2019独角兽企业重金招聘Python工程师标准>>>

Gerrit 代码审核服务器的工作流和原理

谷歌 Android 开源项目在 Git 的使用上有两个重要的创新,一个是为多版本库协同而引入的 repo,这在之前我们已经详细讨论过。另外一个重要的创新就是 Gerrit —— 代码审核服务器。Gerrit 为 Git 引入的代码审核是强制性的,就是说除非特别的授权设置,向 Git 版本库的推送(Push)必须要经过 Gerrit 服务器,修订必须经过代码审核的一套工作流之后,才可能经批准并纳入正式代码库中...

6.7   Gerrit 代码审核服务器

首先贡献者的代码通过 git 命令(或 repo 封装)推送到 Gerrit 管理下的 Git 版本库,推送的提交转化为一个一个的代码审核任务,审核任务可以通过 refs/changes/<change-id> 下的引用访问到。代码审核者可以通过 Web 界面查看审核任务、代码变更,通过 Web 界面做出通过代码审核或者打回等决定。测试者也可以通过 refs/changes/<change-id> 引用获取(fetch)修订对其进行测试,如果测试通过就可以将该评审任务设置为校验通过(verified)。最后经过了审核和校验的修订可以通过 Gerrit 界面中提交动作合并到版本库对应的分支中。 在 Android 项目的网站的代码贡献流程图更为详细的介绍了 Gerrit 代码审核服务器的工作流程。  

代码审核工作流

6.7.1   Gerrit 的实现原理

SSH 协议的 Git 服务器   Gerrit 本身基于 SSH 协议实现了一套 Git 服务器,这样就可以对 Git 数据推送进行更为精确的控制,为强制审核的实现建立了基础。 Gerrit 提供的 Git 服务的端口并非标准的 22 端口,缺省是 29418 端口。可以访问 Gerrit 的 Web 界面得到这个端口。对 Android 项目的代码审核服务器,访问 https://review.source.android.com/ssh_info   就可以查看到 Git 服务的服务器域名和开放的端口。下面我们用 curl 命令查看网页的输出。

$ curl -L -k http://review.source.android.com/ssh_info
review.source.android.com 29418

特殊引用 refs/for/<branch-name> 和 refs/changes/nn/<task-id>/m   Gerrit 的 Git 服务器,禁止用户向   refs/heads命名空间下的引用执行推送(除非特别的授权),即不允许用户直接向分支进行提交。为了开发者能够向 Git 服务器提交修订,Gerrit 的 Git 服务器只允许用户向特殊的引用   refs/for/<branch-name>   下执行推送,其中   <branch-name>   即为开发者的工作分支。向   refs/for/<branch-name>   命名空间下推送并不会在其中创建引用,而是为新的提交分配一个 ID,称为 task-id ,并为该 task-id 的访问建立如下格式的引用   refs/changes/nn/<task-id>/m   ,其中:

  • task-id 为 Gerrit 为评审任务顺序分配的全局唯一的号码。
  • nn 为 task-id 的后两位数,位数不足用零补齐。即 nn 为 task-id 除以 100 的余数。
  • m 为修订号,该 task-id 的首次提交修订号为 1,如果该修订被打回,重新提交修订号会自增。

Git 库的钩子脚本 hooks/commit-msg   为了保证已经提交审核的修订通过审核入库后,被别的分支 cherry-pick 后再推送至服务器时不会产生新的重复的评审任务,Gerrit 设计了一套方法,即要求每个提交包含唯一的 Change-Id,这个 Change-Id 因为出现在日志中,当执行 cherry-pick 时也会保持,Gerrit 一旦发现新的提交包含了已经处理过的   Change-Id   ,就不再为该修订创建新的评审任务和 task-id,而直接将提交入库。 为了实现 Git 提交中包含唯一的 Change-Id,Gerrit 提供了一个钩子脚本,放在开发者本地 Git 库中(hooks/commit-msg)。这个钩子脚本在用户提交时自动在提交说明中创建以 "Change-Id: " 及包含   git hash-object   命令产生的哈希值的唯一标识。当 Gerrit 获取到用户向refs/for/<branch-name>   推送的提交中包含 "Change-Id: I..." 的变更 ID,如果该 Change-Id 之前没有见过,会创建一个新的评审任务并分配新的 task-id,并在 Gerrit 的数据库中保存 Change-Id 和 Task-Id 的关联。 如果当用户的提交因为某种原因被要求打回重做,开发者修改之后重新推送到 Gerrit 时就要注意在提交说明中使用相同的 “Change-Id” (使用 --amend 提交即可保持提交说明),以免创建新的评审任务,还要在推送时将当前分支推送到   refs/changes/nn/task-id/m中。其中   nn   和   task-id   和之前提交的评审任务的修订相同,m 则要人工选择一个新的修订号。 以上说起来很复杂,但是在实际操作中只要使用 repo 这一工具,就相对容易多了。   其余一切交给 Web   Gerrit 另外一个重要的组件就是 Web 服务器,通过 Web 服务器实现对整个评审工作流的控制。关于 Gerrit 工作流,参见在本章开头出现的 Gerrit 工作流程图。 感受一下 Gerrit 的魅力?直接访问 Android 项目的 Gerrit 网站:   https://review.source.android.com/   。

Android 项目代码审核网站

Android 项目的评审网站,匿名即可访问。点击菜单中的 “Merged” 显示了已经通过评审合并到代码库中的审核任务。下面的一个界面就是 Andorid 一个已经合并到代码库中的历史评审任务。

Android 项目的 16993 号评审

