如果管道中的变量为null,我希望运行特定的阶段,即gcloud命令在一个阶段中运行,如果该命令的输出为空,那么下一个阶段应该运行。如果它有一个值,就不要运行下一阶段。
这是一个阶段,它运行gcloud命令,如果图像之前已通过二进制授权验证,则用一个值填充ATTESTATION
变量。
注意:有一些全局变量,如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
的情况下运行下一个二进制授权阶段(因为映像尚未验证(。
注意:由于这是在测试中,分支名称必须与定义的名称相匹配——同样,分支条件的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值为null,因为我之前已经将这一行添加到了pipline中,以在之前进行验证
echo "The value of the ATTESTATION env var is: ${env.ATTESTATION}"
对于未经证明的图像,结果是空白的,而对于有证明的图像来说,结果是有价值的!
可以看到ATTESTATION
env var为null,并且仍然没有执行binaryAuth外部库中的命令。
我做错了什么?
感谢@ymochurad在评论中给出的答案。简单地将比较从null
更改为''
就成功了!!
如果我将其与null进行比较没有错,请检查变量是否存在。在您的情况下,它被设置为空字符串。您是否尝试与空字符串进行比较,如:表达式
{ env.ATTESTATION == '' }