如何正确触发TeamCity在git上构建单个包?

时间:2016-07-05 20:13:35

标签: git nuget teamcity

我有一个包含我已添加到TeamCity的各种软件包的项目的Git仓库。

回购的组织方式如下:

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

我想配置TeamCity来执行buildcript,以便在修改或添加到repo时构建特定的包。

我已经将构建脚本作为构建步骤的一部分运行了,但我不知道如何确保每个软件包都已下载并且每个软件包都针对每个软件包运行。

目前,buildscript采用包名,有些工作,然后运行NuGet包。

我是否认为我必须编写构建步骤以检测哪些软件包已更改,然后对每个软件包执行所需的操作?像这样:

  1. 拉包

  2. 在包

  3. 上运行buildscript
  4. 推送到NuGet Feed

  5. 或者是否有内置功能来执行这些步骤?

    编辑:

    目前我已经进行了设置,以便在对Git仓库进行更改后,所有的包都会被重建......这显然很麻烦。

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

    我遇到的一个解决方案是让一个步骤确定自上次构建以来哪些包已更新,然后为每个包执行构建脚本。因此,我现在正在寻求有效方法的建议,可能涉及在一些构建步骤脚本中运行Git命令。

1 个答案:

答案 0 :(得分:1)

您有两种选择:

  1. 为每个程序包设置单独的构建配置,添加一个触发器,只有在该程序包目录中的文件发生更改时才会执行构建。
  2. 作为构建的一部分,获取已更改的文件列表(请参阅TeamCity, how to get names of the files edited以获取一种方法,或使用TeamCity API,下面的示例),阅读这些更改并仅触发已更改的包的构建
  3. 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 />" }
            }   
        }
    }