HudsonいいねHudson。Jenkinsに名前変わったみたいなのでまた後で乗り換えるけれども。
昔某ソフトハウスにいた頃、まだmavenもなかった頃、頑張ってantを駆使してJUnitとJCoverageをデイリービルドで回して計測してエラーがあったらみんなにメールが飛ぶって、そういう環境を自分でも作ったし使っていたのに、今の会社で全然そういうことをしていないのが嫌で嫌で。
そしたらPHP用のAntであるところのPhingもあるしデイリービルドをやってくれるHudsonもあるし、これはと思って1日頑張ってみた。OSはCentOS5.5。
1.CentOS5.5にPHP5.3を入れる
CentOS 5系でPHP5.3系やMySQL5.1系を使いたい場合 - RX-7乗りの適当な日々こちらのサイトを参考に、--enablerepo=remiで
- php
- php-devel
- php-pecl-xdebug
- php-mbstring
- php-pdo
- :
2.PHPUnitをインストール
# pear install phpunit/PHPUnit
3.phingをインストール
# pear channel-discover pear.phing.info
# pear install phing/phing
ここで足りないものがあれば入れておく。4.ちょっとbuild.xml書いてみる
<?xml version="1.0"?>
<project name="minfew-set" default="test" basedir=".">
<target name="lint">
<phplint>
<fileset dir="src">
<exclude name="includes/mfwork/**" />
<exclude name="includes/PEAR/**" />
<exclude name="includes/smarty/**" />
<include name="**/*.php"/>
</fileset>
</phplint>
</target>
</project>
で、
$ phing
おお、実行された。よしよし。5.Hudsonインストール + tomcatにデプロイ
rpm一発でいけた。あっけなく起動も成功。すごい。でもサービス起動しようとするとなんか固まっちゃって怪しいのでtomcatに載せることにした。/etc/tomcat6/tomcat.conf に、
HUDSON_HOME = /var/lib/hudson
を追記。hudson.warをtomcat6にデプロイしていっちょあがり。あと、hudson単体で一度起動している場合、/var/lib/hudsonのownerがhudsonになっているので、
# chown -R tomcat.tomcat /var/lib/hudson
しないとビルド実行でハマる。
6.ジョブを登録
俺プロジェクトをHudsonに「新規ジョブ登録」する。もちろんプロジェクトはいくつも登録することができる。プロジェクトの設定でSVNのURLを記入して「ビルド実行」・・・うんもうすごい。えらい。「ワークスペース」にソースコードをチェックアウトしてくれている。
7.xUnit、Clover、phingプラグインをインストール
HudsonでPHPのユニットテスト - ssogabeの日記HudsonでPHPメモ (1) PHPUnitとカバレッジ - ssogabeの日記
こちらのサイトを超、超参考に!というかほとんどこのまま。Hudsonの画面上でプラグインをインストール。プラグイン画面でチェックしてボタン押すだけの簡単なお仕事。
なお、上記参考サイト様ではphpunitをexecで実行しているけど、その後、PHPUnitTaskがclover対応してくれたので、ちゃんとphpunitタグで書いてスムーズにいけます。
8.プロジェクトの設定
定期実行する設定と、Phing呼び出し設定。
ちなみに、build.xmlのphpdocターゲットはこんな感じ。APIリファレンスが毎日どんどん作られていくよ!
<target name="phpdoc">
<phpdoc title="SAT Library Documentation"
destdir="apidocs"
sourcecode="false"
output="HTML:Smarty:PHP">
<fileset dir="src">
<include name="includes/minfew/**/*.php" />
<include name="includes/pmi/**/*.php" />
<include name="includes/satlib/**/*.php" />
</fileset>
<projdocfileset dir=".">
<include name="README" />
<include name="INSTALL" />
<include name="CHANGELOG" />
</projdocfileset>
</phpdoc>
</target>
testターゲットはこう。カバレージ出力のためにcoverage-setupも必要みたい。
<target name="clean">
<delete dir="reports" includeemptydirs="true" />
<delete dir="clover" includeemptydirs="true" />
</target>
<target name="coverage" depends="clean">
<mkdir dir="reports/tests" />
<mkdir dir="clover" />
<coverage-setup database="./reports/coverage.db">
<fileset dir="src/includes/">
<include name="**/satlib/classes/*.php"/>
<include name="**/minfew/classes/core/*.php"/>
<include name="**/minfew/classes/support/*.php"/>
<include name="*.php"/>
</fileset>
</coverage-setup>
<phpunit haltonfailure="true" printsummary="true" codecoverage="true">
<formatter todir="reports" type="clover"/>
<formatter todir="reports" type="xml"/>
<batchtest>
<fileset dir="./test">
<include name="*Test.php"/>
</fileset>
</batchtest>
</phpunit>
<coverage-report outfile="reports/coverage.xml">
<report todir="clover" />
</coverage-report>
</target>
で、phpunitとcloverのレポートを結果画面に出力させるためのオプションを設定。うわあこんな簡単なのかー。
ここまでの設定で、こんな画面ができあがる!ブラボー!
いや、まあ、ここまでくるまでにはエラーメッセージと格闘しながらいろいろ頑張った。基本的にはエラーメッセージをよーーく見て、「これをするには何かが足りない」と言ってるので、それをインストールするという流れ。yumとpearをひたすらたたき続ける。あと、PHPソースコードのrequireとかにエラーがあると、カバレージがコケるので、ソースコードも直し直ししながらの道のりでした。ああ、これでやっとUnitTestをどんどん書いていくだけの気持ちいい世界にたどり着いた。
この記事に対するコメント