0

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

2 回答 2

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),因此使用环境中的值。

最简单的解决方法是确保始终使用env.Groovy 上下文中的前缀访问要在 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}")

干杯。

于 2018-02-15T22:33:56.003 回答
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}"
}

谢谢。

于 2018-02-16T07:24:40.257 回答