groovy 如何在Jenkins 'when'条件中比较字符串变量

vq8itlhq  于 2023-02-21  发布在  Jenkins
关注(0)|答案(2)|浏览(364)

我正在定义一个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_DIGESTNEW_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...

我想知道问题是否出在expressionallOf上。

djp7away

djp7away1#

根据我在2023年最新版本中的测试,env变量在任何阶段都被初始化,所以之前的值被覆盖。
注:内当时,env vars为默认值,忽略前一阶段放入的期望值。之后,在步骤中,为期望值(前一阶段更新)
如果你使用全局变量而不是env变量,它就可以工作。我用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时,跳过该阶段

如果存在不同,则执行该阶段

xytpbqjk

xytpbqjk2#

问题的根本原因是要比较的两个字符串的输出确实不同:一个是"xxx",另一个是xxx,但Jenkins输出未显示双引号。
正确的Jenkins比较,正如评论中所说,是expression { OLD_DIGEST != NEW_DIGEST }(没有env.)。

相关问题