2011/ 8/25

TeamCity の自動ビルドがこける問題

Facebook で書くか Google+ で書くか Twitter で書くか……と思ったけど、どれも何かまとめておくには困るので、結局ここで。なお、ベンダーへは報告済みです。

TeamCity でしばらくスケジュール済みの定期ビルドが失敗していたのをようやくまともに調査してみました。一応最新バージョンではなかったため、現行最新である 6.5.3 に更新してみても変わらず。

現象としては MSBuild から呼び出されている CodeContracts のリライター (ccrewrite) の呼び出しに失敗してこけている状態。呼び出し自体は "C:\Program Files (x86)\Microsoft\Contracts\Bin\ccrewrite" を呼び出していて、この位置に ccrewrite.exe は確かに存在しています。

また、普通に Visual Studio コマンドプロンプトから msbuild でソリューション自体のビルドなどは、自身の作業用フォルダー、TeamCity の作業用フォルダーいずれでも適切にビルドが実行できる事は確認してあります。

拡張子が指定されていないために実行に失敗している点を考慮して環境変数 PATHEXT を確認してみても、.EXE なんて当然含まれている訳です。うーむ。

ということで、改めてビルドされているときと普通に Windows 上で処理している場合と何か環境に違いがあるのかを確認するため、build parameters を確認してみたところ……ありました。PATH と PATHEXT が明らかに異常です。

env.PATHEXT の値が %PATHEXT%;.RB;.RBW;.RB;.RBW;.RB;.RBW;.RB;.RBW;.RB;.RBW;.RB;.RBW;... いやいやいやいや、何コレ。

さらに env.PATH の値は C:\Ruby192\bin;C:\Ruby192\bin;C:\Ruby192\bin;C:\Ruby192\bin;C:\Ruby192\bin;C:\Ruby192\bin;C:\Ruby192\bin;...;%PATH%;%USERPROFILE%\Programs;C:\Users\(user)\Programs;C:\Users\(user)\Programs;C:\Users\(user)\Programs;C:\Users\(user)\Programs;... って、ちょっと待て。

まぁこの辺で大体オチが見えたと思いますが、Windows の場合は環境変数が 2 つあります。システムグローバルな環境変数とユーザー固有の環境変数です。そして、ユーザーの環境変数を設定する際、C:\Ruby192\bin;%PATH% といった指定をした場合、%PATH% にはシステムの環境変数だけが展開されます。

簡単に言えば、その部分を考慮しない展開が行われているために C:\Ruby192\bin;%PATH% の展開結果が "C:\Ruby192\bin;(システム環境変数の PATH の値)" ではなく "C:\Ruby192\bin;C:\Ruby192\bin;%PATH%" となってしまい、%xxx% があるので再度展開に入る、というのを許容されているループ回数上限まで続けたっぽいです。

無限ループではない感じなのは PATH の方で %USERPROFILE%\Program 以下が展開されていたりするところから想像できます。

この結果として、システム環境変数に含まれている .COM;.EXE;... といった辺りが丸ごと抜けてしまい、.exe が省略された ccrewrite だけではコマンドの実行が出来なかった、という感じになっていました。というか、ExpandEnvironmentStringsForUser 使ってないのかな? コレ。

まぁ、設定されている値を見た通りですが、Ruby 1.9.2 を RubyInstaller から入れた際、ユーザー環境変数の PATH や PATHEXT に追加されていたために、こんなアホなバグを踏んだ感じですね。なんというがっかり。

なお、RubyInstaller 自体は「このユーザーだけに設定しろ」という指定通りに設定しているし、この指定自体は何の問題もありません。