2014-02-17 64 views
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%?格式不重要 - 如果它是一個字符串或數字。 PS:我知道如果測試失敗,我的問題的最佳解決方案是修改應用程序返回非零退出代碼。

+0

任何%ERRORLEVEL%0比其他手段構建失敗 – KMoraz

+0

你能詳細一點。例如「*將測試結果報告給teamcity。*」這些結果如何在TC中完全顯示? 「*基於測試結果*」以什麼格式要求這些結果? 「*獲得構建狀態*」同樣的問題。什麼是構建狀態和/或您希望以何種格式? – stijn

回答

1

TeamCty似乎沒有直接暴露這個,但狀態可以使用REST api獲取。這是一個使用捲曲的例子;但你也可以舉例PowweShell的Invoke-RestMethod。

這裏的MSBuild的腳本casues測試失敗我用於測試:

<?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 
相關問題