miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

Windows で phpUnderControl を動かしてみた

ここの最後で「CI サーバは WindowsLinux どっちがいいだろう?」みたいなことを書きましたが、そもそも Windows で動作するのか、ちょっとだけ試してみました。結論としては、Windows でもおおむね問題なく動きそうです。

CruiseControl のインストール

ここで Windows 用のインストーラ(.exe)が配布されているので特に問題ないかと。デフォルトではサービスとして登録されます。

PATH の設定

CruiseControl をサービス登録したとして、まずサービスを起動すると、

'"java.exe"' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

こんなエラーになってしまいます。さらに、phpUnderControl を動かしたときにも

D:\CruiseControl\projects\php-under-control\build.xml:5: Execute failed: java.io.IOException: Cannot run program "phpdoc.bat" (in directory "D:\CruiseControl\projects\php-under-control\source"): CreateProcess error=2, ?w?????t?@?

こんなエラーが。

まあ PATH が通ってないのが問題で、こういう場合は

  • サービスの起動ユーザを変更
  • build.xml 内の記述をフルパス指定に変更

してしまえばうまくいきそうなものですが、この辺りを変更してもサブプロセスに環境変数が引き継がれない(?)ようで、

'php' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

こんなエラーは残ってしまいます。なので、今回は別の対応を行うことに。

wrapper.conf による設定

ちょっと調べてみると、CruiseControlWindows サービスは Java Service Wrapper というのを使っているらしく、CruiseControl インストールディレクトリ直下の wrapper.conf で設定を行うようです。

細かい設定は

に載っている通りで、 wrapper.conf 末尾に

set.PATH=C:\WINDOWS\SysWOW64%WRAPPER_PATH_SEPARATOR%C:\path\to\php%WRAPPER_PATH_SEPARATOR%%PATH%

みたいなのを追加すれば OK です。

java のパスが通っていない件は、マニュアルに従うと wrapper.java.command を変更するのが正攻法のようなのですが・・・php と同じでサブプロセス側で(?)うまく実行されない問題がありました。

XAMPPP を使うときは

サンプルプロジェクト(phpuc example で作成されるやつ)で PHPUnit を動かすと

Warning: require_once(PHPUnit/Framework/TestCase.php): failed to open stream: No such file or directory in D:\CruiseControl\projects\php-under-control\source\tests\MathTest.php on line 38
Fatal error: require_once(): Failed opening required 'PHPUnit/Framework/TestCase.php' (include_path='.;*\pleiades\xampp\php\pear\') in D:\CruiseControl\projects\php-under-control\source\tests\MathTest.php on line 3
8

のようなエラーが出て、ちょっとハマったりもしました。

理由は PHPUnit が 1.17 とか古いから。あらかじめ

pear uninstall PHPUnit
paer uninstall PHPUnit2

とやったあとで

ここの pear upgrade-all 以降の手順を踏めば、問題ないと思います。

XAMPP は便利なんですけど、PEAR パッケージの管理がいいかげんなのが玉に瑕ですね。phpDocumentor なんかも全然動かないし・・・要望出してるけど反応ないし。

戻り値が拾えない?

PHPUnit 等が異常終了しても、PHPUnit 自体の呼び出しには成功しているので、CruiseControl 側にエラーとして認識されないようです。簡単に解決できそうな気もするんですが、とりあえず放置してます。