Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-60801

Variable changes are shared between matrix (parallel) stages.

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: Blocker Blocker
    • pipeline
    • Jenkins ver. 2.190.2
      Pipeline: API 2.83
      Pipeline: Basic Steps 2.19
      Pipeline: Declarative 1.5.0

      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.

       

       

            Unassigned Unassigned
            kryslj Jakub Krysl
            Votes:
            12 Vote for this issue
            Watchers:
            16 Start watching this issue

              Created:
              Updated: