【问题标题】:Jenkins declarative pipeline lock name with variable带有变量的 Jenkins 声明性管道锁名称
【发布时间】:2018-09-13 13:23:53
【问题描述】:

我有一个带有锁的声明性 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]

在评估 lock-name 时似乎没有设置环境变量,但是在评估 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]]

所以,看起来变量无法正确解析。

我要解决的问题是,创建一个在舞台上有锁的多分支管道。但是当锁有名字时,不依赖于branchname,这个阶段只能并行运行管道的一个分支。

我该如何解决这个问题?

【问题讨论】:

标签: jenkins jenkins-pipeline


【解决方案1】:

您可以将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,这应该可以工作。

另见documentation for lock step

【讨论】:

    【解决方案2】:

    我最近自己也遇到了这个问题。 ${env}options 块中不可访问,但 ${currentBuild} 可以。所以我首先是println("$currentBuild") 并获取班级的名称。从那以后,我用谷歌搜索了 Java 源代码文档并跟踪了这些函数,直到我得到了我需要的东西。

    在我的情况下,我想要${env.NODE_NAME},最后我得到了${currentBuild.getRawBuild().getExecutor().getOwner().getDisplayName()}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 2022-09-27
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多