web-dev-qa-db-ja.com

テストが失敗した場合でもビルドステップを実行するTeamcity

Teamcityに問題があり、前のステップが失敗した場合でもビルドステップの実行が進行しています。

ビルド構成の最後のステップでサイトをデプロイしますが、テストのいずれかが失敗した場合にサイトをデプロイしたくありません。

各ビルドステップは、前のすべてのステップが成功した場合にのみ実行されるように設定されています。

[ビルドの失敗条件]タブで、次の場合に[ビルドの失敗]で次のオプションを確認しました。

-build process exit code is not zero
-at least one test failed
-an out-of-memory or crash is detected (Java only)

これは機能しません-テストが失敗した場合でも、TeamCityは私のサイトをデプロイします、なぜですか?

ビルドログで特定のテキストを検索するビルド失敗条件を追加しようとしました(つまり、「テスト実行に失敗しました。」)。

概要ページで完了したテストを表示すると、最新のビルドに対するエラーメッセージが表示されます。

「テストの実行に失敗しました。」ビルドログにテキストが表示されました

しかし、それでもとにかくそれを展開します。

誰かがこれを修正する方法を知っていますか?問題は長い間実行されているようです ここ

どうやら回避策があります:

これまでのところ、明らかな回避策があるため、この機能はそれほど重要であるとは考えていません。スクリプトは必要な条件をチェックでき、TeamCityで構成されているアーティファクトを生成しません。

例えばスクリプトは、アーティファクトを一時ディレクトリからTeamCityで指定されたディレクトリに移動して、終了直前からビルド操作が成功した場合にアーティファクトを公開できます。

しかし、それを正確に行う方法については私にはわかりませんし、最善の解決策のようにも思えません。助けていただければ幸いです。

編集:スナップショットの依存関係の問題を回避することもできました。テストビルドに依存する別の「デプロイ」ビルドがあります。 、テストが失敗した場合は実行されなくなりました。

This は、依存関係を設定するのに役立ちました。

26
DevDave

これは、TeamCity 8.1(cf。 http://youtrack.jetbrains.com/issue/TW-17002 )の時点で既知の問題であり、TeamCity 8.x +で修正されています( を参照)この答え )。

TeamCityは、失敗したbuildと失敗したbuild stepを区別します。ユニットテストが失敗するとビルド全体が失敗しますが、残念ながらTeamCityはテストステップ自体が成功したと見なしますゼロ以外のエラーコードを返さなかったため。その結果、後続のステップは実行を継続します。

さまざまな回避策が提案されていますが、重要なセットアップが必要であるか、TeamCityでのテストエクスペリエンスに妥協が必要であることがわかりました。

ただし、 @ arex1337からの提案 を確認した後、TeamCityに必要なことを実行させる簡単な方法を見つけました。次のインラインスクリプトを含む既存のテストステップの後に、Powershellビルドステップを追加するだけです(YOUR_TEAMCITY_HOSTNAMEを実際のTeamCityホスト/ドメインに置き換えます)。

$request = [System.Net.WebRequest]::Create("http://YOUR_TEAMCITY_HOSTNAME/guestAuth/app/rest/builds/%teamcity.build.id%")
$xml = [xml](new-object System.IO.StreamReader $request.GetResponse().GetResponseStream()).ReadToEnd()
Microsoft.PowerShell.Utility\Select-Xml $xml -XPath "/build" | % { $status = $_.Node.status }

if ($status -eq "FAILURE") {
    throw "Failing this step because the build itself is considered failed. This is our way to workaround the fact that TeamCity incorrectly considers a test step to be successful even if there are test failures. See http://youtrack.jetbrains.com/issue/TW-17002"
}

このインラインPowerShellスクリプトは、TeamCity REST APIを使用して、ビルド自体が全体として失敗したと見なされるかどうかを確認しています(変数%teamcity.build.id%"はTeamCityに置き換えられます。ステップが実行されたときの実際のビルドID)ビルド全体が失敗したと見なされる場合(たとえば、テストの失敗が原因)、このPowerShellスクリプトはエラーをスローし、プロセスがゼロ以外のエラーコードを返すようにします- これにより、個々のビルドステップ自体が失敗したと見なされます。その時点で、後続のステップが実行されないようにすることができます。

このスクリプトはguestAuthを使用することに注意してください。これには、TeamCityゲストアカウントを有効にする必要があります。または、代わりにhttpAuthを使用することもできますが、スクリプトを更新してTeamCityのユーザー名とパスワードを含める必要があります(例:http://USERNAME:PASSWORD@YOUR_TEAMCITY_HOSTNAME/httpAuth/app/rest/builds/%teamcity.build.id%)。

したがって、この追加の手順を実行すると、「前のすべての手順が成功した場合のみ」を実行するように設定された後続のすべての手順は、以前の単体テストに失敗した場合はスキップされます。 JetBrainsが問題を修正するまで、NUnitテストのいずれかが成功しなかった場合に、自動展開を防ぐためにこれを使用しています。

アイデアをくれた@ arex1337に感謝します。

27
adamjcooper

混乱を防ぐために、この問題はTeam City v8.xで修正されています。現在、これらの回避策は必要ありません。

ステップ実行ポリシーは、[ステップの実行]オプションを使用して指定できます。

ビルドステータスが成功した場合のみ-ステップを開始する前に、ビルドエージェントはサーバーにビルドステータスを要求し、ステータスが失敗した場合はステップをスキップします。

https://confluence.jetbrains.com/display/TCD8/Configure+Build+Steps

もちろん、少なくとも1つの単体テストが失敗した場合は、ビルドを失敗させる必要があります。

https://confluence.jetbrains.com/display/TCD8/Build+Failure+Conditions

[ビルドの失敗条件]ページの[ビルドの失敗]領域で、TeamCityがビルドに失敗するタイミングを指定します。

少なくとも1つのテストが失敗しました:ビルドが少なくとも1つのテストに失敗した場合、ビルドを失敗としてマークするには、このオプションをオンにします。

24

これは(ご存知のとおり)TeamCityの既知の問題であり、Issue Trackerに リンクされた問題 のセットがあります。この問題は、TeamCityの次のリリース(バージョン8.x)で解決される予定です。

それまでの間、問題を解決するために特定した方法(バージョン6.5.5の場合)は、後の手順の一部としてテスト結果ファイルをダウンロードすることでした。次に、これを解析してテストの失敗をチェックし、エラーコードを返し、ビルドを適切に中断しました(失敗の一部として必要なクリーンアップを実行しました)。これはおそらく機能します。

3
Rawrgramming

TeamCityビルドの失敗は、ビルドが停止することを意味するのではなく、ビルドがTeamCityの要求に応じてビルド出力ファイルを提供している場合は、アーティファクトを公開します。ビルドステータスを適切に更新するだけです。

ただし、ビルドスクリプトを変更してテストケースの失敗時にビルドを停止することで、ビルドプロセスを非常にうまく停止できます。 MSBuildを使用している場合は、ContinueOnError="false"それを行います。

1
RinoTom

結局、スナップショットの依存関係の問題を解決することができました。テストビルドに依存する別の「デプロイ」ビルドがあり、テストが失敗すると実行されなくなりました。

This は、依存関係を設定するのに役立ちました。

0
DevDave