Si vous voulez obtenir le stdout ET savoir si la commande a réussi ou non, utilisez simplement returnStdout
et l'envelopper dans un gestionnaire d'exception :
Pipeline scénarisé
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, il manque à hudson.AbortException une méthode utile pour obtenir ce statut de sortie, donc si la valeur réelle est requise, vous devrez l'analyser à partir du message (ugh !).
Contrairement à la Javadoc https://javadoc.jenkins-ci.org/hudson/AbortException.html la construction est no a échoué lorsque cette exception est attrapée. Il échoue quand il est no attrapé !
Mise à jour : Si vous souhaitez également obtenir la sortie STDERR de la commande shell, Jenkins ne prend malheureusement pas correctement en charge ce cas d'utilisation courant. Un billet de 2017 JENKINS-44930 est coincé dans un état de ping-pong d'opinion tout en ne faisant aucun progrès vers une solution - s'il vous plaît envisager d'ajouter votre upvote à elle.
Quant à une solution maintenant il y a plusieurs approches possibles :
a) Rediriger STDERR vers STDOUT 2>&1
- mais c'est ensuite à vous de l'analyser dans la sortie principale, et vous n'obtiendrez pas la sortie si la commande a échoué - parce que vous êtes dans le gestionnaire d'exception.
b) rediriger STDERR vers un fichier temporaire (dont vous avez préparé le nom plus tôt) 2>filename
(mais n'oubliez pas de nettoyer le fichier par la suite) - c'est-à-dire que 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) Aller dans l'autre sens, mettre returnStatus=true
à la place, ne pas utiliser le gestionnaire d'exception et toujours capturer 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 requiert des commandes shell complètement différentes.
3 votes
Duplicata de stackoverflow.com/questions/36507410/ .
0 votes
Duplicata possible de Est-il possible de capturer le stdout de la commande sh DSL dans le pipeline ?