Jenkins parallel script in loop using wrong variables

Viewed 1334

I'm trying to build a dynamic group of steps to run in parallel. The following example is what I came up with (and found examples of at https://devops.stackexchange.com/questions/3073/how-to-properly-achieve-dynamic-parallel-action-with-a-declarative-pipeline). But I'm having trouble getting it to use the expected variables. The result always seems to be the variables from the last iteration of the loop.

In the following example the echo output is always bdir2 for both tests:

pipeline {
  agent any

  stages {
    stage('Test') {
      steps {
        script {
          def tests = [:]
          def files

          files = ['adir1/adir2/adir3','bdir1/bdir2/bdir3']

          files.each { f ->
            rolePath = new File(f).getParentFile()
            roleName = rolePath.toString().split('/')[1]

            tests[roleName] = {
              echo roleName
            }
          }

          parallel tests
        }
      }
    }
  }
}

I'm expecting one of the tests to output adir2 and another to be bdir2. What am I missing here?

1 Answers

Just try to move the test section a little higher, and it will be work

pipeline {
  agent any
  stages {
    stage('Test') {
      steps {
        script {
          def tests = [:]
          def files

          files = ['adir1/adir2/adir3','bdir1/bdir2/bdir3']

          files.each { f ->
            tests[f] = {
             rolePath = new File(f).getParentFile()
             roleName = rolePath.toString().split('/')[1]
             echo roleName
            }
          }
          parallel tests
        }
      }
    }
  }
}
Related