【发布时间】:2021-03-25 23:38:24
【问题描述】:
我试图弄清楚如何让 Jenkins 资源锁使用我根据作业参数和一些附加代码动态创建的锁标签。
首要问题是我有一个复杂的管道,其中包含多个串行和并行步骤,需要将其锁定在单个资源锁下。资源锁标签是动态的,这是棘手的部分。 Jenkins 资源锁插件文档说您可以在 lock(){} 块中放置多个阶段,但现在似乎不再如此。我只能让一个脚本在 lock(){} 块内执行,所以似乎锁必须放在顶级阶段的 option{} 块中。将其放置在 option{} 块中的问题在于,似乎无法从 pipeline{} 块中更改 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{} 块中定义的参数。
我知道 lock 插件有一个 HTTP 接口。但是,这样做可能会泄漏锁,因为如果存在一些总体 Jenkins 环境问题或崩溃,则无法保证 post 块将被执行。
【问题讨论】:
标签: jenkins jenkins-pipeline jenkins-groovy