Jenkins - Variablen zwischen Jobs übergeben?

86

Ich habe zwei Jobs in Jenkins, die beide den gleichen Parameter benötigen.

Wie kann ich den ersten Job mit einem Parameter ausführen, sodass beim Auslösen des zweiten Jobs derselbe Parameter verwendet wird?

Stefan Kendall
quelle
Wir können so viele Möglichkeiten nutzen: Eine beste Möglichkeit ist die Verwendung aktueller
Jobparameter
1
Dieser Titel ist so verwirrend. Wie ist das "Übergeben von Variablen zwischen Jobs?". Ebenfalls akzeptierte Antwort ist ein Plugin. Stellen Sie sich das vor!
Rakib

Antworten:

74

Sie können das parametrisierte Trigger-Plugin verwenden dem Sie Parameter von einer Aufgabe an eine andere übergeben können.

Sie müssen auch diesen Parameter hinzufügen, den Sie von Upstream in Downstream übergeben haben.

Łukasz Rżanek
quelle
10
Hallo, tut mir leid, dass ich mich wie ein Noob anhöre, aber ist es in Ordnung, wenn jemand dies mit Details dazu bearbeiten kann, wie es mit dem parametrisierten Trigger-Plugin gemacht wird?
Fadi
10
Randnotiz: Es sieht nicht so aus, als ob exportierte Umgebungsvariablen, die in Bash-Skriptabschnitten erstellt wurden, in den Ausgabeparametern ersetzt werden können (z. B. 'export VERSION' lässt 'UPSTREAM_VERSION = $ VERSION' nicht den richtigen Wert annehmen, sondern erhält nur '$ VERSION' stattdessen).
Mark McKenna
20
Diese Antwort ist unzureichend
Tarabyte
6
Ich bin damit einverstanden, dass es ein Beispiel geben sollte, wie die Parameter an den Zieljob übergeben werden. Die aktuelle Seite des parametrisierten Trigger-Plugins enthält keine guten Informationen dazu. Es könnte zB geben, welche Art von Syntax Sie beim Übergeben der Parameter verwenden sollten.
Skrii
2
Das Plugin scheint nicht mehr zu funktionieren. Siehe die lange Liste der offenen Fragen . Ich kann mit diesem Plugin keine Parameterwerte mehr übergeben. Irgendeine andere Lösung?
Markus L
38

1.Post-Build-Aktionen> Wählen Sie "Parametrisierten Build für andere Projekte auslösen".

2.Geben Sie die Umgebungsvariable mit value ein. Value kann auch Jenkins Build Parameters sein.

Detaillierte Schritte finden Sie hier: -

https://itisatechiesworld.wordpress.com/jenkins-related-articles/jenkins-configuration/jenkins-passing-a-parameter-from-one-job-to-another/

Hoffe es ist hilfreich :)

Vinu Joseph
quelle
Diese Antwort erfüllt die Frage, die OP stellt, ohne dass ein Plugin erforderlich ist oder DSL verwendet wird.
BTC
8
Zu Ihrer Information, diese Antwort benötigt noch das Plugin.
Thomas Lee
Das Plugin ist großartig, wenn es die in den Befehlsabschnitten zum Ausführen der Shell festgelegten Variablenwerte nicht übergeben kann.
Tara Prasad Gurung
25

Die hier akzeptierte Antwort funktioniert für meinen Anwendungsfall nicht. Ich musste in der Lage sein, Parameter in einem Job dynamisch zu erstellen und an einen anderen zu übergeben. Wie Mark McKenna erwähnt, gibt es anscheinend keine Möglichkeit, eine Variable aus einem Shell-Build-Schritt in die Post-Build-Aktionen zu exportieren.

Ich habe eine Problemumgehung mit dem Parameterized Trigger Plugin erreicht, indem ich die Werte in eine Datei geschrieben und diese Datei als Parameter für den Import über 'Post-Build-Aktion hinzufügen' -> 'Parametrized Build auslösen ...' verwendet und dann 'Parameter hinzufügen' ausgewählt habe. > 'Parameter aus Eigenschaftendatei'.

Nigel Kirby
quelle
Das habe ich gebraucht. Vielen Dank.
Luckytaxi
Wenn Sie bereit sind, die jenkins 2.x-Pipeline zu verwenden, können Sie writeFile / stash-> unstash / readFile verwenden, um Statusdaten zwischen Jobs zu kopieren. slidehare.net/ericlongtx/… Checkout Folie 21 für ein Beispiel.
Siesta
Dies ist erforderlich, wenn SHELL-Variablen durchlaufen werden sollen. Sehr geschätzt für diese Antwort.
Carl Wainwright
17

Ich denke, die obige Antwort muss aktualisiert werden:

Ich habe versucht, ein dynamisches Verzeichnis zum Speichern meiner Upstream-Build-Artefakte zu erstellen. Daher wollte ich meine Upstream-Job-Build-Nummer an den Downstream-Job übergeben. Ich habe die obigen Schritte ausgeführt, konnte sie jedoch nicht ausführen. So hat es funktioniert:

  1. Ich habe die Artefakte von meinem aktuellen Job mit dem Plugin zum Kopieren von Artefakten kopiert.
  2. In der Post-Build-Aktion des Upstream-Jobs habe ich die Variable "SOURCE_BUILD_NUMBER = $ {BUILD_NUMBER}" hinzugefügt und so konfiguriert, dass der Downstream-Job ausgelöst wird.
  3. Alles hat funktioniert, außer dass mein Downstream-Job $ SOURCE_BUILD_NUMBER nicht zum Erstellen des Verzeichnisses abrufen konnte.
  4. Um diese Variable zu verwenden, muss ich dieselbe Variable im Downstream-Job als Parametervariable wie in der folgenden Abbildung definieren:

