批量删除 Azure DevOps Server 中的Git标记
Contents
- 1. 场景描述
- 2. 解决方案
- 2.1 删除标记接口
- 2.2 提取全部需要删除的标记
- 2.3 批量删除标记
1. 场景描述
在使用Azure DevOps Server的过程中,我们通常使用流水线实现自动编译和测试。作为自动化工具,流水线有个让人爱恨交加的功能“标记源”(如下图),这个功能可以在流水线每次编译的过程中,自动为代码库创建一个标记,并且可以按照用户定制的格式创建标记。如果我们规划好这个功能,可以极大的提高我们的代码规范,例如运行发布版本的流水线,自动创建一个发布标记;但是如果规划不好,就会带来灾难性的后果。
下面说一下这个故事。最近一个客户向我反馈,他们在用于拉取请求的流水线中,启用了标记源的功能,结果经过一段时间后,发现流水线自动创建了许多许多Git标记,然而这些标记并没有实际意义;版本管理员想去删除这些标记,发现系统并没有提供批量删除标记的功能,必须要一个一个在网页上点击、确认才能删除这些标记,需要花三五天才能完成这个工作。
为了解决这个问题,我们查询了微软的资料后,发现系统本身具备批量删除标记的功能,本文下面的内容就是来介绍如何“批量删除 Azure DevOps Server 中的Git标记”。
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的占位符{{}},如下图
- 执行run collection时,选择我们上面准备的csv文件,运行,瞬间完成1000个标记的删除。
如果需要了解更新详细的功能,你还可以从微软Azure DevOps Server 的在线文档,查询更多的权威资料,也欢迎通过下面的联系方式与我沟通,相互学习,相互提高!
https://www.cnblogs.com/danzhang
Azure DevOps MVP 张洪君