【问题标题】:Is there a way to get build status as a property?有没有办法获得作为财产的建造状态?
【发布时间】:2014-03-16 23:11:24
【问题描述】:

我有一个丑陋的 Teamcity 使用 MSBuild 构建配置。它执行自定义应用程序(测试运行程序),该应用程序使用自定义消息传递将测试结果报告给 teamcity。

##teamcity[testStarted name='test1']
##teamcity[testFailed name='test1' message='failure message' details='message and stack trace']

在构建概述和测试选项卡中显示在 teamcity 中。

Teamcity 识别失败的测试,如果任何测试失败,它会将构建标记为失败: http://i.stack.imgur.com/Qz9UT.png

稍后在 MSBuild 目标中,我想根据测试结果标记 cvs。 有没有办法将构建状态(如果失败、挂起、警告)作为属性获取?类似 %build.status% 的东西?格式无关紧要 - 如果它是字符串或数字。

PS:我知道我的问题的最佳解决方案是修改应用程序以在测试失败时返回非零退出代码。

【问题讨论】:

  • 除 0 以外的任何 %errorlevel% 都表示构建失败
  • 你能详细说明一下吗?例如“向 teamcity 报告测试结果。”这些结果如何准确地出现在 TC 中? “基于测试结果”你想要这些结果的格式是什么? “获取构建状态”同样的问题。什么是构建状态和/或您期望它采用什么格式?

标签: build msbuild continuous-integration teamcity


【解决方案1】:

TeamCty 似乎没有直接公开这一点,但可以使用 REST api 获取状态。这是一个使用 curl 的示例;但你也可以使用 PowserShell 的 Invoke-RestMethod。

这是我用于测试的导致测试失败的 msbuild 脚本:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Name="Test">
    <Message Importance="high" Text="##teamcity[testStarted name='test1']" />
    <Message Importance="high" Text="##teamcity[testFailed name='test1' message='failure message' details='message and stack trace']" />
  </Target>

</Project>

然后获取当前构建状态的脚本,将其转储到文件中,将文件读入 msbuild 项,然后使用正则表达式从中获取状态。您只需提供 tc_usertc_password 属性(或允许访客访问)并更改 url 以匹配您的服务器。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="GetBuildStatus">

  <Target Name="RunCurl">
    <PropertyGroup>
      <MyTempFile>curl_out</MyTempFile>
    </PropertyGroup>
    <Exec Command="curl http://localhost/httpAuth/app/rest/builds/id:$(teamcity_build_id) -basic -u $(tc_user):$(tc_password) &gt; $(MyTempFile)"/>
    <ReadLinesFromFile File="$(MyTempFile)">
      <Output TaskParameter="Lines" ItemName="CurlOutput"/>
    </ReadLinesFromFile>
    <Delete Files="$(MyTempFile)"/>
  </Target>

  <Target Name="GetBuildStatus" DependsOnTargets="RunCurl">
    <PropertyGroup>
      <CurlOutputFull>@(CurlOutput)</CurlOutputFull>
      <BuildStatus>$([System.Text.RegularExpressions.Regex]::Match($(CurlOutputFull), `status="(\w*)"`).Groups[ 1 ].Value)</BuildStatus>
    </PropertyGroup>
    <Message Text="BuildStatus = $(BuildStatus)"/>
  </Target>

</Project>

打印出来:

BuildStatus = FAILURE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2012-12-14
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    相关资源
    最近更新 更多