有没有办法将构建状态作为属性?

时间:2014-02-17 15:18:42

标签: build msbuild continuous-integration teamcity

我使用MSBuild进行了丑陋的Teamcity构建配置。它执行自定义应用程序(测试运行器),它使用自定义消息传递将测试结果报告给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:我知道我的问题的最佳解决方案是修改应用程序,以便在测试失败时返回非零退出代码。

1 个答案:

答案 0 :(得分: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属性(或允许访客访问)并更改网址以匹配您的服务器。

<?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