Si desea obtener el stdout Y saber si el comando tuvo éxito o no, simplemente utilícelo returnStdout
y envuélvalo en un controlador de excepciones:
tubería guionizada
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}")
}
salida :
[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
Desafortunadamente, a hudson.AbortException le falta algún método útil para obtener ese estado de salida, por lo que si se requiere el valor real, deberá analizarlo en el mensaje (¡uf!)
Contrariamente al Javadoc https://javadoc.jenkins-ci.org/hudson/AbortException.html, la compilación no falla cuando se detecta esta excepción. Se produce un error cuando se no atrapado!
Actualización:
si también desea la salida STDERR del comando de shell, Jenkins desafortunadamente no admite adecuadamente ese caso de uso común. Un boleto 2017 JENKINS-44930 está atrapado en un estado de ping-pong obstinado mientras no avanza hacia una solución, considere agregar su voto positivo.
En cuanto a una solución ahora , podría haber un par de enfoques posibles:
a) Redirige STDERR a STDOUT 2>&1
, pero depende de ti analizar eso de la salida principal, y no obtendrás la salida si el comando falló, porque estás en el controlador de excepciones.
b) redirija STDERR a un archivo temporal (el nombre del cual preparó antes) 2>filename
(pero recuerde limpiar el archivo después), es decir. el código principal se convierte en:
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) Vaya hacia el otro lado, configure en su returnStatus=true
lugar, prescinda del controlador de excepciones y siempre capture la salida en un archivo, es decir:
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
}
Advertencia: el código anterior es específico de Unix / Linux: Windows requiere comandos de shell completamente diferentes.