Antで継続的インテグレーション

JUnit&DbUnitによるテストケース数がついに1000を越え、貧弱なマシンでは全てを実行するのにめちゃくちゃ時間が掛かる、もしくはOutOfMemory...
CVSにコミットする前は全テストを実行してから」というルールをプロジェクトで実施したけれども最近は破綻気味でした。
そこで、継続的インテグレーションの実践。
今さらって感じもしますが、本ではずっと前に読んでたものの、実践するのは今回が初めて。
Antを利用して作成しました。
その時、参考になった本がこれ。

Javaプログラミングツールズ1 Apache Ant

Javaプログラミングツールズ1 Apache Ant


Antってこんなに色々出来るんだーと改めて実感。
今回の継続的インテグレーションってその集大成かも。
最後の「all_test」をcronで定期実行するようにすれば、

  • CVSから最新をチェックアウト
  • コンパイル
  • テスト実施
  • レポートの作成
  • エラーがあった場合はメール送信

ってことが可能になります。

    <target name="checkout" description="最新ソースを取得">
        <!-- CVSの設定 -->
        <property name="cvsServer" value="192.168.0.10" />
        <property name="cvsRoot" value="cvs" />
        <property name="user" value="****" />
        <property name="password" value="****" />

        <delete dir="${root}" />
        <cvspass cvsRoot=":pserver:${user}@${cvsServer}:${cvsRoot}" password="${password}" />
        <cvs cvsRoot=":pserver:${user}@${cvsServer}:${cvsRoot}" package="${root}" dest="." />
    </target>

    <target name="test" description="全テスト実行">
        <mkdir dir="${test.result}" />

        <delete>
            <fileset dir="${test.result}" includes="**/*" />
        </delete>

        <junit printsummary="yes" fork="true" maxmemory="512m" errorproperty="test.error" failureproperty="test.error">
            <classpath refid="build.classpath" />

            <formatter type="xml" />
            <batchtest todir="${test.result}">
                <fileset dir="${root}/test">
                    <include name="**/*Test.java" />
                </fileset>
            </batchtest>
        </junit>
    </target>

    <target name="report" description="テストレポートの作成">
        <junitreport>
            <fileset dir="${test.result}">
                <include name="TEST-*.xml" />
            </fileset>
            <report format="frames" todir="${test.report}" />
        </junitreport>
    </target>

    <target name="send_error_mail" if="test.error" description="エラー通知メール送信">
        <!-- メール送信の設定 -->
        <property name="smtp.server" value="localhost" />
        <property name="from.mailaddress" value="xxx@mail.com" />
        <property name="to.mailaddress" value="***@mail.com" />
        <property name="subject" value="engine全テストエラー" />
        <property name="message" value="engine全テストでエラーが発生しました。詳細は「${basedir}/${test.report}/index.html」を参照" />

        <mail from="${from.mailaddress}" tolist="${to.mailaddress}" subject="${subject}" message="${message}" mailhost="${smtp.server}" />
    </target>

    <target name="all_test" depends="checkout,compile,test,report,send_error_mail"/>