我有一个带锁的声明性Jenkins管道,例如。 g。
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]]
因此,似乎无法正确解析该变量。
我要解决的问题是,创建一条在舞台上具有锁的多分支管道。但是,当锁具有一个不依赖于分支名称的名称时,在此阶段中,只有管道的一个分支可以并行运行。
我该如何解决?
答案 0 :(得分:3)
您可以仅将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
,这应该可以工作。
答案 1 :(得分:0)
我最近遇到了这个问题。 ${env}
在options
块中不可访问,但${currentBuild}
不可访问。因此,我首先要做的是println("$currentBuild")
并获得班级的名称。从那开始,我搜索了Java源代码文档,并遵循了这些功能,直到获得所需的内容。
在我的情况下,我想要${env.NODE_NAME}
,最后得到了${currentBuild.getRawBuild().getExecutor().getOwner().getDisplayName()}