Jenkins 声明性管道 'when' 条件忽略 env var 值
Jenkins declarative pipeline 'when' condition ignoring env var value
如果管道中的变量为空,我想要一个特定阶段运行,即一个阶段中的 gcloud 命令 运行s,如果此命令的输出为空,则下一个舞台应该运行。如果它有值,不要运行下一阶段。
这是 运行gcloud 命令的阶段,如果图像之前已通过二进制授权证明,则用一个值填充 ATTESTATION
变量。
N.B。有一些全局变量,例如 ATTESTOR_NAME
、GIT_COMMIT
和 DOCKER_IMAGE_NAME
,它们在前面定义但为了简单起见未在此处显示 - 当我在终端中执行时,这些命令会起作用,所以什么都没有命令本身有问题。
stage ('Check Attestation') {
steps {
script {
env.IMAGE_DIGEST = sh(returnStdout: true, script: "gcloud container images describe \
${DOCKER_IMAGE_NAME}:qa-${GIT_COMMIT} --format='value(image_summary.digest)' \
--project ${PROJECT_ID_DEV}").trim()
env.ATTESTATION = sh(returnStdout: true, script: "gcloud container binauthz attestations list \
--attestor=${ATTESTOR_NAME} --attestor-project=${PROJECT_ID_DEV} \
--artifact-url=${DOCKER_IMAGE_NAME}@${IMAGE_DIGEST} --format='value(resourceUri)'").trim()
}
}
}
然后在我的声明管道中,如果 ATTESTATION
环境变量是 NULL
,我只希望下一个二进制授权阶段到 运行(因为图像尚未被证明) ).
N.B。由于这是在测试中,分支名称也必须与定义的分支名称相匹配 - 同样,分支条件的 when {{ allOf }}
在管道的其他地方工作正常。
stage('Run Binary Authorisation for QA') {
when {
allOf {
branch QA_DEPLOY_BRANCH; branch 'qa'
expression { env.ATTESTATION == null }
}
}
steps {
withCredentials([file(credentialsId: '*REDACTED*', variable: 'GC_KEY')]) {
sh("gcloud auth activate-service-account --key-file=${GC_KEY}")
script {
// Env vars for Binary Auth
KEYRING = '*REDACTED*'
KMS_KEY = '*REDACTED*'
LOCATION = '*REDACTED*'
PROJECT_ID = '*REDACTED*'
binaryAuth(GIT_COMMIT, ATTESTOR_NAME, DOCKER_IMAGE_NAME_DEV, PROJECT_ID, KEYRING, KMS_KEY, LOCATION)
}
}
}
}
binaryAuth()
是一个外部自定义库,当我没有指定基于 ATTESTATION 变量的条件 'when' 阶段时,它再次工作得非常好。
我遇到的问题是,Jenkins 似乎完全忽略了 ATTESTATION
env var 是否有值。如前所述,预期的行为是 运行 如果值为 null,则该阶段,但是这并没有发生。它完全跳过了应该 运行.
的阶段
我也知道 ATTESTATION 值为空,因为我之前在 pipline 中添加了这一行以验证之前:[=24=]
echo "The value of the ATTESTATION env var is: ${env.ATTESTATION}"
...对于未被证明的图像,结果为空白,对于具有证明的图像,它给出了一个值!
看到 ATTESTATION
env var 为 null 并且仍然没有执行 binaryAuth 外部库中的命令。
我做错了什么?
感谢@ymochurad 在评论中的回答。只需将比较从 null
更改为 ''
即可!
If I am not mistaken comparing it to null checks if variable exists at all. And in your case it is set to empty string. Did you try to compare to empty string like: expression { env.ATTESTATION == '' }
如果管道中的变量为空,我想要一个特定阶段运行,即一个阶段中的 gcloud 命令 运行s,如果此命令的输出为空,则下一个舞台应该运行。如果它有值,不要运行下一阶段。
这是 运行gcloud 命令的阶段,如果图像之前已通过二进制授权证明,则用一个值填充 ATTESTATION
变量。
N.B。有一些全局变量,例如 ATTESTOR_NAME
、GIT_COMMIT
和 DOCKER_IMAGE_NAME
,它们在前面定义但为了简单起见未在此处显示 - 当我在终端中执行时,这些命令会起作用,所以什么都没有命令本身有问题。
stage ('Check Attestation') {
steps {
script {
env.IMAGE_DIGEST = sh(returnStdout: true, script: "gcloud container images describe \
${DOCKER_IMAGE_NAME}:qa-${GIT_COMMIT} --format='value(image_summary.digest)' \
--project ${PROJECT_ID_DEV}").trim()
env.ATTESTATION = sh(returnStdout: true, script: "gcloud container binauthz attestations list \
--attestor=${ATTESTOR_NAME} --attestor-project=${PROJECT_ID_DEV} \
--artifact-url=${DOCKER_IMAGE_NAME}@${IMAGE_DIGEST} --format='value(resourceUri)'").trim()
}
}
}
然后在我的声明管道中,如果 ATTESTATION
环境变量是 NULL
,我只希望下一个二进制授权阶段到 运行(因为图像尚未被证明) ).
N.B。由于这是在测试中,分支名称也必须与定义的分支名称相匹配 - 同样,分支条件的 when {{ allOf }}
在管道的其他地方工作正常。
stage('Run Binary Authorisation for QA') {
when {
allOf {
branch QA_DEPLOY_BRANCH; branch 'qa'
expression { env.ATTESTATION == null }
}
}
steps {
withCredentials([file(credentialsId: '*REDACTED*', variable: 'GC_KEY')]) {
sh("gcloud auth activate-service-account --key-file=${GC_KEY}")
script {
// Env vars for Binary Auth
KEYRING = '*REDACTED*'
KMS_KEY = '*REDACTED*'
LOCATION = '*REDACTED*'
PROJECT_ID = '*REDACTED*'
binaryAuth(GIT_COMMIT, ATTESTOR_NAME, DOCKER_IMAGE_NAME_DEV, PROJECT_ID, KEYRING, KMS_KEY, LOCATION)
}
}
}
}
binaryAuth()
是一个外部自定义库,当我没有指定基于 ATTESTATION 变量的条件 'when' 阶段时,它再次工作得非常好。
我遇到的问题是,Jenkins 似乎完全忽略了 ATTESTATION
env var 是否有值。如前所述,预期的行为是 运行 如果值为 null,则该阶段,但是这并没有发生。它完全跳过了应该 运行.
我也知道 ATTESTATION 值为空,因为我之前在 pipline 中添加了这一行以验证之前:[=24=]
echo "The value of the ATTESTATION env var is: ${env.ATTESTATION}"
...对于未被证明的图像,结果为空白,对于具有证明的图像,它给出了一个值!
看到 ATTESTATION
env var 为 null 并且仍然没有执行 binaryAuth 外部库中的命令。
我做错了什么?
感谢@ymochurad 在评论中的回答。只需将比较从 null
更改为 ''
即可!
If I am not mistaken comparing it to null checks if variable exists at all. And in your case it is set to empty string. Did you try to compare to empty string like: expression
{ env.ATTESTATION == '' }