ne ratez pas jenkins build si execute shell échoue

dans le cadre de mon processus de construction, j'exécute un git commit comme une étape d'exécution shell. Cependant, S'il n'y a aucun changement dans L'espace de travail, Jenkins échoue. C'est parce que git renvoie un code d'erreur quand il n'y a aucun changement à propager. J'aimerais annuler la construire, ou tout simplement le marquer comme instable si c'est le cas. Des idées?

80
demandé sur Grant Garrison 2013-01-18 08:22:17

11 réponses

pour arrêter l'exécution lorsque commande échoue:

command || exit 0

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

command || true

130
répondu Quolonel Questions 2014-09-09 13:13:11

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

donc je pense que ce qui s'est passé dans votre cas est votre commande git exit avec 1, et à cause du paramètre par défaut -e , le shell prend 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 poster votre script étape de construction ici.

si c'est le cas, vous pouvez essayer de mettre #!/bin/sh pour que le script soit exécuté sans option; ou faire un set +e ou n'importe quoi de similaire en haut de l'étape de construction pour outrepasser ce comportement.


Édité: une Autre chose à noter est que, si le dernière commande dans votre script shell renvoie non 0 code , de la construction entière l'étape sera encore marquée comme un échec, même avec cette configuration. Dans ce cas, vous pouvez simplement mettre une commande echo à la fin pour éviter cela.

une Autre question relative à la

55
répondu Xiawei Zhang 2017-05-23 12:18:02

S'il n'y a rien pour pousser git retourne l'état de sortie 1. Execute shell build step est marqué comme ayant échoué respectivement. Vous pouvez utiliser ou statement || (Double pipe).

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

qui signifie, exécuter le deuxième argument si le premier a échoué (état de sortie retourné > 0). La deuxième commande renvoie toujours 0. Quand il n'y a rien à pousser (exit status 1 -> execute second command), echo renvoie 0 et build step continue.

pour marquer build comme unstable vous pouvez utiliser Step Jenkins Text Finder. Il peut passer par la sortie de la console, correspondre au motif (votre écho) et marquer la construction comme instable.

36
répondu ecervena 2013-10-17 10:44:33

il y a une autre façon douce de dire à Jenkins de ne pas échouer. Vous pouvez isoler votre commit dans une étape de compilation et configurer le shell pour qu'il n'échoue pas:

set +e
git commit -m "Bla."
set -e
10
répondu joecks 2017-05-04 12:46:20

Jenkins détermine le succès ou l'échec d'une étape par la valeur de retour de l'étape. Pour le cas de shell, il devrait être le retour de la dernière valeur. Pour les coquilles de Windows CMD et (POSIX) Bash, vous devriez pouvoir définir la valeur de retour manuellement en utilisant exit 0 comme dernière commande.

7
répondu jwernerny 2013-01-18 14:55:13

j'ai pu obtenir ce travail en utilisant la réponse trouvée ici:

Comment git commit rien sans une erreur?

git diff --quiet --exit-code --cached || git commit -m 'bla'
7
répondu Ben 2017-05-23 11:54:47

sur la question (plus générale) dans le titre - pour empêcher Jenkins de tomber, vous pouvez l'empêcher de voir le code de sortie 1. Exemple pour ping:

bash -c "ping 1.2.3.9999 -c 1; exit 0"

et maintenant vous pouvez par exemple obtenir la sortie de ping:

output=`bash -c "ping 1.2.3.9999 -c 1; exit 0"`

bien sûr au lieu de ping ... vous pouvez utiliser n'importe quelle commande - y compris git commit .

6
répondu Nux 2013-11-20 11:05:03

vous pouvez utiliser le Plugin de recherche de texte . Il vous permettra de vérifier la console de sortie pour une expression de votre choix puis de marquer la construction comme Unstable .

5
répondu jphuynh 2013-01-18 09:11:20

si vous mettez ces commandes dans le bloc shell:

false
true

votre construction sera marquée comme fail( au moins 1 code de sortie non-zero), donc vous pouvez ajouter (mettre +e) pour l'ignorer:

set +e
false
true

n'échouera pas. Cependant, cela échouera même avec le (set +e) en place:

set +e
false

parce que la dernière commande shell doit sortir avec 0.

2
répondu chenchuk 2016-11-30 19:35:52

les travaux suivants pour mercurial en commettant seulement s'il y a des changements. Donc la construction échoue seulement si la propagation échoue.

hg id | grep "+" || exit 0
hg commit -m "scheduled commit"
1
répondu Shaun Lebron 2013-02-05 21:00:20

https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script

si vous incluez une propriété returnStatus: true, alors le retour shell est ignoré.

1
répondu jaxxed 2018-07-04 16:17:12