New matrix step provides ability to run the same code in parallel cells. But if that code assigns ANY variable (not just env), it gets overwritten later by the next cell. This is huge deal, it basically prevents from assigning any variable in this kind of pipeline which makes it nearly useless.
The condition is to set variable, have a piece of code that takes some time to execute and use the already set variable after. This can be simulated with sleep().
I boiled down my code to easily reproduce it, here is the pipeline:
pipeline { parameters { booleanParam(name: 'RHEL5', defaultValue: true) booleanParam(name: 'RHEL6', defaultValue: true) booleanParam(name: 'RHEL7', defaultValue: true) } stages { stage('Matrix') { matrix { when { anyOf { expression { params.RHEL5 && env.RHEL == '5' } expression { params.RHEL6 && env.RHEL == '6' } expression { params.RHEL7 && env.RHEL == '7' } } } axes { axis { name 'RHEL' values '5', '6', '7' } } stages { stage('Build single'){ steps { script { echo "RHEL version: " + env.RHEL myVar = "something.something.RHEL-${env.RHEL}" echo "myVar: " + myVar sleep(10) echo "AFTER RHEL version: " + env.RHEL echo "AFTER myVar: " + myVar } } } } } } } }
The result of this code:
RHEL version: 5 myVar: something.something.RHEL-5 Sleeping for 10 sec RHEL version: 6 myVar: something.something.RHEL-6 Sleeping for 10 sec RHEL version: 7 myVar: something.something.RHEL-7 Sleeping for 10 sec No need to sleep any longer RHEL version: 5 myVar: something.something.RHEL-7 No need to sleep any longer RHEL version: 6 myVar: something.something.RHEL-7 No need to sleep any longer RHEL version: 7 myVar: something.something.RHEL-7
As you can see, myVar gets overwritten by the last run cell even for the other cells.