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