Jenkins Build Script sort après L'exécution du test Google
je construis une application Qt GUI via Jenkins. J'ai ajouté 3 étapes de construction:
- construire l'exécutable de test
- exécution de l'exécutable de test
- compiler un rapport de couverture avec gcovr
pour une raison quelconque, la tâche shell pour exécuter l'exécutable de test s'arrête après l'exécution. Même un simple echo
ne court pas après. Les tests sont écrits avec Google Test et sortie des fichiers XML xUnit, qui sont analysés après la compilation.
Certains tests démarrent l'interface utilisateur des applications, donc j'ai installé le plugin jenkins xvnc pour les faire tourner.
les tâches de construction sont les suivantes:
Construire
cd $WORKSPACE/projectfiles/QMake
sh createbin.sh
Test
cd $WORKSPACE/bin
./Application --gtest_output=xml
Rapport De Couverture
cd $WORKSPACE/projectfiles/QMake/out
gcovr -x -o coverage.xml
Now, un echo
à la fin de la première tâche de génération est imprimé correctement, mais un echo
à la fin de la seconde ne l'est pas. La troisième tâche de compilation n'est donc même pas exécutée, bien que la sortie de Google Test soit visible. J'ai pensé que peut-être le problème est que certains des tests Google échouent, mais pourquoi le script devrait-il arrêter d'exécuter juste parce que les tests échouent?
peut-être que quelqu'un peut me donner un indice sur la raison pour laquelle la deuxième tâche s'arrête.
Edit
la sortie de la console ressemble à ceci:
Updating svn://repo/ to revision '2012-11-15T06:43:15.228 -0800'
At revision 2053
no change for svn://repo/ since the previous build
Starting xvnc
[VG5] $ vncserver :10
New 'ubuntu:10 (jenkins)' desktop is ubuntu:10
Starting applications specified in /var/lib/jenkins/.vnc/xstartup
Log file is /var/lib/jenkins/.vnc/ubuntu:10.log
[VG5] $ /bin/sh -xe /tmp/hudson7777833632767565513.sh
+ cd /var/lib/jenkins/workspace/projectfiles/QMake
+ sh createbin.sh
... Compiler output ...
+ echo Build Done
Build Done
[VG5] $ /bin/sh -xe /tmp/hudson4729703161621217344.sh
+ cd /var/lib/jenkins/workspace/VG5/bin
+ ./Application --gtest_output=xml
Xlib: extension "XInputExtension" missing on display ":10".
[==========] Running 29 tests from 8 test cases.
... Test output ...
3 FAILED TESTS
Build step 'Execute shell' marked build as failure
Terminating xvnc.
$ vncserver -kill :10
Killing Xvnc4 process ID 1953
Recording test results
Skipping Cobertura coverage report as build was not UNSTABLE or better ...
Finished: FAILURE
1 réponses
généralement, si un étape de construction échoue, le reste ne sera pas exécuté.
faites attention à cette ligne de votre journal:
[VG5] $ /bin/sh -xe
le -x
permet au shell d'imprimer chaque commande dans la console avant l'exécution.
Le -e
fait sortir le shell avec une erreur si l'une des commandes échoue.
Un "échec" dans ce cas, serait un code de retour non 0 partir de l'une des commandes individuelles.
Vous pouvez vérifier cela en exécutant ceci directement sur la machine:
./Application --gtest_output=xml
echo $?
si le echo $?
affiche 0, cela indique que la commande précédente a été exécutée avec succès. S'il affiche autre chose, il indique un code d'erreur de la commande précédente (from ./ Application), et Jenkins le traite comme tel.
maintenant, il y a plusieurs choses en jeu ici. La première, c'est que votre la deuxième étape de construction (essentiellement un script shell temporaire /tmp/hudson4729703161621217344.sh
) est définie comme un échec si une commande échoue (le comportement par défaut). Quand L'étape de construction échoue, Jenkins s'arrêtera et échouera tout le travail.
Vous pouvez corriger ce comportement en ajoutant set +e
en haut de la deuxième Étape de génération. Cela ne provoquera pas l'échec du script (Build Step) à cause de l'échec de la commande individuelle (il affichera une erreur pour la commande, et continuera).
cependant, le résultat global du script (Build Step) est le code de sortie de la dernière commande. Puisque dans votre OP, vous n'avez que 2 commandes dans le script, et que la dernière est un échec, cela fera que l'ensemble du script (étape de construction) sera considéré comme un échec, malgré le +x
que vous avez ajouté. Notez que si vous ajoutez une echo
comme troisième commande, cela fonctionnera, puisque la dernière commande de script (echo) a réussi, mais cette" solution de contournement " n'est pas ce dont vous avez besoin.
ce qu'il vous faut, c'est une bonne gestion des erreurs ajoutée à votre script. Considérez ceci:
set +e
cd $WORKSPACE/bin && ./Application --gtest_output=xml
if ! [ $? -eq 0 ]; then
echo "Tests failed, however we are continuing"
else
echo "All tests passed"
fi
trois choses se passent dans le script:
-
tout d'abord, nous disons à shell de ne pas sortir en cas de défaillance des commandes individuelles
-
puis j'ai ajouté la gestion des erreurs de base dans la deuxième ligne. Le
&&
signifie "exécuter./Application
si-et-seulement-si le précédentcd
fut un succès. On ne sait jamais, peut-être que le dossier a disparu, ou quoi que ce soit d'autre peut arriver. BTW, le&&
fonctionne en interne sur le même code d'erreur égale 0 Principe -
enfin, il y a maintenant un traitement adéquat des erreurs pour le résultat de
./Application
. Si le résultat n'est pas 0, alors nous montrons qu'il a échoué, sinon nous montrons qu'il est passé. Remarque, ce depuis la dernière commande n'est pas un (potentiellement) à défaut./Application
, mais unecho
de l'une ou l'autre des possibilités if-else, le résultat global du script (étape construite) sera un succès (I. e 0), et la prochaine étape de construction sera exécutée.
BTW, vous pouvez aussi bien mettre toutes les 3 étapes de votre construction en une seule étape de construction avec la bonne gestion des erreurs.
Oui... cette réponse peut être un peu plus longue que ce qui est requis, mais je voulais que vous compreniez comment Jenkins et shell traiter les codes de sortie.