web-dev-qa-db-fra.com

Exécution d'étapes en parallèle avec le flux de travail/pipeline Jenkins

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?

36
ami

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

  • Le Pipeline Steps intégré (une «table d'arborescence» répertoriant toutes les étapes exécutées par la construction) affiche une imbrication arbitraire stage.
  • Le plug-in Pipeline Stage View affiche actuellement uniquement une liste linéaire d'étapes, dans leur ordre de démarrage, indépendamment de la structure d'imbrication.
  • Blue Ocean affichera les étapes de niveau supérieur, plus les branches parallel dans une étape de niveau supérieur, mais actuellement, pas plus.

JENKINS-27394 , s'il était implémenté, afficherait des stages imbriqués de manière arbitraire.

44
Jesse Glick

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.

12
PRF

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'

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

À l'exécution, je peux voir les deux étapes se dérouler simultanément

6
OlivierTerrien

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

2
Quartz

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")
            }
        }
    )
}
0
Anoop Philip