我有一个Jenkins管道工作,我将一些构建变量作为输入,如果用户没有传递变量,我执行一个脚本并获取这些变量的值。后来我必须使用这些变量的值来触发其他工作。
所以我的代码看起来像这样:
node {
withCredentials([[$class: 'StringBinding', credentialsId: 'DOCKER_HOST', variable: 'DOCKER_HOST']]) {
env.T_RELEASE_VERSION = T_RELEASE_VERSION
env.C_RELEASE_VERSION = C_RELEASE_VERSION
env.N_RELEASE_VERSION = N_RELEASE_VERSION
env.F_RELEASE_VERSION = F_RELEASE_VERSION
....
stage concurrency: 1, name: 'consul-get-version'
sh '''
if [ -z ${T_RELEASE_VERSION} ]
then
export T_RELEASE_VERSION=$(ruby common/consul/services_prod_version.rb prod_t_release_version)
aws ecr get-login --region us-east-1
aws ecr list-images --repository-name t-server | grep ${T_RELEASE_VERSION}
else
aws ecr get-login --region us-east-1
aws ecr list-images --repository-name t-server | grep ${T_RELEASE_VERSION}
fi
.......
't-integ-pipeline' : {
build job: 't-integ-pipeline', parameters: [[$class: 'StringParameterValue', name: 'RELEASE_VERSION', value: T_RELEASE_VERSION],
[$class: 'BooleanParameterValue', name: 'FASTFORWARD_TO_DEPLOY', value: true]]
},
......
问题是当我使用空T_RELEASE_VERSION触发主作业时,使用RELEASE_VERSION参数的空值触发子构建作业t-integ-pipeline。
如何在shell执行程序中更改groovy参数,然后在具有修改值的groovy执行程序中再次访问它?
答案 0 :(得分:0)
使用env-inject时,可以将值存储在属性文件中,并将它们作为环境变量注入。无法找到任何简单的方法来管理它。
无论如何,这是一个解决方案,将值存储到文件中,并从管道中读取文件。然后使用eval或类似方法将其转换为可解析的对象(哈希)。
Eval.me示例:Serializing groovy map to string with quotes
写入/读取文件示例: https://wilsonmar.github.io/jenkins2-pipeline/
EDIT Manish解决方案的可读性:
sh 'ruby common/consul/services_prod_version.rb prod_n_release_version > status'
N_RELEASE_VERSION_NEW = readFile('status').trim()
sh 'ruby common/consul/services_prod_version.rb prod_q_release_version > status'
Q_RELEASE_VERSION_NEW = readFile('status').trim()
答案 1 :(得分:0)
我找到了一种方法,可以在shell中更改groovy变量,无需将其存储在文件中,git-tag-message-plugin这里有一个示例,我使用这种方法如下:
script{
N_RELEASE_VERSION_NEW = getN_RELEASE_VERSION_NEW()
}
String getN_RELEASE_VERSION_NEW() {
return sh(script: "ruby common/consul/services_prod_version.rb prod_n_release_version ", returnStdout: true)?.trim()
}