目次へ

9. Continuum

2009.04.03 シナジーマーケティング株式会社 鈴木 圭

今回は、Maven と親和性の高い CI (Continuous Integration) サーバである Continuum を取り上げます。Continuum を用いることで「リポジトリから最新コードの取得→ビルド&テスト→結果の通知」といった作業を自動化することができます。本章では現時点の最新バージョンである Continuum 1.2 を対象に解説します。

9.1. Continuum とは

Continuum とは、Maven と親和性の高い CI (Continuous Integration) サーバです。CI (Continuous Integration) とは継続的結合のことであり、定期的かつ自動的にビルドやテストを行うことを指します。CI を実践することで、プログラムの修正による不具合を早期に検出することができます。以下に CI ツールの詳しい特徴をまとめます。

各開発者の作業に影響を与えることなく、定期的にビルドやテストを行うことができる
システムの規模が大きくなるにつれ、各開発者の環境でシステム全体のビルドやテストを行うことは困難になります。仮に開発者の環境でビルドやテストを実行するとしても、その間は開発の手を止めなければならないかもしれません。CI ツールを導入すれば、CI サーバで定期的にビルドやテストが行われるため、ビルドやテストにある程度の時間がかかるとしても、各開発者の作業に影響を与えることはありません。
ビルドやテストを定期的かつ自動的に行うことができる
システム全体のビルドやテストを手作業で行う場合を考えると、実行間隔を短くするほど人の負担は増えてしまいます。最悪の場合、それを行うこと自体を忘れてしまうかもしれません。CI ツールを導入すれば、それらの作業を自動化することができます。
テストの条件を一定にすることができる
開発者の環境にはコミットされていないコードが存在するかもしれませんし、データベースの内容も動作テストによって変更されているかもしれません。そのため、ある開発者の環境ではテストに成功しても、他の開発者の環境ではテストに失敗するという状況が発生することがあります。CI ツールを導入すれば、コミットされている最新のソースコードをビルドし、データベースの内容を初期化した後にテストを実行することができるため、テストの条件を一定に保つことができます。

そして、CI ツールの一つである Continuum は次の特徴を備えています。

  • 簡単なインストール - スタンドアロンとして実行するか WAR ファイルをサーブレットコンテナに配備します。
  • 簡単な設定 - Web インタフェースにより簡単に設定を変更することができます。
  • SCM のサポート - CVS、Subversion、Clearcase、Perforce、Starteam、Visual Source Safe、CM Synergy、Bazaar、Mercurial をサポートしています。
  • チェンジセットのサポート - 各ビルド結果には SCM のチェンジセット全て(コミット者、コミットログ、修正されたファイル)が表示されます。
  • ビルドの通知 - メール、Jabber、Google Talk、MSN、IRC、wagon でのレポートの通知をサポートしています。
  • ビルドツールのサポート - Maven1、Maven2、ANT、シェルスクリプトをサポートしています。
  • 外部アクセス - XML-RPC によって外部ツールと連携することができます。
  • ビルドタイプ - 手動ビルド、スケジュールによるビルド、XML-RPC によるビルドをサポートしています。
  • ビルドテンプレート - プロジェクトタイプごとのデフォルトのビルドテンプレートを定義することができます。
  • ビルドキュー - ビルドキューにあるプロジェクトの閲覧や割り込み(ビルドの中止)を行うことができます。

9.2. インストールと起動

Continuum は以下のダウンロードページから取得することができます。

Continuum - Download

Continuum はスタンドアロンとして動作させることも、Tomcat などのサーブレットコンテナ上で動作させることもできます。

スタンドアロンとして動作させる場合

  1. スタンドアロンとして動作させる場合は WAR 形式以外のファイルをダウンロードします。
  2. ダウンロードしたファイルを適当なディレクトリに展開します。
  3. 「<インストール先ディレクトリ>/bin/continuum start」を実行します。
  4. デフォルトでは 8080 ポートで起動するので、http://localhost:8080/continuum/ にアクセスし、Continuum が動作していることを確認します。

サーブレットコンテナ上で動作させる場合

  1. サーブレットコンテナ上で動作させる場合は WAR 形式のファイルをダウンロードします。
  2. ダウンロードした WAR ファイルをサーブレットコンテナに配備します。
  3. 配備先のサーブレットコンテナを起動します。
  4. 配備時の設定通りの URL にアクセスし、Continuum が動作していることを確認します。

9.3. 管理者ユーザの作成

Continuum に初めてアクセスするときは、管理者ユーザを作成するための画面が表示されます。

Continuum 管理者ユーザ作成画面

管理者ユーザを作成すると、通常のログイン画面が表示されるので、作成した管理者ユーザでログインします。

