Jenkins声明式管道锁名称(带变量)

时间:2018-09-13 13:23:53

标签: jenkins jenkins-pipeline

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

评估锁名时似乎未设置环境变量,但评估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]]

因此,似乎无法正确解析该变量。

我要解决的问题是,创建一条在舞台上具有锁的多分支管道。但是,当锁具有一个不依赖于分支名称的名称时,在此阶段中,只有管道的一个分支可以并行运行。

我该如何解决?

2 个答案:

答案 0 :(得分:3)

您可以仅将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

答案 1 :(得分:0)

我最近遇到了这个问题。 ${env}options块中不可访问,但${currentBuild}不可访问。因此,我首先要做的是println("$currentBuild")并获得班级的名称。从那开始,我搜索了Java源代码文档,并遵循了这些功能,直到获得所需的内容。

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