Geben Sie hier die Bildbeschreibung ein

Dies liegt daran, dass Sie in der neuen Version von Jenkins die Variable auch im Downstream-Job definieren müssen. Ich hoffe es ist hilfreich.

Tarun
quelle
Stimme voll und ganz zu. Dies ist ein obligatorisches Update, das die erste Antwort zu 100% vervollständigt.
CodeSlave
10

(für andere Googler)

Wenn Sie eine ernsthafte Pipeline mit dem Build Flow Plugin erstellen , können Sie Parameter zwischen Jobs mit DSL wie folgt übergeben:

Angenommen, ein verfügbarer Zeichenfolgenparameter "CVS_TAG", um ihn an andere Jobs zu übergeben:

build("pipeline_begin", CVS_TAG: params['CVS_TAG'])
parallel (
   // will be scheduled in parallel.
   { build("pipeline_static_analysis", CVS_TAG: params['CVS_TAG']) },
   { build("pipeline_nonreg", CVS_TAG: params['CVS_TAG']) }
)
// will be triggered after previous jobs complete
build("pipeline_end", CVS_TAG: params['CVS_TAG'])

Hinweis zum Anzeigen verfügbarer Variablen / Parameter:

// output values
out.println '------------------------------------'
out.println 'Triggered Parameters Map:'
out.println params
out.println '------------------------------------'
out.println 'Build Object Properties:'
build.properties.each { out.println "$it.key -> $it.value" }
out.println '------------------------------------'
Offirmo
quelle
Build Flow Plugin ist veraltet, Benutzer sollten zu wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin
vhamon
7

Fügen Sie einfach meine Antwort zusätzlich zu der von Nigel Kirby hinzu, da ich noch keinen Kommentar abgeben kann:

Um einen dynamisch erstellten Parameter zu übergeben, können Sie die Variable auch in die Kachel 'Shell ausführen' exportieren und dann über 'Parametrisierten Build für andere Projekte auslösen' => 'Vordefinierte Parameter' => Geben Sie 'YOUR_VAR = $ YOUR_VAR'. Mein Team verwendet diese Funktion, um die npm-Paketversion vom Build-Job an die Bereitstellungsjobs zu übergeben

UPDATE: oben funktioniert nur für von Jenkins injizierte Parameter. Aus der Shell erstellte Parameter müssen weiterhin dieselbe Methode verwenden. z.B. echo YOUR_VAR = $ {YOUR_VAR}> variable.properties und übergebe diese Datei stromabwärts

Shawn
quelle
3

Ich hatte das gleiche Problem, als ich eine POM-Version an einen nachgeschalteten Rundeck-Job übergeben musste.

Was ich getan habe, war die Verwendung der Parameterinjektion über eine Eigenschaftendatei als solche:

1) Erstellen von Eigenschaften in der Eigenschaftendatei über die Shell:

Aktionen erstellen:

  • Führen Sie ein Shell-Skript aus
  • Injizieren Sie Umgebungsvariablen

ZB: Eigenschaftsdefinition

2) Übergeben definierter Eigenschaften an den nachgeschalteten Job: Aktionen nach dem Erstellen:

  • Lösen Sie einen parametrisierten Build für ein anderes Projekt aus
  • Parameter hinzufügen: Aktuelle Build-Parameter
  • Parameter hinzufügen: vordefinierte Parameter

ZB: Eigenschaften senden

3) Es war dann möglich, $ POM_VERSION als solche im nachgeschalteten Rundeck-Job zu verwenden.

/! \ Jenkins Version: 1.636

/! \ Aus irgendeinem Grund musste beim Erstellen des ausgelösten Builds die Option 'Aktuelle Buildparameter' hinzugefügt werden, um die Eigenschaften zu übergeben.

Eli Mous
quelle
EDIT: Ich habe in dem, was ich geschrieben habe, einen Blooper gefunden. In der Eigenschaftendefinition sollte es gewesen sein: echo POM_VERSION = $ POM_VERSION> play.properties und nicht: echo $ POM_VERSION >> play.properties Entschuldigung.
Eli Mous
2

Wenn ich die Antworten durchlese, sehe ich keine andere Option, die mir gefällt, und werde sie auch anbieten. Ich mag die Parametrisierung von Jobs, aber sie lässt sich nicht immer gut skalieren. Wenn Sie Jobs haben, die nicht direkt hinter dem ersten Job, sondern weiter unten in der Pipeline liegen, möchten Sie nicht wirklich jeden Job in der Pipeline parametrisieren, um die Parameter vollständig durchlaufen zu können. Oder wenn Sie eine große Anzahl von Parametern haben, die von einer Vielzahl anderer Jobs verwendet werden (insbesondere diejenigen, die nicht unbedingt an einen übergeordneten oder Master-Job gebunden sind), funktioniert die Parametrisierung erneut nicht.

In diesen Fällen bevorzuge ich die Ausgabe der Werte in eine Eigenschaftendatei und das Einfügen dieser Werte in den von mir benötigten Job mithilfe des EnvInject- Plugins. Dies kann dynamisch erfolgen. Dies ist eine weitere Möglichkeit, das Problem anhand einer anderen Antwort zu lösen, bei der noch parametrisierte Jobs verwendet wurden. Diese Lösung lässt sich in vielen Szenarien sehr gut skalieren.

tbradt
quelle
1

Sie können dazu den Builder von Hudson Groovy verwenden.

Erster Job in der Pipeline

Geben Sie hier die Bildbeschreibung ein

Zweiter Job in der Pipeline

Geben Sie hier die Bildbeschreibung ein

CAMOBAP
quelle
Eine Antwort basierend auf zwei Bildern und einem externen Link ist keine sehr hilfreiche Antwort
Will Barnwell