Se você deseja obter o stdout AND saber se o comando foi bem-sucedido ou não, basta usá returnStdout
-lo e envolvê-lo em um manipulador de exceções:
pipeline com script
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}")
}
saída :
[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
Infelizmente hudson.AbortException está faltando algum método útil para obter esse status de saída, portanto, se o valor real for necessário, você precisará analisá-lo da mensagem (ugh!)
Ao contrário do Javadoc https://javadoc.jenkins-ci.org/hudson/AbortException.html, a construção não falha quando a exceção é capturada. Ele falha quando é não pegou!
Atualização:
se você também deseja a saída STDERR do comando shell, o Jenkins infelizmente não suporta adequadamente esse caso de uso comum. Um ingresso para 2017 JENKINS-44930 está preso em um estado de pingue-pongue opinativo, enquanto não progride em direção a uma solução - considere adicionar seu voto positivo a ele.
Quanto a uma solução agora , pode haver algumas abordagens possíveis:
a) Redirecione STDERR para STDOUT 2>&1
- mas você decide analisá-lo da saída principal e não obterá a saída se o comando falhar - porque você está no manipulador de exceções.
b) redirecione o STDERR para um arquivo temporário (cujo nome você preparou anteriormente) 2>filename
(mas lembre-se de limpar o arquivo posteriormente) - ie. o código principal se torna:
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) Vá para o outro lado, defina returnStatus=true
, dispense o manipulador de exceções e sempre capture a saída em um arquivo, ou seja:
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
}
Advertência: o código acima é específico para Unix / Linux - o Windows requer comandos shell completamente diferentes.