Jenkins 脚本化管道嵌套环境变量

Jenkins scripted pipeline nested environment variable

我正在使用 Jenkins 脚本管道,但无法理解如何将环境变量相互嵌套,这是一个 MWE:

// FROM https://jenkins.io/doc/pipeline/examples/#parallel-multiple-nodes

def labels = []

if (HOST == 'true') {
    labels.add(<HOSTNAME>)
}

def builders = [:]

for (x in labels) {
    def label = x

    builders[label] = {
        ansiColor('xterm') {
            node(label) {
                stage('cleanup') {
                    deleteDir()
                }
                stage('build') {

                    env.test = "TESTA"

                    env.intern = '''
                        TEST = "${env.test}"
                    '''

                    sh '''
                        echo $intern
                        printenv
                    '''
                }
            }
        }
    }
}

parallel builders

这里的想法是 env.test 包含值 TESTA,它将 env.intern 设置为 TEST = TESTA 这就是我想要发生的事情。在此之后,代码只是打印出值。 遗憾的是结果是 TEST = "${env.test}".

如何在 Jenkins 脚本管道中使用嵌套字符串环境变量?

尝试以下操作:

env.intern = "TEST = ${env.test}"

按照您现在的设置,env.intern 的实际结果将是 "TEST= ${env.test}"。只要在设置 env.intern 之前设置 env.test 就可以了。另外,值得注意的是,如果您更改了 env.test 的值,那么您需要重置 env.intern 的值,否则它将保留 env.test 的原始值。

此处的语法差异是 Groovy 中的文字字符串与内插字符串与 shell 步骤方法中的 shell 解释器。

  • ": Groovy
  • 中的内插字符串
  • ':Groovy 中的文字字符串和 shell 解释器中的内插字符串

本质上,在管道执行的"内插入一个Groovy变量,在管道执行的"内和'内插入一个环境变量在 shell 解释器中(并且在管道内也必须在 env 对象中访问,但是在 shell 步骤方法中是第一个 class 变量表达式)。

因此,我们可以固定 env.intern 的分配值:

env.intern = "TEST = ${env.test}"

其中 env.test 的分配值将在 Groovy 字符串中插入并分配给 intern 键处的 env 管道对象。然后 shell 解释器也可以在 shell 步骤方法中访问它,并且管道的其余部分已经正确并且将按预期运行。