26

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で指定されたディレクトリに移動して、終了直前からビルド操作が成功した場合にアーティファクトを公開できます。

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

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

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

4

5 に答える 5

27

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

TeamCityは、失敗したビルドと失敗したビルドステップを区別します。ユニットテストが失敗するとビルド全体が失敗しますが、残念ながら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に感謝します。

于 2013-03-13T16:29:54.290 に答える
24

混乱を防ぐために、この問題は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つのテストに失敗した場合にビルドを失敗としてマークするには、このオプションをオンにします。

于 2014-10-20T10:40:43.050 に答える
3

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

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

于 2013-03-07T13:46:11.767 に答える
1

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

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

于 2013-03-06T19:52:33.177 に答える
0

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

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

于 2013-03-08T10:24:19.710 に答える