如何动态提供Jenkins管道资源锁定标签?

时间:2020-02-27 05:09:03

标签: jenkins jenkins-pipeline jenkins-groovy

我试图根据工作参数和一些其他代码来弄清楚如何获取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块。

1 个答案:

答案 0 :(得分:0)

目前无法将用户构建参数用作资源锁。

有一个关于它的abandoned PR

和和official open issue in jenkins.