我有一个场景,我必须阅读不同组件的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}'
}}}}}}}
答案 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_USERNAME
和ART_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}"
}
谢谢你。