目录


​一、 Code Review是什么​

​二、 Gerrit简介​

​三、Gerrit安装​

​四、如何使用gerrit​

​五.使用gerrit website完成code review​

​六 注意事项​





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

一、 Code Review是什么

略。

二、 Gerrit简介

Gerrit是Google为Android系统研发量身定制的一套免费开源的代码审核系统,它在传统的源码管理协作流程中强制性引入代码审核机制,通过人工代码审核和自动化代码验证过程,将不符合要求的代码屏蔽在代码库之外,确保核心代码多人校验、多人互备和自动化构建核验。

Gerrit之前的系统架构:

【Gerrit】gerrit代码同行评审 - Gerrit Code Review_服务器


Gerrit之后的系统架构:

【Gerrit】gerrit代码同行评审 - Gerrit Code Review_服务器_02


通过Gerrit机制将代码做分隔。

Gerrit适用性

几乎任何需要正式发布的项目都应当使用Gerrit来进行代码审查,如果Team中有新人,必须使用Gerrit确保代码质量。


工作流程

【Gerrit】gerrit代码同行评审 - Gerrit Code Review_git_03


使用过git的同学,都知道,当我们​​git add --> git commit --> git push​​ 之后,你的代码会被直接提交到repo,也就是代码仓库中,就是图中橘红色箭头指示的那样。


那么gerrit就是上图中的那只鸟,普通成员的代码是被先push到gerrit服务器上,然后由代码审核人员,就是左上角的integrator在web页面进行代码的审核(review),可以单人审核,也可以邀请其他成员一同审核,当代码审核通过(approve)之后,这次代码才会被提交(submit)到代码仓库(repo)中去。

无论有新的代码提交待审核,代码审核通过或被拒绝,代码提交者(Contributor)和所有的相关代码审核人员(Integrator)都会收到邮件提醒。

gerrit还有自动测试的功能,和主线有冲突或者测试不通过的代码,是会被直接拒绝掉的,这个功能似乎就是右下角那个老头(Jenkins)的任务。


