66 votes

Exécution des étapes en parallèle avec le workflow / pipeline de Jenkins

Veuillez noter: la question est basée sur l'ancien format de pipeline, maintenant appelé format "scripté". Lors de l'utilisation de "pipelines déclaratifs", des blocs parallèles peuvent être imbriqués à l'intérieur de blocs de stage (voir Stages parallèles avec Declarative Pipeline 1.2).

Je me demande comment les étapes parallèles sont censées fonctionner avec le plugin workflow/pipeline de Jenkins, en particulier comment les mélanger avec des étapes de construction. Je connais le modèle général:

parallel(firstTask: {
  // Faire quelque chose
}, secondTask: {
  // Faire autre chose en parallèle
})

Cependant, j'aimerais exécuter plusieurs étapes en parallèle (sur le même nœud, qui possède plusieurs exécuteurs), donc j'ai essayé d'ajouter des étapes comme ceci:

stage 'A'
// Faire quelques préparations

parallel(firstTask: {
  stage 'B1'
  // Faire quelque chose
}, secondTask: {
  stage 'B2'
  // Faire autre chose en parallèle
})

stage 'C'
// Finaliser

Cela ne fonctionne pas comme prévu. Les tâches "faire quelque chose" sont exécutées en parallèle, mais les étapes parallèles se terminent immédiatement et n'incorporent pas le contenu qu'elles devraient contenir. Par conséquent, la vue d'étape ne montre pas le résultat correct et ne lie pas non plus les journaux.

Puis-je construire différentes étapes en parallèle, ou l'étape "parallel" est-elle seulement censée être utilisée dans un seul stage?

0 votes

Qu'est-ce qui ne fonctionne pas exactement? J'ai essayé votre extrait dans Jenkins il y a quelques minutes et cela semble fonctionner parfaitement.

0 votes

Comme je l'ai dit, les étapes de travail ne sont pas vraiment effectuées dans le cadre des phases, c'est-à-dire que la Vue de la Phase ne montre pas le temps passé pour elles, et aussi aucun journal. Si vous réalisez les mêmes étapes de manière non parallèle, vous verrez la différence.

0 votes

Je vois - donc le problème ne peut être vu que dans la vue de la scène, n'est-ce pas?

67voto

Jesse Glick Points 3877

Vous ne pouvez pas placer le stage déprécié (comme dans la question d'origine) à l'intérieur de parallel.

À partir de JENKINS-26107, stage prend un argument de bloc. Vous pouvez mettre parallel à l'intérieur de stage ou stage à l'intérieur de parallel ou stage à l'intérieur de stage etc. Cependant, les visualisations de la construction ne garantissent pas de prendre en charge toutes les imbrications; en particulier

  • Les étapes du pipeline intégrées (une liste "arborescente" de chaque étape exécutée par la construction) affichent un enchevêtrement arbitraire de stage.
  • Le plugin Pipeline Stage View n'affichera actuellement qu'une liste linéaire des étapes, dans l'ordre où elles ont commencé, indépendamment de la structure d'imbrication.
  • Blue Ocean affichera les étapes de premier niveau, ainsi que les branches parallel à l'intérieur d'une étape de premier niveau, mais actuellement pas plus.

JENKINS-27394, si implémenté, affichera des stages imbriqués de manière arbitraire.

2 votes

Je viens de lire ici qu'à partir de la version 2.1, l'étape de scène à l'intérieur d'une parallèle n'est pas utilisable, car elle n'a jamais été prise en charge. Pouvez-vous me dire quel est l'état actuel de cela?

0 votes

Dans la version 2.2 du plugin pipeline-stage-step, les étapes prennent des blocs. Bien qu'il contienne toujours la vérification pour voir s'il se trouve à l'intérieur d'un processus parallèle, je n'ai pas vu d'exception être lancée. En général, j'utilise aussi un bloc parallel([thingA: { stage('A') { echo('A') } }]). Notez que cela aura un aspect étrange à la fois dans l'interface standard et dans l'océan bleu. Voir JENKINS-38442

0 votes

@ZombieDev, v2.2 me lance une exception en utilisant un pipeline déclaratif. Cet usage ne passe pas le vérificateur déclaratif.

26voto

PRF Points 448

Cette syntaxe est maintenant obsolète, vous obtiendrez cette erreur :

org.codehaus.groovy.control.MultipleCompilationErrorsException: démarrage échoué:
WorkflowScript: 14: Un étage est attendu @ ligne 14, colonne 9.
       parallel firstTask: {
       ^

WorkflowScript: 14: L'étage n'a pas de nom @ ligne 14, colonne 9.
       parallel secondTask: {
       ^

2 erreurs

Vous devriez faire quelque chose comme :

stage("Parallel") {
    steps {
        parallel (
            "firstTask" : {
                //faire quelque chose
            },
            "secondTask" : {
                // Faire quelque chose d'autre en parallèle
            }
        )
    }
}

Juste pour ajouter l'utilisation de node ici, pour distribuer les tâches sur plusieurs serveurs de build/ VMs :

pipeline {
  stages {
    stage("Work 1"){
     steps{
      parallel ( "Build common Library":   
            {
              node(''){
                  /// votre contenu
                  }
            },

        "Build Utilities" : {
            node(''){
               /// votre contenu
              }
           }
         )
    }
}

Toutes les VMs doivent être étiquetées comme pour les utiliser comme un pool.

16voto

OlivierTerrien Points 825

J'ai juste testé 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 jobs 'test1' et 'test2' sont des jobs simples :

Exemple pour 'test1'

  • Un paramètre nommé 'Environment'
  • Pipeline : echo "$env.Environment-TEST1"

Lors de l'exécution, je peux voir les deux étapes s'exécutant en même temps

2 votes

Quelle version de Jenkins?

0 votes

Comme indiqué par @joao-cenoura - Je veux vraiment que cela fonctionne, mais cela ne fonctionne pas en 2.58 et je ne vois rien dans les notes de version pour 2.61 ou les plugins actuels qui semble indiquer qu'ils le feront fonctionner. Quelle version de Jenkins et des plugins de pipeline utilisez-vous ?

0 votes

La mienne est "Jenkins ver. 2.46.2"

5voto

Quartz Points 181

Je pense que cela a été officiellement implémenté maintenant : https://jenkins.io/blog/2017/09/25/declarative-1/

5voto

Anoop Philip Points 152

Comme mentionné par @Quartz, 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")
            }
        }
    )
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X