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

时间:2018-02-15 13:47:38

标签: maven jenkins jenkins-pipeline multibranch-pipeline jenkins-groovy

我有一个场景,我必须阅读不同组件的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

有人可以告诉我可能出了什么问题吗?这将适用于单个maven文件,该文件在env块中读取如下:

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}'
}}}}}}}

2 个答案:

答案 0 :(得分:0)

通过阅读您的代码,您将环境变量与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脚本的上下文。

但是,在行 2 3 中,使用单引号(')引用命令,这意味着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}")

干杯。

答案 1 :(得分:0)

感谢您的回复。我的问题得到了解决。在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}"
}

谢谢你。