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

Declarative Pipeline each loop in parallel step

    Details

    • Type: Bug
    • Status: Open (View Workflow)
    • Priority: Blocker
    • Resolution: Unresolved
    • Component/s: groovy-plugin, pipeline
    • Labels:
      None
    • Environment:
      Jenkins on premise - ver. 2.175,
      Checked with Jenkins stabe 2.164.2 - same issue
      RH 7.6 server
      Latest version of all plugins [groovy, pipeline, declarative pipeline etc]
    • Similar Issues:

      Description

      When running declarative pipeline with two maps and using function something got mixed.

      example code:

       

      pipeline{
          agent { node 'builder_linux_1' }
          stages{
              stage('test'){
                  steps{
                      script{
                          first_map = [:]
                          first_map['JIRA-1'] = ['ArtifactId':'first_ART-1','ArtifactVersion':'1.0.3-1','ParentIssue':'JIRA-0']
                          first_map['JIRA-2'] = ['ArtifactId':'first_ART-2','ArtifactVersion':'1.0.3-1','ParentIssue':'JIRA-0']
                          second_map = [:]
                          second_map['JIRA-12'] = ['ArtifactId':'second_ARTIFACT-100','ArtifactVersion':'1.0.3-10','ParentIssue':'JIRA-0']
                          def ParallelSteps = [:]
                          ParallelSteps['first'] = {
                              test(first_map, 'FIRST')
                          }
                          ParallelSteps['second'] = {
                              test(second_map, 'SECOND')
                          }
                          parallel ParallelSteps
                      }
                  }       
              }
          }
      }
      void test(ARTIFACT_MAP, TECH){
          ARTIFACT_MAP.each { art ->
              if (TECH == 'SECOND'){
                  splited_artifact_name = art.value['ArtifactId'].tokenize('_')
                  splited_artifact_name.remove(splited_artifact_name[0])
                  TEMP_HOLDER_ARTIFACT_ID = splited_artifact_name.join('_')
              }
              else {
                  TEMP_HOLDER_ARTIFACT_ID = art.value['ArtifactId']
              }
              dir(TECH){
                  println "${TEMP_HOLDER_ARTIFACT_ID}, ${TECH}"
              }
          }
      }
      

      The output is:

      [Pipeline] stage
      [Pipeline] { (test)
      [Pipeline] script
      [Pipeline] {
      [Pipeline] parallel
      [Pipeline] { (Branch: first)
      [Pipeline] { (Branch: second)
      [Pipeline] dir
      Running in /home/devops/.jenkins/workspace/test_15/FIRST
      [Pipeline] {
      [Pipeline] dir
      Running in /home/devops/.jenkins/workspace/test_15/SECOND
      [Pipeline] {
      [Pipeline] echo
      ARTIFACT-100, FIRST
      [Pipeline] }
      [Pipeline] echo
      ARTIFACT-100, SECOND
      [Pipeline] }
      [Pipeline] // dir
      [Pipeline] // dir
      [Pipeline] }
      [Pipeline] dir
      Running in /home/devops/.jenkins/workspace/test_15/FIRST
      [Pipeline] {
      [Pipeline] echo
      first_ART-2, FIRST
      [Pipeline] }
      [Pipeline] // dir
      [Pipeline] }
      [Pipeline] // parallel
      [Pipeline] }
      [Pipeline] // script
      [Pipeline] }
      [Pipeline] // stage
      [Pipeline] }
      [Pipeline] // node
      [Pipeline] End of Pipeline
      

      Now if in the mention pipeline i will remove the 'dir' function from the void function

      dir(TECH){ println "${TEMP_HOLDER_ARTIFACT_ID}, ${TECH}" }
      

      and just print:

      println "${TEMP_HOLDER_ARTIFACT_ID}, ${TECH}"
      

      everything looks fine....

      [Pipeline] { (Branch: first)
      [Pipeline] { (Branch: second)
      [Pipeline] echo
      first_ART-1, FIRST
      [Pipeline] echo
      ARTIFACT-100, SECOND
      [Pipeline] }
      [Pipeline] echo
      first_ART-2, FIRST
      

      found that it's work well if running the 'if statement' inside the dir func..

      void test(ARTIFACT_MAP, TECH){
          ARTIFACT_MAP.each { art ->
              dir(TECH){
                  if (TECH == 'SECOND'){
                      splited_artifact_name = art.value['ArtifactId'].tokenize('_')
                      splited_artifact_name.remove(splited_artifact_name[0])
                      TEMP_HOLDER_ARTIFACT_ID = splited_artifact_name.join('_')
                  }
                  else {
                      TEMP_HOLDER_ARTIFACT_ID = art.value['ArtifactId']
                  }
                  println "${TEMP_HOLDER_ARTIFACT_ID}, ${TECH}"
              }
          }
      }
      

       NOT WORKING IF TAKING THE PRINTLN OUTSIDE 'DIR()'

       

        Attachments

          Activity

          There are no comments yet on this issue.

            People

            • Assignee:
              vjuranek vjuranek
              Reporter:
              apresfiux Kirill Kamaldinov
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated: