即使在 jenkins 脚本中分配了 pom 版本号后,环境变量值也被重置为原始值

Env variable value got reset to original even after assigning the pom version number in jenkins script

我有一个场景,我必须读取不同组件的 maven pom 版本并将该版本分配给 docker image(TAG)。但是在我阅读 pom 之后,将其分配给某个全局变量,它将在 groovy jenkins 脚本中重置为原始值。下面是示例。 HMAP_VERSION 值将为 1.2.1,但在行中使用时:sh "docker login -u ${ART_USERNAME} -p ${ART_PASSWORD} test.com" 值将为 UNINITIALISED.

有人能告诉我哪里出了问题吗?这将适用于在 env 块中读取的单个 Maven 文件,如下所示:

environment {
    CLOADER_VERSION  = readMavenPom().getVersion()
}

以下是我要执行的操作示例。

#! groovy

environment {
    HMAP_VERSION = "UNINITIALISED"
    CLOADER_VERSION = "UNINITIALISED"
}

stages {
    stage('Build Cloader') {
        steps {
            checkout([$class: 'GitSCM' "rest is removed")

            dir('isa-casloader') {
                script {
                    CLOADER_VERSION = readMavenPom().getVersion()
                }
                container('build') {
                    sh '/opt/apache-maven/bin/mvn -s settings.xml -B clean install -DskipTests=true'
                }
            }
        }
    }
    stage ('Build Casloader Docker Image') {
        steps {
        dir('isa-casloader') {
        container('tools') {
            echo("CLOADER_VERSION=${CLOADER_VERSION}")
            withCredentials() {
                sh "docker login -u ${ART_USERNAME} -p ${ART_PASSWORD} testing.com"
                sh 'docker build -t testing.com:${CLOADER_VERSION} .'
                sh 'docker push testing.com:${CLOADER_VERSION}' 
            }
          }
        }
      }
    }
    stage ('Build Heat Map Docker Image') {
        steps {
            checkout([$class: 'GitSCM', "rest is commented"])

            dir('apps') {
                container('tools') {
                    script {
                        def pom = readMavenPom file: 'pom-docker.xml'
                        HMAP_VERSION = pom.version
                    }
                    echo("HMAP_VERSION=${HMAP_VERSION}")
                    withCredentials() {
                    sh "docker login -u ${ART_USERNAME} -p ${ART_PASSWORD} test.com"
                    sh 'docker build -t test.com:${HMAP_VERSION} .'
                    sh 'docker push test.com:${HMAP_VERSION}'
}}}}}}}

根据我对您代码的阅读,您将环境变量与 Groovy 上下文中的变量混合在一起。

这些行创建环境变量,可在 shell 中访问为 $HMAP_VERSION$CLOADER_VERSION:

environment {
    HMAP_VERSION = "UNINITIALISED"
    CLOADER_VERSION = "UNINITIALISED"
}

但是,您在此处填充了一个 Groovy 变量:

script {
    CLOADER_VERSION = readMavenPom().getVersion()      
}

要改为填充环境变量,您需要使用 env.CLOADER_VERSION

这会更改当您使用 sh 指令调用 shell 时评估变量的上下文:

1-> sh "docker login -u ${ART_USERNAME} -p ${ART_PASSWORD} testing.com"
2-> sh 'docker build -t testing.com:${CLOADER_VERSION} .'
3-> sh 'docker push testing.com:${CLOADER_VERSION}' 

在上面的行号 1 中,命令使用双引号 (") 引用,这意味着变量 ART_USERNAMEART_PASSWORD 正在 Groovy 脚本的上下文中进行评估。

但是,在 23 行中,命令使用单引号 (') 引用,这意味着shell(可能 /bin/sh)正在评估这些变量,因此使用环境中的值。

最简单的解决方法是确保始终使用 Groovy 上下文中的 env. 前缀访问要在 shell 中公开的值:

// set environment for CLOADER_VERSION
env.CLOADER_VERSION = readMavenPom().getVersion()
// print value of environment variable CLOADER_VERSION
echo("CLOADER_VERSION=${env.CLOADER_VERSION}")

// set environment for HMAP_VERSION
env.HMAP_VERSION = pom.version
// print value of environment variable HMAP_VERSION
echo("HMAP_VERSION=${env.HMAP_VERSION}")

干杯。

感谢您的回复。我的问题得到解决。在 docker 上下文中,如下所示,

withCredentials() {
 sh "docker login -u ${ART_USERNAME} -p ${ART_PASSWORD} testing.com"
 sh 'docker build -t testing.com:${CLOADER_VERSION} .'
 sh 'docker push testing.com:${CLOADER_VERSION}' 
}

登录命令在双引号内是正确的,但接下来的语句在单引号内。所以变量的最新值没有得到解决。当我将语句更改为双引号内时,它起作用了!!

下面是正确的命令:

withCredentials() {
 sh "docker login -u ${ART_USERNAME} -p ${ART_PASSWORD} testing.com"
 sh "docker build -t testing.com:${CLOADER_VERSION} ."
 sh "docker push testing.com:${CLOADER_VERSION}"
}

谢谢。