あー、なんだ
CruiseControl.NET で PowerShell スクリプトを実行 - 気楽に諸々
CC.NET はどうやって失敗を - 気楽に諸々
プロセスの終了コードが 0 以外なら失敗となるのか。
コンソールアプリのことを良く知らないからすぐにはわからなかった。
PowerShell ならエラー発生で終了した場合、終了コードが 0 以外になって、ちゃんと CC.NET が失敗と判定してくれるし、エラーの内容も出力される。
Write-Output "test1"; throw "hoge"; Write-Output "test2";
このスクリプトを実行すると、CC.NET は失敗と判定する。また、以下のような内容がログに出力される。
<buildresults> <message>test1</message> </buildresults> <buildresults> <message level="Error">hoge</message> <message level="Error">発生場所 D:\Server\Projects\NAgile\CI\build.ps1:2 文字:6</message> <message level="Error">+ throw <<<< "hoge";</message> </buildresults>
あと、エラー発生させなくとも
Exit 1
って感じのコードで終了させれば、終了コードが 1 になって失敗と判定されるけど、これだけだと何も出力されない。
Write-Output "test1"; Write-Warning "hoge"; Write-Error "fuga"; Write-Error "piyo"; Write-Output "test2"; Exit 1;
こんなスクリプトを実行すれば、CC.NET で以下のような内容がログに出力される。
<buildresults> <message>test1</message> <message>警告: hoge</message> <message>test2</message> </buildresults> <buildresults> <message level="Error">D:\Server\Projects\NAgile\CI\build.ps1 : fuga</message> <message level="Error">発生場所 行:1 文字:2</message> <message level="Error">+ &' <<<< .\build.ps1' -Noninteractive</message> <message level="Error">D:\Server\Projects\NAgile\CI\build.ps1 : piyo</message> <message level="Error">発生場所 行:1 文字:2</message> <message level="Error">+ &' <<<< .\build.ps1' -Noninteractive</message> </buildresults> </build>
スクリプトの最後の Exit 1 がない場合、ログの内容は同じだけど CC.NET は成功と判定する。