2012-09-20

GithubのプロジェクトをCruiseControlで自動ビルドしてみた

達人プログラマー―ソフトウェア開発に不可欠な基礎知識 バージョン管理/ユニットテスト/自動化 に触発されて、Javaプロジェクトの自動テストにチャレンジしました。

ダッシュボード

継続的インテグレーションツールであるCruisecontrol(以下CC)を使って、 GitHub上のプロジェクトを自動ビルドしてみます。

今回の環境は、マシンをUbuntu 10.04.4 LTS, CCをcruisecontrol-bin-2.8.4.zip、ビルドターゲットを僕の作ったMyJavaTetrisとします。

目標はソフトウェア開発に役立てるというよりもCCを回すことであるので、手段と目的が逆になっている気もしますがこれも勉強の一つです。

ちなみに上の画像は、CCのdashboardで実際に表示されるページのスクリーンショットです。

以下手順です。

本書の手順にあるスクリプトの情報は古く動作しなかったため、公式HPのGettingStartedを参考にしました。

CCのインストール

CCをインストールして/opt/cruisecontrol/ に配置します。

wget http://jaist.dl.sourceforge.net/project/cruisecontrol/CruiseControl/2.8.4/cruisecontrol-bin-2.8.4.zip

unzip cruisecontrol-bin-2.8.4.zip

mv cruisecontrol-bin-2.8.4 /opt/cruisecontrol/

ついでに.bashrcにPATHを通しておきます。
echo “export PATH=$PATH:/opt/cruisecontrol” >> ~/.bashrc
source ~/.bashrc
この手順の後、カレントディレクトリを/opt/cruisecontrol/に指定してcruisecontrol.shを実行することでCCの動作確認ができます。

Githubプロジェクトの設定

続いて自分のGitHubプロジェクトをCCのビルドループに追加する手順です。
今回、作業ディレクトリを /work/cc/に置くこととして、必要なディレクトリを作成していきます。
cd /work/cc
mkdir projects artifacts logs
次に、/work/cc/下に必要なスクリプトを二つ作成します。
一つ目はconfig.xmlです。このファイルによってCCのビルドループが設定されます。
 
<cruisecontrol>
  <project name="MyJavaTetris" buildafterfailed="true">
    <listeners>
      <currentbuildstatuslistener
        file="logs/MyJavaTetris/status.txt"/>
    </listeners>

    <!-- Bootstrappers are run every time the build runs,
                                                 *before* the modification checks -->
    <bootstrappers>
    </bootstrappers>

    <!-- Defines where CruiseControl looks for changes, to decide
                            whether to run the build -->
    <modificationset quietperiod="10">
      <cvs localworkingcopy="projects/MyJavaTetris"/>
    </modificationset>

    <!-- Configures the actual build loop, how often and which
                                  build file/target -->
    <schedule interval="60">
      <ant buildfile="build-MyJavaTetris.xml"
        uselogger="true"/>
    </schedule>

    <!-- directory to write build logs to -->
    <log/>

    <!-- Publishers are run *after* a build completes -->
    <publishers>
    </publishers>
  </project>
</cruisecontrol>
二つ目はbuild-MyJavaTetris.xmlです。このファイルにはprojects/ディレクトリにgit cloneし、ant buildで動作確認するプロセスが記述されています。antの標準機能ではgitの操作に対応していなかったので、この記事を参考にgitコマンドをmacrodefしています。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project name="build-MyJavaTetris" default="build" basedir="projects">
  <target name="build">
    <macrodef name = "git">
      <attribute name = "command" />
      <attribute name = "dir" default = "" />
      <element name = "args" optional = "true" />
      <sequential>
        <echo message = "git @{command}" />
        <exec executable = "git" dir = "@{dir}">
          <arg value = "@{command}" />
          <args/>
        </exec>
      </sequential>
    </macrodef>

    <delete dir="MyJavaTetris" />
    <git command ="clone">
      <args>
        <arg value ="ssh://git@github.com:22/yysaki/MyJavaTetris.git"/>
      </args>
    </git>
    <ant antfile="build.xml" dir="MyJavaTetris" target="build" />
    <!-- nazo no error <ant antfile="build.xml" dir="MyJavaTetris" target="test" /> -->
  </target>
</project>

これで設定は全て完了です。

/work/cc/下でcruisecontrol.shを実行するとMyJavaTetrisの自動ビルドが行われます。

後はずっと放置しておけばCCさんが必要なタイミングでプロジェクトの自動ビルドを行います。

リポジトリにコミットした時などにhttp://localhost:8080/にアクセスして動作をニヤニヤ監視しましょう。

以上です。