Comment / quand L'exécution D'un Shell marque-t-elle l'échec d'une construction dans Jenkins?

les histoires d'horreur que j'ai trouvées en cherchant une réponse pour celle-ci...

OK, j'ai un .sh script qui assez bien fait tout Jenkins censé faire:

  • vérifie les sources de SVN
  • construire le projet
  • déploie le projet
  • nettoie après lui-même

donc à Jenkins Je n'ai qu'à "construire" le projet par exécuter le script dans une commande D'exécution Shell. Le script est lancé (les sources sont téléchargées, le projet est construit/déployé) mais ensuite il marque la construction comme un échec: Étape de construction 'exécuter shell' marquée construire comme échec Même si le script a été exécuté avec succès! J'ai essayé de fermer le script avec:

  • exit 0 (marque encore comme d'un échec)
  • la sortie 1 (marques comme d'un échec, comme prévu)
  • pas de commande de sortie du tout (marque comme echec)

quand, comment et pourquoi exécute Shell Marque mon build comme un échec?

98
demandé sur The Des 2014-04-02 18:25:24

6 réponses

tout d'abord, passez la souris au-dessus de la zone grise ci-dessous. Pas partie de la réponse, mais doit absolument être dit:

si vous avez un script shell qui fait "checkout, build, deploy" tout seul, alors pourquoi utilisez-vous Jenkins? Vous oubliez toutes les caractéristiques de Jenkins qui en font ce qu'il est. vous pouvez aussi bien avoir un cron ou un crochet SVN post-commit appeler le script directement . Jenkins exécutant le SVN la caisse elle-même est cruciale. Il permet aux constructions d'être déclenchées seulement quand il y a des changements (ou sur timer, ou manuel, si vous préférez). Il garde la trace des changements entre les constructions. Il montre ces changements, de sorte que vous pouvez voir quelle construction était pour quel ensemble de changements. Il envoie des e-mails aux committers lorsque leurs modifications ont causé une compilation réussie ou un échec (encore une fois, selon la configuration que vous préférez). Il enverra un e-mail aux committers lorsque leurs correctifs auront corrigé la construction défaillante. Et plus et plus. Jenkins archivage des artefacts fait aussi ils sont disponibles, par construction, directement au large de Jenkins. Bien qu'elle ne soit pas aussi cruciale que la caisse SVN, elle fait une fois de plus partie intégrante de ce qui en fait Jenkins. Même avec le déploiement. À moins d'avoir un seul environnement, le déploiement se produit habituellement dans plusieurs environnements. Jenkins peut garder une trace de l'environnement dans lequel une construction spécifique (avec un ensemble spécifique de modifications SVN) est déployée, grâce à l'utilisation de Promotions. Vous perdez tous les de ce. On dirait Qu'on vous dit "vous devez utiliser Jenkins" mais vous ne le voulez pas vraiment, et vous le faites juste pour vous débarrasser de vos patrons, juste pour mettre un crochet "Oui, J'ai utilisé Jenkins

la réponse courte est: le code de sortie de dernier commande de la commande exécuter Shell étape de construction est ce qui détermine le succès/l'échec de étape de construction . 0 - succès, anything else - échec. Remarque, c'est la détermination de la succès / échec de la étape de construction , pas l'ensemble job run . Le succès ou l'échec de l'ensemble de l'exécution du travail peut également être affecté par de multiples étapes de construction, ainsi que par des actions et des plugins post-construction.

vous avez mentionné Build step 'Execute shell' marked build as failure , nous allons donc nous concentrer sur une seule étape de construction. Si votre Exécuter shell étape de génération n'a qu'une seule ligne qui appelle votre shell script, puis le code de sortie de votre script shell déterminera le succès ou l'échec de l'étape de génération. Si vous avez plus de lignes, après votre exécution de script shell, alors examinez-les attentivement, car ce sont celles qui pourraient causer l'échec.

Enfin, à lire ici Jenkins Construire Script se termine après que Google l'exécution du Test de . Il n'est pas directement lié à votre question, mais notez que la partie sur Jenkins lancer le Exécutez Shell étape de construction, comme un script shell avec /bin/sh -xe

le -e signifie que le script shell sort avec un échec, même si seulement une commande échoue, même si vous faites une vérification d'erreur pour cette commande (parce que le script sort avant qu'il arrive à votre vérification d'erreur). Ceci est contraire à l'exécution normale des scripts shell, qui impriment habituellement le message d'erreur pour la commande échouée (ou redirigez-la vers null et manipulez-la par d'autres moyens), et continuez.

pour contourner cela, ajoutez set +e en haut de votre script shell.

puisque vous dites que votre script fait tout ce qu'il est censé faire, il y a des chances que la commande défaillante soit quelque part à la fin du script. Peut-être une dernière écho? Ou une copie d'artefacts quelque part? Sans voir la sortie complète de la console, on ne fait que deviner.

veuillez poster le la sortie de la console de job run, et de préférence le script shell lui-même, et ensuite nous pourrions vous dire exactement quelle ligne échoue.

116
répondu Slav 2017-05-23 12:02:56

réponse simple et courte à votre question Est

veuillez ajouter la ligne suivante dans votre étape de construction" Execute shell".

#!/bin/sh

permettez-moi maintenant de vous expliquer la raison pour laquelle nous avons besoin de cette ligne pour le travail de construction" Execute Shell".

par défaut Jenkins prendre /bin/sh -xe et cela signifie -x affichera chaque commande.Et l'autre option -e , qui empêche shell d'exécuter un script immédiatement quand une commande sort avec un code de sortie non-zéro (quand une commande échoue).

donc en ajoutant le #!/bin/sh vous permettra d'exécuter sans option.

78
répondu Abhijeet Kamble 2015-11-16 18:45:47

simple et simple:

si Jenkins voit l'étape de construction (qui est aussi un script) sortir avec un code non-zéro, la construction est marquée d'une boule rouge (= échec).

la raison pour laquelle cela se produit dépend de votre script de construction.

j'ai écrit quelque chose de similaire d'un autre point de vue mais peut-être qu'il sera utile de le lire de toute façon: pourquoi Jenkins pense que ma construction a réussi?

2
répondu sti 2016-07-10 01:17:56

à mon avis, désactiver l'option -e de votre shell est une très mauvaise idée. Éventuellement, une des commandes de votre script échouera en raison de conditions transitoires telles que l'espace disque ou des erreurs réseau. Sans -e Jenkins ne le remarquera pas et continuera avec joie. Si vous avez Jenkins mis en place pour faire le déploiement, cela peut entraîner un mauvais code obtenir poussé et faire tomber votre site.

si vous avez une ligne dans votre script où l'échec est prévu, comme un grep ou trouver, puis il suffit d'ajouter || true à la fin de la ligne. Cela garantit que la ligne sera toujours de retour de succès.

si vous devez utiliser ce code de sortie, vous pouvez soit hisser la commande dans votre instruction if:

grep foo bar; if [ $? == 0 ]; then ...    -->   if grep foo bar; then ...

ou vous pouvez capturer le code de retour dans votre || clause:

grep foo bar || ret=$?
2
répondu Bryan Larsen 2017-03-17 11:55:51

donc en ajoutant le #!/bin/sh vous permettra d'exécuter sans option.

cela m'a aussi aidé à résoudre un problème où j'exécutais le script bash de Jenkins master sur mon esclave Linux. En ajoutant simplement #!/bin/bash au-dessus de mon script actuel dans le bloc" Execute Shell " il a corrigé mon problème car autrement il exécutait la version fournie par windows git de bash shell qui donnait une erreur.

0
répondu shailender chauhan 2017-10-17 10:03:19

Dans Jenkins ver. 1.635, il est impossible de montrer une variable d'environnement native comme ceci:

$ BUILD_NUMBER or ${BUILD_NUMBER}

Dans ce cas, vous êtes dans une autre variable.

set BUILDNO = $ BUILD_NUMBER $ BUILDNO

0
répondu user10413452 2018-09-25 13:08:34