Wie starte ich einen Jenkins-Job, nachdem mehrere Upstream-Jobs gleichzeitig erfolgreich waren?


70

Um das schnellstmögliche Feedback zu erhalten, möchten wir gelegentlich, dass Jenkins-Jobs parallel ausgeführt werden. Jenkins hat die Möglichkeit, mehrere nachgelagerte Jobs zu starten (oder die Pipeline zu "verzweigen"), wenn ein Job beendet ist. Jenkins scheint jedoch keine Möglichkeit zu haben, einen nachgelagerten Job nur zum Start aller Zweige dieser Gabelung zu führen (oder die Gabelung wieder zusammenzufügen).

Jenkins hat die Schaltfläche "Erstellen, nachdem andere Projekte erstellt wurden", aber ich interpretiere dies als "Diesen Job starten, wenn ein Upstream-Job beendet ist" (nicht "Diesen Job starten, wenn alle Upstream-Jobs erfolgreich sind").

Hier ist eine Visualisierung dessen, wovon ich spreche. Weiß jemand, ob ein Plugin existiert, um das zu tun, wonach ich suche? Pipeline erstellen


Bearbeiten:

Als ich diese Frage ursprünglich im Jahr 2012 stellte, war Jasons Antwort (die Plugins Join und Promoted Build) die beste und die Lösung, mit der ich mich entschieden habe.

Die Antwort von dnozay (The Build Flow Plugin) wurde jedoch ungefähr ein Jahr nach dieser Frage populär gemacht, was eine viel bessere Antwort ist. Für das, was es wert ist, wenn die Leute mir diese Frage heute stellen, empfehle ich das jetzt stattdessen.


Zitiert Andrews Antwort ... "Jenkins hat kürzlich erstklassige Unterstützung für den Workflow angekündigt." jenkins-ci.org/content/workflow-plugin-10
Clintm

1
Sie können die ausgewählte Antwort ändern, wenn Sie der Meinung sind, dass die neuere Antwort jetzt besser geeignet ist.
naught101

Antworten:


27

Es gibt zwei Lösungen, die ich in der Vergangenheit für dieses Szenario verwendet habe:

  1. Verwenden Sie das Join-Plugin für Ihren Job "Bereitstellen" und geben Sie "Heraufstufen" als Zieljob an. Sie müssten "Funktionstests" und "Leistungstests" als verbundene Jobs angeben und sie in gewisser Weise nach dem Erstellen starten. Das parametrisierte Trigger Plugin ist dafür gut geeignet .

  2. Verwenden Sie das Plugin für gesponserte Builds für Ihren "Bereitstellungs" -Job, geben Sie eine Heraufstufung an, die funktioniert, wenn nachgelagerte Jobs abgeschlossen sind, und geben Sie Funktions- und Leistungstestjobs an. Lösen Sie im Rahmen der Beförderungsaktion den Job "Befördern" aus. Sie müssen die beiden Testjobs noch über "Bereitstellen" starten.

Beide Lösungen haben einen KRITISCHEN Aspekt: ​​Fingerabdrücke müssen korrekt verwendet werden. Folgendes habe ich gefunden:

  1. Der "Build" -Job muss eine neue Fingerabdruckdatei ORIGINIEREN. Mit anderen Worten, es muss eine Datei mit einem Fingerabdruck versehen werden, von der Jenkins glaubt, dass sie vom ursprünglichen Job stammt. Überprüfen Sie den Link "Fingerabdrücke anzeigen" des Jobs, um dies zu überprüfen.
  2. Alle nachgeschalteten verknüpften Jobs (in diesem Fall "Bereitstellen", "Funktionstests" und "Leistungstests") müssen dieselbe Datei abrufen und mit einem Fingerabdruck versehen. Das Plugin zum Kopieren von Artefakten eignet sich hervorragend für solche Dinge.
  3. Beachten Sie, dass Sie mit einigen Plugins die Reihenfolge des Fingerabdrucks und des Starts des nachgeschalteten Jobs ändern können. In diesem Fall MUSS der Fingerabdruck erfolgen, bevor ein nachgeschalteter Auftrag dieselbe Datei mit Fingerabdrücken abtastet, um sicherzustellen, dass der URSPRUNG des Fingerabdrucks richtig eingestellt ist.

3
Ich habe sowohl die Join- als auch die Promoted Builds-Plugins ausprobiert, aber ich denke, sie leiden unter einer Einschränkung, die ich beim ersten Schreiben meiner Frage nicht berücksichtigt habe. Grundsätzlich scheinen sie nur zu funktionieren, wenn jeder „Zweig“ der Aufteilung genau einen Job tief ist. Die Plugins funktionieren beide wie in meinem Bild oben erwartet, aber unsere reale Pipeline sieht eher so aus: dl.dropbox.com/u/74726/pipeline.png - Beachten Sie, dass ein 'Zweig' der Teilung nur eine Tiefe hat (Codeabdeckung) ), aber der andere Zweig ist ZWEI Jobs tief (bereitstellen und dann testen). Keiner von beiden startet den "Promotion" -Job, wenn alle abgedeckt, bereitgestellt und getestet wurden!
Jay Spang

2
Ich habe diese Lösung verwendet, wenn die Pfade mehrere Jobs tief sind. Der kritische Schlüssel waren die Dateien mit Fingerabdruck. Ich werde meine Antwort aktualisieren, um dies widerzuspiegeln.
Jason Swager

