2009-09-03 2 views
31

Ich schreibe ein Bash-Skript, um den Build-Prozess zu automatisieren. Es gibt zwei große Build-Blöcke, einer ist eine Ameisen-Aufgabe und einer ist eine einfache alte "mvn clean install". Ich möchte etwas tun, wenn Build-Fehler von einem dieser beiden Build-Prozesse kommen.Wie erkennt man einen Build-Fehler von Ant/Maven über ein Bash-Skript?

und das Problem ist, diese Builds enthalten Testfehler oder Fehler von Zeit zu Zeit, aber das Endergebnis ist erfolgreich. und ich glaube, dass der Statuscode ($?), der von diesen Prozessen zurückgegeben wird, 0 sein sollte, egal ob der Build fehlschlägt oder erfolgreich ist, ich könnte falsch liegen.

Also was ist der beste Weg für mein Skript, das Endergebnis (Build fehlgeschlagen/erfolgreich) zu erkennen, ohne die falschen Informationen während der mittleren Build (Testfehler, etc) von ihnen abzufangen?

+2

Die Werkzeuge sollten die richtigen Exit-Status zurückgeben. – derobert

+0

Ich bin mir eigentlich nicht sicher, was der Ausgangsstatus für ant/maven ist, ich nehme an, dass sie 0 zurückgeben werden, selbst wenn der Build fehlschlägt. Also sagst du, dass sie einen Wert ungleich null zurückgeben werden, wenn der Build fehlschlägt? das wird mein Leben viel einfacher machen. – fei

+0

Wenn Ihre Tests manchmal erfolgreich sind und manchmal scheitern und Ihnen egal ist, warum sollten Sie sie als Teil Ihres Builds ausführen? –

Antwort

4

Nach den Ant manual:

startet die Ameise Skripte up (in ihrer Windows- und Unix-Version) gibt den Return-Code des Java-Programms. Ein erfolgreicher Build gibt 0 zurück, fehlgeschlagene Builds geben andere Werte zurück.

Maven gibt bei einem Fehler auch einen Nicht-Null-Exitcode zurück. Hier ist a link, die zeigt, wie dieser Status mit der Maven Invocation API abgefragt wird.

So scheint es mir, dass Sie in der Lage sein sollten, die Rückkehrcodes in Ihrem Skript explizit behandeln. Vermutlich können Sie Fehlercodes in Bezug auf Tests usw. ignorieren, wenn diese Ihnen nicht wichtig sind.

exec Fehlercodes in Ant sind betriebssystemspezifisch. Diese können Ihnen helfen:

3

Hier ist genau das, was ich tue, das gewünschte Ergebnis zu erhalten.

<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> 
11

Es gibt ein paar Probleme gegen Maven 2 falsche Rückgabecodes Rückkehr (das heißt immer 0 zurückkehrt). Bemerkenswert MNG-3651 das wurde in Maven 2.0.9 behoben.

In älteren Versionen endete mvn.bat mit dieser Zeile:

cmd /C exit /B %ERROR_CODE% 

So ein Nicht-0:

exit /B %ERROR_CODE% 

Von Maven 2.0.9 ab, die letzte Zeile auf diese geändert wurde Wenn der Build fehlschlägt, wird der Rückgabecode zurückgegeben. Im Falle eines Buildfehlers ist der Rückkehrcode 1. Wenn Sie kein Upgrade auf 2.0.9+ durchführen können, können Sie mvn.bat wie oben beschrieben modifizieren, um den korrekten Code zurückzugeben.

36
mvn clean test 
rc=$? 
if [[ $rc -ne 0 ]] ; then 
    echo 'could not perform tests'; exit $rc 
fi 
+4

Es wäre viel besser, wenn Sie mehr auf diese Antwort eingehen könnten. Wie und warum beantwortet das die Frage besser als die anderen Antworten? – nietonfir

+1

Ich mag diese Antwort am besten. Ich habe gegoogelt, wie man Fehlercodes von mvn in einem Bash-Skript behandelt, und Renauds Antwort passt perfekt zur Rechnung. Ich vermute, dass Fei am Ende eine ähnliche Technik benutzt hat, nachdem er entdeckt hat, dass mvn einen Code ungleich Null für Testfehler zurückgibt. –

+0

Fast perfekt - aber ich würde entweder Anführungszeichen verwenden, wenn Sie wirklich diesen Zeichenfolgenvergleich vornehmen möchten (siehe https://www.gnu.org/software/bash/manual/bashref.html/search for "=="), oder "-ne", was der Vergleichsoperator für (ungeteilte) Ganzzahlen ist. – cslotty

Verwandte Themen