Remarque: la question est basée sur l'ancien format de pipeline "scripté". Lors de l'utilisation de "pipelines déclaratifs", des blocs parallèles peuvent être imbriqués à l'intérieur de blocs d'étape (voir Étapes parallèles avec Declarative Pipeline 1.2 ).
Je me demande comment les étapes parallèles sont supposées fonctionner avec le plug-in de flux de travail/pipeline Jenkins, en particulier. comment les mélanger avec les étapes de construction. Je connais le schéma général:
parallel(firstTask: {
// Do some stuff
}, secondTask: {
// Do some other stuff in parallel
})
Cependant, je voudrais exécuter quelques étapes en parallèle (sur le même noeud, qui a plusieurs exécuteurs), alors j'ai essayé d'ajouter des étapes comme ceci:
stage 'A'
// Do some preparation stuff
parallel(firstTask: {
stage 'B1'
// Do some stuff
}, secondTask: {
stage 'B2'
// Do some other stuff in parallel
})
stage 'C'
// Finalizing stuff
Cela ne fonctionne pas comme prévu. Les tâches à exécuter sont exécutées en parallèle, mais les étapes parallèles se terminent immédiatement et n'intègrent pas le contenu qu'elles devraient contenir. En conséquence, la vue de la scène n’affiche pas le résultat correct et ne lie pas non plus les journaux.
Puis-je construire différentes étapes en parallèle ou est-ce que l'étape "parallèle" est uniquement destinée à être utilisée dans une seule étape?
Vous ne pouvez pas placer le stage
(comme dans la question initiale), obsolète et sans blocages, dans parallel
.
A partir de JENKINS-26107 , stage
prend un argument de blocage. Vous pouvez insérer parallel
dans stage
ou stage
dans parallel
ou stage
dans stage
etc. Cependant, les visualisations de la construction ne prennent pas en charge toutes les imbrications; en particulier
stage
.parallel
dans une étape de niveau supérieur, mais actuellement, pas plus.JENKINS-27394 , s'il était implémenté, afficherait des stage
s imbriqués de manière arbitraire.
cette syntaxe est maintenant obsolète, vous obtiendrez cette erreur:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 14: Expected a stage @ line 14, column 9.
parallel firstTask: {
^
WorkflowScript: 14: Stage does not have a name @ line 14, column 9.
parallel secondTask: {
^
2 errors
Vous devriez faire quelque chose comme:
stage("Parallel") {
steps {
parallel (
"firstTask" : {
//do some stuff
},
"secondTask" : {
// Do some other stuff in parallel
}
)
}
}
Juste pour ajouter l'utilisation du noeud ici, pour répartir les tâches sur plusieurs serveurs/VM de construction:
pipeline {
stages {
stage("Work 1"){
steps{
parallel ( "Build common Library":
{
node('<Label>'){
/// your stuff
}
},
"Build Utilities" : {
node('<Label>'){
/// your stuff
}
}
)
}
}
Tous les ordinateurs virtuels doivent porter une étiquette indiquant qu'ils doivent être utilisés en tant que pool.
Je viens de tester le pipeline suivant et cela fonctionne
parallel firstBranch: {
stage ('Starting Test')
{
build job: 'test1', parameters: [string(name: 'Environment', value: "$env.Environment")]
}
}, secondBranch: {
stage ('Starting Test2')
{
build job: 'test2', parameters: [string(name: 'Environment', value: "$env.Environment")]
}
}
Ce job nommé 'trigger-test' accepte un paramètre nommé 'Environment'
Les tâches 'test1' et 'test2' sont des tâches simples:
Exemple pour 'test1'
À l'exécution, je peux voir les deux étapes se dérouler simultanément
Je pense que cela a été officiellement appliqué maintenant: https://jenkins.io/blog/2017/09/25/declarative-1/
Comme @Quartz l'a mentionné, vous pouvez faire quelque chose comme
stage('Tests') {
parallel(
'Unit Tests': {
container('node') {
sh("npm test --cat=unit")
}
},
'API Tests': {
container('node') {
sh("npm test --cat=acceptance")
}
}
)
}