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. En effet, git renvoie un code d'erreur lorsqu'il n'y a aucune modification à valider. Je voudrais soit abandonner la construction, soit simplement la marquer comme instable si c'est le cas. Des idées?
J'ai été capable de faire fonctionner cela en utilisant la réponse trouvée ici:
Comment git ne rien commettre sans erreur?
git diff --quiet --exit-code --cached || git commit -m 'bla'
Pour arrêter une exécution ultérieure lorsque commande échoue:
command || exit 0
Pour continuer l'exécution quand commande échoue:
command || true
Jenkins exécute les étapes de construction de Shell en utilisant /bin/sh -xe
par défaut. -x
signifie imprimer chaque commande exécutée. -e
signifie quitter en cas d'échec si l'une des commandes du script échouait.
Donc, je pense que dans votre cas, votre commande git exit avec 1, et à cause du paramètre par défaut -e
, 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 poster votre script d'étape de construction ici.
Si c'est le cas, vous pouvez essayer de mettre #!/bin/sh
afin 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.
Modifié: Une autre chose à noter est que, si la dernière commande de votre script Shell renvoie un code non-0 , toute l’étape de construction sera toujours marquée comme ayant échoué, même avec cette configuration. Dans ce cas, vous pouvez simplement mettre une commande echo
à la fin pour éviter cela.
S'il n'y a rien à Push, git renvoie l'état de sortie 1. L'étape de construction de l'exécution de Shell est marquée comme ayant échoué. Vous pouvez utiliser OR statement || (double tuyau).
git commit -m 'some messasge' || echo 'Commit failed. There is probably nothing to commit.'
Cela signifie que, si le premier échoue, exécute le deuxième argument (état de sortie renvoyé> 0). La deuxième commande retourne toujours 0. Lorsqu'il n'y a rien à pousser (statut de sortie 1 -> exécuter la deuxième commande), echo retournera 0 et l'étape de construction continuera.
Pour marquer la construction comme étant instable, vous pouvez utiliser l’étape de post-génération Jenkins Text Finder. Il peut passer par la sortie de la console, correspondre au motif (votre écho) et marquer la construction comme étant instable.
Il existe un autre moyen simple 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 en fonction de la valeur de retour de l'étape. Dans le cas d'un shell, il devrait s'agir du retour de la dernière valeur. Pour les interpréteurs de commandes Bash Windows (CMD) et Windows (POSIX), vous devez pouvoir définir la valeur de retour manuellement à l'aide de exit 0
comme dernière commande.
Sur la question (plus générale) dans le titre - pour empêcher Jenkins d’échouer, 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
.
Vous pouvez utiliser le plug-in Text-Finder . Cela vous permettra de rechercher dans la console de sortie une expression de votre choix, puis de marquer la construction comme Unstable
.
https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-Shell-script
si vous incluez une propriété returnStatus: true, le retour Shell est ignoré.
Si vous placez ces commandes dans le bloc Shell:
false
true
votre construction sera marquée en échec (au moins 1 code de sortie non nul), vous pouvez donc ajouter (set + 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
car la dernière commande Shell doit sortir avec 0.
Ce qui suit fonctionne pour Mercurial en ne s’engageant que s’il ya des changements. Donc, la construction n'échoue que si la validation échoue.
hg id | grep "+" || exit 0
hg commit -m "scheduled commit"
Une autre réponse avec quelques astuces peut être utile à quelqu'un:
n'oubliez pas de séparer vos commandes avec la règle suivante :
commande1 && commande2 - signifie que la commande2 sera exécutée uniquement si la commande1 a abouti
commande1 ; commande2 - signifie que la commande 2 sera exécutée malgré le résultat de la commande1
par exemple:
String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test ;set -e;echo 0 ", returnStdout: true).trim()
println run_tests
sera exécuté avec succès avec les commandes set -e
et echo 0
si gmake test
échoue (vos tests échouent), alors que le code suivant est extrait:
String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test && set -e && echo 0 ", returnStdout: true).trim()
println run_tests
un peu faux et les commandes set -e
et echo 0
in&& gmake test && set -e && echo 0
seront ignorées, avec l'instruction println run_tests
, car échouées gmake test
annulera la construction de jenkins. En guise de solution de contournement, vous pouvez basculer sur returnStatus:true
, mais vous perdrez alors le résultat de votre commande.