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é.
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
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
}
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.