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

Variable changes are shared between matrix (parallel) stages.

    XMLWordPrintable

Details

    • Bug
    • Status: Open (View Workflow)
    • Blocker
    • Resolution: Unresolved
    • pipeline
    • Jenkins ver. 2.190.2
      Pipeline: API 2.83
      Pipeline: Basic Steps 2.19
      Pipeline: Declarative 1.5.0

    Description

      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.

       

       

      Attachments

        Activity

          pfuntner John Pfuntner added a comment -

          anentropic I'm sorry but I don't think I kept a good example around. I think the script I was using has advanced past that issue.

          pfuntner John Pfuntner added a comment - anentropic I'm sorry but I don't think I kept a good example around. I think the script I was using has advanced past that issue.
          tonyaps Tony Sinclair added a comment -

          Also hitting this, but not with "matrix"

           

          We're seeing this with "parallel" syntax, but I'm guessing the underlying bug is the same.

           

          I run 3 parallel stages for 3 different architectures.  Currently seeing my "x86_64" arch values suddenly become "ppc64le" arch values.  Builds often fail because they try to run the wrong arch type. 

          tonyaps Tony Sinclair added a comment - Also hitting this, but not with "matrix"   We're seeing this with "parallel" syntax, but I'm guessing the underlying bug is the same.   I run 3 parallel stages for 3 different architectures.  Currently seeing my "x86_64" arch values suddenly become "ppc64le" arch values.  Builds often fail because they try to run the wrong arch type. 

          Without "def toolName" i can reproduce this issue. This is a post-stage inside a matrix pipeline job.

          post {
              always {
          ...
                  script {
                      // Without def toolName the variable scope is for the whole pipeline
                      // and therefore in a Matrix/Parallel build we have stages overwriting
                      // each other
                      def toolName
                      switch ("${TOOL}") {
                          case 'configurator':
                              toolName = 'Kyoto Configurator'
                              break
                          case 'designer':
                              toolName = 'Kyoto Designer'
                              break
                      }
          ...
              }
          }
          
          benbrummer Benjamin Brummer added a comment - Without "def toolName" i can reproduce this issue. This is a post-stage inside a matrix pipeline job. post { always { ... script { // Without def toolName the variable scope is for the whole pipeline // and therefore in a Matrix/Parallel build we have stages overwriting // each other def toolName switch ( "${TOOL}" ) { case 'configurator' : toolName = 'Kyoto Configurator' break case 'designer' : toolName = 'Kyoto Designer' break } ... } }
          austingray Austin added a comment - I was able to solve this issue by following along here https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md#creating-multiple-threads
          gabyx Gabriel Nützi added a comment - Experience the same exact issue: https://stackoverflow.com/questions/72725684/parallel-matrix-and-global-variables-without-race-condition

          People

            Unassigned Unassigned
            kryslj Jakub Krysl
            Votes:
            11 Vote for this issue
            Watchers:
            13 Start watching this issue

            Dates

              Created:
              Updated: