Jenkins 为什么每次使用此环境变量时都要对其进行评估?

Jenkins 为什么每次使用此环境变量时都要对其进行评估?,jenkins,jenkins-pipeline,jenkins-declarative-pipeline,Jenkins,Jenkins Pipeline,Jenkins Declarative Pipeline,我注意到(对我来说)这种奇怪的行为。我有一个Jenkins声明性管道: #!groovy pipeline { agent { node { label 'mine-agent-pod' } } environment { MARKER = """run-${sh( returnStdout: true, script

我注意到(对我来说)这种奇怪的行为。我有一个Jenkins声明性管道:

#!groovy

pipeline {

    agent {
        node {
            label 'mine-agent-pod'
        }
    }

    environment {
        MARKER = """run-${sh(
            returnStdout: true,
            script: "date -Ins | sed 's/[^a-zA-Z0-9-]/_/g'"
        ).trim()}"""
        STATUS_DATA = "status-data-${MARKER}.json"
    }

    stages {

        stage('Setup') {
            steps {
                sh("""echo MARKER=${MARKER}""")
                sh("""echo STATUS_DATA=${STATUS_DATA}""")
            }
        }

    }
}
我希望
标记
是一种ID,可以用来标记我在构建中创建的所有临时内容(我希望它是一个日期)。但是看起来,无论何时使用
标记
,都会对其进行求值,正如构建的输出所示(请注意字符串的纳秒部分有多么不同):


为什么呢?如何实现拥有“静态”变量?

这是因为Groovy闭包比单纯的表达式有一个有趣的优势:惰性求值。更多


在couleague的建议之后,定义管道之外的变量有助于:

#!groovy

def MARKER = """run-${ new Date().format("yyyy-MM-dd'T'HH:mm:ss.SZ") }"""

pipeline {

    agent {
        node {
            label 'sat-cpt'
        }
    }

    environment {
        STATUS_DATA = "status-data-${MARKER}.json"
    }

    stages {

        stage('Setup') {
            steps {
                sh("""echo MARKER=${MARKER}""")
                sh("""echo STATUS_DATA=${STATUS_DATA}""")
            }
        }

    }
}
这张照片是:

[Pipeline] sh
+ echo MARKER=run-2020-07-08T19:41:56.130+0000
MARKER=run-2020-07-08T19:41:56.130+0000
[Pipeline] sh
+ echo STATUS_DATA=status-data-run-2020-07-08T19:41:56.130+0000.json
STATUS_DATA=status-data-run-2020-07-08T19:41:56.130+0000.json

非常感谢。我想我缺少了一些基本的东西。将
MARKER=“”运行-${sh(returnStdout:true,脚本:“date-Ins | sed's/[^a-zA-Z0-9-]/\ug')。trim()}”“。toString()
也可以工作(将
GString
转换为
String
)?嗯,它抱怨
WorkflowScript:40:要连接在一起的环境变量值必须是单引号或双引号。
-知道如何解决@yong?这失败于:
org.codehaus.groovy.control.multiplecompationerrorsException:启动失败:WorkflowScript:38:要连接的环境变量值一起必须是单引号或双引号。@第38行,第27列。MARKER='run-'+sh(
#!groovy

def MARKER = """run-${ new Date().format("yyyy-MM-dd'T'HH:mm:ss.SZ") }"""

pipeline {

    agent {
        node {
            label 'sat-cpt'
        }
    }

    environment {
        STATUS_DATA = "status-data-${MARKER}.json"
    }

    stages {

        stage('Setup') {
            steps {
                sh("""echo MARKER=${MARKER}""")
                sh("""echo STATUS_DATA=${STATUS_DATA}""")
            }
        }

    }
}
[Pipeline] sh
+ echo MARKER=run-2020-07-08T19:41:56.130+0000
MARKER=run-2020-07-08T19:41:56.130+0000
[Pipeline] sh
+ echo STATUS_DATA=status-data-run-2020-07-08T19:41:56.130+0000.json
STATUS_DATA=status-data-run-2020-07-08T19:41:56.130+0000.json