web-dev-qa-db-fra.com

comment détecter une erreur de construction de ant / maven via un script bash?

J'écris un script bash pour automatiser le processus de construction. Il y a deux principaux blocs de construction, l'un est une tâche de fourmi et l'autre est un simple vieux mvn clean install. Je veux faire quelque chose quand il y a une erreur de build provenant de l'un de ces deux processus de build.

Le problème est que ces versions contiendront des échecs ou des erreurs de test de temps en temps, mais le résultat final est réussi. Et je crois que le code d'état ($?) Renvoyé par ces processus devrait être 0, peu importe que la construction échoue ou réussisse, je peux me tromper.

Alors, quelle est la meilleure façon pour mon script de détecter le résultat final (échec/réussite de la construction) sans attraper les fausses informations lors de la mi-construction (erreurs de test, etc.)?

45
fei
mvn clean test
if [[ "$?" -ne 0 ]] ; then
  echo 'could not perform tests'; exit $rc
fi
  • $? est une variable Shell spéciale qui contient le code de sortie (qu'il se soit terminé avec succès ou non) de la commande récemment exécutée la plus immédiate.
  • -ne signifie "pas égal". Nous testons donc ici si le code de sortie de mvn clean n'est pas égal à zéro.
51
Renaud

Il y a quelques problèmes avec le retour par Maven 2 de codes de retour incorrects (c'est-à-dire toujours toujours 0). Notamment MNG-3651 qui a été corrigé dans Maven 2.0.9.

Dans les anciennes versions, mvn.bat se terminait par cette ligne:

exit /B %ERROR_CODE%

À partir de Maven 2.0.9, la dernière ligne a été modifiée comme suit:

cmd /C exit /B %ERROR_CODE%

Par conséquent, un code retour différent de 0 est renvoyé si la génération échoue. Dans le cas d'une ERREUR de build, le code retour est 1. Si vous ne parvenez pas à mettre à niveau vers 2.0.9+, vous pouvez envisager de modifier mvn.bat comme ci-dessus pour retourner le code correct.

11
Rich Seller

Selon le manuel Ant :

les scripts de démarrage de la fourmi (dans leur version Windows et Unix) renvoient le code retour du programme Java. Ainsi, une construction réussie renvoie 0, les constructions ayant échoué renvoient d'autres valeurs.

Maven renvoie également un code de sortie non nul en cas d'erreur. Voici n lien montrant comment interroger ce statut à l'aide de l'API d'invocation Maven.

Il me semble donc que vous devriez être capable de gérer explicitement les codes retour dans votre script. Vraisemblablement, vous pouvez ignorer les codes d'erreur relatifs aux tests, etc. si ceux-ci ne vous concernent pas.

exec les codes d'erreur dans Ant sont spécifiques au système d'exploitation. Cela peut vous aider:

5
ire_and_curses

Solution correcte pour unix/linux:

mvn clean install
rc=$?
if [ $rc -ne 0 ] ; then
  echo Could not perform mvn clean install, exit code [$rc]; exit $rc
fi

L'instruction "if" elle-même est une commande et si elle réussit, elle réinitialisera $? variable à 0. Il en va de même pour l'écho. Donc, vous devez utiliser une variable locale intermédiaire, par exemple $ rc pour stocker le code de retour de "mvn clean install", puis il peut également être passé à la commande "exit".

3
Māris Rubenis

Voici exactement ce que je fais pour obtenir le résultat souhaité.

    <exec executable="${env.M2_HOME}/bin/mvn" dir="${basedir}"
          failonerror="true" osfamily="unix">
        <arg value="-DskipTests=${argSkipTests}"/>
        <arg value="-Doffline=${argOffline}"/>
        <arg line="${projectsLine}"/>
        <arg line="${resumeFromLine}"/>
        <arg line="${alsoMakeLine}"/>
        <arg line="${alsoMakeDependentsLine}"/>
        <arg line="${commandsLine}"/>
    </exec>
3
codefinger

Il y a une commande intégrée à bash qui effectue exactement cela.

# exit when any command fails
set -e

Je mets cela en haut de mes scripts bash, que j'ai copiés de cette excellente ressource.

# keep track of the last executed command
trap 'last_command=$current_command; current_command=$BASH_COMMAND' DEBUG

# echo an error message before exiting
trap 'echo "\"${last_command}\" command filed with exit code $?."' EXIT

2
Will