Jenkins 声明性管道锁名称与变量

Sil*_*Nak 7 jenkins jenkins-pipeline

我有一个带锁的声明式詹金斯管道,例如

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

但是当我执行管道时,日志中显示

[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]
Run Code Online (Sandbox Code Playgroud)

当评估 lock-name 时,环境变量似乎没有设置,但是当评估 echo 参数时,它被正确设置。

这个对一个有点相关的问题的答案给出了使用延迟评估的 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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

给我以下日志消息

[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]]
Run Code Online (Sandbox Code Playgroud)

因此,看起来该变量无法正确解析。

我想解决的问题是,创建一个在舞台上有锁的多分支管道。但是当锁有一个不依赖于分支名称的名称时,该阶段只有一个管道分支可以并行运行。

我该如何解决这个问题?

Mic*_*ael 5

您可以只使用lockasstep而不是 an option

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

由于在steps变量中env.BRANCH已设置,这应该可以工作。

另请参阅步骤文档lock