如何在 Jenkins `when` 条件下比较字符串变量

问题描述 投票:0回答:1

我正在定义一个 Jenkins 声明式管道,并且很难配置一个步骤以在两个字符串相等时不执行。

我尝试了几种方法,但字符串比较不起作用。

这是我目前的状态:

stages {
    stage('Check if image has changed') {
        steps {
            script {
                OLD_DIGEST = sh(returnStdout: true, script: "podman manifest inspect registry/myimage:11 2>/dev/null | jq .config.digest").trim()
                NEW_DIGEST = sh(returnStdout: true, script: "podman inspect --format='sha256:{{.Id}}' myimage:11-tmp").trim()
            }
            sh "echo previous digest:${OLD_DIGEST}, new digest:${NEW_DIGEST}"
        }
    }
    stage('Release') {
        when {
            allOf {
                expression { env.RELEASE != null && env.RELEASE == "true" }
                expression { env.OLD_DIGEST != env.NEW_DIGEST }
            }
        }
        steps {
            sh "echo Releasing image..."
            sh "podman image push myimage:11-tmp registry/myimage:11.${DATE_TIME}"
            sh "podman image push myimage:11-tmp registry/myimage:11"
        }
    }
}

更具体地说,问题在于

when

allOf {
    expression { env.RELEASE != null && env.RELEASE == "true" }
    expression { env.OLD_DIGEST != env.NEW_DIGEST }
}

第一个表达式工作正常但我不能使第二个工作:即使

OLD_DIGEST
NEW_DIGEST
不同,这一步也会被跳过。

示例输出:

previous digest:sha256:736fd651afdffad2ee48a55a3fbab8de85552f183602d5bfedf0e74f90690e32, new digest:sha256:9003077f080f905d9b1a960b7cf933f04756df9560663196b65425beaf21203d
...
Stage "Release" skipped due to when conditional

我也尝试过

expression { OLD_DIGEST != NEW_DIGEST }
(删除
env.
)但现在结果相反:即使两个字符串相等,也不会跳过该步骤。

这种情况下的输出:

previous digest:sha256:8d966d43262b818073ea23127dedb61a43963a7fafc5cffdca85141bb4aada57, new digest:sha256:8d966d43262b818073ea23127dedb61a43963a7fafc5cffdca85141bb4aada57
...
Releasing image...

我想知道问题是否在于

expression
allOf
在某些时候。

jenkins groovy jenkins-pipeline jenkins-groovy
1个回答
0
投票

根据我在最新的 2023 版本中的测试,env 变量在任何阶段都被初始化,因此之前的值被覆盖了。

注意:在when内部,环境变量有默认值,忽略了前一阶段的预期值。之后,在steps中,有预期值(在前一阶段更新)

如果你使用全局变量而不是环境变量,它就可以工作。我用 echo 模拟你的 podman 输出。

def OLD_DIGEST
def NEW_DIGEST

pipeline {
    agent any
    environment {
      RELEASE = "true"
    } 
    stages {
        stage('Check if image has changed') {
            steps {
                script {
                    OLD_DIGEST = sh(returnStdout: true, script: "echo '1'").trim()
                    NEW_DIGEST = sh(returnStdout: true, script: "echo '1'").trim()
                }
                sh "echo previous digest:${OLD_DIGEST}, new digest:${NEW_DIGEST}"
            }
        }
        stage('Release') {
            when {
                allOf {
                    expression { env.RELEASE != null && env.RELEASE == "true" }
                    expression { OLD_DIGEST != NEW_DIGEST }
                }
            }
            steps {
                sh "echo Releasing image..."
            }
        }
    }
}

当 OLD_DIGEST = 1 && NEW_DIGEST = 1 时,跳过该阶段

如果有不同,阶段执行

© www.soinside.com 2019 - 2024. All rights reserved.