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

布伦丹·麦科伊(Brendan McCoy)

我有一个项目的Git存储库,其中包含我已添加到TeamCity的各种软件包。

回购的组织方式如下:

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

我想配置TeamCity来执行构建脚本,以在修改或添加到仓库中时构建特定的程序包。

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

当前,构建脚本采用程序包名称,进行一些工作,然后运行NuGet程序包。

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

  1. 拉包

  2. 在包上运行buildscript

  3. 推送至NuGet提要

还是有内置功能可用于执行某些步骤?

编辑:

目前,我已经对其进行了设置,以便在对Git存储库进行更改之后,可以重新构建所有软件包……这显然很麻烦。

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

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

本·理查兹(Ben Richards)

您有两种选择:

  1. 为每个软件包设置一个单独的构建配置,添加一个触发器,该触发器仅在该软件包目录中的文件已更改时才进行构建。
  2. 作为构建的一部分,获取已更改文件的列表(请参阅TeamCity,如何以一种方式编辑文件的名称,或使用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 />" }
        }   
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在引用程序集(NuGet程序包)中的DbContext上触发Update-Database

来自分类Dev

如何在引用程序集(NuGet程序包)中的DbContext上触发Update-Database

来自分类Dev

如何配置teamcity以构建asp.net mvc Web项目的部署程序包并将其放入指定目录

来自分类Dev

构建自定义RPM,但程序包为空?

来自分类Dev

构建自定义RPM,但程序包为空?

来自分类Dev

为.proto文件设置正确的程序包名称

来自分类Dev

如何在Emacs的配置文件上为程序包设置可执行路径?

来自分类Dev

使用3种不同的构建配置从单个C#项目创建NuGet程序包

来自分类Dev

XLConnect,rJava和程序包构建

来自分类Dev

如何导入/调用程序包的“子程序包”?

来自分类Dev

无法为 UWP 商店提交构建应用程序包

来自分类Dev

为Meteor编写程序包时如何依赖另一个程序包

来自分类Dev

带有Rcpp代码的程序包无法在Windows上构建

来自分类Dev

启动板:在utopic上构建程序包,但针对较旧版本发布

来自分类Dev

我可以在ubuntu信任机器上安装为ubuntu xenial构建的内核程序包吗?

来自分类Dev

在TeamCity中隐藏一些nuget程序包

来自分类Dev

为SSIS程序包配置TFS

来自分类Dev

如何创建在单个组织内使用的托管程序包?

来自分类Dev

从单个程序包名称获取主要活动类名称。如何?

来自分类Dev

使用setuptools构建程序包时,如何避免收到无用的警告?

来自分类Dev

如何使用启动板配方来修补和构建原始程序包?

来自分类Dev

如何删除特定程序包的所有构建依赖项?

来自分类Dev

如何使用启动板配方来修补和构建原始程序包?

来自分类Dev

如何为商店构建Windows 10通用应用程序包

来自分类Dev

如何删除特定程序包的所有构建依赖项?

来自分类Dev

构建android应用程序包时如何修复“缺少按需模块的标题”?

来自分类Dev

(不是)将NuGet程序包添加到ASP.NET上的GIT

来自分类Dev

无法在Teamcity上启动GIT构建

来自分类Dev

我如何将这个引导程序包正确放置到我的Laravel项目中?

Related 相关文章

  1. 1

    如何在引用程序集(NuGet程序包)中的DbContext上触发Update-Database

  2. 2

    如何在引用程序集(NuGet程序包)中的DbContext上触发Update-Database

  3. 3

    如何配置teamcity以构建asp.net mvc Web项目的部署程序包并将其放入指定目录

  4. 4

    构建自定义RPM,但程序包为空?

  5. 5

    构建自定义RPM,但程序包为空?

  6. 6

    为.proto文件设置正确的程序包名称

  7. 7

    如何在Emacs的配置文件上为程序包设置可执行路径?

  8. 8

    使用3种不同的构建配置从单个C#项目创建NuGet程序包

  9. 9

    XLConnect,rJava和程序包构建

  10. 10

    如何导入/调用程序包的“子程序包”?

  11. 11

    无法为 UWP 商店提交构建应用程序包

  12. 12

    为Meteor编写程序包时如何依赖另一个程序包

  13. 13

    带有Rcpp代码的程序包无法在Windows上构建

  14. 14

    启动板:在utopic上构建程序包,但针对较旧版本发布

  15. 15

    我可以在ubuntu信任机器上安装为ubuntu xenial构建的内核程序包吗?

  16. 16

    在TeamCity中隐藏一些nuget程序包

  17. 17

    为SSIS程序包配置TFS

  18. 18

    如何创建在单个组织内使用的托管程序包?

  19. 19

    从单个程序包名称获取主要活动类名称。如何?

  20. 20

    使用setuptools构建程序包时,如何避免收到无用的警告?

  21. 21

    如何使用启动板配方来修补和构建原始程序包?

  22. 22

    如何删除特定程序包的所有构建依赖项?

  23. 23

    如何使用启动板配方来修补和构建原始程序包?

  24. 24

    如何为商店构建Windows 10通用应用程序包

  25. 25

    如何删除特定程序包的所有构建依赖项?

  26. 26

    构建android应用程序包时如何修复“缺少按需模块的标题”?

  27. 27

    (不是)将NuGet程序包添加到ASP.NET上的GIT

  28. 28

    无法在Teamcity上启动GIT构建

  29. 29

    我如何将这个引导程序包正确放置到我的Laravel项目中?

热门标签

归档