2016-07-05 36 views
0

我有一个包含我添加到TeamCity中的各种包的项目的Git回购。如何正确触发TeamCity构建git上的单个包?

回购组织这样的:

README.md 
packages/ 
packages/buildscript 
packages/packageOne/manifest (and files) 
packages/packageTwo/manifest (and files) 
packages/packageThree/manifest (and files) 

我想配置TeamCity的执行buildscript建立一个特定的包时,它要么修改或添加到该回购协议。

我已经有了运行buildscript作为构建步骤的一部分,但我不知道如何确保每个包下载和buildscript跑了每一个。

目前buildscript接收包名称,做一些工作,然后运行一个NuGet包。

我是在想,我必须写构建检测哪些软件包已经改变步骤正确,然后做每包所需的行动?就像这样:

  1. 拉包

  2. 软件包运行buildscript

  3. 推到的NuGet饲料

还是有内置的功能做一些步骤?

编辑:

目前,我有它设置,使后更改了Git的回购做,所有的包都将被重建......这显然是很麻烦。

似乎我需要为每个包创建一个构建配置,如果我希望它们单独触发。这发生在我

一种解决方案是有一个步骤,它确定了哪些软件包自上次构建更新,然后执行为他们每个人的构建脚本。因此,我现在正在寻求建议有效的方法,可能涉及在某些构建步骤脚本中运行Git命令。

回答

1

你有两个选择:

  1. 设置为每个包单独构建配置,添加一个触发器,如果​​在包目录中的文件发生了变化,将只进行构建。
  2. 作为构建的一部分,得到改变的文件(见TeamCity, how to get names of the files edited单程,或使用TeamCity的API,例如下图)的列表,阅读这些变化,只有触发已更改的包构建。

PowerShell函数得到修改过的文件和提交日志。只是我的设置的复制粘贴。这些函数要求您传递服务器Url,用户名,密码和构建ID,这些都可以在TeamCity的运行时获得。

# Gets the change log for the specified build ID 
function TeamCity-GetChangeLog($serverUrl, $username, $password, $buildId){ 
    $buildUrl = "$serverUrl/httpAuth/app/rest/changes?build=id:$($buildId)" 
    $authToken = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($username + ":" + $password)) 

    # Get all the changes 
    $request = [System.Net.WebRequest]::Create($buildUrl) 
    $request.Headers.Add("AUTHORIZATION", "$authToken"); 
    $xml = [xml](new-object System.IO.StreamReader $request.GetResponse().GetResponseStream()).ReadToEnd() 

    # Get all commit messages for each of them 
    $changelog = Microsoft.PowerShell.Utility\Select-Xml $xml -XPath ` 
     "/changes/change" | Foreach { 
      TeamCity-GetCommitMessage $serverUrl $username $password $_.Node.id 
     } 

    return $changelog 
} 

# Get the commit messages, and files changed for the specified change id 
# Ignores empty lines, lines containing "#ignore", "merge branch"" or "TeamCity" 
Function TeamCity-GetCommitMessage($serverUrl, $username, $password, $changeId) 
{ 
    $getFilesChanged = $false; 
    $request = [System.Net.WebRequest]::Create("$serverUrl/httpAuth/app/rest/changes/id:$changeId") 
    $authToken = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($username + ":" + $password))  
    $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')) ` 
     -and (-Not $_.Node["comment"].InnerText.StartsWith("Merge branch")) ` 
     -and (-Not $_.Node["comment"].InnerText.StartsWith("TeamCity change"))} | 
     foreach { 
      $getFilesChanged = $true; 
      "<br /><strong>$($_.Node["user"].name.Trim() + " on " + ([System.DateTime]::ParseExact($_.Node.Attributes["date"].Value, "yyyyMMddTHHmmsszzzz", [System.Globalization.CultureInfo]::InvariantCulture)))</strong><br /><br />" 

      "$($_.Node["comment"].InnerText.Trim().Replace("`n", "`n<br />"))" 
     } 

    if ($getFilesChanged) { 
     "<br /><br /><strong>Files Changed</strong><br /><br />" 
     Microsoft.PowerShell.Utility\Select-Xml $xml -XPath "/change/files" | 
     where { ($_.Node["file"].Length -ne 0)} |  
     foreach { Select-Xml $_.Node -XPath 'file' | 
      foreach { "$($_.Node.Attributes["file"].Value)<br />" } 
     } 
    } 
} 
+0

感谢您的信息!我最终修改了我的构建步骤,如下所示: 'Get-Content“%system.teamcity.build.changedFiles。file%“| Select-String -Pattern”packages/*“|%{($ _ -split”:“)[0]} |%{($ _ -split”/“)[1]} | Sort-Object -Unique | Where-Object {Test-Path $ _ -PathType容器} |%{。\ build $ _}' 关于以下更改: 'packages/packageOne/manifest.nuspec:CHANGED:[hash] 包/ packageTwo /工具/ chocolateyInstall.ps1:CHANGED:[散列] 包/ README.md:CHANGED:[散列] file.txt的:CHANGED:[散列] README.md Otherscript.ps1' packageOne& packageTwo将脚本运行:) –

+0

对SE的第一评论,所以我不知道有关字符限制,有点搞砸了我的意图评论,但我希望任何人想知道我如何结束去得到这是它的要点。 –