Gerrit是一个基于 Web 的代码审查系统,适于采用 Git 版本控制系统开发的项目进行在线代码审查。

快速启动

快速启动一个gerrit server,启动后在浏览器中访问 http://localhost:8080 即可进入gerrit code reviewer界面

1
docker run -ti -p 8080:8080 -p 29418:29418 gerritcodereview/gerrit

生产环境部署

在生产环境中部署gerrit,结合OpenLDAP使用,可以更好的做身份验证。

环境配置

创建一个外部目录,来存放配置文件以及存储文件。

1
2
3
4
5
6
7
8
9
git clone https://github.com/GerritCodeReview/docker-gerrit.git 

cd docker-gerrit

mkdir -p ./external/gerrit/etc/

touch ./external/gerrit/etc/gerrit.config
 
touch ./external/gerrit/etc/secure.config

./external/gerrit/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
[gerrit]
  basePath = git

[index]
  type = LUCENE

[auth]
  type = ldap
  gitBasicAuth = true

[ldap]
  server = ldap://ldap
  username=cn=admin,dc=example,dc=org
  accountBase = dc=example,dc=org
  accountPattern = (&(objectClass=person)(uid=${username}))
  accountFullName = displayName
  accountEmailAddress = mail

[sendemail]
  smtpServer = localhost

[sshd]
  listenAddress = *:29418

[httpd]
  listenUrl = http://*:8080/

[cache]
  directory = cache

[container]
  user = root

./external/gerrit/etc/secure.config配置示例如下:

1
2
[ldap]
  password = secret

docker-compose.yaml如下

 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
35
36
37
38
version: '3'

services:
  gerrit:
    image: gerritcodereview/gerrit
    ports:
      - "29418:29418"
      - "80:8080"
    depends_on:
      - ldap
    volumes:
      - ./external/gerrit/etc:/var/gerrit/etc
      - ./external/gerrit/git:/var/gerrit/git
      - ./external/gerrit/db:/var/gerrit/db
      - ./external/gerrit/index:/var/gerrit/index
      - ./external/gerrit/cache:/var/gerrit/cache
    environment:
      - CANONICAL_WEB_URL=http://localhost
    # command: init
    # entrypoint: /entrypoint.sh init

  ldap:
    image: osixia/openldap
    ports:
      - "389:389"
      - "636:636"
    environment:
      - LDAP_ADMIN_PASSWORD=secret
    volumes:
      - ./external/gerrit/ldap/var:/var/lib/ldap
      - ./external/gerrit/ldap/etc:/etc/ldap/slapd.d

  ldap-admin:
    image: osixia/phpldapadmin
    ports:
      - "6443:443"
    environment:
      - PHPLDAPADMIN_LDAP_HOSTS=ldap

启动初始化

启动时取消docker-compose.yaml中的entrypoint: /entrypoint.sh init注释,

然后运行命令docker-compose up gerrit进行初始化,初始化成功后容器就会退出。

后台启动

初始化完成后,重新注释掉init指令,再执行启动命令后台运行。

1
> docker-compose -f docker-compose.yaml up -d

查看启动状态

1
2
3
4
5
6
> docker-compose -f docker-compose.yaml ps
           Name                    Command         State                       Ports
---------------------------------------------------------------------------------------------------------
docker-gerrit_gerrit_1       /entrypoint.sh        Up      0.0.0.0:29418->29418/tcp, 0.0.0.0:80->8080/tcp
docker-gerrit_ldap-admin_1   /container/tool/run   Up      0.0.0.0:6443->443/tcp, 80/tcp
docker-gerrit_ldap_1         /container/tool/run   Up      0.0.0.0:389->389/tcp, 0.0.0.0:636->636/tcp

使用 PhpLdapAdmin 登录 OpenLDAP

浏览器打开 https://localhost:6443/ 登录,账号为配置文件中设置的username, 密码配置为password,如下: 账号:cn=admin,dc=example,dc=org 密码:secret

登录 OpenLDAP 创建 gerrit 管理员账号

点击 Create a child entry 后选择账号模板,点击 Courier Mail Account 填写账号信息,示例如下:

Given Name: Gerrit Last Name: Admin Common Name: Gerrit Admin User ID: gerritadmin Email: gerritadmin@localdomain Password: secret

同样的方式创建其他子账号

用管理员账号登录gerrit

浏览器中打开 http://localhost,使用在LDAP中创建的账号密码登录

Login: gerritadmin Password: secret

登录成功后,打开 http://localhost/settings/#SSHKeys 设置ssh keys

创建项目

选择 BROWSE -> Repositories -> CREATE NEW 创建存储仓库,示例如下:

Repository name: rstt

创建成功后,点击仓库名称进入设置页面

第一步下载 commit-msg hook,脚本位置存放在.git/hooks/commit-msg,提交审核时会执行这个脚本来生成Change-ID。

1
git clone "ssh://gerritadmin@localhost:29418/rstt" && scp -p -P 29418 gerritadmin@localhost:hooks/commit-msg "rstt/.git/hooks/"

clone 项目

1
git clone "ssh://gerritadmin@localhost:29418/rstt"

创建分支,提交修改,推送提交审核

1
2
3
git checkout -b dev master

git push origin HEAD:refs/for/master

提交后会创建引用 `.git/refs/changes/01/1/1

审核过程中提交推送修改

1
git commit --amend

查看引用提交列表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
> git ls-remote origin
74d72f4e31eb984bd852a2ef327a43ca4a244fc9        HEAD
5a30f5e7b6343e785c0ed9ffa0188ee08c9c36fb        refs/changes/01/1/1
06c425732aa90317272f1dcaf72b0198e061738d        refs/changes/01/1/2
471393b7402a031acd0d69a15b7d63808f3d1ee3        refs/changes/01/1/3
3a48c8c89a35b6161bf654b8889281f4f7d2f978        refs/changes/01/1/4
c3319ba7d1f26275661b3b39cd2108e3c4318b26        refs/changes/01/1/5
374956310ca8a5f595aab7197ee48db6adfef195        refs/changes/01/1/meta
74d72f4e31eb984bd852a2ef327a43ca4a244fc9        refs/changes/02/2/1
d426a8f985dd1fc9fdcd887c37d255bf319e3727        refs/changes/02/2/meta
74d72f4e31eb984bd852a2ef327a43ca4a244fc9        refs/heads/master

提交审核通过合并后即可更新master

谷歌工程实践

Google 有许多通用工程实践,几乎涵盖所有语言和项目。此文档为长期积累的最佳实践,是集体经验的结晶。

下面引用Google代码审查两则指南:

代码审查是除了代码作者之外,其他人检查代码的过程。

Google 通过 Code Review 来维护代码和产品质量。

此文档是 Google Code Review 流程和政策的规范说明。

此页面是我们进行 Code Review 流程的概述。本指南还有另外两套文档:

代码审查者指南

本节是基于过往经验编写的 Code Review 最佳方式建议。其中分为了很多独立的部分,共同组成完整的文档。虽然您不必阅读文档,但通读一遍会对您自己和团队很有帮助。

代码开发者指南

本节页面的内容为开发人员进行代码审查的最佳实践。这些指南可帮助您更快地完成审核并获得更高质量的结果。您不必全部阅读它们,但它们适用于每个 Google 开发人员,并且许阅读全文通常会很有帮助。

参考