首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jenkins声明式管道“when”条件忽略env值

Jenkins声明式管道“when”条件忽略env值
EN

Stack Overflow用户
提问于 2021-12-13 10:04:57
回答 1查看 902关注 0票数 0

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

下面是运行gcloud命令的阶段,如果图像以前已通过二进制授权进行验证,则可以使用值填充ATTESTATION变量。

注:前面定义了一些全局变量,如ATTESTOR_NAMEGIT_COMMITDOCKER_IMAGE_NAME,但为了简单起见,这里没有显示这些变量--当我在终端中执行命令时,这些命令确实有效,因此命令本身没有任何问题。

代码语言:javascript
复制
        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 }}在管道的其他地方工作得很好。

代码语言:javascript
复制
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外部库中的命令。

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-13 14:27:09

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

如果我没有错误地将其与空检查是否存在变量进行比较,则为

。在您的例子中,它被设置为空字符串。您是否尝试将其与空字符串(如:表达式{ env.ATTESTATION == '' }

)进行比较?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70332870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档