Ich habe so etwas in einer Jenkins-Datei (Groovy) und möchte den Standard- und den Exit-Code in einer Variablen aufzeichnen, um die Informationen später zu verwenden.
sh "ls -l"
Wie kann ich das tun, zumal es den Anschein hat, dass Sie keinen wirklich groovigen Code innerhalb von ausführen können Jenkinsfile
?
Antworten:
Mit der neuesten Version des Pipeline-
sh
Schritts können Sie Folgendes tun:Ein weiteres Feature ist die
returnStatus
Option.Diese Optionen wurden aufgrund dieses Problems hinzugefügt .
Siehe offizielle Dokumentation zum
sh
Befehl.quelle
WorkflowScript: 97: Expected a step @ line 97, column 17.
script
Schrittblocks funktioniert . jenkins.io/doc/book/pipeline/syntax/#declarative-stepsDie aktuelle Pipeline-Version unterstützt nativ
returnStdout
undreturnStatus
, wodurch die Ausgabe oder der Status vonsh
/bat
step abgerufen werden kann.Ein Beispiel:
Eine offizielle Dokumentation .
quelle
script { }
Schritt zu verpacken .Die schnelle Antwort lautet:
Ich denke, es gibt eine Feature-Anfrage, um das Ergebnis von sh step zu erhalten, aber soweit ich weiß, gibt es derzeit keine andere Option.
EDIT: JENKINS-26133
EDIT2: Nicht ganz sicher seit welcher Version, aber sh / bat Schritte können jetzt die Standardausgabe zurückgeben, einfach:
quelle
Wenn Sie die Standardausgabe erhalten möchten UND wissen möchten, ob der Befehl erfolgreich war oder nicht, verwenden Sie ihn einfach
returnStdout
und verpacken Sie ihn in einen Ausnahmebehandler:Skript-Pipeline
Ausgabe :
Leider fehlt bei hudson.AbortException eine nützliche Methode, um diesen Exit-Status zu erhalten. Wenn also der tatsächliche Wert erforderlich ist, müssen Sie ihn aus der Nachricht analysieren (ugh!).
Im Gegensatz zu Javadoc https://javadoc.jenkins-ci.org/hudson/AbortException.html ist der Build nicht fehlgeschlagen, wenn diese Ausnahme abgefangen wird. Es schlägt fehl, wenn es nicht gefangen wird!
Update: Wenn Sie auch die STDERR-Ausgabe vom Shell-Befehl erhalten möchten, unterstützt Jenkins diesen allgemeinen Anwendungsfall leider nicht richtig. Ein Ticket für 2017 JENKINS-44930 steckt in einem Ping-Pong-Zustand, ohne Fortschritte bei der Lösung zu machen. Bitte fügen Sie Ihre Gegenstimme hinzu.
Für eine Lösung könnte es jetzt einige mögliche Ansätze geben:
a) Leiten
2>&1
Sie STDERR zu STDOUT um - aber es liegt dann an Ihnen, dies aus der Hauptausgabe zu analysieren, und Sie erhalten die Ausgabe nicht, wenn der Befehl fehlschlägt - weil Sie sich im Ausnahmebehandler befinden.b) Leiten Sie STDERR in eine temporäre Datei um (deren Namen Sie zuvor vorbereitet haben)
2>filename
(denken Sie jedoch daran, die Datei anschließend zu bereinigen). Hauptcode wird:c) Gehen Sie in die andere Richtung, setzen Sie
returnStatus=true
stattdessen, verzichten Sie auf den Ausnahmebehandler und erfassen Sie die Ausgabe immer in einer Datei, dh:Vorsichtsmaßnahme: Der obige Code ist Unix / Linux-spezifisch - Windows erfordert völlig andere Shell-Befehle.
quelle
Dies ist ein Beispielfall, der meiner Meinung nach Sinn machen wird!
quelle
Für diejenigen, die die Ausgabe in nachfolgenden Shell-Befehlen verwenden müssen, anstatt groovig zu sein, könnte so etwas wie dieses Beispiel getan werden:
Ich fand die Beispiele auf Code Maven sehr nützlich.
quelle
Der einfachste Weg ist, diesen Weg zu benutzen
my_var=`echo 2` echo $my_var
Ausgabe: 2Beachten Sie, dass ein einfaches Anführungszeichen kein einfaches Anführungszeichen (`) ist.
quelle
sh
anderen verpackt werden sollten, sonst könnten die Leute denken, dass es groovig ist, besonders wenn sie nicht mit Bash-Skripten vertraut sind. Ich habe es gerade bei Jenkins ausprobiert,ls -l
stattecho 2
und es funktioniert. Ich hatte diesen Ansatz schon einmal verwendet, habe aber nach einer Alternative gesucht, weil sie nicht sehr zuverlässig ist. Ich habe die Ausgabe eines komplexeren Befehls auf diese Weise auf einer Standard-Shell erfasst, aber wenn sie auf die Jenkins portiert wird, enthältsh
die Variable aus einem unbekannten Grund nichts.