我正在定义一个 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
在某些时候。
根据我在最新的 2023 版本中的测试,env 变量在任何阶段都被初始化,因此之前的值被覆盖了。
注意:在when内部,环境变量有默认值,忽略了前一阶段的预期值。之后,在steps中,有预期值(在前一阶段更新)
如果你使用全局变量而不是环境变量,它就可以工作。我用 echo 模拟你的 podman 输出。
def OLD_DIGEST
def NEW_DIGEST
pipeline {
agent any
environment {
RELEASE = "true"
}
stages {
stage('Check if image has changed') {
steps {
script {
OLD_DIGEST = sh(returnStdout: true, script: "echo '1'").trim()
NEW_DIGEST = sh(returnStdout: true, script: "echo '1'").trim()
}
sh "echo previous digest:${OLD_DIGEST}, new digest:${NEW_DIGEST}"
}
}
stage('Release') {
when {
allOf {
expression { env.RELEASE != null && env.RELEASE == "true" }
expression { OLD_DIGEST != NEW_DIGEST }
}
}
steps {
sh "echo Releasing image..."
}
}
}
}
当 OLD_DIGEST = 1 && NEW_DIGEST = 1 时,跳过该阶段
如果有不同,阶段执行