webentwicklung-frage-antwort-db.com.de

Parallele Ausführung von Phasen mit Jenkins Workflow/Pipeline

Bitte beachten Sie: Die Frage basiert auf dem alten, jetzt als "Skript" bezeichneten Pipeline-Format. Bei Verwendung von "deklarativen Pipelines" können parallele Blöcke innerhalb von Stufenblöcken verschachtelt werden (siehe Parallele Stufen mit deklarativer Pipeline 1.2 ).

Ich frage mich, wie parallele Schritte mit dem Workflow-/Pipeline-Plugin von Jenkins funktionieren sollen. wie man sie mit Bauabschnitten mischt. Ich weiß über das allgemeine Muster Bescheid:

parallel(firstTask: {
  // Do some stuff
}, secondTask: {
  // Do some other stuff in parallel
})

Ich möchte jedoch einige Stufen parallel ausführen (auf demselben Knoten, auf dem sich mehrere Executoren befinden). Daher habe ich versucht, folgende Stufen hinzuzufügen:

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

Dies funktioniert nicht wie erwartet. Die "do stuff" -Aufgaben werden parallel ausgeführt, aber die parallelen Stufen enden sofort und enthalten nicht die Inhalte, die sie enthalten sollen. Folglich zeigt die Bühnenansicht nicht das korrekte Ergebnis und verknüpft auch die Protokolle nicht.

Kann ich verschiedene Stufen parallel bauen, oder ist der "parallele" Schritt nur für eine einzige Stufe vorgesehen?

36
ami

Sie können die veraltete nicht-blockierte stage (wie in der ursprünglichen Frage) nicht in parallel platzieren.

Ab JENKINS-26107 verwendet stage ein Blockargument. Sie können parallel in stage oder stage in parallel oder stage in stage usw. einfügen. Es wird jedoch nicht garantiert, dass Visualisierungen des Builds alle Verschachtelungen unterstützen. im Speziellen

  • Die eingebauten Pipeline-Schritte (eine "Baumtabelle", die jeden vom Build ausgeführten Schritt auflistet) zeigen eine beliebige stage-Verschachtelung an.
  • Das Pipeline Stage View - Plugin zeigt derzeit nur eine lineare Liste von Stufen in der Reihenfolge an, in der sie begonnen haben, unabhängig von der Verschachtelungsstruktur.
  • Blue Ocean zeigt die obersten Ebenen sowie parallel-Verzweigungen innerhalb einer obersten Ebene an, derzeit jedoch nicht mehr.

JENKINS-27394 würde, falls implementiert, beliebig verschachtelte stages anzeigen.

44
Jesse Glick

diese Syntax ist nun veraltet. Sie erhalten diesen Fehler:

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

Sie sollten etwas tun wie:

stage("Parallel") {
    steps {
        parallel (
            "firstTask" : {
                //do some stuff
            },
            "secondTask" : {
                // Do some other stuff in parallel
            }
        )
    }
}

Fügen Sie hier einfach die Verwendung des Knotens hinzu, um Jobs auf mehrere Build-Server/VMs zu verteilen:

pipeline {
  stages {
    stage("Work 1"){
     steps{
      parallel ( "Build common Library":   
            {
              node('<Label>'){
                  /// your stuff
                  }
            },

        "Build Utilities" : {
            node('<Label>'){
               /// your stuff
              }
           }
         )
    }
}

Alle VMs sollten als Pool bezeichnet werden.

12
PRF

Ich habe gerade die folgende Pipeline getestet und sie funktioniert

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")]
    }
}

Dieser Job mit dem Namen 'trigger-test' akzeptiert einen Parameter mit dem Namen 'Environment'.

Job 'test1' und 'test2' sind einfache Jobs:

Beispiel für 'test1'

  • Ein Parameter mit dem Namen 'Environment'
  • Pipeline: echo "$ env.Environment-TEST1"

Bei der Ausführung kann ich sehen, dass beide Stufen gleichzeitig laufen

6
OlivierTerrien

Ich denke, das wurde jetzt offiziell umgesetzt: https://jenkins.io/blog/2017/09/25/declarative-1/

2
Quartz

Wie @Quartz erwähnt, kannst du so etwas tun

stage('Tests') {
    parallel(
        'Unit Tests': {
            container('node') {
                sh("npm test --cat=unit")
            }
        },
        'API Tests': {
            container('node') {
                sh("npm test --cat=acceptance")
            }
        }
    )
}
0
Anoop Philip