ここの最後で「CI サーバは Windows と Linux どっちがいいだろう?」みたいなことを書きましたが、そもそも 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 による設定
ちょっと調べてみると、CruiseControl の Windows サービスは 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 upgrade-all 以降の手順を踏めば、問題ないと思います。
XAMPP は便利なんですけど、PEAR パッケージの管理がいいかげんなのが玉に瑕ですね。phpDocumentor なんかも全然動かないし・・・要望出してるけど反応ないし。
戻り値が拾えない?
PHPUnit 等が異常終了しても、PHPUnit 自体の呼び出しには成功しているので、CruiseControl 側にエラーとして認識されないようです。簡単に解決できそうな気もするんですが、とりあえず放置してます。