Continuum ログイン画面

初回ログイン時は一般情報設定画面が表示されます。

Continuum 一般情報設定画面

この情報は後から変更することもできるため、特に必要が無ければこのまま [Save] をクリックします。

9.4. プロジェクトの登録とビルド

Continuum プロジェクトグループ一覧画面

Continuum で扱う一番大きな単位はプロジェクトグループです。左メニューの「Show Project Groups」をクリックするとプロジェクトグループ一覧画面が表示されます。インストール直後では「Default Project Group」という名前のプロジェクトグループが作成されています。

プロジェクトグループの中にはいくつかのプロジェクトが配置されます。プロジェクトグループ一覧画面に表示されているプロジェクトグループの名前をクリックすると、そこに含まれているプロジェクトの一覧画面が表示されます。

それでは実際にプロジェクト(Maven2 プロジェクト)を登録してみましょう。ここではプロジェクトを一から作成する手間を省くために、オープンソースプロジェクトである Commons Lang を登録することとします。また、追加先のプロジェクトグループは「Default Project Group」とします。

Commons Lang を Continuum に登録する

Default Project Group のプロジェクト一覧画面を表示します。画面下部のプルダウンから「Add M2 Project」を選択し、「Add」ボタンを押します。

プロジェクトの登録(1)

プロジェクト登録画面が表示されます。「POM Url:」に Apache Commons Lang のリポジトリの URL である「http://svn.apache.org/repos/asf/commons/proper/lang/trunk/pom.xml」を入力し、「Add」ボタンを押します。

プロジェクトの登録(2)

登録が完了するとプロジェクト一覧画面が表示されるので、追加したプロジェクト名をクリックします。

プロジェクト一覧画面

設定項目は色々ありますが、まずは「Build Now」ボタンで手動ビルドを開始してみましょう。

手動ビルド

画面に変化はありませんが、バックグラウンドでビルドが開始されます。ビルドの結果/経過を見るには「Builds」タブをクリックします。

ビルド結果を見る

ビルド結果のページには実行したビルドの結果が全て蓄積されていきます。また、画面右端の「Result」リンクから、個々のビルド結果の詳細を閲覧することもできます。

独自プロジェクトを Continuum に登録する場合のポイント

ここまでで、Continuum にプロジェクトを登録し、ビルドするまでを見てきました。既存のオープンソースプロジェクトを利用したので最小限の手間で Continuum の動作を見ることができました。独自に作成したプロジェクトを Continuum に登録するときも、今まで見てきたようにプロジェクトを Continuum に登録します。ただし、一つだけやらなければならないことがあります。それは、プロジェクトの pom.xml の project/scm 要素に SCM (ソフトウェア構成管理) ツールの URL を指定することです。Continuum はここで指定されている場所からプロジェクトのソースコードを取得し、ビルドします。project/scm 要素の子要素には以下のものを指定することができます。

要素名 説明
connection ソースコードの取得に使用するための SCM への接続情報を指定します。記述する形式は、「scm:<プロバイダ>:<リポジトリの場所>」です。このうち、「<プロバイダ>」の部分には、使用している SCM の種類を表す文字列が入ります。CVS の場合は「cvs」、Subversion の場合は「svn」が入ります。「<リポジトリの場所>」には SCM ごとに定義されている形式でリポジトリの URL を指定します。Commons Lang の場合は「scm:svn:http://svn.apache.org/repos/asf/commons/proper/lang/trunk」が指定されています。
developerConnection ソースコードのコミットに使用するための SCM への接続情報を指定します。記述形式は connection 要素と同じです。
tag connection や developerConnection 要素で指定した場所を基準としたソースコードの場所を指定します。ある程度大規模なプロジェクトでは、プロジェクトを複数のブランチに分けて開発を進めることがあります。良くある分け方としては、リポジトリのルート直下に trunk、branches、tags を作成し、最新の開発は trunk で行う、trunk と平行して開発しなければならないときには branches 以下に分岐する、正式リリースしたときのスナップショットは tags 以下に配置する、というものです。例えば、connection 要素で指定したリポジトリが trunk、branches、tags に分けられており、trunk のコードを使用したい、という場合は tag 要素に「trunk」を指定します。
url ソースコードをブラウザなどで閲覧するための URL を指定します。

Continuum でプロジェクトをビルドするためには、最低限 connection 要素を指定しておく必要があります。

9.5. ビルド結果の通知

Continuum にはビルド結果をメールなどで通知する機能があります。現在サポートされている通知手段は、メール、IRC、Jabber、MSN、Wagon の 5 つです。通知の設定は、プロジェクトグループに対して行うことも、プロジェクトに対して行うことも出来ます。あるプロジェクトグループに含まれるプロジェクト全てで同じ通知設定を行いたい場合は、プロジェクトグループに対して通知設定を行うと良いでしょう。

