批量删除 Azure DevOps Server 中的Git标记

Contents

  • 1. 场景描述
  • 2. 解决方案
    • 2.1 删除标记接口
    • 2.2 提取全部需要删除的标记
    • 2.3 批量删除标记

1. 场景描述

在使用Azure DevOps Server的过程中,我们通常使用流水线实现自动编译和测试。作为自动化工具,流水线有个让人爱恨交加的功能“标记源”(如下图),这个功能可以在流水线每次编译的过程中,自动为代码库创建一个标记,并且可以按照用户定制的格式创建标记。如果我们规划好这个功能,可以极大的提高我们的代码规范,例如运行发布版本的流水线,自动创建一个发布标记;但是如果规划不好,就会带来灾难性的后果。

下面说一下这个故事。最近一个客户向我反馈,他们在用于拉取请求的流水线中,启用了标记源的功能,结果经过一段时间后,发现流水线自动创建了许多许多Git标记,然而这些标记并没有实际意义;版本管理员想去删除这些标记,发现系统并没有提供批量删除标记的功能,必须要一个一个在网页上点击、确认才能删除这些标记,需要花三五天才能完成这个工作。

为了解决这个问题,我们查询了微软的资料后,发现系统本身具备批量删除标记的功能,本文下面的内容就是来介绍如何“批量删除 Azure DevOps Server 中的Git标记”。

image


2. 解决方案

2.1 删除标记接口

通过调研,我们发现Azure DevOps Server提供Rest Api来删除代码库中的Tag,接口的调用方式和参数如下:

[
    {
        "name": "refs/tags/20210225.3",
        "newObjectId": "0000000000000000000000000000000000000000",
        "oldObjectId": "ae3cef3e54f347b60f2070ade0684187243b9f51"
    }
]

上面参数中的说明如下:

  • name:就是标记的名称,如果标记中包含的斜杠字符,需要写完整的标记名称;中间的refs/tags是固定内容,代表标记类型的数据
  • newObjectId:固定格式,40个零
  • oldObjectId:当前标记对应的提交ID

2.2 提取全部需要删除的标记

通过上面的分析,我们可以使用接口删除单个标记,但是需要提取需要删除的全量标记,我们需要另外一个接口来提取这个数据。这个时候我们发现微软产品的优势来了,你需要的接口齐全!很快就找到了提取标记需要的Rest Api接口。这个接口的调用方式和参数如下:

  • GET http://server/Collection/_apis/git/repositories/f35cbaec-acda-4521-a1fe-fc209c1079a1/refs?api-version=5.1&filter=tags/PR&$top=1000&includeLinks=false
  • 入参:由于是GET请求,无需在请求头中配置参数,只需要的接口的URL中配置参数即可,具体参数的说明如下
    • filter: 这个接口实际上是提取所有版本信息的通用接口,我们可以用它获取分支、标记等信息;这个参数用于筛选版本中的refs,并且只匹配refs的开头字符,例如我们使用tags/PR,就会筛选已经字符“tags/PR"开头的全部refs
    • $top:这个参数在许多接口中都通用,用于限制返回数据的条目,默认为100条,最高为1000条;由于代码库中的refs数量太多,微软设置1000的最高值也是可以理解的,否则如果一次性提取10万条数据,会直接把系统卡死。
    • 其他参数:在我们今天的这个场景中没有用到就不做赘述了
  • 返回值:系统返回符合条件的全部标记,例如
{
    "value": [
        {
            "name": "refs/tags/PR/LumingTest_202109271555",
            "objectId": "9c702b8965ec3bf3f3a38155925216d1b67a45ee",
            "creator": {
                "displayName": "srv-alm-tfsservice",
                "url": "http://server/collection/_apis/Identities/bca1b7f0-e2f1-42ae-9d21-0c0f44207c20",
                "_links": {
                    "avatar": {
                        "href": "http://server/collection/_apis/GraphProfile/MemberAvatars/win.Uy0xLTUtMjEtNDE4Mzg5NTYwNS0xOTEyMDk1MTY2LTQzNjc3MTY1Ni00MjE0NjM"
                    }
                },
                "id": "bca1b7f0-e2f1-42ae-9d21-0c0f44207c20",
                "uniqueName": "domain\\srv-alm-tfsservice",
                "imageUrl": "http://server/collection/_api/_common/identityImage?id=bca1b7f0-e2f1-42ae-9d21-0c0f44207c20",
                "descriptor": "win.Uy0xLTUtMjEtNDE4Mzg5NTYwNS0xOTEyMDk1MTY2LTQzNjc3MTY1Ni00MjE0NjM"
            },
            "url": "http://server/collection/ded5bae5-a2f3-4b4e-80e6-44a5439654bf/_apis/git/repositories/f35cbaec-acda-4521-a1fe-fc209c1079a1/refs?filter=tags%2FPR%2FLumingTest_202109271555"
        }
    ],
    "count": 1000
}

上面的返回数据中,我们需要的关键数据是name、objectId,这是在删除标记参数中必要的两个值。

2.3 批量删除标记

有了上面的基础数据,接下来我们就是使用自动化的工具来调用接口,批量删除标记了。如果你是一个程序员,马上想到编写一个脚本批量调用接口和传入参数。实际上还有更简单的方式,利用postman的批量执行功能,实现无编码批量调用接口。

  • 将返回的数据转换为我们需要的csv文件,格式如下;如何将json转换为csv,我们可以使用在线的免费工具,例如https://www.convertcsv.com/json-to-csv.htm。
name,objectId
refs/tags/20210721.1,6ea8019b670b4493e50b88706f5df7d938613ae6
refs/tags/20210722.1,f6939f63da3837df460becc560398982382269be
refs/tags/20210722.2,8ddb377b0c92876a84ecba45141719e5d2609b24
refs/tags/20210723.1,7919feb59709b61ece40dc9b180a035d94cc0211
refs/tags/20210723.2,c27ca7d7a6e42e96f0b3f55b6c50649895a1b3bc
refs/tags/20210826.1,dac0a6456ca3d3ed9d232ee5a81dc34c18827254
  • 在postman中使用run collection的方法批量调用接口
    • 新增一个collection
    • 在新增的colleciton中新增一个接口,接口的头文件中的变量值使用postman的占位符{{}},如下图
      image
    • 执行run collection时,选择我们上面准备的csv文件,运行,瞬间完成1000个标记的删除。
      image


如果需要了解更新详细的功能,你还可以从微软Azure DevOps Server 的在线文档,查询更多的权威资料,也欢迎通过下面的联系方式与我沟通,相互学习,相互提高!


https://www.cnblogs.com/danzhang
Azure DevOps MVP 张洪君
在这里插入图片描述

posted on 2023-01-31 20:26  danzhang  阅读(78)  评论(0编辑  收藏  举报

导航