2016-07-14 5 views
0

Ich habe ein paar Build-Skripte, die ich in meinem Jenkins CI-Server arbeiten. Um die Dinge organisiert zu halten, tendiere ich dazu, jeden Abschnitt "Shell ausführen" des Jobs kleiner und isoliert im Umfang zu halten.Behalten konfigurierte Variablen zwischen "Execute Shell" -Abschnitten in Jenkins

Angenommen, ich baue einen Zeichenfolgenwert auf, den ich später an verschiedenen Stellen in meinem Job verwenden möchte. (ZB Name der Tags, Nachricht mit dem Tag zugeordnet ist, Datumsformat, etc ...)

Execute Shell #1 
# Utilizing Multiple Lines and temporary variables for readability 
tagName="$tagName_Sub1 $tagName_Sub2 $tagName_Sub3" 

Execute Shell #2 
# Build Script - tagName is an argument to my build script 
run build_job $tagName 

Execute Shell #3 
# Tag Git 
git tag -a $tagName 

Execute Shell #4 
# Something else 
echo "Hello World, $tagName" 
+0

Es sieht aus, als was Sie eigentlich wollen, ist ein Array, keine Zeichenfolge. Berücksichtigen Sie * das Definieren * eines Arrays: 'tagNames = (" $ tagName_Sub1 "" $ tagName_Sub2 "" $ tagName_Sub3 ")', dann verwenden Sie es entsprechend mit '" $ {tagNames [@]} "'. –

+0

Andernfalls haben Sie eine sehr unangenehme Zeit, wenn Sie versuchen, einen Tag-Namen mit einem literalen Leerzeichen darin zu verwenden, mit Leerzeichen, die temporär zu IFS hinzugefügt wurden oder die als interpretiert werden können glob, der dem Dateisysteminhalt entspricht. –

+0

... siehe http://mywiki.wooledge.org/BashFAQ/050 - die Vorbehalte und Hinweise in diesem Abschnitt gelten für jeden Fall, in dem '$ foo' (ohne umgebende doppelte Anführungszeichen) als Teil der Befehlszeilengenerierung verwendet wird. –

Antwort

1

Es keine allgemeine Antwort existiert: Man kann Variablen exportieren nur auf dem direkten Teilprozesse ohne direkte Zusammenarbeit von a Elternprozess; Mit einem Build-Verzeichnis erhalten Sie jedoch einen gemeinsamen Speicher, der zusammen mit Ihren Geschwistern verwendet werden kann.


Sie also declare -p können Sie eine Skriptkomponente erzeugen, die, wenn sie stammen, eine Variable neu erstellen wird, wie es im Stand der Shell-Instanz existiert:

declare -p tagName >vars # optionally, you can put more than one variable name here 

... dann, in anderen Code :

source vars # import all variables written to the file 

mit declare -p serialisiert Status in Bezug auf die nicht nur Inhalte, ob eine Variable (entsprechend zitiert oder entkam sicher gelesen werden kann), aber auch gewesen exportiert; ob es ein Array oder eine reguläre Zeichenfolge ist; ob es für eine spezielle Behandlung als Integer gekennzeichnet ist; und stellt ansonsten sicher, dass das, was du herausholst, wirklich das ist, was du gerettet hast.

Stellen Sie sicher, dass alle beteiligten Skripte tatsächlich mit /bin/bash ausgeführt werden, nicht /bin/sh; Dies ist eine Bash-spezifische Syntax.

+0

Danke, das hat super funktioniert. Ich habe alles zu "Vars" deklariert und ich habe "Source Vars" an die Spitze aller meiner Execute Shell-Blöcke hinzugefügt und alles hat funktioniert. – FishStix

Verwandte Themen