【问题标题】:How to provide Jenkins pipeline resource lock label dynamically?如何动态提供 Jenkins 流水线资源锁标签?
【发布时间】: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


    【解决方案1】:

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

    有一个关于它的abandoned PR

    official open issue in jenkins.

    【讨论】:

    • 官方issue已关闭,但不确定与问题的关系。您认为我们现在可以有更好的解决方案吗?
    猜你喜欢
    • 2022-09-26
    • 2020-08-16
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多