CruiseControl

1月 1, 2003 · Posted in CruiseControl · Comment 

概要

CruiseControl(クルーズコントロール)は継続的インテグレーション(Continuous Integration)を実現するためのフレームワーク。
継続的なビルド(+単体テスト)と詳細なレポート機能を簡単に利用することができる。
また、各種SCMやFindBugs等の外部ツールとも容易に連携させることが可能。
ライセンスはBSD.

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

MartinFowlerによる解説

ダウンロード〜インストール(超簡単!)

インストールは以下の手順で行う。
1.公式サイト(http://cruisecontrol.sourceforge.net/)のdownloadより、最新のリリースをダウンロードする。
2.ダウンロードしたファイル群より、cruisecontrol.bat(cruisecontrol.sh)を実行する。
バッチファイル実行前にJDKのインストールとJAVA_HOMEの設定が必要。
これだけでCruiseControlサーバが起動状態になる。
また、付属のサンプルプロジェクトがビルドされる。

サンプルプロジェクトを利用して画面と操作に触れてみる

ステータスページ(全プロジェクトのトップページ)

http://localhost:8080/cruisecontrol/
http://127.0.0.1:8080/cruisecontrol/
にアクセスすると、ステータスページと呼ばれるCruiseControlのトップページが表示される。
このページには、CruiseControlで管理されているすべてのプロジェクトとその状態が表示されており、
インストール直後の状態では、connectfourというサンプルプロジェクトが登録されている。
図1:初期ステータスページ
図1:初期ステータスページ

ここでBuildボタンを押下すると、強制的にプロジェクトのビルドを実行することができる。
図2:ビルド実行中の様子
図2:ビルド実行中の様子

サンプルプロジェクトのビルドはAntのビルドファイル(build.xml)を元に実行される。

プロジェクト詳細ページ

次に、プロジェクト名をクリックしてプロジェクトの詳細ページを表示する。
図3:詳細ページ
図3:詳細ページ

ビルド結果が表示され、ビルドを実行した日時・ビルド実行に要した時間・単体テスト結果などが表示されている。

単体テスト結果

Test Resultsタブをクリックすると単体テストの結果を表示することができる。
図4:テスト結果の表示
図4:テスト結果の表示

サンプルプロジェクトのテストがすべて正常に完了していることがわかる。

ためしにテストを失敗させてみる。
CruiseControlの
projects/connectfour/test/net/sourceforge/cruisecontrol/sampleproject/connectfour
にある、CellTest.javaのコードを書き換えてみた。

assertEquals(5, newCell.getRow());
↓
assertEquals(555, newCell.getRow());

再びCruiseControlのステータスページ(トップページ)を表示させ、Buildボタンを押下。

ビルドが完了したら、詳細ページのビルド結果ページ(またはテスト結果ページ)を表示すると、テストのエラーを示すメッセージが表示されている。
図5:テスト結果NG
図5:テスト結果NG

@XML Log File

XML Log Fileを表示すると、最新のビルド結果がXML形式で表示される。
図6:XML表示
図6:XML表示

Metrics

Metricsでは、プロジェクトが管理しているビルドの統計(尺度?)を見ることができる。

Control Panel

各種設定を行う。

Cruise Controlの設定ファイル(config.xml)について

コンフィグファイルのリファレンスマニュアル(英語)

http://cruisecontrol.sourceforge.net/main/configxml.html

リスナーの指定(listeners)

リスナーはプロジェクトの状態を監視する。

<cruisecontrol>
    <project name="connectfour">
        <listeners>

ビルドステータスリスナー

CruiseControlでは、ビルド実行・待機のようなステータス変更があると、現在の状態をファイルに記録する。
そのファイルを読み込んで、ステータスページに現在の状態を表示している。
ビルドステータス記録用のファイルには、ローカルのファイルシステムを利用する方法とFTPを利用してリモートのファイルシステムを利用する方法がある。

例(currentbuildstatuslistener)

<listeners>
    <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
</listeners>

書式
ローカルファイルシステム

<currentbuildstatuslistener file="[パスを含むファイル名]"/>

リモートファイルシステム

<currentbuildstatusftplistener filename="[パスを含むファイル名]" destdir="[リモートディレクトリ]">

このファイルを指定していない場合や読み込めない場合には、ステータスページに[?]と表示されてしまう。
図1:ファイル指定ミス
図1:ファイル指定ミス

ブートストラッパーの指定(bootstrappers)

CruiseControl上でビルドが実行される前に行う動作を指定する場合、ブートストラッパーを利用する。
ブートストラッパーはCruiseControlのプラグインとして用意されており、任意の動作を行う
ブートストラッパークラスを自作することもできる。

<cruisecontrol>
    <project name="connectfour">
        <bootstrappers>

cvsbootstrapper

CVSブートストラッパーを利用すると、ビルド実行前に指定したCVSリポジトリに関する操作を実行することができる。

例(cvsbootstrapper)

<bootstrappers>
    <cvsbootstrapper localWorkingCopy="projects/${project.name}" />
</bootstrappers>

書式

<cvsbootstrapper localWorkingCopy="projects/${project.name}" />

変更管理の指定

リポジトリやファイルシステムの変更を検知してすぐにビルドを実行すると、一連のファイルを変更(コミット)している途中でビルドをはじめてしまう可能性がある。
この状況を防ぐために、最後の更新検知からビルド実行開始までの時間をしていすることができる。

<cruisecontrol>
  <project>
    <modificationset>

実際の動作は以下のとおり
1.クルーズコントロールが更新を検知
2.指定された時間待機。
3.更新を検知した時点のファイルと待機終了後のファイルに変化がなければビルドを開始する。変化があった場合は再び待機。

CVS

<modificationset quietperiod="30">
    <cvs localWorkingCopy="projects/${project.name}"/>
</modificationset>

ビルドスケジュールの指定

クルーズコントロールでは通常、変更を検知してビルドを実行するが、日時や時間間隔をしていして強制的にビルドを実行することもできる。

<cruisecontrol>
  <project>
    <schedule>

Ant

<schedule interval="300">
    <ant anthome="apache-ant-1.6.5" buildfile="projects/${project.name}/build.xml"/>
</schedule>

ログファイル格納場所の指定

Cruise Controlが出力するログファイルを格納する場所を指定する。

<cruisecontrol>
  <project>
    <log>

<log>
    <merge dir="projects/${project.name}/target/test-results"/>
</log>

ビルド結果の配信

様々な方法を使ってビルド結果を配信することができる。

<cruisecontrol>
  <project>
    <publishers>

成功時/失敗時などの配信条件の指定や、いろいろな配信方法(メール、メッセンジャー、ファイル、FTP)に対応している。

ビルド成功時に指定ディレクトリにjarファイルを格納

<publishers>
    <onsuccess>
        <artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar"/>
    </onsuccess>
</publishers>

リンク