2010-11-30 53 views
13

有沒有簡單的方法讓TeamCity將文本或html更改日誌包含爲其輸出工件之一?在TeamCity中創建更改日誌工件

也許我需要走下有msbuild或其他進程創建更改日誌的路線,但由於TeamCity爲每個構建生成一個,我想知道是否已經有一個簡單的方法來訪問它作爲工件和將其包含在工件路徑指令中,以便它可以成爲發行包的一部分。

+0

你能說明從哪裏生成這個日誌嗎?通常將文件附加爲製品不應該成爲問題。 – 2013-08-27 06:32:30

回答

12

是的,改變日誌是作爲文件訪問,此文件路徑是在TeamCity的編譯參數:

%system.teamcity.build.changedFiles.file% 

所以,你可以這樣做:

  • 向您的構建添加命令行構建步驟。
  • 使用類型自定義腳本。
  • 輸入該腳本:

副本 「%system.teamcity.build.changedFiles.file%」 changelog.txt

  • 最後編輯神器規則,您的構建,包括工件中的changelog.txt(常規設置 - >工件路徑 - >添加「changelog.txt」)。
+0

+1這對我來說是一個好的開始。但changelog.txt文件缺少與列出的每個文件關聯的註釋。你知道是否有辦法得到評論嗎? – slolife 2014-01-30 08:45:21

+1

不要這樣想。我們有相同的要求,最終制作了一個控制檯應用程序,它訪問TC的其餘api以獲取提交評論。然後運行這個控制檯應用程序作爲最終的構建步驟。 – 2014-01-30 12:46:38

8

您可以通過TeamCity的REST API生成更改日誌。一個PowerShell腳本可以找到這個here

<# 
.SYNOPSIS 
    Generates a project change log file. 
.LINK 
    Script posted over: 
    http://open.bekk.no/generating-a-project-change-log-with-teamcity-and-powershell 
#> 

# Where the changelog file will be created 
$outputFile = "%system.teamcity.build.tempDir%\releasenotesfile_%teamcity.build.id%.txt" 
# the url of teamcity server 
$teamcityUrl = "%teamcity.serverUrl%" 
# username/password to access Teamcity REST API 
$authToken=[Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("%system.teamcity.auth.userId%:%system.teamcity.auth.password%")) 
# Build id for the release notes 
$buildId = %teamcity.build.id% 

# Get the commit messages for the specified change id 
# Ignore messages containing #ignore 
# Ignore empty lines 
Function GetCommitMessages($changeid) 
{ 
    $request = [System.Net.WebRequest]::Create("$teamcityUrl/httpAuth/app/rest/changes/id:$changeid")  
    $request.Headers.Add("AUTHORIZATION", "$authToken"); 
    $xml = [xml](new-object System.IO.StreamReader $request.GetResponse().GetResponseStream()).ReadToEnd()  
    Microsoft.PowerShell.Utility\Select-Xml $xml -XPath "/change" | 
     where { ($_.Node["comment"].InnerText.Length -ne 0) -and (-Not $_.Node["comment"].InnerText.Contains('#ignore'))} | 
     foreach {"+ $($_.Node["user"].name) : $($_.Node["comment"].InnerText.Trim().Replace("`n"," "))`n"} 
} 

# Grab all the changes 
$request = [System.Net.WebRequest]::Create("$teamcityUrl/httpAuth/app/rest/changes?build=id:$($buildId)") 
$request.Headers.Add("AUTHORIZATION", "$authToken"); 
$xml = [xml](new-object System.IO.StreamReader $request.GetResponse().GetResponseStream()).ReadToEnd() 

# Then get all commit messages for each of them 
$changelog = Microsoft.PowerShell.Utility\Select-Xml $xml -XPath "/changes/change" | Foreach {GetCommitMessages($_.Node.id)} 
$changelog > $outputFile 
Write-Host "Changelog saved to ${outputFile}:" 
$changelog