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
7
demandé sur dasmaze 2012-11-15 19:15:13

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:

  1. tout d'abord, nous disons à shell de ne pas sortir en cas de défaillance des commandes individuelles

  2. 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édent cd 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

  3. 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 un echo 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.

25
répondu Slav 2012-11-15 19:21:24