我试图根据工作参数和一些其他代码来弄清楚如何获取Jenkins资源锁以使用我动态创建的锁标签。
最主要的问题是我有一个复杂的管道,具有多个串行和并行步骤,需要将其锁定在单个资源锁下。资源锁标签是动态的,这是棘手的部分。 Jenkins资源锁插件文档说,您可以在lock(){}块中放置多个阶段,但是现在似乎不再如此了。我只能在lock(){}块中执行一个脚本,因此似乎必须将锁放在顶级阶段的option {}块中。将其放置在option {}块中的问题在于,似乎不可能从管道{}块中更改option {}块中使用的任何变量。
例如:
lock_label = null
pipeline {
agent {
node {
label 'ci-runner-bionic'
}
}
stages {
stage('Setup') {
steps {
script {
lock_label = 'SOME_LOCK'
}
}
}
stage('World') {
options {
lock label: lock_label, resource: null, quantity: 2, variable: 'SERVERS'
}
stages {
stage('Something') {
steps {
sh 'echo "SERVERS=$SERVERS"'
}
}
stage('More things') {
parallel {
stage('Something 2') {
steps {
sh 'echo "SERVERS=$SERVERS"'
}
}
stage('Something 3') {
steps {
sh 'echo "SERVERS=$SERVERS"'
}
}
}
}
}
}
}
}
当该管道实际运行时,lock()看到的锁定标签为null,而不是'SOME_LOCK'。尽管可能在pipeline {}块之前有可能影响锁定标签的代码,但问题是,之前运行的代码无法访问pipeline {}块中定义的参数。
我知道锁插件有一个HTTP接口。但是,以这种方式进行操作可能会泄漏锁定,因为如果存在一些总体的Jenkins环境问题或崩溃,则无法保证将执行post块。