Skip to content
Table of contents

Gerrit 使用

7 min read ··· views #gerrit

介绍

关于 Gerrit

Gerrit 是一款开源的代码审查软件,通过网页界面使用。团队成员可以借助浏览器相互审阅彼此修改后的代码,并决定是提交、退回还是继续修改。它以版本控制系统 Git 作为底层。

定位

理论上,Git 是一个分布式版本管理系统,不需要中心代码库也能相互同步数据。但在实际开发中,为了便于团队内多名开发人员协作,通常需要指定一个确定的代码库用于提交和同步代码。因此,我们的代码管理一般采用如下结构:image

引入 Gerrit 代码审核机制后,代码提交和同步的方式发生了变化:

image 1

工作流程

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

image 2

用户登录

首先打开主页:http://192.168.51.201:81

主页会提示登录:

image 3

用户名与密码均与邮箱账号相同,例如:

username :wanghh
password : 111111
powershell

登录后的界面如下:

image 4

简单入手

克隆代码仓库

要进行代码修改和提交审查,第一步自然是从远程代码库克隆一份代码。Gerrit 提供 HTTP 和 SSH 两种服务(使用 SSH 协议需要配置本机密钥),获取方式可在项目基本信息页面查看。

image 5

clone 命令有两种类型:

1. 命令含 commit-msg hook

git clone "http://wanghh%40fdmtek.com@192.168.52.46:8088/a/gerrit-base" \
&& (cd "gerrit-base" && mkdir -p `git rev-parse --git-dir`/hooks/ \
&& curl -Lo `git rev-parse --git-dir`/hooks/commit-msg http://192.168.52.46:8088/tools/hooks/commit-msg \
&& chmod +x `git rev-parse --git-dir`/hooks/commit-msg)
bash

功能:

  • 克隆仓库: 首先,通过 git clone 命令从 Gerrit 服务器克隆 gerrit-base 仓库。
  • 设置 commit-msg hook
    • 进入克隆的 Git 仓库目录 gerrit-base
    • 创建 Git Hooks 目录:GIT_DIR/hooks/GIT_DIR 是 Git 的 .git 文件夹路径,由 git rev-parse --git-dir 获取)。
    • 下载 commit-msg hook:使用 curl 从服务器地址 http://192.168.52.46:8088/tools/hooks/commit-msg 获取文件。
    • 添加执行权限:对下载的 commit-msg 文件运行 chmod +x

作用:

commit-msg hook 是 Gerrit 为 Git 提供的一种工具:

  • 检查提交消息是否符合 Gerrit 的要求。
  • 在提交消息中自动添加 Change-Id,这是 Gerrit 用于跟踪代码变更的标识符。
  • 没有该 hook 时,手动提交可能会报错,或不符合 Gerrit 的提交规范。

这条命令适用于需要将代码提交到 Gerrit 的用户,因为 Gerrit 要求提交必须带有 Change-Id。


2. 命令不含 commit-msg hook

git clone "http://wanghh%40fdmtek.com@192.168.52.46:8088/a/gerrit-base"
bash

功能:

  • 只克隆指定的仓库 gerrit-base
  • 克隆后的仓库没有额外设置 commit-msg hook,使用默认的 Git 操作。

作用:

  • 适合仅拉取代码或进行简单本地修改、不向 Gerrit 提交代码的场景。
  • 如果计划把修改提交到 Gerrit,则可能因缺少 Change-Id 而被 Gerrit 拒绝。

HTTP 使用需要申请 Token 用于验证

image 6

同时可以顺便验证一下邮箱(重要!

image 7

仓库 clone 完成后就可以进行后续操作:

此时需要的密码依然是之前生成的 Token,但 Push 操作被拒绝了。这是因为仓库没有开放直接推送权限,通常无法直接 push 到 master,需要先 push 到 Gerrit 的分支上,如 refs/for/master

image 8

image 9

此时,我们就可以提交了:

  gerrit-base git:(master) git push origin HEAD:refs/for/master
Password for 'http://wanghh%40fdmtek.com@192.168.52.46:8088':
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Writing objects: 100% (3/3), 274 bytes | 274.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Processing changes: refs: 1, new: 1, done
remote:
remote: SUCCESS
remote:
remote:   http://192.168.52.46:8088/c/gerrit-base/+/1 v0.0.1 [NEW]
remote:
To http://192.168.52.46:8088/a/gerrit-base
 * [new reference]   HEAD -> refs/for/master
bash

提交成功后,就可以在 Gerrit 中看到变化:

image 10

image 11

可以看到当前还不满足 submit 条件,需要进行 Review 与 Verify。

审查代码

默认情况下,项目的所有者和管理员可以指定代码审核人。指定后,Gerrit 会向审核人发送邮件,提醒有新的审核任务。

审核代码的流程:

  1. 浏览代码增量,并给出注释;
  2. 浏览完所有代码,给出综合评价和评分(-2, -1, 0, 1, 2)。只有评分大于 2,才允许 merge 到目标分支。

这时,我们想起允哥说过,有空的时候就可以想起他:

image 12

此时,电脑另一端的允哥也收到了干活的消息:

aa7aebc6-34e7-4790-9ed2-e17fca056cfa

允哥打开 Gerrit 后,也看到了新的 commit:

image 13

随后,允哥觉得小伙子写得很不错!

image 14

但这时,高老爷也过来看了一下,说小伙子菜还得多练啊:

image 15

返工修改

根据上面的 Gerrit 流程图,当代码审核未通过,或合并过程中出现冲突时,就需要返工修改后再提交。

返工流程有三步:

  1. 将未通过的代码获取到本地工作目录;
  2. 修改代码;
  3. 重新提交审核。

修改好代码后,我们再次提交:

修改后的提交,change-id 不会发生变化,只是 patch-id 加 1。

image 16

这一次,高老爷也满意了。至此,我们完成了代码的 Review。

验证修改

修改通过代码审核后,下一步是代码验证。验证前,测试人员需要先把修改获取到本地进行测试,测试后对本次修改投票做出评价。

image 17

提交修改

当代码成功通过 Review 和 Verified 后,这段修改就可以合并到主分支了。

这时,高老爷动了动小手:

image 18

这时,代码才真正被同步到了 master 分支中。

image 19

更多信息可查看 官方文档


另:

Gerrit 的 HTTP 验证通常依赖外部反向代理处理用户认证,客户端通过浏览器发送 HTTP basic authentication 的头部信息来完成验证。因此:

  1. 用户的登录状态由浏览器缓存的 Basic Authentication 凭据维持,不存储在 Gerrit 中。
  2. 用户点击 Sign out 后,Gerrit 本身无法清除浏览器上缓存的凭据。
  3. 现代浏览器的 HTTP Basic Auth 无法通过 JS 或页面行为主动触发清理,因此退出登录比较困难。

即: 浏览器缓存了 Basic Authentication 凭证,即使点击了 Sign out,浏览器依然会用之前缓存的凭据重新发送认证请求,导致用户无法登出。

较新的火狐内核支持特定形式的 URL 处理,因此通过修改反向代理配置可以清除缓存的 HTTP Basic Authentication 会话,解决此问题。但基于 Chromium 内核的浏览器可能依然存在这个问题。如果你不用火狐,又确实需要退出用户登录,请自行清理浏览器缓存记录。