首页 > 解决方案 > 带有变量的 Jenkins 声明性管道锁名称

问题描述

我有一个带有锁的声明性 Jenkins 管道,例如

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 参数时,它设置正确。

这个对一个有点相关的问题的回答暗示了使用懒惰评估的 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,这个阶段只能并行运行管道的一个分支。

我该如何解决这个问题?

标签: jenkinsjenkins-pipeline

解决方案


您可以只使用lockastep而不是 a 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,这应该可以工作。

另请参阅step的文档lock


推荐阅读