Jenkins 为什么每次使用此环境变量时都要对其进行评估?
我注意到(对我来说)这种奇怪的行为。我有一个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
#!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