git - 将来自多个存储库的 Git 提交与 TFS 2013 构建相关联

标签 git tfsbuild multi-module

我正在使用 Team Foundation Server 2013 构建一个多模块 Gradle 项目,每个模块都驻留在自己的 Git 存储库中。所有这些存储库都位于一个 TFS 2013 项目中。构建模板在主模块的存储库上执行。也就是说,在构建配置中,Source Settings/Repository name 设置为主模块的存储库。

现在,在构建中,为每个模块识别当前提交以及最后一次成功构建的提交 ID(这是通过 Git shell 魔法和一个单独的存储库来记录最后一次成功构建的) .然后,再次为每个模块调用 TFS 构建事件 GitAssociateCommitsAndWorkItems 并调用 CurrentCommitPreviousCommitRepositoryRootFolder 的值> 设置为与该模块的存储库对应的值。

构建后,TFS 网页上的构建摘要正确显示自上次成功构建以来发生的所有模块的提交,包括它们的提交消息。对于主模块中的提交,提交链接正确地指向 TFS 中的提交摘要页面,并且提交消息中引用的工作项按预期与构建相关联。但是,对于所有其他模块,提交链接不起作用,因为它们指向主模块的存储库(链接指向类似 http://my-tfs-server/tfs/MyProject/_git/主模块/提交/0458838c815786dfaa5fac519d1fb19699c645c5)。在这种情况下,工作项的关联也不起作用。

For modules which are not the main module, commit links on the TFS build summary page don't work

我现在的问题是:GitAssociateCommitsAndWorkItems 如何确定提交所属的 TFS Git 存储库,是否可以更改它?

最佳答案

好吧,我找到了解决我的问题的解决方法。这不是很方便,但却是我能找到的最佳解决方案。

我基本上用自定义序列替换了 GitAssociateCommitsAndWorkItems 事件,该序列将提交与构建一一分配。为此,我的 Gradle 构建(更具体地说是它的初始化脚本)生成了一个制表符分隔的输出文件,其中包含所有应该关联的提交。然后,在构建中,读取该文件并将每一行拆分为不同的值,这些值是

  • 作者
  • 身份证
  • 提交者
  • 消息(Git 中的主题)
  • 时间戳
  • 提交所属存储库的 TFS GUID

除了最后一个值之外的所有值都可以很容易地从 Git 提交日志中检索到。可以使用 TFS 的 REST API 使用 REST 端点 http://my.tfs.server/tfs/MyProjectCollection/_apis/git/repositories?api-version=1.0 检索 Git 存储库的 TFS GUID。在这里您还可以找到您也需要的 TFS 项目的 GUID,但不包含在我的提交信息文件中,因为项目 GUID 对于给定的构建定义(换句话说,一个构建定义始终属于单个 TFS 项目)。

然后,使用这些值,创建并填充一个 AssociatedCommit 对象。对于此对象的 Uri 字段,必须使用以下模式:

"vstfs:///Git/Commit/" + tfsProjectGuid + "%2f" + tfsRepositoryGuid + "%2f" + commit.CommitId

最后,WriteBuildInformation 事件用于将提交对象与构建相关联(见下图)。此事件的类型参数是 Microsoft.TeamFoundation.Build.Activities.Git.AssociatedCommit

Activity to manually associate a commit with a build

关于git - 将来自多个存储库的 Git 提交与 TFS 2013 构建相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27485900/

相关文章:

仅 Git 名称和模式

git - Git 存储文本文件和二进制文件的方式有区别吗

asp.net-mvc - TFS 构建 2012、ASP.NET MVC 和 MSB3247 : Found conflicts between different versions of same dependent assembly

eclipse - Eclipse 和 Maven 多模块项目的问题

java - 合并 Maven 模块和父模块的输出

Github代码库: how to check if a repo is classified as active

git - 是否可以在不检查的情况下快进另一个分支?

visual-studio-2012 - 构建 checkin 策略与私有(private)门禁 checkin

java - 在 TFS 中发布 TestNG 结果

plugins - Gradle for Maven 提供的范围缺少 OOTB 支持。 Spring 的 Gradle propdeps-plugin 未按预期运行