即使测试失败,Teamcity也会运行构建步骤

时间:2013-03-06 17:57:33

标签: build teamcity mstest

我遇到了Teamcity的问题,即使以前没有成功,也会继续运行构建步骤。

构建配置的最后一步是部署我的网站,如果我的任何测试失败,我不希望它这样做。

每个构建步骤都设置为仅在前面的所有步骤都成功时执行。

在Build Failure Conditions选项卡中,我检查了Fail build if下的以下选项:

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

这不起作用 - 即使测试失败,TeamCity部署我的网站,为什么?

我甚至尝试添加一个额外的构建失败条件,该条件将在构建日志中查找特定文本(即“测试运行失败”。)

在概述页面中查看已完成的测试时,您可以看到针对最新版本的错误消息:

“测试运行失败。”文本出现在构建日志中

但无论如何它仍然会部署它。

有谁知道如何解决这个问题?该问题似乎已经运行了很长时间,here

显然有一种解决方法:

  

到目前为止,我们并不认为此功能非常重要   一个明显的解决方法:脚本可以检查必要的条件   并且不会生成TeamCity中配置的工件。

     

e.g。脚本可以将工件从临时目录移动到   TeamCity中指定的目录为just的发布工件   在完成之前以及构建操作成功的情况。

但我对于如何做到这一点并不清楚,并且听起来也不是最好的解决方案。任何帮助表示赞赏。

编辑:我还能够解决快照依赖的问题,我将有一个独立的“部署”版本依赖于测试版本,现在它不会运行如果测试失败。

This对于设置依赖关系非常有用。

5 个答案:

答案 0 :(得分:27)

这是TeamCity 7.1(参见http://youtrack.jetbrains.com/issue/TW-17002)中的已知问题,已在TeamCity 8.x +中修复(请参阅this answer)。

TeamCity区分失败的构建和失败的构建步骤。虽然失败的单元测试将使整个构建失败,但不幸的是,TeamCity仍然认为测试步骤本身成功,因为它没有返回非零错误代码。因此,后续步骤将继续运行。

已经提出了各种变通方法,但我发现它们要么需要非常重要的设置,要么对TeamCity的测试体验有所妥协。

但是,在审核了suggestion from @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测试都没有成功,我们就会使用它来阻止自动部署。

Thanks to @arex1337 for the idea.

答案 1 :(得分:24)

为防止混淆,此问题已在Team City v8.x中修复,我们现在不需要这些解决方法。

您可以通过执行步骤选项指定步骤执行策略:

仅在构建状态成功时 - 在开始步骤之前,构建代理会从服务器请求构建状态,并在状态失败时跳过该步骤。

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

当然,如果至少有一个单元测试失败,则需要使构建失败:

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

在Build Failure Conditions页面上,Fail build if区域,指定TeamCity何时失败构建:

至少有一个测试失败:如果构建失败至少一个测试,请选中此选项以将构建标记为失败。

答案 2 :(得分:3)

这是(正如您所发现的)TeamCity的已知问题,其问题跟踪器中有一组linked issues。希望在下一版本的TeamCity(版本8.x)中解决此问题

与此同时,我们确定解决问题的方式(对于版本6.5.5)是下载测试结果文件作为后续步骤的一部分。然后解析它以检查任何测试失败,返回错误代码并因此正确地破坏构建(执行我们作为失败的一部分所需的任何清理),这可能对您有用。

答案 3 :(得分:1)

TeamCity构建失败并不意味着它将停止构建,如果构建提供TeamCity要求的构建输出文件,它将发布构件。它只会正确更新构建状态。

但是,您可以通过修改构建脚本来停止构建测试用例失败,从而停止构建过程。如果您使用的是MSBuild,那么ContinueOnError="false"将会这样做。

答案 4 :(得分:0)

最后,我能够通过快照依赖来解决问题,我将拥有一个独立的“部署”构建,它依赖于测试构建,现在如果测试失败,它就不会运行。

This对于设置依赖关系非常有用。