ビルドプロセスを自動化するbashスクリプトを書いています。 2つの主要なビルドブロックがあります。1つはAntタスクで、もう1つは単純な古いmvn clean install
です。この2つのビルドプロセスのいずれかからビルドエラーが発生したときに何かしたいと思います。
問題は、これらのビルドにはテストの失敗やエラーが時々含まれるが、最終結果は成功することです。そして、これらのプロセスによって返されるステータスコード($?)は、ビルドが失敗したか成功したかに関係なく、0になるはずだと思います。
では、スクリプトが中間ビルド(テストエラーなど)中に誤った情報をキャッチせずに最終結果(ビルドの失敗/成功)を検出する最善の方法は何でしょうか。
mvn clean test
if [[ "$?" -ne 0 ]] ; then
echo 'could not perform tests'; exit $rc
fi
$?
は、直前に実行されたコマンドの終了コード(正常に終了したかどうかにかかわらず)を含む特別なシェル変数です。-ne
は「等しくない」を表します。したがって、ここではmvn clean
からの終了コードがゼロに等しくないかどうかをテストしています。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を変更して正しいコードを返すことを検討してください。
Antマニュアル によると:
ant起動スクリプト(WindowsおよびUnixバージョン)は、Javaプログラムの戻りコードを返します。つまり、ビルドが成功すると0が返され、ビルドが失敗すると他の値が返されます。
また、Mavenはエラー時にゼロ以外の終了コードを返します。以下は a link で、Maven呼び出しAPIを使用してこのステータスを問い合わせる方法を示しています。
そのため、スクリプトで戻りコードを明示的に処理できるように思えます。おそらく、テストなどに関係のないエラーコードは無視してかまいません。
exec
Antのエラーコードはオペレーティングシステム固有です。これらはあなたを助けるかもしれません:
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」コマンドに渡すこともできます。
ここにあなたが望む結果を得るために私がすることは正確です。
<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>
これを正確に実行するコマンドが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