J'ai quelque chose comme ça sur un fichier Jenkins (Groovy) et je veux enregistrer la sortie standard et le code de sortie dans une variable afin d'utiliser les informations plus tard.
sh "ls -l"
Comment puis-je faire cela, d'autant plus qu'il semble que vous ne pouvez pas vraiment exécuter de code groovy à l'intérieur de Jenkinsfile
?
Réponses:
La dernière version de l'
sh
étape du pipeline vous permet d'effectuer les opérations suivantes;Une autre caractéristique est l'
returnStatus
option.Ces options ont été ajoutées en fonction de ce problème.
Voir la documentation officielle de la
sh
commande.la source
WorkflowScript: 97: Expected a step @ line 97, column 17.
script
bloc d'étapes. jenkins.io/doc/book/pipeline/syntax/#declarative-stepsLa version actuelle du Pipeline prend en charge nativement
returnStdout
etreturnStatus
, ce qui permet d'obtenir la sortie ou l'état à partir desh
/bat
steps.Un exemple:
Une documentation officielle .
la source
script { }
étape.la réponse rapide est la suivante:
Je pense qu'il existe une demande de fonctionnalité pour pouvoir obtenir le résultat de l'étape sh, mais pour autant que je sache, il n'y a actuellement aucune autre option.
EDIT: JENKINS-26133
EDIT2: Je ne sais pas trop depuis quelle version, mais les étapes sh / bat peuvent maintenant retourner la sortie std, simplement:
la source
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é
sortie :
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: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:Attention: le code ci-dessus est spécifique à Unix / Linux - Windows nécessite des commandes shell complètement différentes.
la source
ceci est un exemple de cas, ce qui aura du sens je crois!
la source
Pour ceux qui ont besoin d'utiliser la sortie dans les commandes shell suivantes, plutôt que groovy, quelque chose comme cet exemple pourrait être fait:
J'ai trouvé les exemples sur le code maven très utiles.
la source
Le moyen le plus simple est d'utiliser de cette façon
my_var=`echo 2` echo $my_var
sortie: 2notez que ce n'est pas une simple citation simple, c'est une citation de retour (`).
la source
sh
autre, sinon les gens pourraient penser que c'est groovy, surtout s'ils ne sont pas familiers avec les scripts bash. Je viens de l'essayer sur Jenkins, en utilisantls -l
au lieu deecho 2
et cela fonctionne. J'avais déjà utilisé cette approche auparavant, mais je cherchais une alternative parce que ce n'est pas très fiable. J'ai la sortie d'une commande plus complexe capturée sur un shell standard de cette façon, mais lorsqu'elle est portée sur Jenkins,sh
la variable ne contient rien, pour une raison inconnue.