我正在定义一个Jenkins声明性管道,很难配置一个步骤,使其在两个字符串相等时不执行。
我尝试了几种方法,但字符串比较不起作用。
以下是我的当前状态:
stages {
stage('Check if image has changed') {
steps {
script {
OLD_DIGEST = sh(returnStdout: true, script: "podman manifest inspect registry/myimage:11 2>/dev/null | jq .config.digest").trim()
NEW_DIGEST = sh(returnStdout: true, script: "podman inspect --format='sha256:{{.Id}}' myimage:11-tmp").trim()
}
sh "echo previous digest:${OLD_DIGEST}, new digest:${NEW_DIGEST}"
}
}
stage('Release') {
when {
allOf {
expression { env.RELEASE != null && env.RELEASE == "true" }
expression { env.OLD_DIGEST != env.NEW_DIGEST }
}
}
steps {
sh "echo Releasing image..."
sh "podman image push myimage:11-tmp registry/myimage:11.${DATE_TIME}"
sh "podman image push myimage:11-tmp registry/myimage:11"
}
}
}
更具体地说,问题在于when
:
allOf {
expression { env.RELEASE != null && env.RELEASE == "true" }
expression { env.OLD_DIGEST != env.NEW_DIGEST }
}
第一个表达式很好用,但我无法使用第二个表达式:即使OLD_DIGEST
和NEW_DIGEST
不同,也跳过该步骤。
输出示例:
previous digest:sha256:736fd651afdffad2ee48a55a3fbab8de85552f183602d5bfedf0e74f90690e32, new digest:sha256:9003077f080f905d9b1a960b7cf933f04756df9560663196b65425beaf21203d
...
Stage "Release" skipped due to when conditional
我也尝试过expression { OLD_DIGEST != NEW_DIGEST }
(删除env.
),但现在的结果正好相反:即使两个字符串相等,也不跳过该步骤。
这种情况下的输出:
previous digest:sha256:8d966d43262b818073ea23127dedb61a43963a7fafc5cffdca85141bb4aada57, new digest:sha256:8d966d43262b818073ea23127dedb61a43963a7fafc5cffdca85141bb4aada57
...
Releasing image...
我想知道问题是否出在expression
或allOf
上。
2条答案
按热度按时间djp7away1#
根据我在2023年最新版本中的测试,env变量在任何阶段都被初始化,所以之前的值被覆盖。
注:内当时,env vars为默认值,忽略前一阶段放入的期望值。之后,在步骤中,为期望值(前一阶段更新)
如果你使用全局变量而不是env变量,它就可以工作。我用echo模拟了你的podman输出。
当OLD_DIGEST = 1且NEW_DIGEST = 1时,跳过该阶段
如果存在不同,则执行该阶段
xytpbqjk2#
问题的根本原因是要比较的两个字符串的输出确实不同:一个是
"xxx"
,另一个是xxx
,但Jenkins输出未显示双引号。正确的Jenkins比较,正如评论中所说,是
expression { OLD_DIGEST != NEW_DIGEST }
(没有env.
)。