CakePHPアプリをHudsonで継続的インテグレーションする方法

2010/10/18

この記事はCakePHP1.2系またら1.3系を対象としており、CakePHP2.0系では別のアプローチになります。

不思議なことにCakePHPアプリの開発でHudson使って継続的インテグレーションしている事例をほとんど見たことがないんだけど、個人的にはPHPアプリだって全部HudsonでCIすべきと思っているのでやってみた。 (ちなみに最近までphpUnderControlでCIしていた)

概略

CakePHPアプリでCIやろうとして問題になるのは、

  • CakePHPでのテストライブラリがSimpleTestでありJUnit互換のテスト結果を出力できないこと
  • さらにSimpleTestでは一応XMLでの結果出力ができるのに、CakePHPのreporterにcake_xml_reporterとかが無くて、html出力かテキスト出力しかできない

という2点にあるので、この2点をクリアする方法を考えれば良い。 CakePHPのreporterを自作して、xsltでXMLをJUnit互換にしても良いが、今回偶然にもStagehand_TestRunnerという素晴らしいライブラリを見つけたので、そいつを使うことにする。

Stagehand_Testrunnerって何?

Stagehand_TestRunnerはテスト駆動開発者のためのテストランナーを提供しており、以下のような特徴がある。(上記サイトより引用)

  • 指定されたディレクトリに含まれるテストの実行
  • 指定されたファイルに含まれるテストの実行
  • 指定されたファイルの指定されたテストのみの実行
  • 指定されたクラスのテストのみの実行
  • テスト結果の色付け
  • 指定された PHP スクリプトのテスト実行前のプリロード
  • 指定されたディレクトリの変更の監視および変更検出時のテストの実行
  • Growl へのテスト結果の通知
  • JUnit XML フォーマットによる、指定されたファイルへのテスト結果のロギング
  • 詳細な進捗リポートの出力
  • 最初の失敗またはエラーの際の停止
  • テストファイルのサフィックスの指定
  • PHPUnit, SimpleTest, CakePHP, PHPT, PHPSpec のサポート

このツールを使うことで、PHPUnitでもSimpleTestでもCakePHPでもほぼ同様のインターフェイスでテストを実行できるようになる優れものである。

で、Hudson + CakePHP

Stagehand_TestRunnerを使うことで問題はクリアできるので、あとは実際にインストール&設定の手順を書く。

Stagehand_TestRunnerのインストール

pear channel-discover pear.piece-framework.com
pear install piece/stagehand_testrunner

Hudson側の準備

「PHPでもHudsonを使うべし」を参照して、Hudsonの設定をする。必要になってくるのは以下のもの

  • phingの導入 (pearコマンドから)
  • phingプラグインの導入 (Hudsonの管理画面から)
  • xUnitプラグインの導入 (Hudsonの管理画面から)

phingのビルド設定

build.xmlには以下のように追記する。

  <target name="test"> 
   <exec command="cakerunner --cakephp-app-path /path/to/source/app --log-junit=/path/to/reports/unittest.xml -R /path/to/source/app/tests/cases/" /> 
 </target>

Hudsonの設定

プロジェクトの設定画面において、ビルド手順の設定でphingの操作を設定

さらに出力したユニットテスト結果の取り込みのためにxunitの取り込み設定を行う(「JUnitテスト結果の集計」でレポートのパスを設定してもうまくいかない。たぶん処理の順番かと。)

※レポートの種別は何でもよいと思うが、PHPUnitレポートからの変換を選択しておく。

以上で完了だ

最後に

CakePHPアプリケーションをHudsonでCIする方法は海外を探してもあんまり情報が出てこなかったけど、現状はこれが一番楽な方法だと思う。本当はCakePHPのTestRunnerがもうちょっと改善されれば良いんだけどね。

ということで、CIライフをお楽しみください。

2010/10/18

著作

寄稿

Ryuzeeについて

Latest post: