Jeśli chcesz uzyskać standardowe wyjście ORAZ wiedzieć, czy polecenie się powiodło, czy nie, po prostu użyj returnStdout
i umieść je w module obsługi wyjątków:
potok skryptowy
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}")
}
wynik :
[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
Niestety hudson.AbortException nie ma żadnej użytecznej metody uzyskania tego statusu wyjścia, więc jeśli wymagana jest rzeczywista wartość, musisz ją przeanalizować z komunikatu (ugh!)
W przeciwieństwie do Javadoc https://javadoc.jenkins-ci.org/hudson/AbortException.html kompilacja nie kończy się niepowodzeniem, gdy ten wyjątek zostanie przechwycony. Kończy się niepowodzeniem, gdy jest zostanie złapany!
Aktualizacja:
Jeśli chcesz również otrzymać wynik STDERR z polecenia powłoki, Jenkins niestety nie obsługuje poprawnie tego typowego przypadku użycia. Bilet na 2017 rok JENKINS-44930 na rok utknął w stanie upartego ping-ponga, nie czyniąc postępów w kierunku rozwiązania - prosimy o dodanie do niego opinii.
Co do rozwiązania teraz , nie może być kilka możliwych rozwiązań:
a) Przekieruj STDERR do STDOUT 2>&1
- ale to od Ciebie zależy, czy parsujesz to z głównego wyjścia, ale nie dostaniesz wyjścia, jeśli polecenie się nie powiedzie - ponieważ jesteś w procedurze obsługi wyjątków.
b) przekieruj STDERR do pliku tymczasowego (którego nazwę przygotujesz wcześniej) 2>filename
(ale pamiętaj, aby wyczyścić plik później) - tj. główny kod staje się:
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) Idź w drugą stronę, returnStatus=true
zamiast tego ustaw , zrezygnuj z procedury obsługi wyjątków i zawsze przechwytuj dane wyjściowe do pliku, tj .:
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
}
Uwaga: powyższy kod jest specyficzny dla Uniksa / Linuksa - Windows wymaga zupełnie innych poleceń powłoki.