n’échoue pas la construction de jenkins si l’exécution du shell échoue

Dans le cadre de mon processus de compilation, je lance un commit git en tant qu’étape d’exécution du shell. Cependant, s’il n’y a aucun changement dans l’espace de travail, Jenkins échoue à la génération. C’est parce que git renvoie un code d’erreur lorsqu’il n’y a pas de modifications à valider. Je voudrais soit interrompre la construction, soit la marquer comme instable si tel est le cas. Des idées?

Pour arrêter l’exécution ultérieure lorsque la commande échoue:

command || exit 0

Pour continuer l’exécution lorsque la commande échoue:

command || true

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 la sortie de la commande git avec 1, et à cause du paramètre -e par défaut, le shell récupère le code de sortie non 0, ignore le rest du script et marque l’échec. Nous pouvons le confirmer si vous pouvez poster votre script d’étape de construction ici.

Si tel est le cas, vous pouvez essayer de mettre #!/bin/sh pour que le script soit exécuté sans option; ou faites un set +e ou quelque chose de similaire en haut de l’étape de construction pour remplacer ce comportement.


Edited: Une autre chose à noter est que, si la dernière commande de votre script shell retourne du code non-0 , toute l’étape de construction sera toujours 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 connexe

S’il n’y a rien à pousser, git renvoie le statut de sortie 1. Exécuter l’étape de construction du shell est marqué 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 que vous devez exécuter le second argument si le premier échoue (retourne le statut de sortie> 0). La deuxième commande renvoie toujours 0. Lorsqu’il n’y a rien à pousser (état de sortie 1 -> exécuter la deuxième commande), echo renvoie 0 et l’étape de construction continue.

Pour marquer la construction comme instable, vous pouvez utiliser l’étape post-build Jenkins Text Finder. Il peut passer par la sortie de la console, faire correspondre le motif (votre écho) et marquer la création comme instable.

Il y a un autre moyen facile de dire à Jenkins de ne pas échouer. Vous pouvez isoler votre commit dans une étape de construction et configurer le shell pour qu’il n’échoue pas:

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

Jenkins détermine le succès / l’échec d’une étape par la valeur de retour de l’étape. Dans le cas d’un shell, cela devrait être le retour de la dernière valeur. Pour les shells Windows CMD et (POSIX) Bash, vous devez pouvoir définir manuellement la valeur de retour en utilisant la exit 0 comme dernière commande.

J’ai pu faire fonctionner ceci en utilisant la réponse trouvée ici:

Comment git ne commet rien sans erreur?

 git diff --quiet --exit-code --cached || git commit -m 'bla' 

Sur la question (plus générale) dans le titre – pour empêcher Jenkins de ne pas réussir, 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 une 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 .

Vous pouvez utiliser le plug-in Text-Finder . Il vous permettra de vérifier la console de sortie pour une expression de votre choix, puis de marquer la construction comme étant Unstable .

Si vous placez ces commandes dans le bloc shell:

 false true 

votre build sera marqué comme échec (au moins 1 code de sortie différent de zéro), vous pouvez donc append (set + e) ​​pour l’ignorer:

 set +e false true 

ne va pas échouer. Cependant, cela échouera même avec (set + e) ​​en place:

 set +e false 

car la dernière commande shell doit sortir avec 0.

Ce qui suit fonctionne pour mercurial en ne commettant que des modifications. La construction échoue donc uniquement si la validation échoue.

 hg id | grep "+" || exit 0 hg commit -m "scheduled commit" 

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

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