msdeploy の出力を解析し、エラーが発生した場合に TeamCity のビルドを失敗するにはどうすればよいですか?
質問
ASP.Net プロジェクトをステージング サーバーにデプロイするために TeamCity から実行される msdeploy.exe を使用していますが、いくつかのエラーが発生した場合でも、終了時に常に 0 ステータスを返すという深刻な問題があります。これは、不適切なデプロイは失敗せず、すべてが正常に見えることを意味します。
したがって、出力を解析してエラーを発生させる必要があるのですが、これを行う簡単な方法はありますか?あるいは、これを行う難しい方法はありますか?
以下の TeamCity ビルド ログから、何が起こっているかを確認できます (エラーは発生しますが、終了ステータスが 0 であるため続行されます)。
[17:32:31]: Skip copying Global.asax to obj\Debug\Package\PackageTmp\Global.asax, File obj\Debug\Package\PackageTmp\Global.asax is up to date
[17:32:31]: C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(1845,5): error : Copying file Web.Debug.config to obj\Debug\Package\PackageTmp\Web.Debug.config failed. Could not find file 'Web.Debug.config'. [C:\BuildAgent\work\f3548ee02a6397b9\webapp\WebApp.csproj]
[17:32:31]: Done Building Project "C:\BuildAgent\work\f3548ee02a6397b9\webapp\WebApp.csproj" (Package target(s)) -- FAILED.
[17:32:31]: Build FAILED.
[17:32:31]: "C:\BuildAgent\work\f3548ee02a6397b9\webapp\WebApp.csproj" (Package target) (1) ->
[17:32:31]: (ValidateGlobalPackageSetting target) ->
[17:32:31]: C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(817,5): error : '..\Package\WebApp.zip' exists as a file. You can't package as an archive directory to be the same path as an existing file. Please delete the file before packaging. Alternative,you can call msbuild with /t:CleanWebsitesPackage target to remove it. [C:\BuildAgent\work\f3548ee02a6397b9\webapp\WebApp.csproj]
[17:32:31]: "C:\BuildAgent\work\f3548ee02a6397b9\webapp\WebApp.csproj" (Package target) (1) ->
[17:32:31]: (CopyAllFilesToSingleFolderForPackage target) ->
[17:32:31]: C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(1845,5): error : Copying file Web.Debug.config to obj\Debug\Package\PackageTmp\Web.Debug.config failed. Could not find file 'Web.Debug.config'. [C:\BuildAgent\work\f3548ee02a6397b9\webapp\WebApp.csproj]
[17:32:31]: 0 Warning(s)
[17:32:31]: 2 Error(s)
[17:32:31]: Time Elapsed 00:00:00.87
[17:32:31]: C:\BuildAgent\work\f3548ee02a6397b9>"C:\Program Files\IIS\Microsoft Web Deploy"\msdeploy.exe -verb:sync -source:Package=Package\WebApp.zip -dest:auto -setParam:"IIS Web Application Name"=MyWebName
[17:32:32]: Info: Updating setAcl (MyWebName).
[17:32:32]: Info: Updating setAcl (MyWebName).
[17:32:32]: Info: Updating setAcl (MyWebName/App_Data).
[17:32:32]: Total changes: 3 (0 added, 0 deleted, 3 updated, 0 parameters changed, 0 bytes copied)
[17:32:32]: Process exited with code 0
[17:32:32]: Build finished
解決
TeamCity 7 にはビルド失敗機能があります。
- ビルド構成の設定を編集する
- [ビルド失敗条件] タブ (番号 4) に移動します。
- 「ビルド失敗条件を追加」をクリックします。
- 「ビルドログの特定のテキストでビルドを失敗する」タイプを選択します。
- 「EXEC :」という文字列を使用しました。エラー数:「MSDeploy エラーをキャッチするには、うまく機能します。」
- [テスト] ボタンをクリックすると便利なダイアログが開き、失敗するはずであることがわかっている以前のビルド ログで失敗条件をテストできます。
- 保存
私の構成では、MSBuild から直接 msdeploy.exe を呼び出しています。それが、私のエラー テキストがあなたのものと異なる理由だと思います。
とてもクールで、これに関しては JetBrains が大好きです。
他のヒント
ここでは、リモートでデプロイするために Nant スクリプトを実行したときに、MSDeploy からビルドの失敗を捕捉するために使用したアプローチを示します。これは同じシナリオではありませんが、出発点となるコンセプトを提供するはずです。基本的にこれはシェルから実行できますが、出力をキャプチャし、msdeploy から返されるプレーン テキストを後処理するには、powershell などのスクリプト言語が必要です。私はこの問題を MSDeploy チームに報告し、これに対処するのは面倒であることを伝えました。
でチームシティー9ビルド構成に行くとは、失敗条件をクリックしてください。 「エラーメッセージがビルドランナーによってログに記録された」チェックボックスをチェックしてください。エラーが展開中に発生した場合、これは、ビルドに失敗します。