Gibt es eine bessere Möglichkeit, eine Shell-Task in einer Jenkins 2.0-Pipeline auszuführen und anschließend das stdout
des Befehls zurückzugeben? Die einzige Möglichkeit, dies zum Laufen zu bringen, besteht darin, die Ausgabe des Befehls in eine Datei umzuleiten und die Datei dann in eine Variable einzulesen.
sh('git config --get remote.Origin.url > GIT_URL')
def stdout = readFile('GIT_URL').trim()
Dies scheint eine wirklich schlechte Möglichkeit zu sein, die Ausgabe zurückzugeben. Ich hatte gehofft, ich könnte etwas machen wie:
def stdout = sh('git config --get remote.Origin.url').stdout
oder
def exitcode = sh('git config --get remote.Origin.url').exitcode
Ist das möglich?
Ja, wie luka5z erwähnt, unterstützt Version 2.4 des Pipeline Nodes and Processes Plugins jetzt diese Art von Sachen:
def stdout = sh(script: 'git config --get remote.Origin.url', returnStdout: true)
println stdout
def retstat = sh(script: 'git config --get remote.Origin.url', returnStatus: true)
println retstat
Scheint, wenn Sie versuchen, beide im selben Skript zurückzugeben, wird returnStatus returnStdout überschreiben, was etwas unglücklich ist.
Sie können mehr in der offiziellen Dokumentation lesen hier
Bearbeiten: Darüber hinaus können Sie den Status fehlgeschlagener/instabiler Builds genauer steuern. Sie können ein Beispiel in meinem Kommentar sehen hier
Seit 6/2016 ist JENKINS-261 offiziell als Gelöst markiert. Versuchen Sie daher, bevor Sie die folgenden Problemumgehungen versuchen, zunächst die unterstützten Parameter Implementierung für sh
/bat
, mit denen die Parameter returnStdout
und returnStatus
verwendet werden können.
Leider wird diese Funktion immer noch nicht unterstützt und fehlt. Weitere Informationen entnehmen Sie bitte dem offiziellen Ticket :
JENKINS-26133 Shell-Skript nimmt/gibt Ausgabe/Status zurück Status: Verantwortlicher: Priorität: Lösung: Öffnen Jesse Glick Major Ungelöst
Beschreibung
Derzeit hat sh keinen aussagekräftigen Rückgabewert und löst eine Ausnahme aus, wenn der Exit-Status nicht Null ist. Wäre schön, eine Option zu haben, die den Exit-Code (null oder nicht) als Ganzzahlwert zurückgibt:
def r = sh script: 'someCommand', returnStatus: true
Aktuelle Problemumgehung:
sh 'someCommand; echo $? > status' def r = readFile('status').trim()
Oder um die Standardausgabe (ähnlich wie bei Shell-Backticks) zurückzugeben:
def lines = sh(script: 'dumpStuff.sh', returnStdout: true).split("\r?\n")
Problemumgehung:
sh 'dumpStuff.sh > result' def lines = readFile('result').split("\r?\n")
Oder um etwas auf Standardeingabe nehmen zu lassen:
sh script: 'loadStuff.sh', stdin: someText
Problemumgehung:
writeFile file: 'input', text: someText > sh 'loadStuff.sh < input'
Erfordert wahrscheinlich einige API-Änderungen in der Funktion "Dauerhafte Aufgabe".