如何实现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记录进行操作,当然是查看它的官方文档了

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.0Content-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, secondsm, min, minute, minutesh, hr, hour, hoursd, 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 $linecurl -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
docurl -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请求。

如何实现gerrit的垃圾回收功能相关推荐

  1. JVM垃圾回收3——参数详解(转载)

    基本参数说明  -client,-server 这两个参数用于设置虚拟机使用何种运行模式,client模式启动比较快,但运行时性能和内存管理效率不如server模式,通常用于客户端应用程序.相反,se ...

  2. <JVM上篇:内存与垃圾回收篇>01-JVM与Java体系结构

    笔记来源:尚硅谷 JVM 全套教程,百万播放,全网巅峰(宋红康详解 java 虚拟机) 文章目录 1.JVM 与 Java 体系结构 1.1. 前言 1.2. 面向人群及参考书目 1.3. Java ...

  3. JVM面试(四)-垃圾回收、垃圾收集器、GC日志

    垃圾回收.垃圾收集器.GC日志 什么是垃圾?(垃圾的概念) 什么是垃圾回收?(垃圾回收的概念) 为什么要垃圾回收?(垃圾回收的原因) 如何定义垃圾? 引用计数算法 什么是循环引用 可达性分析算法 哪些 ...

  4. 4.1 心跳机制和垃圾回收机制

    任务目的 了解心跳机制流程 知晓 NameNode 感知 DataNode 掉线死亡的时长计算公式 学会在配置文件中设置心跳机制 掌握开启 HDFS 垃圾回收机制的方法 任务清单 任务1:Hadoop ...

  5. JVM-内存与垃圾回收篇!女朋友看了都想当架构师的超详细保姆级笔记!呕心沥血之作!看完还不会你砍我!

    1. JVM与Java体系结构 1.1 Java虚拟机 Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成. JVM平台的各种 ...

  6. jvm内存模型与垃圾回收

    *JVM历史JIT编译(just-in-time compilation)狭义来说是当某段代码即将第一次被执行时进行编译,因而叫"即时编译" 互联网-js人工智能-python微服 ...

  7. 学习笔记:Java虚拟机——JVM内存结构、垃圾回收、类加载与字节码技术

    学习视频来源:https://www.bilibili.com/video/BV1yE411Z7AP Java类加载机制与ClassLoader详解推荐文章:https://yichun.blog.c ...

  8. JVM内存与垃圾回收篇——JVM与Java体系结构

    前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM GC问题,但却无从下手. 新项目上线,对各种JVM参数设 ...

  9. JVM与垃圾回收笔记

    JVM与垃圾回收 1.JVM与Java体系结构 1.1 Java虚拟机 1.1.1 简介 1.1.2 作用 1.1.3 特点 1.1.4 JVM的位置 1.2 JVM的整体结构 1.3 java代码执 ...

最新文章

  1. 2013年工作中遇到的20个问题:181-200
  2. 元胞自动机与相关理论和方法
  3. What Is Text Mining?
  4. 802.11发展到802.11g历程
  5. Hi Visual Studio for Mac
  6. [转]HTTP/3 未来可期?
  7. synchronized锁
  8. Magento的基本架构
  9. Android-即时通训
  10. 简单的重定义一下NSLOG
  11. POJ 3049 DFS
  12. 天锐绿盾技术大讲堂:终端出现红色“+”
  13. eclipse优化方案
  14. 团队项目-Recycle需求规格说明书
  15. 谷歌浏览器访问端口限制
  16. Flips测试类(page43)
  17. 关于PG与Linux的HUGEPAGE/HUGETLBFS
  18. 一个生成随机密码的WPF小程序
  19. 【网络经济与企业管理】选择题,错题
  20. C语言通讯录系统程序设计

热门文章

  1. vue2.0生命周期数据共享
  2. Python+Matplotlib绘制饼状图模拟南丁格尔玫瑰图
  3. 大数据的应用场景都有哪些(交通篇)
  4. 忠告7 成功 = 能力 X 努力 X 态度
  5. oracle表连接查询逗号隔开_Oracle多表连接查询
  6. banne图怎么设计才会有更多的点击率
  7. 台式电脑怎么添加计算机硬盘,如何在台式电脑增加硬盘的安装及设置方法
  8. 小程序成四大行业商家标配,小程序代理市场如何
  9. MFC Afx*.h 详解
  10. 没有性生活、觉得老板傻……我们问了2000个人辞职的理由