整个流程就是这样。 在使用过程中,有两点需要特别注意下:


  1. 当进行commit时,必须要生成一个Change-Id,否则,push到gerrit服务器时,会收到一个错误提醒。
  2. 提交者不能直接把代码推到远程的master主线(或者其他远程分支)上去。这样就相当于越过了gerrit了。 gerrit必须依赖于一个​​refs/for/*​​的分支。
    假如我们远程只有一个master主线,那么只有当你的代码被提交到​​refs/for/master​​分支时,gerrit才会知道,我收到了一个需要审核的代码推送,需要通知审核员来审核代码了。
    当审核通过之后,gerrit会自动将这条分支合并到master主线上,然后邮件通知相关成员,master分支有更新,需要的成员再去pull就好了。而且这条​​refs/for/master​​分支,是透明的,也就是说普通成员其实是不需要知道这条线的,如果你正确配置了sourceTree,你也应该是看不到这条线的。

这两点很重要!!这两点很重要!!这两点很重要!!

三、Gerrit安装

3.1. 环境准备


  • ①. Linux,Gerrit需要Linux环境,ubuntu 或者  centos,这里使用Ubuntu;
  • ②. JDK,使用1.7版本就行
  • ③. MySQL,其实这个非必须,Gerrit自带的有H2数据库
  • ④. nginx/apache,作为认证和反向代理服务器;
  • ⑤. Maven, 在安装的过程中会下载一些jar文件;
  • ⑥. Git,用来拉取代码

3.2 java环境安装

下载:jdk-7u79-linux-x64.tar.gz ​​http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html​

安装:sudo tar zxvf ./jdk-7u79-linux-x64.tar.gz -C /opt

配置:vim ~/.bashrc(针对当前用户) or vim /etc/profile(针对所有用户,推荐)


1

2

3

4



​export​​​ ​​JAVA_HOME=​​​​/opt/jdk1​​​​.7.0_79​

​export​​​ ​​JRE_HOME=$JAVA_HOME​​​​/jre​

​export​​​ ​​CLASSPATH=$JAVA_HOME​​​​/lib​​​​:$JRE_HOME​​​​/lib​​​​:$CLASSPATH​

​export​​​ ​​PATH=$JAVA_HOME​​​​/bin​​​​:$JRE_HOME​​​​/bin​​​​:$PATH​


验证:


1

2

3

4

5



​java -version​


​java version ​​​​"1.7.0_79"​

​Java(TM) SE Runtime Environment (build 1.7.0_79-b15)​

​Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)​


3.3 git环境

gerrit依赖,用来操作git repository


1



​sudo​​​ ​​apt-get ​​​​install​​​ ​​git​


3.4 下载gerrit


1



​wget  https:​​​​//www​​​​.gerritcodereview.com​​​​/download/gerrit-2​​​​.12.4.war​


3.5 apache2安装


1



​sudo​​​ ​​apt-get ​​​​install​​​ ​​apache2​


验证:


1



​service apache2 start​


3.6 gerrit管理帐号

gerrit依赖,用来管理gerrit。


1

2



​sudo​​​ ​​adduser gerrit​

​sudo​​​ ​​passwd​​​ ​​gerrit​


并将gerrit加入sudo权限


1



​sudo​​​ ​​visudo​


gerrit  ALL=(ALL:ALL) ALL (为了测试方便,开最大权限)

3.7 配置gerrit

默认安装:


1



​java -jar gerrit-2.12.4.war init --batch -d ~​​​​/review_site​


更新配置文件:sudo vim ~/review_site/etc/gerrit.config


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34



​[gerrit]​

​basePath = git​

​canonicalWebUrl = http:​​​​//47​​​​.120.74.47:8081/​

​[database]​

​type​​​ ​​= h2​

​database = ​​​​/home/gerrit/review_site/db/ReviewDB​

​[index]​

​type​​​ ​​= LUCENE​

​[auth]​

​type​​​ ​​= http​

​[receive]​

​enableSignedPush = ​​​​false​

​[sendemail]​

​smtpServer = smtp.163.com​

​smtpServerPort = 465​

​smtpEncryption = ssl​

​smtpUser = avcd@163.com​

​smtpPass = avcd123123123​

​sslVerify = ​​​​false​

​from = code review<avcd@163.com>​

​[container]​

​user = gerrit​

​javaHome = ​​​​/opt/jdk1​​​​.7.0_79​​​​/jre​

​[sshd]​

​listenAddress = *:29418​

​[httpd]​

​listenUrl = http:​​​​//​​​​*:8081/​

​[cache]​

​directory = cache​


​[http]​

​proxy = http:​​​​//47​​​​.120.74.47:8090​

​proxyUsername = gerrit1 ​​​​#proxy user & password​

​proxyPassword = 123456​


3.8 配置apache2反向代理

a、如果apache目录结构如下:


1



​apache2.conf conf-enabled magic mods-enabled ports.conf sites-enabled conf-available envvars mods-available sites-available​


开启SSL、Proxy、Rewrite等模块:


1

2

3

4

5

6

7

8

9

10

11



​cd​​​ ​​/etc/apache2/mods-enabled​

​ln​​​ ​​-s ..​​​​/mods-available/proxy​​​​.load​

​ln​​​ ​​-s ..​​​​/mods-available/proxy​​​​.conf​

​ln​​​ ​​-s ..​​​​/mods-available/proxy_http​​​​.load​

​ln​​​ ​​-s ..​​​​/mods-available/proxy_balancer​​​​.conf​

​ln​​​ ​​-s ..​​​​/mods-available/proxy_balancer​​​​.load​

​ln​​​ ​​-s ..​​​​/mods-available/rewrite​​​​.load​

​ln​​​ ​​-s ..​​​​/mods-available/ssl​​​​.conf​

​ln​​​ ​​-s ..​​​​/mods-available/ssl​​​​.load​

​ln​​​ ​​-s ..​​​​/mods-available/socache_shmcb​​​​.load ​​​​#​

​ln​​​ ​​-s ..​​​​/mods-available/slotmem_shm​​​​.load ​​​​#​


更新配置文件:sudo vim /etc/apache2/sites-enabled/gerrit-httpd.conf


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25



​ServerName 47.200.74.47​

​<VirtualHost *:8090>​

​ProxyRequests Off​

​ProxyVia Off​

​ProxyPreserveHost On​

​AllowEncodedSlashes On​

​RewriteEngine On​

​RewriteRule ^/(.*) http:​​​​//47​​​​.200.74.47:8081/$1 [NE,P]​


​<Proxy *>​

​Order deny,allow​

​Allow from all​

​<​​​​/Proxy​​​​>​


​<Location ​​​​/login/​​​​>​

​AuthType Basic​

​AuthName ​​​​"Gerrit Code Review"​

​Require valid-user​

​AuthBasicProvider ​​​​file​

​AuthUserFile ​​​​/etc/apache2/passwords​

​<​​​​/Location​​​​>​


​ProxyPass / http:​​​​//127​​​​.0.0.1:8081/​


​<​​​​/VirtualHost​​​​> ​


b、如果apache目录结构如下:


1



​bin  build  cgi-bin  conf  error  htdocs  icons  include  lib  logs  ​​​​man​​​  ​​manual  modules​


开启SSL、Proxy、Rewrite等模块:


1

2

3

4

5

6

7



​# Open LoadModule​

​LoadModule proxy_module modules​​​​/mod_proxy​​​​.so​

​LoadModule proxy_http_module modules​​​​/mod_proxy_http​​​​.so​

​LoadModule ssl_module modules​​​​/mod_ssl​​​​.so​

​LoadModule rewrite_module modules​​​​/mod_rewrite​​​​.so​

​# Gerrit config​

​Include conf​​​​/extra/gerrit-httpd​​​​.conf​


其中apache2/conf/extra/gerrit-httpd.conf内容同上,apache2/sites-enabled/gerrit-httpd.conf。

3.9 配置gerrit账户密码


1

2

3



​touch​​​ ​​/etc/apache2/passwords​

​htpasswd -b ​​​​/etc/apache2/passwords​​​ ​​admin 123456(管理员)​

​htpasswd -b ​​​​/etc/apache2/passwords​​​ ​​gerrit1 123456(普通用户)​


3.10 启动gerrit&启动apache2


1

2



​sudo​​​ ​​~​​​​/review_site/bin/gerrit​​​​.sh start​

​sudo​​​ ​​/etc/init​​​​.d​​​​/apache2​​​ ​​start​


四、如何使用gerrit

前提:需要git使用端 / gerrit服务端配合使用。

4.1 添加项目(gerrit 服务端)


1



​ssh​​​ ​​-p 29418 gerrit1@47.200.74.47 gerrit create-project --empty-commit --name demo-project​


#建议采用管理界面添加

 【Gerrit】gerrit代码同行评审 - Gerrit Code Review_html_04

4.2 使用gerrit添加已有项目:(适用于已有项目下移植到gerrit中)

ssh -p 29418 gerrit1@192.168.199.112 gerrit create-project --name exist-project #建议采用管理界面添加

或者使用gerrit管理界面

【Gerrit】gerrit代码同行评审 - Gerrit Code Review_html_05

然后将已有项目与gerrit上建立的exist-project关联,即将已有代码库代码push到gerrit中进行管理。


1

2

3



​cd​​​ ​​~​​​​/exist-project​


​git push ​​​​ssh​​​​:​​​​//gerrit1​​​​@47.200.74.47:29418​​​​/exist-project​​​ ​​*:*​


4.3.生成sshkey(git使用端)

在开发账户中生成sshkey,用作与gerrit服务器连接。


1



​ssh​​​​-keygen -t rsa ​​​​#生成sshkey​


4.4.添加sshkey到gerrit服务器(gerrit 服务端)

此步骤与git流程类似,即将id_rsa.pub内容上传到git repository,gerrit中帮我们管理git repository.

4.5 拉取代码&配置git hooks(git client端)

验证sshkey是否配置成功:ssh gerrit1@47.200.74.47 -p 29418


1

2

3

4

5

6

7

8

9

10



​****    Welcome to Gerrit Code Review    ****​


​Hi gerrit1, you have successfully connected over SSH.​


​Unfortunately, interactive shells are disabled.​

​To clone a hosted Git repository, use:​


​git clone ​​​​ssh​​​​:​​​​//gerrit1​​​​@47.200.74.47:29418​​​​/REPOSITORY_NAME​​​​.git​


​Connection to 47.200.74.47 closed.​


拉取代码: 


1



​git clone ​​​​ssh​​​​:​​​​//gerrit1​​​​@47.200.74.47:29418​​​​/REPOSITORY_NAME​​​​.git​


更新githooks:


1



​gitdir=$(git rev-parse --git-​​​​dir​​​​); ​​​​scp​​​ ​​-p -P 29418 gerrit1@47.200.74.47:hooks​​​​/commit-msg​​​ ​​${gitdir}​​​​/hooks/​


该过程用来在commit-msg中加入change-id,gerrit流程必备。

修改代码并提交,推送时与原有git流程不一致,采用 git push origin HEAD:refs/for/master 。


1

2

3

4

5

6

7

8

9

10

11

12



​[root@iZ62j8121e5Z abcd]​​​​# git push origin HEAD:refs/for/master​

​Counting objects: 3, ​​​​done​​​​.​

​Compressing objects: 100% (2​​​​/2​​​​), ​​​​done​​​​.​

​Writing objects: 100% (3​​​​/3​​​​), 710 bytes | 710.00 KiB​​​​/s​​​​, ​​​​done​​​​.​

​Total 3 (delta 0), reused 0 (delta 0)​

​remote: Processing changes: new: 1, refs: 1, ​​​​done​​   

​remote:​

​remote: New Changes:​

​remote:   http:​​​​//47​​​​.200.74.47:8081​​​​/5​​​ ​​xxxx​

​remote:​

​To ​​​​ssh​​​​:​​​​//47​​​​.200.74.47:29418​​​​/abcd​

​* [new branch]      HEAD -> refs​​​​/for/master​


如果不加会提示一下错误:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15



​[root@iZ62j8121e5Z abcd]​​​​# git push origin HEAD:refs/for/master​

​Counting objects: 3, ​​​​done​​​​.​

​Writing objects: 100% (3​​​​/3​​​​), 239 bytes | 239.00 KiB​​​​/s​​​​, ​​​​done​​​​.​

​Total 3 (delta 0), reused 0 (delta 0)​

​remote: Processing changes: refs: 1, ​​​​done​​   

​remote: ERROR: missing Change-Id ​​​​in​​​ ​​commit message footer​

​remote:​

​remote: Hint: To automatically insert Change-Id, ​​​​install​​​ ​​the hook:​

​remote:   gitdir=$(git rev-parse --git-​​​​dir​​​​); ​​​​scp​​​ ​​-p -P 29418 admin@47.200.74.47:hooks​​​​/commit-msg​​​ ​​${gitdir}​​​​/hooks/​

​remote: And ​​​​then​​​ ​​amend the commit:​

​remote:   git commit --amend​

​remote:​

​To ​​​​ssh​​​​:​​​​//47​​​​.200.74.47:29418​​​​/abcd​

​! [remote rejected] HEAD -> refs​​​​/for/master​​​ ​​(missing Change-Id ​​​​in​​​ ​​commit message footer)​

​error: failed to push some refs to ​​​​'ssh://admin@47.200.74.47:29418/abcd'​


五.使用gerrit website完成code review

当完成push后,可在gerrit管理界面看到当前提交code review的change。

查看某次提交的详细信息(审核者+2可通过本次提交,提交者可通过Abandon本次提交):

【Gerrit】gerrit代码同行评审 - Gerrit Code Review_java_06

如果审核者+2通过后,可提交该次commit.


六 注意事项


  • 需要为每个使用者分配gerrit账号,不要都使用admin账号,因为admin账号可直接push master
  • pull代码后需要配置githooks文件,以便在commit时自动生成change-id,否则无法push
  • push代码时需要使用git push origin HEAD:refs/for/master(branch),gerrit默认关闭非admin账号的push direct权限
  • push代码时需要commit email与gerrit account email一致,否则无法push成功,可选择关闭email notify,并开启forge user权限,或者通过修改gerrit数据库account email信息
  • gerrit数据库与gitlab同步,需要安装replication插件,并开启该功能 


参考链接:

Java SDK Download: ​​http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html​

Gerrit Code Review - Releases Download: ​​https://gerrit-releases.storage.googleapis.com/index.html​

Gerrit Code Review -  Quick get started guide: ​​https://git.eclipse.org/r/Documentation/install-quick.html​

Gerrit代码审核流程 ​​http://www.worldhello.net/gotgit/images/gerrit-workflow.png​

Gerrit代码审核原理 ​​http://www.worldhello.net/gotgit/05-git-server/055-gerrit.html​

Gerrit代码审核权限管理 ​​https://gerrit-review.googlesource.com/Documentation/access-control.html#category_forge_committer​

Gerrit修改数据库email信息 

Gerrit安装replication插件 ​​https://gerrit-review.googlesource.com/Documentation/cmd-plugin-install.html​