我正在使用 Team Foundation Server 2013 构建一个多模块 Gradle 项目,每个模块都驻留在自己的 Git 存储库中。所有这些存储库都位于一个 TFS 2013 项目中。构建模板在主模块的存储库上执行。也就是说,在构建配置中,Source Settings/Repository name
设置为主模块的存储库。
现在,在构建中,为每个模块识别当前提交以及最后一次成功构建的提交 ID(这是通过 Git shell 魔法和一个单独的存储库来记录最后一次成功构建的) .然后,再次为每个模块调用 TFS 构建事件 GitAssociateCommitsAndWorkItems
并调用 CurrentCommit
、PreviousCommit
和 RepositoryRootFolder
的值> 设置为与该模块的存储库对应的值。
构建后,TFS 网页上的构建摘要正确显示自上次成功构建以来发生的所有模块的提交,包括它们的提交消息。对于主模块中的提交,提交链接正确地指向 TFS 中的提交摘要页面,并且提交消息中引用的工作项按预期与构建相关联。但是,对于所有其他模块,提交链接不起作用,因为它们指向主模块的存储库(链接指向类似 http://my-tfs-server/tfs/MyProject/_git/主模块/提交/0458838c815786dfaa5fac519d1fb19699c645c5
)。在这种情况下,工作项的关联也不起作用。
我现在的问题是: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
。
关于git - 将来自多个存储库的 Git 提交与 TFS 2013 构建相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27485900/