如果管道中的变量为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()是一个外部自定义库,当我没有根据认证变量指定条件' when‘时,它的工作非常好。
我的问题是,Jenkins似乎完全忽略了ATTESTATION env是否有值。正如我前面所述,如果值为null,那么预期的行为将运行这个阶段,但是这种情况并没有发生。当它应该运行时,它完全跳过了舞台。
我还知道认证值为null,因为我在之前将这一行添加到pipline以进行验证:
echo "The value of the ATTESTATION env var is: ${env.ATTESTATION}"
...and结果对于尚未被验证的图像是空白的,对于那些具有认证的图像来说,它给出了一个值!
它看到ATTESTATION env为null,仍然没有执行binaryAuth外部库中的命令。
我做错了什么?
发布于 2021-12-13 14:27:09
感谢@ymochurad在评论中给出的答案。简单地将比较从null更改为''有效!!
如果我没有错误地将其与空检查是否存在变量进行比较,则为
。在您的例子中,它被设置为空字符串。您是否尝试将其与空字符串(如:表达式
{ env.ATTESTATION == '' }
)进行比较?
https://stackoverflow.com/questions/70332870
复制相似问题