我遇到了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对于设置依赖关系非常有用。
答案 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测试都没有成功,我们就会使用它来阻止自动部署。
答案 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对于设置依赖关系非常有用。