web-dev-qa-db-fra.com

Comment faire en sorte que le travail de pipeline attende tous les travaux parallèles déclenchés?

J'ai un script Groovy dans le cadre du travail Pipeline à Jenkins, comme ci-dessous:

node {
    stage('Testing') {
        build job: 'Test', parameters: [string(name: 'Name', value: 'Foo1')], quietPeriod: 2, wait: false
        build job: 'Test', parameters: [string(name: 'Name', value: 'Bar1')], quietPeriod: 2, wait: false
        build job: 'Test', parameters: [string(name: 'Name', value: 'Baz1')], quietPeriod: 2, wait: false
        build job: 'Test', parameters: [string(name: 'Name', value: 'Foo2')], quietPeriod: 2, wait: false
        build job: 'Test', parameters: [string(name: 'Name', value: 'Bar2')], quietPeriod: 2, wait: false
        build job: 'Test', parameters: [string(name: 'Name', value: 'Baz2')], quietPeriod: 2, wait: false
    }
}

qui exécute plusieurs autres travaux libres en parallèle, car l'indicateur wait est défini sur false. Cependant, j'aimerais que le travail de l'appelant soit terminé lorsque tous les travaux sont terminés. Actuellement, le travail Pipeline déclenche tous les travaux et se termine après quelques secondes, ce qui n'est pas ce que je veux, car je ne peux pas suivre le temps total et je ne peux pas annuler tous les travaux déclenchés en une fois.

Comment corriger le script ci-dessus pour que le travail de pipeline se termine lorsque tous les travaux en parallèle sont terminés?

J'ai essayé de regrouper les tâches de construction dans le bloc waitUntil {}, mais cela n'a pas fonctionné.

7
kenorb

Vous devez utiliser pipeline parallel expression, qui attendra que tous les travaux/sous-tâches générés soient terminés:

stage('testing') {
    def branches = [:]

    for(i = 0; i < params.size(); i += 1) {
        def param = params[i]

        branches["Test${i}"] = {
            build job: 'Test', parameters: [string(name: 'Name', value: param)], quietPeriod: 2
        }
    }
    parallel branches
}

Vous pouvez trouver d'autres exemples dans la documentation du pipeline à jenkins.io

14
agg3l

Il suffit de rencontrer le même problème et de trouver une solution efficace. Il suffit d'utiliser foreach.

stage('testing') {
    def jobs = [:]

    [1,2,3,4,5].each{
        i -> jobs["Test${i}"] = {
            build job: 'Test', 
            parameters: [string(name: 'theparam', value: "${i}")],
            quietPeriod: 2
        }
    }
    parallel jobs
}
3
hEngi

Cependant, l'exemple de @ agg3l ne fonctionne pas avec plusieurs tâches.

Map jobResults = [:]

Boolean failedJobs = false
def buildJobWithParams(def jobs_list, Map results) {
  def branches = [:]    
  for(job in jobs_list)
  {
    print job
    branches["Test-${job}"] = {
       def jobBuild = build job: job, propagate: false
       def jobResult = jobBuild.getResult()
       echo "Build of '${job}' returned result: ${jobResult}"
       results[job] = jobResult
    }
  }    
  return branches
}

stage('Run integration tests') {
      steps {
            def job_branch = buildJobWithParams(item_list, jobResults)
            print job_branch
            parallel job_branch
          }
}

Le item_list a plus d'un travail, mais il n'exécutera que le dernier travail plusieurs fois.

2
GOGS K