Tout d'abord, passez la souris sur la zone grise ci-dessous. Cela ne fait pas partie de la réponse, mais il faut absolument le dire:
Si vous avez un script shell qui "checkout, build, deploy" tout seul, alors pourquoi utilisez-vous Jenkins? Vous renoncez à toutes les fonctionnalités de Jenkins qui en font ce qu'il est. Vous pourriez aussi bien avoir un cron ou un hook post-commit SVN appeler le script directement. Jenkins effectue la vérification SVN elle-même est cruciale. Il permet aux builds d'être déclenchés uniquement lorsqu'il y a des changements (ou sur minuterie, ou manuel, si vous préférez). Il garde une trace des changements entre les versions. Il montre ces changements, afin que vous puissiez voir quelle version était pour quel ensemble de modifications. Il envoie un e-mail aux commetteurs lorsque leurs modifications ont entraîné une compilation réussie ou échouée (encore une fois, selon la configuration que vous préférez). Il enverra un e-mail aux commetteurs lorsque leurs correctifs auront corrigé la version défaillante. Et de plus en plus. Jenkins archivant les artefacts les rend également disponibles, par build, directement à partir de Jenkins. Bien que ce ne soit pas aussi crucial que le paiement SVN, cela fait à nouveau partie intégrante de ce qui en fait Jenkins. Idem pour le déploiement. À moins que vous n'ayez un seul environnement, le déploiement se produit généralement dans plusieurs environnements. Jenkins peut garder une trace de l'environnement dans lequel une version spécifique (avec un ensemble spécifique de modifications SVN) est déployée, grâce à l'utilisation de Promotions. Vous renoncez à tout cela. On dirait qu'on vous dit "vous devez utiliser Jenkins" mais vous ne le voulez pas vraiment, et vous le faites juste pour vous faire perdre vos patrons, juste pour mettre une coche "oui, j'ai utilisé Jenkins"
La réponse courte est: le code de sortie de la dernière commande de l' étape de construction de Jenkin's Execute Shell est ce qui détermine le succès / échec de l' étape de construction . 0
- succès, anything else
- échec. Notez que cela détermine le succès / l'échec de l' étape de construction , pas l'ensemble du travail exécuté . Le succès / l'échec de l'ensemble de l'exécution du travail peut en outre être affecté par plusieurs étapes de construction, ainsi que par des actions et des plugins post-construction.
Vous l'avez mentionné Build step 'Execute shell' marked build as failure
, nous nous concentrerons donc sur une seule étape de construction. Si votre étape de construction Execute shell n'a qu'une seule ligne qui appelle votre script shell, alors le code de sortie de votre script shell déterminera le succès / l'échec de l'étape de construction. Si vous avez plus de lignes, après exécution de votre script shell, examinez-les attentivement, car ce sont elles qui pourraient causer des échecs.
Enfin, lisez ici Jenkins Build Script se termine après l'exécution de Google Test . Ce n'est pas directement lié à votre question, mais notez que la partie concernant le lancement par Jenkins de l' étape de construction Execute Shell , en tant que script shell avec/bin/sh -xe
Les -e
moyens que le script shell va sortir à l' échec, même si seulement 1 commande échoue, même si vous faites la vérification des erreurs pour cette commande (car les sorties de script avant qu'il arrive à votre vérification d'erreur). Ceci est contraire à l'exécution normale des scripts shell, qui affichent généralement le message d'erreur de la commande ayant échoué (ou le redirigent vers null et le traitent 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 est probable que la commande défaillante se trouve quelque part à la fin du script. Peut-être un écho final? Ou une copie d'artefacts quelque part? Sans voir la sortie complète de la console, nous ne faisons que deviner.
Veuillez publier la sortie de la console de l'exécution du travail, et de préférence le script shell lui-même, et nous pourrons alors vous dire exactement quelle ligne échoue.