DBFluteのReplaceSchemaをHudsonで実行する
ビルドのたびにDBを作り直す継続的データベースインテグレーションをHudson+DBFluteのReplaceSchemaでやっています。
やり方はシェルの実行でこんな感じに入力して実行します。
cd dbflute_exampledb export DBFLUTE_ENVIRONMENT_TYPE=ut export answer=y sh replace-schema.sh
注意点としてはReplaceSchemaのデータ登録で失敗した場合でもビルド成功になります。
ただ最近でたDBFlute-0.9.7.9の
[DBFLUTE-787] {Java/C#}: ReplaceSchemaでDDL実行エラーがあったらANT実行自体をFailureにする - The Seasar Foundation Issues (Deprecated)
を見て、Hudsonでビルド失敗にできるんじゃねって思いましたが、無理なようです。
Hudsonのジョブのコンソールログはこんな感じ。Antは失敗していますが、Hudsonでは成功になっています。
[df-load-data] {Load Data}: loaded-files=0 [df-load-data] x (failed: Look the exception message) [df-load-data] * * * * * * [df-load-data] * Failure * [df-load-data] * * * * * * [df-load-data] _/_/_/_/_/_/_/_/_/_/ {ReplaceSchema} BUILD FAILED /.../dbflute-basic-example/mydbflute/dbflute-0.9.7.9/build-torque.xml:229: org.seasar.dbflute.exception.DfDBFluteTaskFailureException: /* * * * * * * * * * * * * * * * * * * * * * * Failed to execute DBFlute task: ReplaceSchema Look at the log: console or dbflute.log * * * * * * * * * */ Total time: 2 seconds Finished: SUCCESS
原因として調べた限りでは、Antのリターンコードは0以外だけどシェルのリターンコードとしては最終的に0になりビルド成功と判断されるようです。
replace-schema.shから呼び出される_df-replace-schema.shで下記のようにAntを呼び出しています。
if [ $answer = "y" ] ;then sh $DBFLUTE_HOME/etc/cmd/_df-copy-extlib.sh sh $DBFLUTE_HOME/ant/bin/ant -Ddfenv=$DBFLUTE_ENVIRONMENT_TYPE -f $DBFLUTE_HOME/build-torque.xml replace-schema sh $DBFLUTE_HOME/etc/cmd/_df-delete-extlib.sh fi
データ登録に失敗すればbuild-torque.xml終了時点では0以外のリターンコードが返ります。しかし次の_df-delete-extlib.shが正常終了すればリターンコード0となります。
よって最終的にはHudsonではビルド成功となります。
こんな感じにAntのリターンコード受け取ってexitするようにすればビルド失敗にできます。どうでもいいけど子プロセスで環境変数をセットして親プロセスに渡すってできないんですね。。。そこではまった。。。
if [ $answer = "y" ] ;then sh $DBFLUTE_HOME/etc/cmd/_df-copy-extlib.sh sh $DBFLUTE_HOME/ant/bin/ant -Ddfenv=$DBFLUTE_ENVIRONMENT_TYPE -f $DBFLUTE_HOME/build-torque.xml replace-schema antReturnCode=$? sh $DBFLUTE_HOME/etc/cmd/_df-delete-extlib.sh fi if [ $antReturnCode -ne 0 ];then exit $antReturnCode; fi
Hudsonのジョブのコンソールログはこんな感じ。ま、こういう修正がいいかどうかはわかりませんが、気になって調べたのでメモとして残しておきます。
[df-load-data] {Load Data}: loaded-files=0 [df-load-data] x (failed: Look the exception message) [df-load-data] * * * * * * [df-load-data] * Failure * [df-load-data] * * * * * * [df-load-data] _/_/_/_/_/_/_/_/_/_/ {ReplaceSchema} BUILD FAILED /.../dbflute-basic-example/mydbflute/dbflute-0.9.7.9/build-torque.xml:229: org.seasar.dbflute.exception.DfDBFluteTaskFailureException: /* * * * * * * * * * * * * * * * * * * * * * * Failed to execute DBFlute task: ReplaceSchema Look at the log: console or dbflute.log * * * * * * * * * */ Total time: 2 seconds Finished: FAILURE