プロジェクトグループに対して通知設定を行う

プロジェクトグループに対して通知設定を行う場合は、以下の手順で行います。

  1. プロジェクトグループのページの「Notifiers」タブをクリックします。
  2. 「Project Group Notifiers of Default Project Group group」という項目の「Add」ボタンをクリックします。
  3. 通知の種類(メールなど)を選択します。
  4. 通知の種類ごとの設定と、通知が行われる条件を指定します。

プロジェクトに対して通知設定を行う

プロジェクトに対して通知設定を行う場合は、以下の手順で行います。

  1. プロジェクトのページの「Notifiers」という項目の「Add」ボタンをクリックします。
  2. 通知の種類(メールなど)を選択します。
  3. 通知の種類ごとの設定と、通知が行われる条件を指定します。

pom.xml での通知設定

通知の設定は、pom.xml の project/ciManagement 要素に記述することもできます。

<project ...>
  ...
  <ciManagement>
    <system>continuum</system>
    <url>http://localhost:8080/continuum</url>
    <notifiers>
      <notifier>
        <type>mail</type>
        <sendOnError>true</sendOnError>
        <sendOnFailure>true</sendOnFailure>
        <sendOnSuccess>true</sendOnSuccess>
        <sendOnWarning>true</sendOnWarning>
        <configuration>
          <address>example@example.com</address>
        </configuration>
      </notifier>
    </notifiers>
  </ciManagement>
  ...
</project>

9.6. ユーザアカウントの管理

Continuum に最初にアクセスしたときに管理者ユーザを作成しました。Continuum を扱う人が一人しかいない場合はこのままでも良いですが、複数人で Continuum を扱う場合は、必要な数だけユーザアカウントを作成すると良いでしょう。左メニューの「Users」をクリックすると、ユーザ管理画面が表示されます。

ユーザ管理

この中の「Tools」という項目にある「Create New User」ボタンをクリックすると、ユーザ作成画面に遷移します。

9.7. スケジュールの管理

Continuum では、ビルドを行う間隔は「スケジュール」によって指定します(個々のビルドタスクでは、使用するスケジュールを指定します)。左メニューの「Schedules」をクリックすると、スケジュール管理画面が表示されます。初期状態では、「DEFAULT_SCHEDULE」という名前の、一時間ごとに実行を行うためのスケジュールが登録されています。

スケジュール管理

例として、毎日 0 時に実行されるスケジュールを作成する場合は、次のように入力します。

スケジュール管理(追加)

以下、それぞれの入力項目についてまとめます。

項目名 説明 必須
Name スケジュールの名前を指定します。
Description スケジュールの説明を指定します。
Cron Expression スケジュールの実行間隔を指定します。記述形式は Linux の cron を元にしたものであり、「*」を指定した場合は「全て」という意味になります。また、「Day of Month」と「Day of Week」については、「無指定」を意味する「?」を指定することが出来ます。「Day of Month」と「Day of Week」のどちらか一方を指定したい場合に、もう片方には「?」を指定することで、設定が衝突しないようにするためです。  
Maximun job 一定時間経ってもビルドが終わらなかった場合にエラーとする秒数を指定します。例えば、「特定の条件が揃うと無限ループに陥ってしまうようなテストコードがコミットされた」という場合や、「データ数が一定以上になると極端にパフォーマンスが悪くなるコードがコミットされた」という場合、Continuum でのビルドがいつまで経っても終わらなくなってしまいます。そういった事故を防ぐためにも、通常のビルドではありえないような大き目の時間を指定しておくと良いでしょう。「0」を指定すると、無制限という意味になります。
Quiet Period Continuum が SCM から最新のコードを取得してから、ビルドを始めるまでの待ち時間を指定します。通常は「0」で問題ありませんが、SCM ツールによっては待ち時間が必要なものもあるようです。

9.8. その他の設定

日本語化

デフォルトでは日本語ロケールが設定されていないため、日本語の表示が全て文字化けしてしまいます。これを解消するには「<インストール先ディレクトリ>/apps/continuum/webapp/WEB-INF/classes/webwork.properties」を修正する必要があります。以下に指定例を示します。

...
# Locale
webwork.locale=ja_JP
webwork.i18n.encoding=UTF-8
...

webwork.locale でロケール、webwork.i18n.encoding で文字のエンコードを指定します。

起動ポートの変更

スタンドアロンとして動作させる場合の起動ポートを変更するには、「<インストール先ディレクトリ>/conf/jetty.xml」の以下の部分を変更します。

