GitHubとJenkinsを組み合わせてユニットテストが成功しているかを常にJenkinsに確認させている。Jenkinsを使い始めてから半年経ったので,使い方や導入方法をメモしておく。
継続的インテグレーションとは
継続的インテグレーション,CI(continuous integration)とは,主にプログラマーのアプリケーション作成時の品質改善や納期の短縮のための習慣のことである。エクストリーム・プログラミング(XP)のプラクティスの一つで,狭義にはビルドやテスト,インスペクションなどを継続的に実行していくことを意味する。
Jenkinsとは
JenkinsとはJavaで書かれたオープンソース継続的インテグレーションツールである。Jenkinsには,2つの主要な機能がある。
1つ目は,継続的なソフトウェアのビルドとテストを行うことが出来る機能である。Jenkinsは「継続インテグレーションシステム」を提供し,開発者が変更をプロジェクトに統合でき,ユーザーがより新しいビルドを容易に取得できるようにする。自動化された継続的なビルドは,生産性を大いに向上させる。
2つ目は,外部で起動するジョブの実行を監視することが出来る機能である。cronによるジョブやprocmailのジョブで,リモートマシンで動作するものが含まれる。例えば,cronについて言えば,出力をキャプチャーした定期的なメールを受信し,それを監視するようなことが出来る。
Jenkinsの使い方
今回はCentOSにJenkinsをインストールして使用する。JenkinsはJavaで実装されているので,あらかじめJavaをインストールしておく必要がある。
Jenkinsをインストールする
インストールする前に,yumリポジトリを追加する必要がある。
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.reporpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
リポジトリが追加出来たらyumコマンドでJenkinsのインストールを行う。
yum install jenkins
インストールが完了すると以下の主要なファイルが作成される。
- /usr/lib/jenkins/jenkins.war : Jenkins本体
- /etc/sysconfig/jenkins : 設定ファイル
- /etc/rc.d/init.d/jenkins : 起動スクリプト
Jenkinsはデフォルトで8080ポートでアクセスを受け付けるが,Tomcatを8080ポートで動かしているなどでポート番号を変更する必要がある場合は設定ファイル /etc/sysconfig/jenkins にある変数 JENKINS_PORT の設定値を変更する。
JENKINS_PORT="8008"
Jenkinsを起動する
Jenkinsを起動するには以下のコマンドを実行する。
service jenkins start
Jenkinsを停止するには以下のコマンドを実行する。
service jenkins stop
OS起動時にJenkinsを自動起動するようにするには以下のコマンドを実行する。
chkconfig jenkins on
Githubと連携してユニットテストを継続的インテグレーションする
ローカルから確認するのであればhttp://localhost:8080にアクセスすることでJenkinsのトップページを確認出来る。グローバルIPアドレスを割り当てている場合はhttp://[IPアドレス]:8080にアクセスすることでトップページを確認出来る。
デフォルトの状態ではバージョン管理システムとしてGitとGitHubを対象にすることが出来ないので,プラグインをインストールして追加する必要がある。
Gitプラグインをインストールする
[Jenkinsの管理] -> [プラグインの管理] -> [利用可能タブ] -> [GIT Plugin]を選択して,インストールする。
GitHubプラグインをインストールする
[Jenkinsの管理] -> [プラグインの管理] -> [利用可能タブ] -> [GitHub Plugin]を選択してインストールする。
Phingプラグインをインストールする
今回はPHPを対象にしてビルドするのでPhingをインストールする。Phingとは,PHP向けのビルドツールである。Phingを使うことによってテストや解析などを一元管理し、コマンド一発で実行できるようになる。
[Jenkinsの管理] -> [プラグインの管理] -> [利用可能タブ] -> [Phing Plugin]を選択して,インストールする。
ジョブを作成する
トップページから[新規ジョブ作成]を選択する。今回はジョブ名をHelloとして, フリースタイル・プロジェクトのビルドを選択してOKボタンを押す。
続いて,ジョブの詳細設定に入る。
[GitHub project]にGitHub上のプロジェクトURLを入力する。例としては以下のようなURLになる。
https://github.com/whohu/smokydog/
[ソースコード管理] にて,[Git]を選択後,[Repository URL] にリポジトリのURLを入力する。例としては以下のようなURLになる。
git@github.com:whohu/smokydog.git
[Branches to build]にorigin/masterと入力する。
origin/master
[ビルド・トリガ]にて[SCMをポーリング]にチェックを付ける。[SCMをポーリング]ではGitリポジトリに変化があった場合に自動的にビルドを行ってくれる。[スケジュール]を以下のように入力する。
H/3 * * * *
上記では3分毎にSCM(software configuration management,バージョン管理システム)からブランチを取得するように設定している。
[ビルド]ではPhingの呼び出しを選択する。[ターゲット]にはunit_testと記述する。
build.xmlを記述する
これでGitからブランチを取得する設定は出来たので,続いて自動でテストを実行する設定を行う。今回はビルドツールとしてPhingを使っているので,build.xmlというファイルを作成し,その中に設定を記述する。
<?xml version="1.0" encoding="utf-8" ?><project name="Hello" basedir="/var/lib/jenkins/workspace/Hello" default="unit_test"> <target name="unit_test"> <exec command="cakerunner --cakephp-app-path app -R app/tests/cases" /> </target></project>
1行目では,バージョンとエンコーディングの宣言を行っている。
2行目では,nameにプロジェクト名, basedirに実行のベースとするディレクトリ,defaultにデフォルトで実行するターゲット名を設定している。
3行目では, target name にてターゲット名を設定している。
4行目では,テストを実行する際のコマンドを設定している。ちなみにPHPのSimpleTestを使って,テストを実行することを想定して記述している。
まとめ
Jenkinsでは非常に簡単な設定でユニットテストを継続的インテグレーションすることが出来る。今回紹介した範疇からは外れるが追加でプラグインを入れることで,ビルド時にシェルスクリプトを実行したり,ビルド失敗時にメールを送ったりすることも出来たりと,更に応用的な使い方も出来る。
参考
継続的インテグレーション – Wikipedia
Jenkins – Wikipedia
Meet Jenkins – 日本語 – Jenkins Wiki
CentOS/RedHatにJenkinsをインストールする手順 (yum, RPM) | OSCALOG
Jenkinsを使ってみよう(Mac OS X&Linux)[Ruby、Rails] – Build Insider
Jenkins で PHP_CodeSniffer と PHPUnit を動かすまで vol.1 – Qiita
build.xmlの作成と説明 | Jenkins で PHP_CodeSniffer と PHPUnit を動かすまで vol.2 – Qiita