【问题标题】:Associate Git commits from multiple repositories with a TFS 2013 build将来自多个存储库的 Git 提交与 TFS 2013 构建相关联
【发布时间】:2015-02-13 15:48:18
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: git tfsbuild multi-module


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-05-28
      • 2020-10-16
      • 2019-06-08
      • 1970-01-01
      • 2014-11-26
      • 2017-06-30
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多