我有一个Jenkinsfile
,其中包含一些全局变量和某些阶段。
我可以从一个阶段更新全局变量吗?
一个例子:
pipeline {
agent any
environment {
PASSWD = "${sh(returnStdout: true, script: 'python -u do_some_something.py')}"
ACC = "HI"
}
stage('stage1') {
when { expression { params.UPDATE_JOB == false } }
steps{
script {
def foo= sh( returnStdout: true, script: 'python -u do_something.py ')
env.ACC = foo
println foo
print("pw")
println env.PASSWD
}
}
}
}
是否可以使用foo中的值更新ACC
变量,以便我可以在下一阶段使用ACC
变量?
答案 0 :(得分:7)
您不能覆盖environment {}
块中定义的环境变量。但是,您可能要使用一个技巧。您可以通过两种方式引用ACC
环境变量:
env.ACC
明确ACC
暗含一旦在env.ACC
块中设置environment {}
的值就无法更改,但是ACC
的行为如下:当未设置变量ACC
时,该值的env.ACC
中的访问(当然存在)。但是,在任何阶段初始化ACC
变量时,ACC
都会在任何阶段引用此新设置的值。考虑以下示例:
pipeline {
agent any
environment {
FOO = "initial FOO env value"
}
stages {
stage("Stage 1") {
steps {
script {
echo "FOO is '${FOO}'" // prints: FOO is 'initial FOO env value'
env.BAR = "bar"
}
}
}
stage("Stage 2") {
steps {
echo "env.BAR is '${BAR}'" // prints: env.BAR is 'bar'
echo "FOO is '${FOO}'" // prints: FOO is 'initial FOO env value'
echo "env.FOO is '${env.FOO}'" // prints: env.FOO is 'initial FOO env value'
script {
FOO = "test2"
env.BAR = "bar2"
}
}
}
stage("Stage 3") {
steps {
echo "FOO is '${FOO}'" // prints: FOO is 'test2'
echo "env.FOO is '${env.FOO}'" // prints: env.FOO is 'initial FOO env value'
echo "env.BAR is '${BAR}'" // prints: env.BAR is 'bar2'
script {
FOO = "test3"
}
echo "FOO is '${FOO}'" // prints: FOO is 'test3'
}
}
}
}
如上例所示,该规则的唯一例外是环境变量是否在envrionment {}
块之外初始化。例如,本示例中的env.BAR
在Stage 1
中进行了初始化,但是env.BAR
的值可以在Stage 2
中进行更改,并且Stage 3
会看到更改后的值。