<Configure id="Server" class="org.mortbay.jetty.Server">
    ...
    <!-- START SNIPPET: jetty_port -->
    <Call name="addConnector">
      <Arg>
          <New class="org.mortbay.jetty.nio.SelectChannelConnector">
            <Set name="host"><SystemProperty name="jetty.host" /></Set>
            <Set name="port"><SystemProperty name="jetty.port" default="<起動ポート>"/></Set>
            <Set name="maxIdleTime">30000</Set>
            <Set name="Acceptors">2</Set>
            <Set name="statsOn">false</Set>
            <Set name="confidentialPort">8443</Set>
            <Set name="lowResourcesConnections">5000</Set>
            <Set name="lowResourcesMaxIdleTime">5000</Set>
          </New>
      </Arg>
    </Call>
    <!-- END SNIPPET: jetty_port -->
    ...
</Configure>

メールの設定

メール送信については、「mail/Session」という名前で JNDI ルックアップできるように設定しておく必要があります。Continuum をスタンドアロンで利用する場合、初期状態では localhost の SMTP サーバを利用するように設定されています。別の SMTP サーバを利用する場合は、「<インストール先ディレクトリ>/conf/jetty.xml」の以下の部分を変更します。「<ユーザ名>」や「<パスワード>」は SMTP-Auth を利用しない場合は省略することができます。

<Configure id="Server" class="org.mortbay.jetty.Server">
  ...
  <!-- START SNIPPET: mail -->
  <New id="validation_mail" class="org.mortbay.jetty.plus.naming.Resource">
    <Arg>mail/Session</Arg>
    <Arg>
      <New class="org.mortbay.naming.factories.MailSessionReference">
        <Set name="user"><ユーザ名></Set>
        <Set name="password"><パスワード></Set>
        <Set name="properties">
          <New class="java.util.Properties">
            <Put name="mail.smtp.host"><ホスト名></Put>
          </New>
        </Set>
      </New>
    </Arg>
  </New>
  <!-- END SNIPPET: mail -->
  ...
</Configure>

データベースの設定

公式サイトの情報が少ないので、実際に動作させながら確認した情報も加えて説明します。Continuum はデフォルトでは組み込み可能なデータベースである Apache Derby を利用します。対応しているデータベースは Apache Derby、MySQL、MS SQL Server です。他のデータベースに変更したい場合は、「jdbc/continuum」と「jdbc/users」という名前で JNDI ルックアップできるように設定を行う必要があるようです。Continuum をスタンドアロンで実行する場合は、「<インストール先ディレクトリ>/conf/jetty.xml」の以下の部分を変更するとともに、「<インストール先ディレクトリ>/lib」に必要な JDBC ドライバを配置します。

<Configure>
  ...
  <!-- START SNIPPET: datasources -->
  <!-- continuum database -->
  ...
  <!-- Users / Security Database -->
  ...
  <!-- END SNIPPET: datasources -->
  ...
</Configure>

それでは具体例として、スタンドアロンで実行する Continuum のデータベースを PostgreSQL 8.3 に変更する手順を説明します。

(1) データベースの作成

データベースを作成します。テーブルについては Continuum が自動的に作成しますので、データベースは空のままにしておきます。ここでは continuum ユーザで continuum-db という名前のデータベースを作成すします。

createdb -U continuum continuum-db

(2) jetty.xml の変更

「<インストール先ディレクトリ>/conf/jetty.xml」を開き、データベースの設定を以下のように変更します。

<Configure>
  ...
  <!-- START SNIPPET: datasources -->
  <New id="continuumDataSource" class="org.postgresql.ds.PGPoolingDataSource">
    <Set name="serverName">localhost</Set>
    <Set name="databaseName">continuum-db</Set>
    <Set name="user">continuum</Set>
    <Set name="password"></Set>
  </New>

  <New id="continuum" class="org.mortbay.jetty.plus.naming.Resource">
    <Arg>jdbc/continuum</Arg>
    <Arg><Ref id="continuumDataSource" /></Arg>
  </New>

  <New id="users" class="org.mortbay.jetty.plus.naming.Resource">
    <Arg>jdbc/users</Arg>
    <Arg><Ref id="continuumDataSource" /></Arg>
  </New>
  <!-- END SNIPPET: datasources -->
  ...
</Configure>

(3) Continuum を起動する

ここまでできたら、Continuum を起動して動作していることを確認します。

9.9. まとめ

今回は Maven 本体から離れて、CI ツールの一つである Continuum について解説しました。CI ツールを利用すると、定期的に、いつも同じ条件の下でテストを行うことができます。今まで CI ツールを使ったことが無いという方は、まずは簡単に導入できる Continuum を検討してみてはいかがでしょうか。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp
  • シナジーマーケティング研究開発グループブログ
Loading