【问题标题】:Tagging a TFS Git repository during a release在发布期间标记 TFS Git 存储库
【发布时间】:2017-08-09 04:20:43
【问题描述】:

我正在使用 TFS 2017 设置我们的构建/发布环境。

我将 Build 设置为在每次提交后自动运行,当我们准备发布应用程序的一个版本时,手动创建一个 Release,然后部署到各种环境。

我们希望在我们的 git 存储库中标记已发布的版本,以便轻松了解哪个 git 修订版对应于二进制文件。构建定义中的“标签源”设置允许在构建时标记 git 修订,但是因为我们构建在每个提交上会生成很多我们不关心的标签(因为它们不会部署到任何地方,直到发布)。

如何设置 TFS,以便在创建 Release(或可能部署到环境)时,在 Git 存储库中的相应提交上创建标签?

【问题讨论】:

    标签: git tfs tfsbuild release ms-release-management


    【解决方案1】:

    您可以使用 REST API 添加标签:

    POST https://{instance}/DefaultCollection/_apis/git/repositories/{repository}/refs?api-version={version}
    
    [
      {
        "name": {string},
        "oldObjectId": {string}, (The current commit id the ref is at. 0000000000000000000000000000000000000000 when creating a new ref.)
        "newObjectId": {string}
      }
    ]
    

    通过 PowerShell 调用 Rest API:

    $result = Invoke-RestMethod -Uri $uri -Method Get -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
    

    更多信息,可以参考Calling VSTS APIs with PowerShell(适用于tfs 2017)

    【讨论】:

    • 太棒了!这正是我所需要的。提交参考在 $(BUILD.SOURCEVERSION) 变量中的版本中可用,因此我可以将新标签分配给该修订。这是我使用的 PS 命令:Invoke-RestMethod $uri -Method Post -Body (ConvertTo-Json $body) -Credential $cred -ContentType "application/json" 正文中的 name 属性应设置为:"refs/tags/v_0.9.234.2"
    • 感谢您的帮助信息。我会添加一个指向相关文档页面的链接:docs.microsoft.com/en-us/previous-versions/azure/devops/…
    【解决方案2】:

    我已经构建了一个 vsts 扩展来执行此操作:https://marketplace.visualstudio.com/items?itemName=jabbera.git-tag-on-release-task

    【讨论】:

    • 看起来棒极了!我会尽快检查的。
    【解决方案3】:

    您可以在发布定义中添加命令行任务并使用 git 命令git tag -a vx.x $(Build.SourceVersion) -m "xxx" 要添加标签,请查看以下屏幕截图:

    ================================================ ============================

    更新:

    为了避免指定 git reop 签出的工作文件夹,您可以在构建定义中发布$(build.sourcesdirectory) 到放置文件夹,然后在发布定义中,您只需选择放置文件夹目录即可。检查下面的屏幕截图:

    【讨论】:

    • 非常感谢您的建议。但这只有在您知道在代理上哪里可以找到包含 git 存储库签出的目录时才有效(在您的示例中为 C:\TFS2015Agent\agent_work\4\s)。如果发布发生在不同的构建代理上怎么办?或者更糟糕的是,如果以某种方式在执行 git 标签的位置克隆了另一个存储库怎么办。你最终可能会标记错误的仓库!
    • 好吧,我认为这会起作用......但是将整个源目录打包为每个构建的工件似乎只是为了向存储库添加标签而非常浪费!想象一下,如果 repo 是 1 GB!更不用说这还将包括整个 Git 历史记录,因此您可能会查看多个 GB 的大型存储库。
    • 不发布源文件夹,为什么不简单地将$(Build.Repository.LocalPath)指定为工作文件夹?
    • 在一个版本中,源未被签出,$(Build.Repository.LocalPath)$(Build.SourcesDirectory) 未被填充。我认为 REST API 可能是一个更好的指导。
    猜你喜欢
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2016-08-15
    • 2012-10-07
    • 1970-01-01
    • 2015-07-14
    • 2019-12-06
    相关资源
    最近更新 更多