Dans le cadre de mon processus de construction, j'exécute un commit git en tant qu'étape d'exécution du shell. Cependant, s'il n'y a aucune modification dans l'espace de travail, Jenkins échoue la construction. C'est parce que git renvoie un code d'erreur lorsqu'il n'y a pas de modifications à valider. Je voudrais soit abandonner la construction, soit simplement la marquer comme instable si tel est le cas. Des idées?
132
Réponses:
Pour arrêter la poursuite de l'exécution lorsque la commande échoue:
command || exit 0
Pour continuer l'exécution lorsque la commande échoue:
command || true
la source
|| exit 0
dans le premier cas, sicommand
retourne false, l'exécution s'arrêtera. Cela dit, la deuxième option est très utile!exit 0
car tout code de sortie non nul échouera la construction.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 quitter avec un échec si l'une des commandes du script a échoué.Donc, je pense que ce qui s'est passé dans votre cas est votre sortie de commande git avec 1, et à cause du
-e
paramètre par défaut , le shell récupère le code de sortie non-0, ignore le reste du script et marque l'étape comme un échec. Nous pouvons le confirmer si vous pouvez publier votre script d'étape de construction ici.Si c'est le cas, vous pouvez essayer de mettre de
#!/bin/sh
sorte que le script soit exécuté sans option; ou faites uneset +e
ou quelque chose de similaire en plus de l'étape de génération pour remplacer ce comportement.Modifié: Une autre chose à noter est que, si la dernière commande de votre script shell renvoie du code non-0 , toute l'étape de construction sera toujours marquée comme échec même avec cette configuration. Dans ce cas, vous pouvez simplement mettre une
echo
commande à la fin pour éviter cela.Une autre question connexe
la source
S'il n'y a rien à pousser, git renvoie l'état de sortie 1. L'étape d'exécution de la construction du shell est marquée comme ayant échoué respectivement. Vous pouvez utiliser l'instruction OR || (double tuyau).
Cela signifie, exécutez le deuxième argument en cas d'échec du premier (état de sortie renvoyé> 0). La deuxième commande renvoie toujours 0. Lorsqu'il n'y a rien à pousser (état de sortie 1 -> exécution de la deuxième commande), l'écho renverra 0 et l'étape de construction continue.
Pour marquer la construction comme instable, vous pouvez utiliser l'étape de post-construction Jenkins Text Finder. Il peut passer par la sortie de la console, faire correspondre le modèle (votre écho) et marquer la construction comme instable.
la source
Il existe un autre moyen simple de dire à Jenkins de ne pas échouer. Vous pouvez isoler votre validation dans une étape de construction et définir le shell pour ne pas échouer:
la source
set -e
après la commande que vous souhaitez exécuter quel que soit le code de sortie. Sinon, vous risquez d'exécuter des commandes que vous n'avez pas l'intention de faire. Je voulais gérer l'erreur moi-même, alors j'ai fait quelque chose comme: `set + e commit -m" bla "EXIT_CODE =" $ {?} "Set -e # gérer la logique du code deJenkins détermine le succès / l'échec d'une étape par la valeur de retour de l'étape. Dans le cas d'un shell, ce devrait être le retour de la dernière valeur. Pour les shells Windows CMD et (POSIX) Bash, vous devez pouvoir définir la valeur de retour manuellement en utilisant
exit 0
comme dernière commande.la source
exit 0
avec "exécuter la commande batch windows" dans plusieurs versions sur mon installation Windows Jenkins, et cela fonctionne comme prévu. Quelque chose d'autre doit se passer. Pourriez-vous publier la partie pertinente du journal de la console?#!/bin/sh -xv
consiste à exécuter un shell qui entraîne l'arrêt du script si une erreur est rencontrée.J'ai pu faire fonctionner cela en utilisant la réponse trouvée ici:
Comment git ne rien commettre sans erreur?
la source
git diff
Exécutez la commande, et si cela échoue, exécutez lagit commit
commande. Fondamentalement, il ne fait la validation que sigit diff
quelque chose à valider a été trouvé. Cependant, la réponse @jwernerny était correcte que vous devriez pouvoir ajouterexit 0
comme dernière instruction à n'importe quel script pour que Jenkins le considère comme un succès. Je peux penser à un scénario où cela échouerait si vous faisiez une étape de shell Linux, mais dans Batch cela devrait toujours fonctionner./bin/sh -xe
par défaut comme mentionné ici (au milieu). Ainsi, vous pouvez essayer de mettre#!/bin/bash
ou de faire unset +e
au-dessus de l'étape de construction pour remplacer ce comportement, ce qui continuera le reste de l'étape même une commande à l'intérieur de la sortie avec un code non-0Sur la question (plus générale) du titre - pour éviter l'échec de Jenkins, vous pouvez l'empêcher de voir le code de sortie 1. Exemple pour ping:
Et maintenant, vous pouvez par exemple obtenir la sortie du ping:
Bien sûr, au lieu de
ping ...
Vous pouvez utiliser n'importe quelle commande, y comprisgit commit
.la source
https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script
si vous incluez une propriété returnStatus: true, le retour du shell est ignoré.
la source
Vous pouvez utiliser le plugin Text-finder . Cela vous permettra de vérifier la console de sortie pour une expression de votre choix puis de marquer la construction comme
Unstable
.la source
Pour plusieurs commandes shell, j'ignore les échecs en ajoutant:
set +e commands true
la source
Si vous mettez ces commandes dans le bloc shell:
votre build sera marqué comme échec (au moins 1 code de sortie différent de zéro), vous pouvez donc ajouter (set + e) pour l'ignorer:
n'échouera pas. Cependant, cela échouera même avec (set + e) en place:
car la dernière commande shell doit quitter avec 0.
la source
Ce qui suit fonctionne pour mercurial en ne validant que s'il y a des changements. Ainsi, la construction échoue uniquement si la validation échoue.
la source
Une autre réponse avec quelques conseils peut être utile pour quelqu'un:
n'oubliez pas de séparer vos commandes avec la règle suivante :
commande1 && command2 - signifie que la commande2 sera exécutée, uniquement si la commande1 réussit
command1 ;command2 - signifie que la commande 2 sera exécutée malgré le résultat de la commande1
par exemple:
sera exécuté avec succès avec les commandes
set -e
et enecho 0
cas d'gmake test
échec (vos tests ont échoué), tandis que le code suivant est extrait:un peu faux et les commandes
set -e
etecho 0
in&& gmake test && set -e && echo 0
seront ignorées, avec l'println run_tests
instruction, car échouégmake test
entraînera l'annulation de la construction de jenkins. Pour contourner le problème, vous pouvez basculer versreturnStatus:true
, mais vous manquerez la sortie de votre commande.la source
Cette réponse est correcte, mais elle ne spécifie pas la commande
|| exit 0
ou|| true
entre dans la commande shell . Voici un exemple plus complet:Ce qui précède fonctionnera, mais ce qui suit échouera:
C'est peut-être évident pour les autres, mais j'ai perdu beaucoup de temps avant de m'en rendre compte.
la source