Si vous voulez obtenir la sortie standard ET savoir si la commande a réussi ou non, utilisez simplement returnStdout
et encapsulez-la dans un gestionnaire d'exceptions:
pipeline 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}")
}
sortie :
[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
Malheureusement, hudson.AbortException ne contient aucune méthode utile pour obtenir ce statut de sortie, donc si la valeur réelle est requise, vous devrez l'analyser hors du message (ugh!)
Contrairement au Javadoc https://javadoc.jenkins-ci.org/hudson/AbortException.html, la génération n'est pas échouée lorsque cette exception est interceptée. Il échoue quand il n'est pas pris!
Mise à jour:
si vous souhaitez également la sortie STDERR de la commande shell, Jenkins ne parvient malheureusement pas à prendre correctement en charge ce cas d'utilisation courant. Un billet 2017 JENKINS-44930 est coincé dans un état de ping-pong avisé sans faire de progrès vers une solution - veuillez envisager d'y ajouter votre vote positif.
En ce qui concerne une solution maintenant , il pourrait y avoir deux approches possibles:
a) Redirigez STDERR vers STDOUT 2>&1
- mais c'est ensuite à vous de l'analyser hors de la sortie principale, et vous n'obtiendrez pas la sortie si la commande a échoué - parce que vous êtes dans le gestionnaire d'exceptions.
b) rediriger STDERR vers un fichier temporaire (dont vous préparez le nom plus tôt) 2>filename
(mais n'oubliez pas de nettoyer le fichier par la suite) - ie. le code principal devient:
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) Dans l'autre sens, définissez returnStatus=true
plutôt, supprimez le gestionnaire d'exceptions et capturez toujours la sortie dans un fichier, c'est-à-dire:
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
}
Attention: le code ci-dessus est spécifique à Unix / Linux - Windows nécessite des commandes shell complètement différentes.