2010-11-30 4 views
13

Есть ли простой способ заставить TeamCity включить текстовый или html-журнал изменений в качестве одного из его артефактов вывода?Создать артефакт изменений в TeamCity

Возможно, мне нужно спуститься по пути, когда msbuild или какой-либо другой процесс создадут журнал изменений, но поскольку TeamCity генерирует один для каждой сборки, мне интересно, есть ли еще простой способ получить к нему доступ как артефакт и включить его в директивы пути артефактов, чтобы он мог быть частью пакета выпуска.

+0

Можете ли вы уточнить, откуда сгенерирован этот журнал? Обычно прикрепление файлов в качестве артефакта не должно быть проблемой. – 2013-08-27 06:32:30

ответ

12

Да, переключающий журнал доступен в виде файла, путь к этому файлу в параметре TeamCity сборки:

%system.teamcity.build.changedFiles.file% 

Таким образом, вы могли бы сделать это:

  • Добавить шаг командной строки для сборки.
  • Использовать шрифт Custom Script.
  • Введите этот скрипт:

копия "% system.teamcity.build.changedFiles.file%" changelog.txt

  • Наконец редактировать правила артефакта для вашей сборки, чтобы включить changelog.txt в ваших артефактах (Общие настройки -> Пути артефактов -> Добавить "changelog.txt").
+0

+1 Это хорошее начало для меня. Но в файле changelog.txt отсутствуют комментарии, связанные с каждым указанным файлом. Знаете ли вы, есть ли способ включить комментарии? – slolife 2014-01-30 08:45:21

+1

Не думайте так. У нас было одно и то же требование, и мы закончили создание консольного приложения, которое обратилось к остальным участникам TC, чтобы получить комментарии коммита. Запуск этого консольного приложения был добавлен в качестве окончательного этапа сборки. – 2014-01-30 12:46:38

8

Вы можете создать журнал изменений через REST API TeamCity. Сценарий 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 
Смежные вопросы