web-dev-qa-db-ja.com

bashスクリプトを介してant / mavenからのビルドエラーを検出する方法

ビルドプロセスを自動化するbashスクリプトを書いています。 2つの主要なビルドブロックがあります。1つはAntタスクで、もう1つは単純な古いmvn clean installです。この2つのビルドプロセスのいずれかからビルドエラーが発生したときに何かしたいと思います。

問題は、これらのビルドにはテストの失敗やエラーが時々含まれるが、最終結果は成功することです。そして、これらのプロセスによって返されるステータスコード($?)は、ビルドが失敗したか成功したかに関係なく、0になるはずだと思います。

では、スクリプトが中間ビルド(テストエラーなど)中に誤った情報をキャッチせずに最終結果(ビルドの失敗/成功)を検出する最善の方法は何でしょうか。

45
fei
mvn clean test
if [[ "$?" -ne 0 ]] ; then
  echo 'could not perform tests'; exit $rc
fi
  • $?は、直前に実行されたコマンドの終了コード(正常に終了したかどうかにかかわらず)を含む特別なシェル変数です。
  • -neは「等しくない」を表します。したがって、ここではmvn cleanからの終了コードがゼロに等しくないかどうかをテストしています。
51
Renaud

Maven 2が誤った戻りコードを返すことに対するいくつかの問題があります(つまり、常に0を返します)。特に MNG-3651 Maven 2.0.9で修正されました。

古いバージョンでは、mvn.batは次の行で終了しました:

exit /B %ERROR_CODE%

Maven 2.0.9以降、最後の行は次のように変更されました。

cmd /C exit /B %ERROR_CODE%

したがって、ビルドが失敗すると、0以外の戻りコードが返されます。ビルドエラーの場合、戻りコードは1です。2.0.9+にアップグレードできない場合は、上記のようにmvn.batを変更して正しいコードを返すことを検討してください。

11
Rich Seller

Antマニュアル によると:

ant起動スクリプト(WindowsおよびUnixバージョン)は、Javaプログラムの戻りコードを返します。つまり、ビルドが成功すると0が返され、ビルドが失敗すると他の値が返されます。

また、Mavenはエラー時にゼロ以外の終了コードを返します。以下は a link で、Maven呼び出しAPIを使用してこのステータスを問い合わせる方法を示しています。

そのため、スクリプトで戻りコードを明示的に処理できるように思えます。おそらく、テストなどに関係のないエラーコードは無視してかまいません。

exec Antのエラーコードはオペレーティングシステム固有です。これらはあなたを助けるかもしれません:

5
ire_and_curses

Unix/linuxの正しい解決策:

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

「if」ステートメント自体はコマンドであり、それが成功すると$?がリセットされます。変数は0です。エコーについても同様です。したがって、「mvn clean install」からの戻りコードを保存するために、中間のローカル変数、たとえば$ rcを使用する必要があります。それから、「exit」コマンドに渡すこともできます。

3
Māris Rubenis

ここにあなたが望む結果を得るために私がすることは正確です。

    <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

これを正確に実行するコマンドがbashに組み込まれています。

# exit when any command fails
set -e

これをbashスクリプトの一番上に置き、 この優れたリソースからコピーしました

# 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