Hudsonの活用方法について考えてみる

ここ数日Hudsonを調べていて実際にうまく活用するにはどうやるのがいいか考えていたのでそれについてつらつらと書いてみる。

Hudsonはセットアップがシンプルですぐ始められる割にはかなり高度なことができる。

ファイル指紋を使えば成果物管理もうまくできるんじゃないかと思っている。今までリポジトリにタグうって成果物(例:warファイル、jarファイル)はファイルサーバに置いたりしていたが、ある程度規模がおおきなプロジェクトだとこの方法では問題が発生する可能性がある。バグ修正したのにそれが反映されていない成果物をテストしたり、そのまま本番機にもってっちゃったりとかね。

ファイル指紋を使えばHudsonのビルド番号単位で成果物を管理できるので、どのバージョンの成果物を使えばいいのかわかりやすい。というかトレーサビリティがある。これは大規模で分散開発しているときはおおきな力を発揮するだろう。

ただし、Hudsonで成果物を管理するにはそれなりに考慮することがあるように思う。

例えば以下のようなありがちなマルチプロジェクト構成の場合について考えてみる。

example-porject/
  |
  common/     DBアクセス等の共通クラスがある。成果物はjarファイル
  |  |
  |  build.properties
  |  build.xml
  |
  launcher/   バッチアプリ。成果物はjarファイル。commonに依存
  |  |
  |  build.properties
  |  build.xml
  web-app/    Webアプリ。成果物はwarファイル。commonに依存
  |  |
  |  build.properties
  |  build.xml
  |
  build.properties
  build.xml  こいつが上記3つのbuild.xmlを呼び出す

この場合Hudsonのジョブの単位としてはルートのexample-porject/build.xmlをキックするもの1つだけにするのか、
それともcommon, launcher, web-appの3つにするのか?

明らかに前者の1つの方がシンプルですぐに始められる。ただしファイル指紋を用いた成果物管理をしていくなら3つにしないとダメだろう。その場合commonが上流ビルドということになる。launcherがつかっているcommonのビルド番号とか知りたいよね。そうするとそれぞれのビルドスクリプトの独立性を高める必要がある。つまりcommon/build.xmlがexample-porject/build.propertiesの情報を引っ張らないでも動くようにしないといけない。またlauncherのビルドの際はcommonのjarを取ってくる必要がある。Antのjavacタスクの共通化とかもできない。ビルドスクリプトの設計をちゃんと考える必要がある。この辺どうするのがいいのだろう。

またSI用ビルドスクリプトとCI用ビルドスクリプトは分けるべきなのか?

FindBugs等でインスペクションしたい場合はCIマシンにFindBugsをインストールしなければならない(Mavenならする必要無いけど)。でもFindBugsがインストールされていないとSIできないってのはちょっと無いよね。まあビルドスクリプトをわけなくてもAntのif(Mavenならプロファイル)を使えば2つに分ける必要は無い。ただそれ以外にもSI用とCI用で違うことをするというのはありそうなので分けた方がいいんじゃないかという気はしている。DRYじゃないけど。

いじょ。