1、Code Review 介绍

Code Review 代码评审是指在软件开发过程中,对源代码的系统性检查。Code Review 是一种用来确认方案设计和代码实现的质量保证机制,通过这个机制我们可以对代码,测试过程和注释进行检查。Code Review 主要用来在软件工程过程中改进代码质量,查找系统缺陷,保证软件总体质量和提高开发者自身水平。

2、Gerrit 介绍

Gerrit实际上一个Git服务器,它为在其服务器上托管的Git仓库提供一系列权限控制。Gerrit 是一个免费、开放源代码的代码审查软件。利用网页浏览器,同一个团队的软件程序员,可以相互审阅彼此修改后的程序代码,决定是否能够提交,退回或者继续修改。Gerrit 是使用 Git 作为底层版本控制系统,通过网页界面,能方便的做代码审核工作的一个轻量型框架,出自google团队的开源项目。这里我们要实现的是,本地 Git 提交代码 review 到 Gerrit,在 Gerrit 上做 Code Review,如果 commit 通过则直接 merge 到分支,不通过则再修改并 update patch set 或者直接 abandon 掉。

3、环境、软件准备

本次演示环境,我是在本地机器 Mac 上操作,以下是安装的软件及版本:

Docker:version 17.03.1-ce
Git:version 2.10.1
Gerrit:version 2.13.5
Git-Review:version 1.25.0
注意:Gerrit 这里我使用基于 Docker 安装,所以需要先安装一下 Docker,后边演示 Git-Review 操作,需要本地先安装 Git,这里 Git、Docker 的安装忽略。

4、 Git-Review 安装

git-review 安装方式很简单,针对不同的系统,安装方式也不同。

Linux系统上 yum | apt-get 安装

sudo yum install git-review
sudo apt-get install git-review

Mac OS X 上 pip | Homebrew 安装

1、pip安装方式

$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python get-pip.py
$ sudo pip install git-review

2、Homebrew 安装

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ sudo brew install git-review

安装完毕后,可以通过 git review --help 查看 review 命令相关信息。

5、Gerrit 安装

Gerrit 详细的安装过程,可参考我之前的文章 记录Gerrit2.8.4环境迁移、安装、配置以及问题解决 写的比较详细。这里我在本地使用 docker 快速搭建一个简单的 gerrit 服务。

$ docker pull openfrontier/gerrit
$ docker run --name gerrit -p 9000:8080 -p 29418:29418 -v /Users/wanyang3/gerrit/review_site:/var/gerrit/review_site openfrontier/gerrit

启动完成后,本地访问 http://127.0.0.1:9000/ 即可访问 Gerrit 网页版。

6、简单的 Demo 示例

6.1 注册登录

默认 Gerrit 登录,需要点击页面右上角 “Become in”, 然后注册账号。 如果 Gerrit 配置 LDAP 登录,则需要在修改配置文件 /Users/wanyang3/gerrit/review_site/etc/gerrit.conf,配置上 LDAP 相关信息,然后点击页面右上角 “Sign In”,输入用户名、密码即可登录,系统自动将用户信息入库。 

注意:第一个注册的帐号或者 LDAP 登录的用户,默认为管理员。

gitlab实现代码评审 git怎么做代码评审_gitlab实现代码评审

6.2 上传公钥

为了方便以后操作,这里我们使用 ssh 方式连接。Gerrit 配置 ssh key 也很简单。 
登录系统后,点击右上角用户名 -> Settings -> SSH Public Keys -> Add Key,把自己本地的公钥复制到文本域里,点击 Add 即可。本地生成 SSH Key如下:

$ ssh-keygen –t rsa 
$ cat ~/.ssh/id_rsa.pub #内容复制到上边文本域中。

gitlab实现代码评审 git怎么做代码评审_Code_02

6.3 创建项目

下边我们开始创建一个demo项目,项目名为 review_demo,点击 Projects -> Create New Project -> 输入 Project Name -> 点击 Create Project。

6.4 Clone 项目

clone 远程项目到本地,这里 clone 有两种,第一种只 clone 项目,第二种 clone 项目的同时,复制 gerrit 提供的 commit-msg 钩子脚本,它的作用是在每次新的提交时生成 change-id。

第一种:
git clone ssh://wanyang3@127.0.0.1:29418/review_demo
第二种:
git clone ssh://wanyang3@127.0.0.1:29418/review_demo && scp -p -P 29418 wanyang3@127.0.0.1:hooks/commit-msg review_demo/.git/hooks/

6.5 git review 操作

