【问题标题】:Teamcity running build steps even when tests fail即使测试失败,Teamcity 也会运行构建步骤
【发布时间】:2013-02-21 16:06:11
【问题描述】:

我在使用 Teamcity 时遇到问题,即使之前的步骤不成功,它也会继续运行构建步骤。

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

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

在“构建失败条件”选项卡中,我检查了 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 中的配置生成工件。

例如脚本可以将工件从临时目录移动到 在 TeamCity 中指定为发布工件的目录 在完成之前,以防构建操作成功。

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

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

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

【问题讨论】:

  • 即使您通过变通方法解决了自己的问题,我认为 Adams 的回答更适合您描述的场景。考虑将他的答案标记为已接受。
  • 是的,我不确定只是因为我的解决方法更简单,但这是一个很好的答案,我已经重新分配了。

标签: build teamcity mstest


【解决方案1】:

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

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

【讨论】:

  • 我在部署构建步骤中设置了这个值,@RinoTom,它仍然被部署
  • 对不起,如果我做了任何混淆。 ContinueOnError 是默认设置为 false 的东西。因此,您可能不需要在任何构建步骤中明确指定。但是,在您的某些构建步骤中,它可能设置为true。所以你需要用true检查那个,然后把它改回来。最有可能的是,目前构建失败的地方。部署构建步骤可以继续进行,无需任何更改。
【解决方案2】:

这是(如您所见)TeamCity 的一个已知问题,在他们的问题跟踪器中有一组linked issues。此问题有望在 TeamCity 的下一版本(8.x 版)中得到解决

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      这是 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.

      【讨论】:

      • 有一种更简单的方法可以在不解析 XML 的情况下直接获取构建状态:/guestAuth/app/rest/builds/%teamcity.build.id%/status
      • 从 PowerShell 引发错误似乎不会返回错误代码。我改用“exit 1”。
      • 正如@arni 提到的,您需要为 TeamCity 输出非零退出代码以检测构建失败。使用“exit 1”而不是抛出错误。
      【解决方案5】:

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

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

      仅当构建状态成功时 - 在开始步骤之前,构建代理向服务器请求构建状态,如果状态失败则跳过该步骤。

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

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

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

      在构建失败条件页面,如果构建失败区域,指定 TeamCity 构建失败的时间:

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

      【讨论】:

      • 这是正确答案。选中“至少一个测试失败”和“构建运行程序记录错误消息”复选框(以防万一)为我们解决了这个问题。避免使用 powershell 路线,节省时间、精力和维护混乱!
      猜你喜欢
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多