Practice Ant
Antを利用した継続的インテグレーション
Antは,ビルドツールの一種です.Javaをベースとしていますので,OSのタイプに限定されることがないという点で,makeよりも優れているといわれています.
また,The Jakarta Projectのビルドにも使われていますし,Ant自身もAntでビルドされています.(Antのソースアーカイブをダウンロードしてきて,展開すると,Antのビルドファイルを見つけることができます.)
The Jakarta Project(http://jakarta.apache.org/ant/index.html)のサイトから,Antのアーカイブをダウンロードします.
ダウンロードするファイルは,
jakarta-ant-1.3-bin.zip(または,jakarta-ant-1.3-bin.tar.gz)
jakarta-ant-1.3-optional.jar
でOKです.optional.jarは,オプションタスクを利用するときに必要になるアーカイブです.すぐには使用しないかもしれませんが,ダウンロードしておきましょう.
ここでは,WinNT環境へのインストール手順を示していきます.パス等の表記が異なるだけで,自分の環境に置き換えれば,特に問題ないでしょう.
まずは,JDKがすでにインストールされていることを確認してください.また,JDKがインストールされているディレクトリに対して,JAVA_HOME環境変数を設定します.
次に,Antのアーカイブを展開して,インストールしたいディレクトリにコピーします.このディレクトリに対して,ANT_HOMEを設定し,ANT_HOME\binへのパスを設定すれば,Antのインストールは完了です.
早速,インストールできたかどうかを確認してみます.コマンドプロンプトを起動して,"ant"と入力してリターンを押してみてください.
C:\>ant Buildfile: build.xml does not exist! |
上のようなエラーメッセージが表示されれば,Antがインストールは成功しています.(もし,Antを実行したディレクトリよりも親ディレクトリに,"build.xml"というファイルが存在していると,ビルドが成功してしまう可能性がありますので注意してください.)
ここで,Antの動作を簡単に説明しておきます.(詳細は,Antのドキュメントを参照してください.)
まずは,Antのコマンドラインオプション一覧を見てみます.
C:\>ant -help |
細かい説明は置いておいて,-buildfileオプションに注目すると,このオプションで,Antが実行するビルドプロセスが記述されたビルドファイルを指定するようになっています.
先ほどは,このオプションを指定しなかった訳ですが,このオプションの指定がなかったときは,Antはデフォルトで,"build.xml"という名前のファイルをビルドファイルとして使用する仕様となっています.そして,カレントディレクトリで,ビルドファイルが見つからないときは,親ディレクトリを探し,また見つからないときは,,,とルートまで遡ってビルドファイルを探します.最後までさかのぼっても見つからないと,「Buildfile: build.xml does not exist!」と教えてくれるわけですね.
さて,Antに自動ビルドさせるには,ビルドファイルが必要だ,というのが分かったところで,早速ビルドファイルを作ってみたいと思います.
まずは,あくびが出るほど簡単なサンプルを動かして,その構成を説明したいと思います.
はじめに,テンポラリのディレクトリを作成して,そのディレクトリに,"build.xml"という名前のビルドファイルを作成します.build.xmlの内容は,以下の通り.
<?xml version="1.0" encoding="utf-8"?> |
早速,Antを実行してみます.Antを実行するときには,作成したbuild.xmlファイルがあるディレクトリに移動するのを忘れないようにしてください.
また,Antを実行するときのパラメータとして,"prepare"を指定していますが,これはビルドファイル中に定義されているターゲットの名前のことです.ここでは,"prepare"ターゲットしかないので,これを指定します.
C:\>cd tmp C:\tmp>dir /B |
予想通り?だと思いますが,classesディレクトリが作成されたことが確認できると思います.それでは,結果が分かったところで,上記build.xmlについての簡単な解説をします.
まず,最初の行ですが,これは単なるXML宣言です.特に説明は要らないと思います.
次に2行目のproject要素ですが,
<project name="sample" default="prepare" basedir=".">
...
</project>
属性 | 説明 |
name | プロジェクト名 |
default | ターゲットが指定されないときに使用される,デフォルトターゲットの名前 |
basedir | ビルド時に使用されるパスの,ベースディレクトリ |
ターゲットというのは,3行目に記述されているtarget要素のことをあらわしています.このビルドファイルでは,ターゲットprepareしか定義されていませんので,これをデフォルトのターゲットとしています.
3行目は,target要素です.
<target name="prepare">
...
</target>
この例では,ターゲット名を指定するname属性しか定義していませんが,他にも,ターゲット間の依存関係を定義するdepends属性なども存在します.
4行目は,mkdir要素です.
<mkdir dir="./classes"/>
mkdirは,Antで実行できる標準のタスクで,文字通りディレクトリの作成を行います.この例では,カレントディレクトリに,classesディレクトリを作成します.(ビルドファイルでは,パス区切り文字には,"/"を使用するので注意!)
また,この例ではターゲット内のタスクは,mkdirのみでしたが,複数のタスクを記述することもでき,その組み合わせによって,さまざまなビルドが可能となります.
さて,非常に単純なサンプルでしたが,基本的に,ビルドファイルというのはタスクの組み合わせに過ぎません.ターゲットは,タスクをひとまとめにして,見通しの良いかたまりとしたようなものです.(タスクが定義済み関数で,ターゲットが自作の関数のようなものでしょうか?)
だから,複雑に見えるビルドファイルも,一つ一つのタスクの振る舞いさえ分かってしまえば,実は大したことをしてなかったりします.
次の段階として,実践的なビルドの例を紹介して,Antの優秀さの一面を体験してみましょう.
まずは,実践的なプロジェクトとして,以下のようなディレクトリ階層構造のプロジェクトを想定します.プロジェクトのホームディレクトリの下に,ソースコードを格納するためのsrcディレクトリを作成して,その下にパッケージの階層に沿った形で,ディレクトリ階層を作成した,よく見かけるプロジェクトだと思います.
/PROJECT_HOME(プロジェクトのホームディレクトリ)
/src
/com
/mamezou
/sample
/model
SampleModel.java
/test
SampleModelTest.java
/view
SampleView.java
/test
SampleViewTest.java
このサンプルプロジェクトにおけるクラスは,サンプルのクラスが2つと,それに対するユニットテストクラス2つの計4つです.クラスの実装は以下のようになっていると考えてください.(あくまでもサンプルですので,内容は全く役に立ちません)
プロジェクトサンプル1 → sample1.project.lzh
package com.mamezou.sample.model; public class SampleModel { public int getSampleValue() { return 100; } } package com.mamezou.sample.view; public class SampleView { public int getSampleValue() { return 100; } } package com.mamezou.sample.model.test; import junit.framework.*; |
次に,ビルド結果として期待する,ディレクトリ階層構造および生成物を示します.Antに上記サンプルプロジェクトを自動ビルドさせた結果がこうなるべき,というものですね.
/PROJECT_HOME(プロジェクトのホームディレクトリ)
/src
・・・(省略)
/build
sample.jar
/apidocs
・・・(Javadocが出力される)
/classes
/com
/mamezou
/sample
/model
SampleModel.class
/test
SampleModelTest.class
/view
SampleView.class
/test
SampleViewTest.class
build以下のディレクトリが生成物になるわけですが,分かりづらいかもしれませんので,自動ビルドを手順を追って説明します.
これらの作業が自動化されると相当便利になりますね.では,実際にこれらの作業を自動化するためのAntのビルドファイルを紹介します.
今回は,ビルドファイルにコメントを埋め込む形で,ビルドファイルの内容について説明をしたいと思います.ビルドファイルの簡単な概要は分かっていると思いますので,こちらのほうが読みやすいと思います.
また,Antのドキュメントは併用して読むようにしてください.
ビルドファイルサンプル1→ sample1.build.xml
<?xml version="1.0" encoding="utf-8"?> |
このビルドファイルを,PROJECT_HOME下に置いた後,PROJECT_HOMEに移動して,Antを実行 ,,,っとその前に,ユニットテストでは,JUnitを使用してますので,ビルド環境にJUnitがインストールされていない場合は,先にこちらをダウンロードして,インストールしておかなければなりません.
JUnit.org(http://www.junit.org/)
ここでは,JUnitの使用方法は省略させていただきます.
また,Antでのテストの自動化を視野に入れると,CLASSPATHをビルドファイルで設定するのは面倒なので,JAVA_HOME\jre\lib\extディレクトリにコピーしておくと便利です.
ここまでの準備ができたら,実行します.指定するターゲットは,jarターゲットを指定すれば,それに依存するターゲット全てが実行されるのでOKです.今回は,実行結果は省略しますが,"BUILD SUCCESSFUL"と表示されればビルドは成功です!期待通りの生成物ができたかどうかを確認してみてください.
このビルドファイルでは,いきなり使用したタスクの数が多くなってしまいましたが,それほど難しくなく,読みこなせたのではないでしょうか?また,ディレクトリ名などは,プロパティを使用して指定していますが,このようにしておくことで,何らかの変更があったときに対処しやすいビルドファイルになるので,参考にしてみてください.ソースコードに限らず,「Once and Only Once」の精神で行きましょう.
また,他のJakarta Projectでも,Antを使用しての自動ビルドが活用されていますので,是非こうしたオープンソースプロジェクトからビルドファイルの作り方のコツを盗んできましょう.
ここまでで,プロジェクトの自動ビルドまでが達成されました.しかし,eXtremeに少しでも近づくために,テストも自動化したくなるのが人情です.
幸いにも,Antの拡張オプションとして,JUnitタスクがありますので,これを利用することで,自動テストを簡単に行うことができます.さらには,テスト結果をXML形式で出力する機能や,さらにテスト結果をまとめてくれる機能なども,提供されているのです.
そうはいったものの,具体的にどの程度のテスト結果が出力されるのかが分からないと,ピンとこないと思いますので,まずはサンプルをご覧ください.
テスト結果サンプル → SampleModelTestクラスのテスト結果(XML形式)
テスト結果集計サンプル → 集計サンプル
どうでしょう?集計サンプルの方で,きちんと集計されているのを見て,これは使えそうだ!と思われる方も多いのではないかと思います.
気分が乗ってきたところで,早速,テスト結果集計までを実現するための手順を説明していきたいと思います.
まず,オプションタスクである,JUnit,JUnitReportを使うために,一番初めにダウンロードしておいた,optional.jarを,ANT_HOME\libディレクトリにコピーします.
次に,JUnitタスクで必要となる,JUnitのアーカイブが,インストールされていることを確認します.(今回は,JAVA_HOME\jre\lib\extディレクトリ下にコピーされているものと想定します.ここに置いておくと,JUnitタスクで,classpath属性を指定しなくて良かったりしますので,便利です.もちろん,タスク内できちんと指定して頂いても構いません.)
次に,XML形式で出力されたテスト結果を,HTML形式で集計するために必要となる,Xalan1を手に入れる必要があります.The Apache XML
Project(http://xml.apache.org/xalan/)のサイトから,Xalan1のアーカイブをダウンロードしてきます.(現在のバージョンのAntでは,JUnitReportタスクでXalan2はサポートされていないようです.Xalan1
compatibility jar of Xalan2ならOKのようですが,試したことはありません.)
ダウンロードするファイルは,
xalan-j_1_2_2.zip(または,xalan-j_1_2_2.tar.gz)
でOKです.
Xalanのアーカイブを展開すると,ファイルがいっぱいできますが,この中で必要となるのは,xalan.jarとxerces.jarの2つだけです.(xerces.jarについては,最新のXerces
Javaでも問題ありません.)
このファイルも,ここではJAVA_HOME\jre\lib\extディレクトリ下に置いてしまいます.(Xercesなどは,別のディレクトリに置いてあることが多いと思いますので,パスを設定して頂いても構いません.)
さて,ここまでで,JUnit,JUnitReportタスクを実行できる環境が整いました.早速,ユニットテストの自動化&レポート集計のための,ターゲット例を見てみましょう.
<target name="runtests" depends="compile"> <!-- |
ここでは,見やすいように,JUnit関連のターゲットだけ切り出して説明を付加しましたが,このままでは未定義のPropertyなどが存在するために実行できませんので,ビルドファイルサンプル2として,ビルドファイル全体のサンプルを示しておきます.
ビルドファイルサンプル2 → sample2.build.xml
<?xml version="1.0" encoding="utf-8"?> <!-- jarターゲットの定義 |
このビルドファイルを先ほどのプロジェクトに適用すると,以下のようなディレクトリ構成,生成物が自動生成されます.
/PROJECT_HOME(プロジェクトのホームディレクトリ)
/src
・・・(ソースファイル)
/build
sample.jar(テストクラスの除いたクラスのJARアーカイブ)
/apidocs
・・・(Javadocドキュメント)
/classes
・・・(クラスファイル)
/reports
TEST-com.mamezou.sample.model.test.SampleModelTest.xml(テスト結果)
TEST-com.mamezou.sample.view.test.SampleViewTest.xml(テスト結果)
TESTS-TestSuites.xml(集計用Suites)
/html
・・・(集計ファイル)
テスト結果の集計を参照するには,/PROJECT_HOME/reports/html/index.htmlにアクセスしてみてください.先ほどのサンプルと同じ結果が出力されることを確認することができます.
このように,テスト&テスト結果の集計の自動化を,Antを使うことによって簡単に行うことができることが分かっていただけたと思います.
また,自動化することで,ビルド時の手違いが入り込む余地を最小に抑え,リリース時のコストも抑えることができるができるようになります.
XPのプラクティスとして,テスト(Testing)の重要さについては,かなり広まってきた印象がありますが,次のステップとして,継続的インテグレーション(Continuous
Integration)も取り入れてみてはいかがでしょうか?
退屈な作業を自動化することで,プログラミングを存分に楽しむことができるようになるでしょう!
謝辞
ドキュメントをまとめるにあたって,XP-jpメーリングリストのメンバである,懸田さんに有益なアドバイスを頂きました.
ありがとうございました.
最終更新日:
04/03/2001 13:02
株式会社 豆蔵
KURIHARA Tetsuya <kuri-t@mamezou.com>