cd review_demo
git remote add gerrit ssh://wanyang3@127.0.0.1:29418/review_demo 
#这里因为 git-review 在使用 gerrit 时会默认查找名为 gerrit 的 remote,
如果 remote 存在,则 git-review 将提交当前分支到 remote 的 HEAD:refs/for/master
如果 remote 不存在,则 git-review 会查找 .gitreview 文件,所以我们需要创建一个 .gitreview 文件。

vim .gitreview

[gerrit]
host=127.0.0.1
port=29418 
project=review_demo 
defaultbranch=develop #这里指向了 develop 分支。

接下来正常执行 git 操作,但是 commit 完成后,不需要 push,只需要执行:
git review #会自动推送到我们的 gerrit 服务器上
然后相关负责人去 gerrit 上做 Code review,如果审核通过,则 Merge 到分支,若未通过,则可直接 Abandon 掉或者 Code-Review -2打回。

注意:当我们提交的commit审核未通过时,我们再修改完成之后,执行:
git add .
git commit --amend #注意这里会保留上次的 change-id,gerrit 将不会生成新的评审任务编号,使用原有任务编号,并将本次提交作为老评审任务的补丁。
git review

6.6 示例操作

$ vim test.txt
$ git add .
$ git commit -m "add test.txt"
[develop 636e853] add test.txt
 1 file changed, 1 insertion(+), 2 deletions(-)
$ git review
remote: Processing changes: new: 1, refs: 1, done
remote:
remote: New Changes:                              ###6.6.1 新的 change
remote:   http://127.0.0.1:9000/11 add test.txt   ###6.6.1 序号11
remote:
To ssh://127.0.0.1:29418/review_demo
 * [new branch]      HEAD -> refs/publish/develop

此时,本次 commit 已经提交到 gerrit 上,并生成好了change-id,等待审核 Code-Review。这里演示先 Code-Review -1,然后 Code-Review -2,相当于本次提交不通过。接下来,我们在做一下修改,再次提交(注意:这里我们要使用上一次提交的 change-id,意思是再次提交作为上一次的修改补丁),最后 Code-Review +1,Code-Review +2 审核通过本次提交,真正合并到分支上。(以上都是用我一个人的账号进行 Code-Review,实际应用中,可以事先指定好各审核人。)

$ vim test.txt
$ cat test.txt
This is test message for review_demo.
I have modify the bug, please let me pass.
$ git add .
$ git commit --amend
[develop b0e8fc1] add test.txt
 Date: Mon Aug 14 10:19:54 2017 +0800
 1 file changed, 2 insertions(+), 2 deletions(-)
$ git review
remote: Processing changes: updated: 1, refs: 1, done
remote:
remote: Updated Changes:                          ###6.6.2 更新 change
remote:   http://127.0.0.1:9000/11 add test.txt   ###6.6.2 序号11
remote:
To ssh://127.0.0.1:29418/review_demo
 * [new branch]      HEAD -> refs/publish/develop

#从打印的日志信息中6.6.1和6.6.2就可以看出来,本次 commit 是针对上一次提交的 update,使用的是同一个 change-id。

gitlab实现代码评审 git怎么做代码评审_gitlab实现代码评审_03

至此,针对本次的修改才被真正 merge 到分支上了。当然 gerrit 能做的还有很多,如权限控制,分组等等,这里只介绍了最简单的也是最核心的 Code-Review 功能的简单使用。

gitlab实现代码评审 git怎么做代码评审_Code_04

-2 表示不通过,+2表示代码ok可以通过审核,目前还没有深究这个,我理解的就是这样子的。

gerrit通过给每个独立的commit加上一个唯一的changId来保证有序的代码提交和review,多次commit携带相同的changid视为对同一次commit的修改,如果commit没有携带changid的话则无法push成功,所以当push失败的时候第一件事应该是检查当前的commit是否都带有changid。如果仅最后一次commit没有changid,可使用git commit --amend,此命令的作用就是将最新一次commit指向上一次带有changid的commit,如果含多条commit都没有changid的话,可以checkout这些commit然后逐条添加changid,或者rebase到最后一次有效的commit然后重新编辑提交.如果是追加提交 git commit --amend,否则会出现两次提交

如果有多次提交需要合并 git rebase -i HEAD~2   HEAD~后面的数字表示的是上2次提交的合并(里面的参数选择squash)比如

gitlab实现代码评审 git怎么做代码评审_git_05

可以合并成一个,注意合并的时候只保留一个change-id

gitlab实现代码评审 git怎么做代码评审_Docker_06