有没有一种方法可以将构建状态作为属性获取?

6

我有一个使用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%?格式不重要——可以是字符串或数字。

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


任何 %errorlevel% 值不为 0 都意味着构建失败。 - KMoraz
你能详细说明一下吗?例如:“向TeamCity报告测试结果。”这些结果在TC中会以什么样的形式出现?“基于测试结果”,你希望以什么格式呈现这些结果?“获取构建状态”,同样的问题。什么是构建状态,或者你期望以什么格式呈现它? - stijn
1个回答

1
TeamCity似乎没有直接暴露这一点,但可以使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接