あー、なんだ

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 は成功と判定する。