2014-10-22 6 views
5

Ich habe ein Build-Flow-Szenario ähnlich dem documentation example: zwei Jobs, einer nach dem anderen.Jenkins + Build Flow, wie man eine Variable von einem Job zu einem anderen übergibt

b = build("job1") 
build("job2", param1: b.????) 

Mein job1 ist ein Shell-Skript, das ein Paket aus einem ausgecheckt git repositoy baut und druckt die Version des integrierten Pakets aus.

Ich muss die Version von job1 (parse output ??) extrahieren und irgendwie als Parameter zu job2 zur Verfügung stellen. Wie kann dies erreicht werden? Bitte beachten Sie, dass ich die Version vor dem Ausführen von job1 nicht kennen kann.

Antwort

9

Das Problem bei der einfachen Verwendung von export in einem Shellskript-Buildschritt besteht darin, dass die exportierten Variablen verschwinden, wenn das Shellskript beendet wird. Sie werden nicht an den Job weitergegeben.

Verwenden Sie EnvInject plugin, um Umgebungsvariablen in Ihrem Build zu erstellen. Wenn Sie eine Eigenschaftendatei als Teil Ihres Builds ausschreiben, kann EnvInject die Datei lesen und inject variables as a build step. Eine Eigenschaftendatei hat ein einfaches KEY=VALUE Format:

MY_BUILD_VERSION=some_parsed_value 

Sobald Sie eine Umgebungsvariable in Ihrem Job eingestellt haben, im Build Flow- Plugin können Sie den Wert der Variablen extrahieren und sie in den Folgeaufträge verwenden:

def version = build.environment.get("MY_BUILD_VERSION") 
out.println String.format("Parameters: version: %s", version) 
build("My Second Build", MY_BUILD_VERSION: version) 
+0

Funktioniert das für Sie? Ich erstelle eine 'vars.txt'-Eigenschaftendatei ('MY_BUILD_VERSION = something') und" inject variables "als nächsten Buildschritt als Teil von' job1' verwenden. Aber aus irgendeinem Grund wird die Version in buildflow als 'null' ausgegeben, nachdem' job1' ausgelöst wurde (anhand Ihres Beispiels als Code) – Unknown

+0

Nevermind, ich habe es herausgefunden, ich habe 'b = build ('job-1')' gemacht und versuche 'build.environment.get()'; 'b.environment.get()' funktioniert einwandfrei . Vielen Dank! – Unknown

0

Wenn Sie job1 ausführen, exportieren Sie die Version mit Name als Systemeigenschaft.

Dann hängt es davon ab, ob Sie wissen, wie lang die Version ist (Anzahl der Zahlen oder andere Zeichen). Wenn Sie es wissen, können Sie Variable vom Ende im zweiten Build als neue Variable analysieren und verwenden.

Wie Parse String finden Sie in this question with nice examples.

+0

Haben Sie ein Beispiel dafür? Weil es in meinen Tests scheint es nicht; Die Umgebung wird nicht von einem Job zum anderen erhalten. – Unknown

+0

Eigentlich nicht, wir benutzen Jenkins nur gelegentlich. Wenn Sie jedoch ein Bash-Skript als build1 ausführen, können Sie die Variable als Systemvariable exportieren und im zweiten Build können Sie diese Variable verwenden. Oder kannst du mehr Infos dazu (Screenshots von Jenkins, Code, ...) einfügen? –

+0

Siehe meine Konfiguration hier. http://imgur.com/a/rT72w – Unknown

0

Wenn job2 immer Informationen von job1 erhalten soll, können Sie die Methode ohne Parameter verwenden. job1 könnte Artefakte mit Version veröffentlichen und job2 wird dieses Artefakt verwenden (z. B. mit Copy Artifact Plugin). Mit diesem Ansatz könnte job2 auch als eigenständiger Job ausgeführt werden.

0

Für alle anderen auf das kommende, ist eine andere Lösung, die ein scriptler Skript zu verwenden, wo Sie in der .properties Dateipfad übergeben, und das Skript werden die Eigenschaften in die Liste der Jobvariablen hinzufügen:

Properties properties = new Properties() 

FilePath workspace = build.getWorkspace() 
FilePath sourceFile = workspace.child(path) 

properties.load(sourceFile.read()) 

properties.each { key, value -> 
    key = key.replace(".", "_").toUpperCase() 
    Job.setVariable(build, key, value) 

    println "Created Variable: " + key + "=" + value 
} 

Dadurch werden alle Perioden in Unterstriche konvertiert und alle Buchstaben großgeschrieben. Die Verwendung eines Script-Skripts stellt sicher, dass Sie eine Methode haben, die unabhängig von der von Ihnen verwendeten "Plugin-Suppe" funktioniert.