代码之家  ›  专栏  ›  技术社区  ›  SilverNak jach

带有变量的Jenkins声明性管道锁名称

  •  3
  • SilverNak jach  · 技术社区  · 6 年前

    我有一个带有锁的声明性Jenkins管道,例如。

    pipeline {
        environment {
            BRANCH = 'master'
        }
        agent any
        stages{
            stage('stage') {
                options {
                    lock(resource: "lock-${env.BRANCH}")
                }
                steps {
                    echo "Something"
                }
            }
        }
    }
    

    [Pipeline] lock
    Trying to acquire lock on [lock-null]
    Lock acquired on [lock-null]
    [Pipeline] {
    [Pipeline] echo
    master
    [Pipeline] }
    Lock released on resource [lock-null]
    

    在计算锁名时,似乎没有设置环境变量,但在计算echo参数时,它设置正确。

    This answer 对于一个有点相关的问题,给出了使用延迟计算的GString而不是普通GString的提示。尝试以下操作:

    pipeline {
        environment {
            BRANCH = 'master'
        }
        agent any
        stages{
            stage('stage') {
                options {
                    lock(resource: "lock-${->env.BRANCH}" as String)
                }
                steps {
                    echo "${->env.BRANCH}" as String
                }
            }
        }
    }
    

    提供以下日志消息

    [Pipeline] lock
    Trying to acquire lock on [[no resource/label specified - probably a bug]]
    Lock acquired on [[no resource/label specified - probably a bug]]
    [Pipeline] {
    [Pipeline] echo
    master
    [Pipeline] }
    Lock released on resource [[no resource/label specified - probably a bug]]
    

    所以,看起来变量无法正确解析。

    我怎样才能解决这个问题?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Michael    6 年前

    你可以用 lock 作为一个 step 而不是 option :

    pipeline {
        environment {
            BRANCH = 'master'
        }
        agent any
        stages{
            stage('stage') {
                steps {
                    lock("lock-${env.BRANCH}" as String) {
                        echo "${env.BRANCH}" as String
                    }
                }
            }
        }
    }
    

    在…之内 steps 变量 env.BRANCH 设置好了,应该可以。

    另请参见 documentation for lock step .

        2
  •  1
  •   nlsun    6 年前

    我最近也遇到了这个问题。 ${env} options 阻止,但是 ${currentBuild} 是。所以我首先做的是 println("$currentBuild") 得到班级的名字。从那以后,我在google上搜索Java源代码文档并跟踪函数,直到得到所需的内容。

    就我而言,我想要 ${env.NODE_NAME} ${currentBuild.getRawBuild().getExecutor().getOwner().getDisplayName()}