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?
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
stage
-Verschachtelung an.parallel
-Verzweigungen innerhalb einer obersten Ebene an, derzeit jedoch nicht mehr.JENKINS-27394 würde, falls implementiert, beliebig verschachtelte stage
s anzeigen.
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.
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'
Bei der Ausführung kann ich sehen, dass beide Stufen gleichzeitig laufen
Ich denke, das wurde jetzt offiziell umgesetzt: https://jenkins.io/blog/2017/09/25/declarative-1/
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")
}
}
)
}