I have following pipeline (content simplified, but the structure is exact):
pipeline {
agent any
environment {
my_var = ""
}
stages {
stage('Stage_parallel'){
parallel{
stage('Stage_1') {
steps {
...
}
}
stage('Stage_2'){
steps {
withCredentials([usernamePassword(<LOGIN>, <PASS>)])
{
sh'''
...
var_1 = "/path/to/folder"
var_2 = "file_name"
my_var = "${var_1}/${var_2}"
echo ${my_var} ### returns correct value
'''
}}}}}
stage('Stage_3'){
steps {
sh 'echo ${my_var}' ### returns ""
}}}}
So I tried to declare global variable, update it in Stage_2 and use in Stage_3. However, it returns correct value only in Stage_2 sh block, but not outside... I also tried to
- define variable outside the
pipelineblock likedef my_var - define it in
Stage_2asenv.my_var = "${var_1}/${var_2}"and use inStage_3as${env.my_var}
but none of approaches allows to get my_var value from Stage_2... So how should I fix the pipeline?
Jenkins passes environment variables to scripts "by value", not "by reference", conceptually speaking. If you want to persist any state between
shsteps (doesn't matter inside the same stage or different stages) you have two options:Pick your poison.