1
Vielen Dank. Fingerabdrücke waren in der Tat die Antwort!
Jay Spang

Ich stehe vor dem Problem, dass die Branche nur einen Job tief ist. Ich weiß nicht, wie ich die Fingerabdruckdatei verwenden soll. Wo finde ich genauere Informationen?
Aleung

Ich sehe die Join-Trigger-Option unter Post-Build-Aktionen nicht. Nach der Installation des Join-Plugins habe ich das Plugin installiert, indem ich die .hpi-Datei manuell hochgeladen habe.
viveksinghggits

31

Pipeline-Plugin

Sie können das Pipeline Plugin (früher workflow-plugin) verwenden.

Es enthält viele Beispiele , und Sie können diesem Tutorial folgen .

z.B

// build
stage 'build'
...

// deploy
stage 'deploy'
...

// run tests in parallel
stage 'test'
parallel 'functional': {
  ...
}, 'performance': {
  ...
}

// promote artifacts
stage 'promote'
...

Flow Plugin erstellen

Sie können auch das Build Flow Plugin verwenden . Es ist einfach fantastisch - aber es ist veraltet (Entwicklung eingefroren).

Jobs einrichten

Erstellen Sie Jobs für:

  • bauen
  • bereitstellen
  • Leistungstests
  • Funktionstests
  • Beförderung

Upstream einrichten

  1. buildErstellen Sie im Upstream (hier ) ein einzigartiges Artefakt, z.

    echo ${BUILD_TAG} > build.tag
    
  2. Archivieren Sie das build.tagArtefakt.

  3. Fingerabdrücke aufzeichnen, um die Datennutzung zu verfolgen; Wenn ein Auftrag dieselbe build.tagDatei kopiert und Fingerabdrücke aufzeichnet, können Sie den übergeordneten Auftrag verfolgen.
  4. Konfigurieren Sie, um befördert zu werden, wenn der promotionJob erfolgreich ist.

Einrichten der nachgelagerten Jobs

  1. Ich benutze 2 Parameter PARENT_JOB_NAMEundPARENT_BUILD_NUMBER
  2. Kopieren Sie die Artefakte aus dem Upstream- buildJob mit dem Copy Artifact Plugin

    • Projektname = ${PARENT_JOB_NAME}
    • Welcher Build = ${PARENT_BUILD_NUMBER}
    • Zu kopierende Artefakte = build.tag
  3. Fingerabdrücke aufzeichnen; das ist entscheidend.

Einrichten des Downstream-Promotion-Jobs

Gehen Sie wie oben beschrieben vor, um eine Upstream-Downstream-Beziehung herzustellen. Es ist kein Build-Schritt erforderlich. Sie können zusätzliche Aktionen nach dem Build ausführen, z. B. "Hey QA, Sie sind dran".

Erstellen Sie einen Build-Flow-Job

// start with the build
parent = build("build")
parent_job_name = parent.environment["JOB_NAME"]
parent_build_number = parent.environment["BUILD_NUMBER"]

// then deploy
build("deploy")

// then your qualifying tests
parallel (
    { build("functional tests",
          PARENT_BUILD_NUMBER: parent_build_number,
          PARENT_JOB_NAME: parent_job_name) },
    { build("performance tests",
          PARENT_BUILD_NUMBER: parent_build_number,
          PARENT_JOB_NAME: parent_job_name) }
)

// if nothing failed till now...
build("promotion",
    PARENT_BUILD_NUMBER: parent_build_number,
    PARENT_JOB_NAME: parent_job_name)

// knock yourself out...
build("more expensive QA tests",
    PARENT_BUILD_NUMBER: parent_build_number,
    PARENT_JOB_NAME: parent_job_name)

Viel Glück.


Ich bevorzuge diese Antwort selbst - sie ist meiner Meinung nach sehr einfach und flexibler.
Metaforge


9

Das Multijob-Plugin funktioniert in diesem Szenario hervorragend . Es ist auch praktisch, wenn Sie möchten, dass ein einzelner "Eltern" -Job mehrere "Kind" -Jobs startet, aber dennoch jedes der Kinder manuell für sich ausführen kann. Dies funktioniert durch Erstellen von "Phasen", zu denen Sie 1 zu n Jobs hinzufügen. Der Build wird nur fortgesetzt, wenn die gesamte Phase abgeschlossen ist. Wenn also eine Phase aus mehreren Jobs besteht, müssen alle abgeschlossen sein, bevor der Rest ausgeführt wird. Natürlich kann konfiguriert werden, ob der Build fortgesetzt wird, wenn innerhalb der Phase ein Fehler auftritt.


2

Ich glaube, das Workflow-Plugin heißt jetzt Pipeline-Plugin und ist die (derzeit) bevorzugte Lösung für die ursprüngliche Frage, die vom Build Flow-Plugin inspiriert wurde. Es gibt auch ein Tutorial für die ersten Schritte in GitHub.


2

Die Antworten von Jason & Dnozay sind gut genug. Aber falls jemand nach einer einfachen Möglichkeit sucht, verwenden Sie einfach das JobFanIn-Plugin .


Hallo Yogi, gibt es eine Möglichkeit, Parameter an den Zusammenführungsjob zu übergeben? Ich benutze das parametrize Trigger Plugin
Prasaanth Neelakandan

1
müssen das als Erweiterung zum Plugin hinzufügen. Derzeit macht dieses Plugin das nicht
Yogesh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.