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

ne2*_*mar 6 msbuild teamcity continuous-integration build

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

##teamcity[testStarted name='test1']
##teamcity[testFailed name='test1' message='failure message' details='message and stack trace']
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

sti*_*ijn 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>
Run Code Online (Sandbox Code Playgroud)

然后,脚本获取当前构建的状态,将其转储到文件中,将该文件读入 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>
Run Code Online (Sandbox Code Playgroud)

这打印:

BuildStatus = FAILURE
Run Code Online (Sandbox Code Playgroud)