Jenkins 声明式管道 'when' 条件忽略 env var 值



如果管道中的变量为null,我希望运行特定的阶段,即gcloud命令在一个阶段中运行,如果该命令的输出为空,那么下一个阶段应该运行。如果它有一个值,就不要运行下一阶段。

这是一个阶段,它运行gcloud命令,如果图像之前已通过二进制授权验证,则用一个值填充ATTESTATION变量。

注意:有一些全局变量,如ATTESTOR_NAMEGIT_COMMITDOCKER_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的情况下运行下一个二进制授权阶段(因为映像尚未验证(。

注意:由于这是在测试中,分支名称必须与定义的名称相匹配——同样,分支条件的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似乎完全忽略了ATTESTATIONenv-var是否有值。正如我前面所说的,预期的行为是在值为null的情况下运行阶段,但这并没有发生。它完全跳过了该运行的阶段。

我也知道ATTESTATION值为null,因为我之前已经将这一行添加到了pipline中,以在之前进行验证

echo "The value of the ATTESTATION env var is: ${env.ATTESTATION}"

对于未经证明的图像,结果是空白的,而对于有证明的图像来说,结果是有价值的!

可以看到ATTESTATIONenv var为null,并且仍然没有执行binaryAuth外部库中的命令。

我做错了什么?

感谢@ymochurad在评论中给出的答案。简单地将比较从null更改为''就成功了!!

如果我将其与null进行比较没有错,请检查变量是否存在。在您的情况下,它被设置为空字符串。您是否尝试与空字符串进行比较,如:表达式{ env.ATTESTATION == '' }

最新更新