我使用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:我知道我的问题的最佳解决方案是修改应用程序,以便在测试失败时返回非零退出代码。
答案 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_user
和tc_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) > $(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