I have a Jenkinsfile
with some global variables and some stages. can I update the global variable out from a stage?
An example:
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 } } } }
Is it possible to update the ACC
variable with the value from foo, so that I can use the ACC
Variable in the next stage?
Indeed just use ${env. JOB_NAME} to access a known variable. However if you need to access environment variable where name is given by another variable (dynamic access), just use env["your-env-variable"] .
We can set global properties by navigating to “Manage Jenkins -> Configure System -> Global properties option”.
You can't override the environment variable defined in the environment {}
block. However, there is one trick you might want to use. You can refer to ACC
environment variable in two ways:
env.ACC
ACC
The value of env.ACC
cannot be changed once set inside environment {}
block, but ACC
behaves in the following way: when the variable ACC
is not set then the value of env.ACC
gets accessed (if exists of course). But when ACC
variable gets initialized in any stage, ACC
refers to this newly set value in any stage. Consider the following example:
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' } } } }
And as you can see in the above example, the only exception to the rule is if the environment variable gets initialized outside the environment {}
block. For instance, env.BAR
in this example was initialized in Stage 1
, but the value of env.BAR
could be changed in Stage 2
and Stage 3
sees changed value.
There is one way to override the environment variable defined in the environment {}
block - you can use withEnv()
block that will allow you to override the existing env variable. It won't change the value of the environment defined, but it will override it inside the withEnv()
block. Take a look at the following example:
pipeline { agent any stages { stage("Test") { environment { FOO = "bar" } steps { script { withEnv(["FOO=newbar"]) { echo "FOO = ${env.FOO}" // prints: FOO = newbar } } } } } }
I also encourage you to check my "Jenkins Pipeline Environment Variables explained " video.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With