ということで、予告どおり PHP 用の CI ツールである phpUnderControl について書いていきます。といっても長くなるので、
- phpUnderControl 導入
- phpUnderControl 初期設定&設定上の注意点
- CakePHP 用の設定
の 3 回くらいに分けて書きます。いうことで、まずはインストール方法について。(これだけでもそこそこ長いので要注意です。)
phpUnderControl の概要
第4回CakePHP勉強会@Tokyo でざっくり話しましたが、CruiseControl という Java 製の CI サーバを PHP で使えるように拡張したものです。
ビルドタスク自体は CruiseControl だけでも頑張れば構成できますが、コマンド一発で
等のタスク設定が行え、その結果を見やすい形でレポートしてくれる機能が追加されています。また、phpUnderControl が PEAR モジュールとして配布されており、上記のモジュールに対して依存関係を持っているので、それぞれ個別にインストールする必要がないという利点もあります。
もう一つ PHP で書かれた Xinc というものがあるんですが、
- ちょっと使ってみたらまだ機能が少なかった
- VCS が Subversion しか対応していないらしい
ということで、私は今のところ phpUnderControl のほうを使ってます。
前置き
- 検証は VMware 上の Ubuntu 8.04 で行いました。
- 当初 Ubuntu 7.10 で検証していたので、その時の注意点なんかにも書いていますが、何度かに分けて書いてるので記述に不整合があるかもしれません。
- SVN サーバは別に用意してある&インターネットに繋がる環境を前提として書いています
- アカウントは phpuc という名前で作ってます。
- root で実行してやるコマンドはいちいち sudo をつけてますが、もちろん sudo -s でも OK です。
- はじめ「phpUnderContol を広めたいから、Ubuntu に慣れてない人でも入れられるように丁寧に書こう!」という心意気で書いていたんですが、途中で挫折してます。ところどころやたら丁寧な記述があったらその頃の名残です。
Sun Java のインストール
上記 URL の最初に「Linux にはじめから入ってるやつじゃなくて、ちゃんと Sun の Java を入れてね」とか書いてあります。本当にこれをやっておかないと表示とかうまくいかないので注意しましょう。
8.04 はもともと Java が入ってないのでいいんですが、7.10 の場合、
root@ubuntu-vm:~# java -version
java version "1.5.0"
gij (GNU libgcj) version 4.2.1 (Ubuntu 4.2.1-5ubuntu5)
と Sun Java 以外のものが入っているので、あらかじめ
sudo apt-get remove gij
で消しておきます。(両方入れておいて update-alternatives コマンドで切り替える形でもいいと思います。)
で、Java のインストール。下のほうで紹介する URL には「JDK じゃなくて JRE で十分だよ」と書いてあるんですが、特に最小限の構成にこだわりないのであれば、JDK のほうを入れてしまったほうがいいかもしれません。CruiseControl を入れると connectfour というサンプルプロジェクトがついてくるんですが、このビルドにコケてしまうのでちょっと気持ち悪いです。
JDK を入れる場合は
sudo apt-get install sun-java6-jdk
で、JRE を入れる場合は、
sudo apt-get install sun-java6-jre
みたいな感じです。7.10 のときは java5 でやってました。
一応バージョンを確認しておくと、
root@ubuntu-vm:~# java -version
java version "1.6.0_07"
Java(TM) SE Runtime Environment (build 1.6.0_07-b06)
Java HotSpot(TM) Client VM (build 10.0-b23, mixed mode, sharing)
こんな感じになります。Sun とか書いてないけど、まあ OK です。
CruiseControl のインストール
この辺りの手順は
に書いてるとおりなんですけど、一応説明。phpUnderControl を動作させるには 2.7.x 以降が必要なので、これをダウンロード。現在の最新は 2.8.2 ですね。
CUI でやるなら
wget http://downloads.sourceforge.net/cruisecontrol/cruisecontrol-bin-2.8.2.zip
GUI でやるなら、
- Firefox を起動
- SourceForge.net: Files - CruiseControl に移動
- cruisecontrol-bin-2.8.2.zip とかをダウンロード。
- 「ディスクに保存する」ってやると、~/cruisecontrol-bin-2.8.2.zip ってのが落ちてるはず
という感じです。ちなみに 7.10 の頃のバージョンは 2.7.2 でした。
で、手順どおりに実行します。(root で動かすのもアレだから途中で chown とか入れてますが。)phpuc の部分はユーザ名なので適当に置き換えてください。
sudo mkdir /opt/cruisecontrol-bin-2.8.2
sudo chown phpuc: /opt/cruisecontrol-bin-2.8.2
unzip ~/cruisecontrol-bin-2.8.2.zip -d /opt
sudo ln -s /opt/cruisecontrol-bin-2.8.2 /opt/cruisecontrol
一応確認しておきます。
root@ubuntu-vm:~# ls -l /opt
合計 4
lrwxrwxrwx 1 root root 30 2008-11-19 02:03 cruisecontrol -> /opt/cruisecontrol-bin-2.8.2
drwxr-xr-x 9 phpuc phpuc 4096 2008-11-16 17:37 cruisecontrol-bin-2.8.2
CruiseControl の起動確認
cd /opt/cruisecontrol
export JAVA_HOME=/usr/lib/jvm/java-6-sun
./cruisecontrol.sh
こんな感じで実行すると、ごちゃごちゃメッセージが出て、CruiseControl が起動します。この状態で
あたりを開くと Dashboard が見えるはずです。(すぐには接続できなかったりもします。)
ちなみに JRE を使ってる場合は以下のエラーが出ます。無視してもいいはずです。
Build Error Message
/opt/cruisecontrol-bin-2.8.2/projects/connectfour/build.xml:46: Unable to find a javac compiler; com.sun.tools.javac.Main is not on the classpath. Perhaps JAVA_HOME does not point to the JDK. It is currently set to "/usr/lib/jvm/java-6-sun-1.6.0.07/jre"
画面が確認できたら、一旦 CruiseControl を止めます。
なお、CruiseControl + PHP の使い方について基本的なところを押さえたい場合は上記の URL を辿ると色々載ってます。
あと、JAVA_HOME の設定を毎回やるのが面倒という場合は javaenv.sh に設定を記述してしまえばいいようです。
pear のインストール
phpUnderControl は pear コマンドでインストールするため、まずは php-pear をインストールします。php-cli なんかも依存しているので勝手にインストールされます。(あとで php5-dev を入れる場合はここで一緒に入れてしまっても OK です。)
さらに、「xxx のバージョンが古い」とかいう警告が出るのが面倒なので、ひととおりバージョンアップしてしまいます。
sudo pear upgrade-all
phpUnderControl のインストール
ここからは phpUnderControl Downloads のとおりです。
stable から beta に変えて、依存モジュールのチャンネルを追加します。
sudo pear config-set preferred_state beta
sudo pear channel-discover components.ez.no
sudo pear channel-discover pear.phpunit.de
で、phpUnderControl のインストール。
これで phpuc コマンドが使えるようになっているはずです。
php5-dev のインストール
後述の Xdebug のインストールの際、php5-dev を入れておかないと
running: phpize
sh: phpize: not found
ERROR: `phpize' failed
こんなエラーになってしまうので、入れておきます。
sudo apt-get install php5-dev
Xdebug のインストール
Xdebug を入れないと、phpuc で何か実行したときに
NOTICE: The xdebug extension is not installed. For coverage
you must install xdebug with the following command:
pear install pecl/xdebug
とか言われてしまいます。ここに書いてあるとおり PHPUnit 使ってカバレッジ測定するときにだけ必要になるものなので、必要ない場合も多いかもしれませんけど、メッセージが鬱陶しいのでとりあえず入れてしまいます。(PHPUnit 以外でカバレッジ測定を目指す場合も必要になると思います。)
7.10 だと make が入っていないので、
sudo apt-get install build-essential
として入れておきます。(8.04 では不要だったと思います。)
そして、以下のコマンドを実行。
いろいろ出力されるけど、最後に
Build process completed successfully
Installing '/usr/lib/php5/20060613+lfs/xdebug.so'
install ok: channel://pecl.php.net/xdebug-2.0.4
configuration option "php_ini" is not set to php.ini location
You should add "extension=xdebug.so" to php.ini
みたいな指示が出てます。これにしたがって /etc/php5/cli/php.ini の末尾に追加・・・でもいいんですが、せっかく conf.d があるので /etc/php5/conf.d/xdebug.ini という新規ファイルを作成して、ここに書きましょう。extension じゃなくて zend_extension として書いてやる必要があります。
php -i とやって
This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
with Xdebug v2.0.4, Copyright (c) 2002-2008, by Derick Rethans
のように Xdebug の記述が増えていれば OK です。
本当はメッセージ中に「configuration option "php_ini" is not set to php.ini location」とあるので、set-config しておけば上記のような編集は不要になるはずなんでしょうけど、
- なぜか pecl config-set じゃなくて pear config-set php_ini /etc/php5/cli/php.ini としないとちゃんと参照されない
- それがうまくいっても、php.ini の先頭に「extension="xdebug.so"」なんてやる気のない記述が追加されるだけなので意味がない
という感じなので、おとなしく手動で設定しましょう。
phpUnderControll の適用
phpUnderControl を CruiseControl に適用します。
phpuc install /opt/cruisecontrol
これで、再度 CruiseControl を起動
cd /opt/cruisecontrol
export JAVA_HOME=/usr/lib/jvm/java-6-sun
./cruisecontrol.sh
して、
にアクセスすると、画面が phpUnderControl のものに変わっているはずです。
php-under-control プロジェクトの作成
といっても、CruiseControl のサンプルプロジェクトである connectfour は Java プロジェクトなので、phpUnderControl の画面から見れるレポートはありません。これだけだと寂しいので、
phpuc example /opt/cruisecontrol
とやってサンプルプロジェクトを作ってみましょう。ひととおりのレポートが見れる php-under-control というプロジェクトができます。(しばらく待たないと画面に反映されません。すぐに反映させたい場合は CruiseControl を再起動してください。)
なお、このサンプルプロジェクトは 5 分に一度必ずビルドを行う設定になっています。そのまま放置しておくとログが溜まってやたら容量を食うので、気が済んだら
phpuc delete --project-name php-under-control /opt/cruisecontrol
として消すか、/opt/cruisecontrol/config.xml の
(常にビルドを行う設定)を
(/dev/null が更新されたらビルドする設定。たぶんこうしておくとビルドされない。)にでも書き換えておいたほうが良いです。そうでなくてもプロジェクト規模が大きくなる&ビルド回数が増えるに従ってそれなりに容量は食いますので、CI サーバは HDD を多めに積んでおいたほうがいいかもしれません。
その他必要なモジュールのインストール
この CI サーバでは最新モジュールの取得や unit test を行うことになるので、 VCS クライアントや unit test に必要なモジュールを入れておく必要があります。
Subversion でソース管理しているのであれば、
sudo apt-get install subversion
として入れておく必要がありますし、unit test が DB を利用する形で書かれているのであれば
sudo apt-get install php5-pgsql postgresql
のように DBMS や PHP 用のモジュールを入れなければなりません。また、Selenium のテストをこのサーバで動かしたいなら Apache 等も入れておくべきでしょう。
・・・といったところで導入編はおわりです。細かい設定は次回以降ということで。