166 votes

ne pas faire échouer la construction de jenkins si l'exécution du shell échoue

Dans le cadre de mon processus de construction, j'exécute un commit git comme une étape d'exécution du shell. Cependant, s'il n'y a pas de changements dans l'espace de travail, Jenkins échoue la construction. Ceci est dû au fait que git renvoie un code d'erreur lorsqu'il n'y a pas de changement à livrer. J'aimerais soit interrompre la construction, soit simplement le marquer comme instable si c'est le cas. Avez-vous des idées ?

273voto

Quolonel Questions Points 312

Pour arrêter la poursuite de l'exécution lorsque commande échoue :

command || exit 0

Pour poursuivre l'exécution lorsque commande échoue :

command || true

107voto

Xiawei Zhang Points 1188

Jenkins exécute les étapes de construction du shell en utilisant /bin/sh -xe par défaut. -x signifie imprimer chaque commande exécutée. -e signifie sortir avec un échec si l'une des commandes du script a échoué.

Je pense donc que ce qui s'est passé dans votre cas, c'est que votre commande git est sortie avec 1, et à cause de l'option par défaut -e param, le shell capte le code de sortie non-0, ignore le reste du script et marque l'étape comme un échec. Nous pouvons confirmer cela si vous pouvez poster votre étape de construction script ici.

Si c'est le cas, tu peux essayer de mettre #!/bin/sh afin que le script soit exécuté sans option ; ou bien faites un set +e ou quelque chose de similaire en plus de l'étape de construction pour remplacer ce comportement.


Édité : Une autre chose à noter est que, si le dernière commande dans votre shell script renvoie un code différent de 0 l'ensemble de l'étape de construction sera toujours marqué comme un échec même avec cette configuration. Dans ce cas, vous pouvez simplement mettre un true à la fin pour éviter cela.

Autre question connexe

44voto

ecervena Points 441

S'il n'y a rien à pousser, git renvoie le statut de sortie 1. L'étape Execute shell build est marquée comme ayant échoué respectivement. Vous pouvez utiliser l'instruction OR || (double pipe).

git commit -m 'some messasge' || echo 'Commit failed. There is probably nothing to commit.'

Cela signifie qu'il faut exécuter le deuxième argument si le premier a échoué (état de sortie retourné > 0). La deuxième commande renvoie toujours 0. Lorsqu'il n'y a rien à pousser (statut de sortie 1 -> exécution de la deuxième commande), echo renvoie 0 et l'étape de construction continue.

Pour marquer le build comme instable, vous pouvez utiliser l'étape post-build Jenkins Text Finder. Il peut parcourir la sortie de la console, faire correspondre le modèle (votre écho) et marquer la construction comme instable.

32voto

joecks Points 1080

Il y a une autre façon douce de dire à Jenkins de ne pas échouer. Vous pouvez isoler votre livraison dans une étape de construction et définir le shell pour ne pas échouer :

set +e
git commit -m "Bla."
set -e

21voto

Koveras Points 1169

Cette réponse est correcte, mais elle ne spécifie pas le || exit 0 o || true va sur dans la commande shell . Voici un exemple plus complet :

sh "adb uninstall com.example.app || true"

Ce qui précède fonctionnera, mais ce qui suit échouera :

sh "adb uninstall com.example.app" || true

C'est peut-être évident pour d'autres, mais j'ai perdu beaucoup de temps avant de m'en rendre compte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X