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

parallel stage randomly fails with shared_libs calls

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: Critical Critical
    • pipeline
    • None

      Assume a shared_lib with following code:

       setup.groovy

      def call(Map config) {
        path = config.get("ansible_path")
        project_name = config.get("project_name")
      
        sh label: "Copy playbook", script: "cp ${path}/${project_name}.yml ${env.HOME}/ansible-dev/."
        
       }
      
      

      A Jenkinsfile with:

      pipeline {
          agent any
      
          environment {
              ansible_path=".infra/ansible"
          }
      
          stages {
              stage('init') {
                  steps {
                      sh label: "cleanup", script: "rm -fr ${env.HOME}/ansible-dev ; mkdir -p ${env.HOME}/ansible-dev/environments/${environment}/${region}/"
                  }
              }
      
              stage('deploy') {
                  parallel {
                      stage('bad-sunburst'){
                          environment {
                              project_name="hpgm-sunburst"
                          }
      
                          stages {
                              stage('ansible') {
                                  steps {
                                      echo "${project_name}"
                                      setup project_name: "${project_name}", ansible_path: "${project_name}/${ansible_path}"
      
                                      sh label: "test file", script: "ls -l ${env.HOME}/ansible-dev/${project_name}.yml"
                                  }
                              }
                          }
                      }
      
                      stage('bad-screen-metrics'){
                          environment {
                              project_name="hpgm-screen-metrics"
                          }
      
                          stages {
                              stage('ansible') {
                                  steps {
                                      echo "${project_name}"
                                      setup project_name: "${project_name}", ansible_path: "${project_name}/${ansible_path}"
                                      sh label: "test file", script: "ls -l ${env.HOME}/ansible-dev/${project_name}.yml"
                                  }
                              }
                          }
                      }
                      stage('good-segment'){
                          environment {
                              project_name="hpgm-segment"
                          }
      
                          stages {
                              stage('ansible') {
                                  steps {
                                      echo "${project_name}"
                                      sh label: "Copy playbook", script: "cp ${project_name}/${ansible_path}/${project_name}.yml ${env.HOME}/ansible-dev/."
      
                                      sh label: "test file 1", script: "ls -l ${env.HOME}/ansible-dev/${project_name}.yml"
                                  }
                              }
                          }
                      }
                      stage('good-snapshot'){
                          environment {
                              project_name="hpgm-snapshot"
                          }
      
                          stages {
                              stage('ansible') {
                                  steps {
                                      echo "${project_name}"
                                      sh label: "Copy playbook", script: "cp ${project_name}/${ansible_path}/${project_name}.yml ${env.HOME}/ansible-dev/."
      
                                      sh label: "test file 1", script: "ls -l ${env.HOME}/ansible-dev/${project_name}.yml"
                                  }
                              }
                          }
                      }
                  }
              }
          }
      }

      We assume source files to be there:

      hpgm-snapshot/hpgm-snapshot.yml
      hpgm-segment/hpgm-segment.yml
      hpgm-screen-metrics/hpgm-screen-metrics.yml
      hpgm-sunburst/hpgm-sunburst.yml
      

       

      When we execute this pipeline we got errors, because expected filed copied are not copied when a run that from a shared_libs:

                           [Pipeline] sh (Copy playbook)
      [good-segment]       + cp hpgm-segment/.infra/ansible/hpgm-segment.yml /var/lib/jenkins/ansible-dev/.
                           [Pipeline] sh (Copy playbook)
                           [Pipeline] sh (test file 1)
      [good-snapshot]      + cp hpgm-snapshot/.infra/ansible/hpgm-snapshot.yml /var/lib/jenkins/ansible-dev/.
                           [Pipeline] sh (test file 1)
      [bad-sunburst]       + cp hpgm-screen-metrics/.infra/ansible/hpgm-screen-metrics.yml /var/lib/jenkins/ansible-dev/.
                          [Pipeline] sh (Copy variables)
      [bad-screen-metrics] + cp hpgm-screen-metrics/.infra/ansible/hpgm-screen-metrics.yml /var/lib/jenkins/ansible-dev/.
                          [Pipeline] sh (Copy variables)
      
       

       
      When the pipeline use shared_libs in parallel, commands parameters are mixed.
      When the pipeline use inline command, commands parameters are properly used.

      Bad example:
      [bad-sunburst] + cp hpgm-screen-metrics/.infra/ansible/hpgm-screen-metrics.yml /var/lib/jenkins/ansible-dev/. is wrong

      It should be
       [bad-sunburst] + cp hpgm-sunburst/.infra/ansible/hpgm-screen-metrics.yml /var/lib/jenkins/ansible-dev/. is wrong

      With online commands in Jenkinsfile, it looks good:

      [good-*segment*] + cp hpgm-segment/.infra/ansible/hpgm-segment.yml /var/lib/jenkins/ansible-dev/.
      [...]
      [good-*snapshot*] + cp hpgm-snapshot/.infra/ansible/hpgm-snapshot.yml /var/lib/jenkins/ansible-dev/.

            Unassigned Unassigned
            clarsonneur Christophe LARSONNEUR
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated: