Dev*_*ave 26 teamcity mstest build
我遇到了问题Teamcity
,即使先前的步骤不成功,它也会继续运行构建步骤.
我的Build配置的最后一步是部署我的站点,如果我的任何测试失败,我不希望它这样做.
每个构建步骤都设置为仅在所有先前步骤都成功时执行.
在Build Failure Conditions选项卡中,我在Fail build下检查了以下选项:
-build process exit code is not zero
-at least one test failed
-an out-of-memory or crash is detected (Java only)
Run Code Online (Sandbox Code Playgroud)
这不起作用 - 即使测试失败,TeamCity部署我的网站,为什么?
我甚至尝试添加一个额外的构建失败条件,它将在构建日志中查找特定文本(即"Test Run Failed.")
在概述页面中查看已完成的测试时,您可以看到针对最新版本的错误消息:
"测试运行失败." 文本出现在构建日志中
但无论如何它仍然会部署它.
有谁知道如何解决这一问题?看来,问题已经运行了很长一段时间,在这里.
显然有一个解决方法:
到目前为止,我们不认为此功能非常重要,因为有一个明显的解决方法:脚本可以检查必要条件,并且不会生成TeamCity中配置的工件.
例如,脚本可以将工件从临时目录移动到TeamCity中指定的目录,作为完成之前的发布工件,以防构建操作成功.
但对于我究竟该如何做到这一点并不清楚,并且听起来也不是最好的解决方案.任何帮助赞赏.
编辑:我还能够解决快照依赖的问题,我将有一个独立的"部署"版本,它依赖于测试版本,现在如果测试失败,它就不会运行.
这对于设置依赖性非常有用.
ada*_*per 27
这是TeamCity 7.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"
}
Run Code Online (Sandbox Code Playgroud)
这个内联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%
).
因此,通过此附加步骤,如果之前的单元测试失败,将跳过设置为"仅当所有先前步骤都成功"的所有后续步骤.如果我们的任何NUnit测试在JetBrains修复问题之前没有成功,我们就会使用它来阻止自动部署.
AHM*_*UNY 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何时失败构建:
至少一个测试失败:如果构建失败至少一个测试,请选中此选项以将构建标记为失败.
归档时间: |
|
查看次数: |
10490 次 |
最近记录: |