如何实现gerrit的垃圾回收功能
一、思考阶段
需求描述:
创建一个Jenkins Job,每小时运行一次,废弃超过两周都没有任何新消息记录的gerrit change;另一个Jenkins Job,每周运行一次,删除废弃1周以上的gerrit change
需求分析:
我们应该怎么分析这个需求呢,首先分成两个点来分析,第一是如何对Gerrit上的记录进行增删改查的操作,第二就是如何让这些操作自动化执行,创建Jenkins Job的作用就是自动化执行脚本。
对于第一点,我们再进行进一步的分析:
- 如何查询到Gerrit的patch记录
- 怎么废弃(abandon)Gerrit上的change记录,怎么删除(delete)Gerrit上的废弃后的记录
- 可以直接查询到2周以前的change记录吗?->如何查询指定范围的数据
- 有几种方式对Gerrit记录进行操作
- 如何授权开发者对Gerrit记录进行增删改查的操作
对于第二点,我们应该做出如下的思考:
- 如何创建一个Jenkins Job,应该创建什么类型的job
- 如何定时执行job
二、执行阶段(怎么做)
我们将需求划分成两部分进行分析,所以也就进行两个阶段的工作,首先完成手动执行脚本操作Gerrit记录,然后再创建jenkins job自动化执行脚本。
1.编写脚本对Gerrit记录进行废弃和删除操作
①Gerrit用户手册
想要知道怎么对Gerrit记录进行操作,当然是查看它的官方文档了
- 通过查看文档我们可以知道,有两种方式可以对Gerrit记录进行操作,一种是命令行的方式(ssh连接到后台执行gerrit指令),另一种是根据提供的rest API进行操作。
- 在官方文档,我们找到Customization and Integration(定制与集成模块),我们可以根据该模块提供的帮助定制我们需要的功能。具体如下:
Customization and Integration 定制与集成模块
Dashboards 定制仪表盘
REST API
Gerrit Code Review附带了一个类似REST的API,可通过HTTP访问。该API适用于构建自动化工具,并支持一些特殊的脚本用例。
Gitweb Integration
- Gerrit Code Review可以管理和生成到gitweb的超链接,允许用户从Gerrit内容跳转到gitweb显示的相同信息。
Themes
- Gerrit支持对发送到浏览器的HTML进行一些定制,允许组织更改应用程序的外观,以符合其总体方案。
Single Sign-On Systems
- Gerrit支持与某些类型的单点登录安全解决方案的集成,使最终用户能够在没有管理员参与的情况下设置和管理帐户。
Hooks
Mail Templates
- Gerrit在发送的大部分标准邮件中使用了闭包模板(Soy)。有内置的默认模板,如果未被覆盖,则会使用这些模板。这些默认值也作为示例提供,以便管理员可以复制它们并轻松修改它们以调整其内容。
Contributor Agreements 贡献者协议
Robot Comments 机器人评论
- Gerrit特别支持自动第三方系统生成的内联评论,即所谓的“机器人评论”。例如,机器人注释可以用来表示代码分析器的结果。
② REST API文档
根据文档说明我们可以根据REST API来定制一些自动化工具。
关于使用API接口的认证问题(Authentication)
- 默认情况下,所有REST端点都假定匿名访问,并根据匿名用户可以读取的内容过滤结果(可能根本没有)。
- 用户(和程序)可以通过在端点URL前面加上
/a/
来使用HTTP密码进行身份验证。例如,要对/projects/进行身份验证,请求URL/a/projects/
。Gerrit将使用HTTP基本身份验证和用户帐户设置页面中的HTTP密码。- 这种形式的身份验证绕过了对XSRF tokens的需要
- 授权cookie可能出现在access_token查询参数内的请求URL中。在URL中使用有效的访问令牌时,不需要XSRF令牌。
③查看change相关的文档
由于我们要对change进行操作,所以查看change相关的文档内容——>关于change
常见的请求说明:
Query change 查询change记录
Request 请求
GET /changes/?q=status:open+is:watched&n=2 HTTP/1.0
我们开发中用到的URL是
URL/a/changes/?q=status:open+is:watched&n=2
Abandon change 废弃记录
Request
POST /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/abandon HTTP/1.0
Delete Change 删除记录
Request
DELETE /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940 HTTP/1.0
Content-Type: application/json; charset=UTF-8
Response
HTTP/1.1 204 No Content
总结
上面三种操作,实际上就是分别向指定的URL发送GET,POST和DELETE请求,Request说明要发送请求的类型和要求,Response说明正确的响应内容。三种请求分别执行查询,废弃,删除的操作。
④如何查询指定范围的数据
基础限制信息字段:
age: 'AGE'
可查询给定时间以前的change信息,如 age:1d 即为查询1天前的全部change信息,以change的最后更新时间为基准
s, sec, second, seconds
m, min, minute, minutes
h, hr, hour, hours
d, day, days (1 day is treated as 24 hours)
w, week, weeks (1 week is treated as 7 days)
mon, month, months (1 month is treated as 30 days)
y, year, years (1 year is treated as 365 days)
change: 'ID'
查询指定change- id 的change信息
conflicts: 'ID'
查询指定conflicts- id 的change信息
owner: 'USER' , o: 'USER'
查询指定owner的change信息
ownerin: 'GROUP'
查询指定group人员提交的change信息
reviewer: 'USER' , r: 'USER'
查询指定审核人员的change信息
reviewerin: 'GROUP'
查询指定group人员审核的change信息
commit: 'SHA1'
Changes where 'SHA1' is one of the patch sets of the change.
project: 'PROJECT' , p: 'PROJECT'
查询指定项目下的change信息
projects: 'xx'
查询项目名以xx开头的全部项目的chage信息
parentproject: 'PROJECT'
查询指定项目及其子项目的change信息
branch: 'BRANCH'
查询指定分支的change信息
topic: 'TOPIC'
查询指定topic的change信息,常与‘branch’,‘project’连用
ref: 'xxx'
查询目标分支与 xxx匹配的change信息
tr : 'ID' , bug: 'ID'
查询提交信息中包含‘bug’的change信息
message: 'MESSAGE'
查询提交信息包含‘MESSAGE’的change信息
comment: 'TEXT'
查询comment信息包含指定字符串的 change信息
status:xxx
查询指定状态的change
怎么在URL中使用限制字段信息,缩小查询范围,返回指定数据,可以用+
将限制信息组合,具体如下:
在这里用Linux下的curl工具发送http请求
#查询指定用户两周前的废弃记录
curl -v -X GET --user 'USER:HTTP凭据' 'URL/a/changes/?q=status:abandoned+owner:zhangsan@xx.com+age:2w'
#废弃某一条记录,project是项目名,8401是changeId
curl -v -X POST --user 'USER:HTTP凭据' 'http://10.103.83.3/a/changes/project~8401/abandon'
#删除某条记录
curl -v -X DELETE --user 'USER:HTTP凭据' 'http://10.103.83.3/a/changes/project~8401/abandon'
⑤完整的程序逻辑
使用API思路:
利用API进行废弃和删除操作,本质上就是模拟在gerrit web
页面上进行废弃和删除change记录,那么我们就可以在web页面上执行abandon和delete操作,然后按F12,捕捉相应的请求,查看请求的URL地址,前端暴露的URL地址一般和开发者需要用的URL地址不同,所以我们要加上/a/。才能访问到正确的URL地址。
整体思路:
废弃脚本
查询出2周以前的open状态记录,将查询的结果进行处理,把project和number字段提取出来,写入到一个文本文件a.txt中。然后遍历读取a.txt文件的每一行,执行abandon操作。
代码:gerrit_abandon.sh
废弃超过两周都没有任何新消息记录的gerrit patch:
注:需要jq环境
#!/bin/sh
curl -v -X GET --user 'USER:HTTP凭据' 'http://10.103.83.3/a/changes/?q=status:open+owner:USER@xxxx.com' >b.txt
#curl -v -X GET --user 'USER:HTTP凭据' 'http://10.103.83.3/a/changes/?q=status:open+age:2w' >b.txt
#因为返回的不是正确的json格式字符串,需要把第一行字符删除
sed -i '1d' b.txt
cat b.txt|jq -r '.[]|"\(.project) \(._number)"' >c.txt
count=0
while read line1 line2
do
# ssh -p 29418 90548@10.103.83.3 gerrit review --abandon $line
curl -v -X POST --user 'USER:HTTP凭据' 'http://10.103.83.3/a/changes/'${line1}'~'${line2}'/abandon'
count=$((count + 1))
echo $count
done<c.txt
echo "废弃了$count条记录"
删除脚本
查询出1周以前的abandoned状态记录,将查询的结果进行处理,把project和number字段提取出来,写入到一个文本文件b.txt中。然后遍历读取b.txt文件的每一行,执行delete操作
代码:gerrit_delete.sh
删除一周以上废弃的记录:
#!/bin/sh
#curl -v -X GET --user 'USER:HTTP凭据' 'http://10.103.83.3/a/changes/?q=status:abandoned+age:1w' >a.txt
#curl -v -X GET --user 'USER:HTTP凭据' 'http://10.103.83.3/a/changes/?q=status:abandoned+owner:USER@xxxx.com' >a.txt
sed -i '1d' a.txt
cat a.txt|jq -r '.[]|"\(.project) \(._number)"' >c.txt
count=0
while read line1 line2
do
curl -v -X DELETE --user 'USER:HTTP凭据' 'http://10.103.83.3/a/changes/'${line1}'~'${line2}'/'
count=$((count + 1))
echo $count
done<c.txt
echo "废弃了$count条记录"
2.创建Jenkins job自动化执行脚本
这里只说明一下思路
- 点击new item创建pinepline(流水线)
- 在jenkins中新增一个HTTP凭据
- HTTP凭据是Gerrit用户设置中生成的一串哈希值
- 利用流水线语法自动生成代码
withCredentials([string(credentialsId: 'e0740cc5-8a44-4cbc-946b-f20431e19780', variable: 'credential')])
- 然后在pineline中输入要执行的脚本,并在脚本中调用上面的HTTP凭据,根据变量名调用。
三、测试阶段
该阶段是检验脚本是否正常执行,执行的结果是否符合预期,程序有没有漏洞,有哪些需要改进的点,前端页面和数据库的信息是否同步(即前端页面数据是否及时更新)。
要注意的几个点:
- 自己提交一些change记录用来测试,以便不小心修改其他开发人员的change记录
- 可以用postman来测试HTTP的GET,POST和DELETE请求。