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
try {
// Fails with non-zero exit if dir1 does not exist
def dir1 = sh(script:'ls -la dir1', returnStdout:true).trim()
} catch (Exception ex) {
println("Unable to read dir1: ${ex}")
}
Ausgabe :
[Pipeline] sh
[Test-Pipeline] Running shell script
+ ls -la dir1
ls: cannot access dir1: No such file or directory
[Pipeline] echo
unable to read dir1: hudson.AbortException: script returned exit code 2
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:
def stderrfile = 'stderr.out'
try {
def dir1 = sh(script:"ls -la dir1 2>${stderrfile}", returnStdout:true).trim()
} catch (Exception ex) {
def errmsg = readFile(stderrfile)
println("Unable to read dir1: ${ex} - ${errmsg}")
}
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:
def outfile = 'stdout.out'
def status = sh(script:"ls -la dir1 >${outfile} 2>&1", returnStatus:true)
def output = readFile(outfile).trim()
if (status == 0) {
// output is directory listing from stdout
} else {
// output is error message from stderr
}
Vorsichtsmaßnahme: Der obige Code ist Unix / Linux-spezifisch - Windows erfordert völlig andere Shell-Befehle.