在该界面我们可以看到:

  • URL 中显示的评审任务编号为 16993。
  • 该评审任务的 Change-Id 以字母 I 开头,包含了一个唯一的 40 位 SHA1 哈希。
  • 整个评审任务有三个人参与,一个人进行了检查(verify),两个人进行了代码审核。
  • 该评审任务的状态为已合并:“merged”。
  • 该评审任务总共包含两个补丁集: Patch set 1 和 Patch set 2。
  • 补丁集的下载方法是: repo download platform/sdk 16993/2 。

如果使用 repo 命令获取补丁集是非常方便的,因为封装后的 repo 屏蔽掉了 Gerrit 的一些实现细节,例如补丁集在 Git 库中的存在位置。如前所述,补丁集实际保存在 `refs/changes` 命名空间下。使用 `git ls-remote` 命令,从 Gerrit 维护的代码库中我们可以看到补丁集对应的引用名称。

$ git ls-remote ssh://review.source.android.com:29418/platform/sdk refs/changes/93/16993*
5fb1e79b01166f5192f11c5f509cf51f06ab023d        refs/changes/93/16993/1
d342ef5b41f07c0202bc26e2bfff745b7c86d5a7        refs/changes/93/16993/2

接下来我们就来介绍一下 Gerrit 服务器的部署和使用方法。

转载于:https://my.oschina.net/u/1273559/blog/339844

Gerrit 代码审核服务器的工作流和原理相关推荐

  1. Gerrit代码审核服务器搭建全过程

    Gerrit代码审核服务器搭建全过程 转载请标明出处:http://blog.csdn.net/ganshuyu/article/details/8978614 环境:Ubuntu12.xx 1.建立 ...

  2. 手把手教你搭建自己的git+gerrit代码评审服务器

    有问题可以到公众号嵌入式linux阿财留言交流 你可能遇到过这样的问题,不知道如何管理自己的代码.自己开发的代码,过了几天,忘记修改了什么,忘了上次改到哪了,代码突然找不到了等等,甚至容易消磨自己的耐 ...

  3. 不用开着电脑,如何将脚本代码放到服务器上?

    作者 | sergiojune 转载自公众号日常学python(ID:daily_learn) 程序员转行学什么语言? https://edu.csdn.net/topic/ai30?utm_sour ...

  4. Gerrit代码Review高阶实战

    Gerrit代码Review高阶实战 Gerrit代码Review高阶实战 Gerrit 是一个免费.开放源代码的代码审查软件,使用网页界面.利用网页浏览器,同一团队的程序员,可以相互审阅彼此修改后的 ...

  5. Gerrit代码Review入门实战

    代码审核(Code Review)是软件研发质量保障机制中非常重要的一环,但在实际项目执行过程中,却因为种种原因被Delay甚至是忽略.在实践中,给大家推荐一款免费.开放源代码的代码审查软件Gerri ...

  6. python怎么输入代码-教你如何将自己的脚本代码放到服务器上运行

    原标题:教你如何将自己的脚本代码放到服务器上运行 本文授权转自 | 日常学Python 上次弄了个机器人,反响挺不错的,我也挺满意的,因为这个我也初步了解了服务器这个东西,懂得了如何将自己的脚本代码放 ...

  7. 教你如何将自己的脚本代码放到服务器上运行

    上次弄了个机器人,反响挺不错的,我也挺满意的,因为这个我也初步了解了服务器这个东西,懂得了如何将自己的脚本代码放到服务器上运行了,妈妈再也不怕我每天都得开着电脑才能运行脚本了,不过说实话,这个服务器真 ...

  8. Mui --- app与服务器之间的交互原理、mui ajax使用

    1.APP与服务器之间的交互原理app端(客户端)与服务端的交互其实理解起来和容易,客户端想服务器端发送请求,服务器端进行数据运算后返回最终结果.结果可以是多种格式: 1.text 文本格式 2.xm ...

  9. Gerrit代码Review入门实战 1

    Gerrit代码Review入门实战 库 代码审核 Android Gerrit 经验分享 阅读23889  代码审核(Code Review)是软件研发质量保障机制中非常重要的一环,但在实际项目执行 ...

最新文章

  1. char [] 和 char * 区别
  2. 查看mysql库和表的大小(空间)
  3. quantum theory
  4. 微型计算机及接口技术试题,1月自考微型计算机及其接口技术试题及答案解析...
  5. 周期长度和(KMP)
  6. C++ Lambda表达式基本用法
  7. 让猫给人打工,猫咖是一门好生意吗?
  8. InfoPath读取数据库
  9. 一个月被曝五次数据泄露,ElasticSearch还行不行?
  10. LC 231 power of 2
  11. Java 多态的特性和概念
  12. 数据清洗与数据预处理浅析
  13. 对12w条数据进行相关清理和数据迁移 (数据清理项目实战完整版)文章内有大量sql脚本
  14. 蓝牙车库门禁卡原理及实践
  15. 【PM】互联网项目管理的特点总结
  16. 手机上实现划词朗读功能
  17. Lisp自动画梯形_CAD lisp 求助一段代码实现自动画弧!
  18. nps内网穿透工具学习
  19. 手绘风格的 JS 图表库:Chart.xkcd
  20. 弘辽科技:拼多多转化率怎么看?4个步骤教会你

热门文章

  1. Spring集成spymemcached
  2. JDK1.8快速入门
  3. Fescar 发布 0.3.0 版本, 支持 Eureka 注册中心
  4. 女皇万岁!我们是来送礼的 ——阿里聚安全春天系列全套大礼包
  5. C/C++左值性精髓(二)哪些表达式是左值,哪些是右值?----右值表达式
  6. 认识python(了解)
  7. 工作流引擎--swamp
  8. 安装Windows Vista
  9. 实现一个简单的编译器
  10. [EnterpriseServices]利用assembly定义我们的组件在COM+中的注册方式