Contents
  1. 1. 开发环境
  2. 2. 安装gerrit
    1. 2.1. 下载gerrit安装包
    2. 2.2. 新建gerrit专用用户
    3. 2.3. 安装gerrit
    4. 2.4. 启动gerrit
  3. 3. Nginx
    1. 3.1. nginx默认配置
    2. 3.2. gerrit.conf配置
    3. 3.3. 重启nginx
    4. 3.4. 登录认证文件
  4. 4. 修改gerrit配置
    1. 4.1. 重启gerrit
  5. 5. gitweb(可选)
    1. 5.1. 安装gitweb
    2. 5.2. 修改gitweb配置文件
    3. 5.3. 修改Apache配置文件
    4. 5.4. 修改gerrit配置
  6. 6. 补充内容
    1. 6.1. 卸载Gerrit
    2. 6.2. 删除git工程
    3. 6.3. 退出gerrit网页
    4. 6.4. 参考文献:

最近公司的项目打算启用gerrit做为代码审核的工具,最近3天彻底研究了下gerrit的安装配置过程,这里做个记录,期间很多细节都一一记录下来,以便之后有同学需要用到。
这篇博文先介绍下gerrit的安装过程,然后之后还准备写一篇文章,介绍如何利用gerrit和sourceTree进行协同工作,换句话说,就是gerrit的详细工作流程。

开发环境

先记录下我的开发环境以及要正确安装gerrit需要用到的工具:

  • Redhat(CentOS) 6.5
  • Java 1.7.0 (至少1.6以上)
  • git 1.7,1
  • Nginx 1.10.2
  • Apache 2.2.15

几点说明:

  1. 关于操作系统
    Redhat和CentOS用的是同样的内核,我这里是6.5版本的内核;其他linux系统上安装过程照猫画虎应该也差不多,只不过可能比如Java或者Nginx等工具的安装方式有所差别。
    为了方便后面文章的讲解,我们这里假设gerrit服务器的ip地址是192.168.1.100

  2. 关于Java环境
    在终端中输入 java -version 务必确保你的java环境正确安装了;因为整个gerrit的安装是依赖于Java的,另外最好确保Java版本在1.6以上吧,虽然我没有验证过低版本的Java是不是没问题,但是高一点的版本保险一点。

  3. Web服务器
    网上很多教程有讲到gerrit+apache安装过程的,我这里是用nginx。先来说说为什么一定要用apache或者nginx,是的就是为了反向代理
    Gerrit有两种工作方式,我们要采用http的工作方式,也就是代码审核人员,可以直接通过Web页面对提交的代码进行评审以及后续的操作。
    然后Gerrit要求不能直接请求其端口,必须要使用反向代理才能正确登录。而我们知道Nginx的成功正在于其高效、轻量级以及反向代理,虽然Apache也有反向代理的功能,但是如果你在安装Apache时没有开启,后续的开启过程要相对复杂一点,而Nginx就简单的多了。
    不过即便我们使用Nginx做为web页面引擎,仍然需要安装Apache,因为我们需要用到apache的一个工具来创建验证密码文件。这个后面我们会看到具体用法。

  4. 数据库
    我们使用gerrit自带的H2数据库。网上也有其他数据库的安装教程,我这里想说的是,H2就够用,而且,我们不推荐直接对数据库进行操作,所有的操作,都可以通过命令行的方式完成,所以,尽量简单我们就使用自带的默认的数据库好了。

所以,请务必确保以上几个工具正确安装。
在RedHat或者CentOS上可以通过yum工具来安装,如果yum的源打不开,可以去网上搜一下替换yum源的方法。

安装gerrit

下载gerrit安装包

gerrit的下载地址:
https://www.gerritcodereview.com/releases/README.md
我使用的gerrit版本是2.13.4。 下载完成之后会发现是一个war的包,所以我们的Java环境一定要安装正确。

新建gerrit专用用户

新建一个用户用来专门管理gerrit相关的内容。
在root用户(或者使用sudo命令)下面输入下面的命令:

1
2
$ adduser gerrit
$ su gerrit

建好用户以后,我们可以把之前下载好的gerrit安装包(gerrit-2.13.4.war)拷贝到/home/gerrit/目录下,一会方便gerrit用户来安装。

安装gerrit

在gerrit用户的目录(/home/gerrit/)下面,执行下面的命令:

1
$ java -jar gerrit-2.13.4.war init -d ~/gerrit_site

这个命令的意思是执行安装gerrit,会在当前目录下新建一个文件夹gerrit_site用来作为gerrit的根目录,在这个目录中,会安装git仓库,以及gerrit的web页面,还有gerrit的bin,etc等文件夹。
然后就开始安装过程了,安装的过程会询问很多问题,有一些判断性的问题会用[y/N]这样的形式,大写的字母表示默认,我们直接敲回车就表示采用默认的安装选项。

注意:
  • 我们安装的时候,可以只在Authentication method时输入http,其他全部回车用默认值,因为其他配置我们待会可以通过etc/gerrit.config文件进行修改
  • 期间可能会下载两个文件,这两个文件虽然都很小(不到3M),但是可能是因为GFW的原因,下载速度很慢。你可以到/lib文件夹下面查看他们是不是已经下载完了,或者你手动把那两个文件下载完之后,scp到/lib下面。
    如果你发现已经下完了,但是安装过程卡主了,没有关系,直接ctrl+c然后重新安装就可以了。

下面我就把整个安装过程全部贴出来,加上一些注释,好让大家看清楚都安装了什么:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
*** Gerrit Code Review 2.13.4  
***

## git 代码仓库的位置, 默认会在之前敲的init -d 目录下新建一个git文件夹
## 我们回车表示默认地址
*** Git Repositories
***

Location of Git repositories [git]:

## 数据库类型,我们直接回车表示默认的h2
*** SQL Database
***

Database server type [h2]:

## 用户认证方式,注意!!!!!这里一定要手动输入 http, 其他的就直接回车
*** User Authentication
***

Authentication method [OPENID/?]: http
Get username from custom HTTP header [y/N]?
SSO logout URL :

## 发送email的配置,这里我们全部回车使用默认,之后通过配置文件进行修改
*** Email Delivery
***

SMTP server hostname [localhost]:
SMTP server port [(default)]:
SMTP encryption [NONE/?]:
SMTP username :


## 剩下的全部回车就好了,全部安装成默认的配置
*** Container Process
***

Run as [gerrit]:
Java runtime [/usr/lib/jvm/java-7-openjdk-amd64/jre]:
Copy gerrit-2.13.4.war to /home/gerrit/review/bin/gerrit.war [Y/n]?
Copying gerrit-2.13.4.war to /home/gerrit/review/bin/gerrit.war

*** SSH Daemon
***

Listen on address [*]:
Listen on port [29418]:

## 这里下载可能会失败,按照我之前说过的方法重新试一遍应该就ok了
Gerrit Code Review is not shipped with Bouncy Castle Crypto SSL v151
If available, Gerrit can take advantage of features
in the library, but will also function without it.
Download and install it now [Y/n]?
Downloading http://www.bouncycastle.org/download/bcpkix-jdk15on-151.jar ...


## http的反向代理,我们这里先不要设置,一路回车,尽快完成安装
*** HTTP Daemon
***
Behind reverse proxy [y/N]?
Proxy uses SSL (https://) [y/N]?
Subdirectory on proxy server [/]:
Listen on address [*]:
Listen on port [8080]:

// 插件,默认都是不安装的
*** Plugins
***

Installing plugins.
Install plugin download-commands version v2.11 [y/N]?
Install plugin reviewnotes version v2.11 [y/N]?
Install plugin singleusergroup version v2.11 [y/N]?
Install plugin replication version v2.11 [y/N]?
Install plugin commit-message-length-validator version v2.11 [y/N]?
Initializing plugins.
No plugins found with init steps.

Initialized /home/gerrit_site
...

其实安装过程真的很简单,只是在Authentication method方式时输入http其他的一路回车下去就好了。

启动gerrit

安装完成之后,gerrit会自动启动,而且会开始监听两个端口:

  • 29418: 默认的ssh端口;
  • 8080: gerrit默认的web页面端口。

我们可以通过下面命令查看:

1
2
3
4
$ netstat -ltpn | grep -i gerrit

tcp 0 0 :::29418 :::* LISTEN 49513/GerritCodeRev
tcp 0 0 :::8080 :::* LISTEN 49513/GerritCodeRev

Nginx

接下来就该Nginx上场了。

在没有配置nginx反向之前,我们直接访问192.168.1.100:8080/login(我们之前假设gerrit服务器的ip地址是192.168.1.100),会得到一个错误页面,这个页面对于初次使用http方式的gerrit用户可能会让你感到非常。。。绝望,笔者至少看到这个页面不下10多次。。。
就是这样图片:



下面我们就来看一下nginx需要怎样配置吧。

nginx默认配置

我们首先看一看nginx的默认配置。
注意,你的nginx应该是用root账户安装的,否则可能出现权限问题。我们需要从之前的gerrit用户退出来。
在root用户下面,输入下面的命令:

1
2
$ cd /etc/nginx/conf.d
$ ls -l

默认的nginx只有一个default.conf文件,是nginx的默认配置文件,我们这里需要新建一个专门用来处理gerrit请求的配置文件,先来看一下我的目录吧:



我这里新建了一个gerrit.conf文件,用来处理gerrit的反向代理。待会我们来看里面需要配置些什么,我们先来研究下nginx默认的配置文件, default.conf吧。



上面就是默认的配置,看到这里我把端口默认的监听端口设置成了82, 因为80分配给了apache;
然后日志文件的路径在/var/log/nginx/目录下,如果后面登录认证的失败的时候,我们可以在这个目录下面查找日志文件,分析失败的原因。
nginx路径在/usr/share/nginx/路径下,如果我们进到该目录下,查看其下面的index.html文件,就会发现他就是我们在192.168.1.100:82页面中看到的关于nginx的介绍的页面。



之后还有一些注释掉的关于php的配置部分,这里不做多余的介绍。

gerrit.conf配置

重点来看下我们的gerrit.conf文件如何设置。
我们用vim gerrit.conf创建这个文件,然后输入下面的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen *:81;
server_name gerrit.microwu.com;
allow all;
deny all;

auth_basic "Welcomme to Gerrit Code Review Site!";
auth_basic_user_file /home/gerrit/gerrit.password;

location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
}
}

最终是这样的:



我们来详细解释几个重点:

  • 我们监听81端口,原因和前面一样,80端口被apache占用了,当然你还可以设置成其他没有被占用的端口
  • auth_basic 是用于登录时弹出验证登录对话框,我盗一张图来说明一下



    图片中 服务器提示: 后面的文字,就是我们在配置中当前选项的内容

  • auth_basic_user_file 是我们输入用户名和密码之后要去验证是否匹配的文件,看到路径是放在我们的gerrit用户目录下面;这个详细的内容我们一会再来说。

  • location 部分指的的是当用户访问到192.168.1.100:81时,要指向的内容,这里面的proxy_pass 字段表示要做的反向代理,指向的是8080,还记得8080端口是谁在用么?对的,就是我们之前新建好的gerrit的web监听端口,也就是说,当用户访问81端口时,nginx直接把这个请求代理到8080端口上去了,这个就是所谓的反向代理

重启nginx

配置好了之后,我们需要重启nginx

1
$ service nginx restart

然后我们去访问http://192.168.1.100:81页面,就能看到和上图一样的登录认证界面了。

登录认证文件

那登录认证有了,我们怎么登录呢??就需要前面的auth_basic_user_file文件了。

这里我们需要用apach的 htpasswd工具来新建这个文件,这也是为什么我们虽然不用到apache的反向代理,仍然需要apache的原因。

我们通过下面的命令来在/home/gerrit/路径下创建认证文件

1
$ htpasswd -c /home/gerrit/gerrit.password admin

这个命令的详细解释:

  • -c表示create,也就是新建的意思
  • 接下来跟上文件要创建的目录以及文件名,我们直接用绝对路径,表示将在/home/gerrit目录下新建一个gerrit.password文件
  • 最后的admin表示要写入的用户名

接下来你需要在命令行中连续输入两次密码,我们就为admin用户设置好了密码,可以通过vim来查看下这个密码文件,会发现里面是经过加密的。

如果我们想新建别的用户,或者修改某个用户的密码,只需要把-c改成-m就好了,如果还是用-c并且路径不变的话,就会覆盖掉原来的文件。
例如:我们想要新增一个用户,master,允许其通过页面登录,只需要执行下面的命令就好了

1
$ htpasswd -m /home/gerrit/gerrit.password master

同样的输入两遍密码,就设置好了master用户的登录密码了。

注意

如果你是在root用户下输入上面的命令 创建了gerrit.password文件到/home/gerrit/目录中,你会发现在登录的时候永远登录不成功,永远会得到服务器500的错误页面。原因是/homt/gerrit/文件夹的权限问题。

我们知道,/home/gerrit/是我们之前新建的gerrit用户的,那么这个文件夹的权限是700,也就是只允许gerrit用户访问,其他组的用户是访问不了的,虽然这个文件的权限拥有root用户的所有权限,但是因为它放在700权限的文件夹下面,所以同样其他用户是访问不到的。

这个问题之前纠缠了我好久,通过nginx的日志可以清楚的看到访问拒绝的错误。

所以,我们需要通过下面的命令,来改变gerrit目录的权限

1
$ chmod 755 /home/gerrit

这样,当前目录权限就变成了drwxr-xr-x,也就是其他组的用户也拥有了读取和执行的权利。

修改gerrit配置

好了,配置好了nginx,我们接下来修改下gerrit的配置,我们要做下面几个事情:

  • 配置SMTP邮件发送
  • 配置反向代理

先来看一下我最终成品图,红框里面的东西是需要我们特别注意的:



  1. canonicalWebUrl 就是gerrit的主页地址。开篇时,我们假设gerrit服务器的ip地址是192.168.1.100,这里我们就需要设置成http://192.168.1.100:8080
  2. auth的类型一定要是http,这是我们在安装的时候唯一需要手动设置的地方
  3. sendemail选项就是我们的邮件发送设置,如果你的gerrit服务器上没有搭建邮件服务器,那你可以用smtp发件代理,我这里去我们公司的邮箱注册了一个gerrit专用邮箱`gerrit@microwu.com,我们公司使用的是阿里云的服务,所以smtp服务器地址是smtp.mxhichina.com,端口使用465,因为使用的是SSL认证,然后smtpPass`填写上之前专用邮箱的密码。

    sendemail有什么作用呢?

    • 当有新的允许登录web页面的成员需要修改自己的邮箱时,点击注册邮箱,我们这个专用邮箱就会向该成员申请的邮箱中发送一封确认邮件。
    • 位于Administrator组中的用户,设置了想要watch的项目之后,所有和该项目相关的事件,都能收到一封邮件提醒,发送来自于这个专有邮箱

      具体的细节我们在下一篇文章中再详细介绍

  4. sshd就是ssh监听的端口,这个我们在安装gerrit时采用的是默认的配置,也就是29418这个端口
  5. httpd表示反向监听的端口,这里注意要修改成proxy-http://*:8080/,默认值是没有proxy的

重启gerrit

完成上面的配置之后,我们重启一下gerrit

gerrit的可执行文件位于/home/gerrit/gerrit_site/bin目录下,我们直接执行

1
$ /home/gerrit/gerrit_site/bin/gerrit.sh restart

这样,gerrit就会重新启动,并且加载我们刚才修改的配置。

重启完成之后,我们可以在浏览器中输入192.168.1.100:81看看是不是可以弹出输入用户名和密码的对话框(如果没有,请检查你的Nginx配置);然后输入正确的用户名(我们创建的密码文件用户是admin)和密码,如果你能登录到这个页面,就表示你的gerrit已经成功配置好了!



需要注意的是,gerrit配置了之后,第一个登录成功的用户,自动成为管理员,gerrit会给他分配一个id,1000000,之后登录的成员会依次自增1,初始时 Full Name 和 Email Address字段都是空的。

关于Gerrit的安装和配置Nginx实现反向代理的内容都介绍完了,关于如何使用Gerrit以及Gerrit的工作原理和流程,我们在下一个章节再介绍。

gitweb(可选)

gitweb可以让你的git工程变得更加方便阅读,它相当于网页版的sourceTree或者其他git可视化工具,让你清楚地看到每一次改变的详情。
配置了gitweb之后,可以在gerrit的主页project中增加一个gitweb的连接。

说明:gitweb部分的内容是可选的,不配置gitweb一样可以正常使用gerrit。
下面简要介绍一下集成gitweb的步骤。

安装gitweb

  • ubuntu: apt-get install gitweb
  • redhat/centOS: yum install gitweb

默认gitweb是安装到apache目录中的,也就是/var/www/目录下会有一个git文件夹,专门用来显示gitweb页面

修改gitweb配置文件

gitweb的配置文件地址在:/etc/gitweb.conf
默认的文件中所有的内容应该都被注释掉了,我们直接在最后面执行git仓库的位置:

1
$projectroot = "/home/gerrit/gerrit_site/git"

注:可能你的gerrit位置和我的不一样。如果你按照我这篇文章的教程安装gerrit,则和上面代码一样,只要正确指向所有git仓库的根目录就好了。

修改Apache配置文件

这里先说明一下,gitweb同样可以通过nginx来代理,不过因为默认是在apache目录下,这里我就只介绍下apache的配置,nginx的配置请自行google。

同nginx一样,apache的配置目录(/etc/httpd/)下也有两个文件夹,confconf.d,前面是默认的所有配置,后面是可以自定义的配置。

我们可以选择修改默认配置(/etc/httpd/conf/httpd.conf)或者新建一个配置,然后在配置文件中加入下面的代码:

1
2
3
4
5
6
7
8
9
10
11
#
# gitweb
#
Alias /gitweb "/var/www/git"
<Directory "/var/www/git">
Options FollowSymLinks +ExecCGI
AddHandler cgi-script .cgi
DirectoryIndex index.cgi gitweb.cgi
Order allow,deny
Allow from all
</Directory>

接下来重启一下apache服务器(service httpd restart),你就可以在http://192.168.1.100/gitweb页面中看到你的git项目了。

修改gerrit配置

修改/home/gerrit/gerrit_site/etc/gerrit.conf文件,添加如下内容:

1
2
3
[gitweb]
type = gitweb
cgi = /var/www/git/gitweb.cgi

然后重启一下gerrit服务(/home/gerrit/gerrit_site/bin/gerrit.sh restart),并重新登录web页面,就可以了!!

补充内容

卸载Gerrit

如果你的安装过程出错了,或者觉得安装的不够好,比如文件位置什么的,你可以重新安装。
如果你的gerrit服务已经处于运行中,需要先执行下面的命令把它停掉

1
$ /home/gerrit/gerrit_site/bin/gerrit.sh stop

然后直接删除/home/gerrit/gerrit_site/整个文件夹就好了。

如果你的gerrit服务没有正常退出,可能会发现这个文件夹删除不掉(cache 和 db这两个文件夹一直都会存在),其实是因为还有gerrit的进程在跑,我们要做的是找出gerrit的进程,然后kill掉就好了

1
$ ps -ef | grep gerrit



看上图中的最后一条,就是当前gerrit的进程,49513就是其进程id
我们接着执行

1
$ kill -9 49513

就强制关闭了gerrit进程,然后再试着删除整个gerrit_site文件夹就好了。

删除git工程

如果你想删除一些无用的或者测试的git工程,只需要去/home/gerrit/gerrit_site/git目录下删除掉相应的工程,然后重启一下gerrit服务,同时,把浏览器整个关闭,然后再重新登录,就可以了。至于为什么要关闭掉整个浏览器,接着往下看:

退出gerrit网页

如果你已经成功登录了gerrit的网页,那么如果你想退出,请直接关闭整个浏览器,gerrit没有做logout的session清除,所以如果你直接点击网页右上角的logout,要么会出错,要么就会进入到之前那个提示需要反向代理的错误页面。关于登出,gerrit给出的原因是:

You are using HTTP Basic authentication. There is no way to tell abrowser to quit sending basic authentication credentials, to logout with basicauthentication is to close the Webbrowser.

参考文献:

  1. 烤鸭的gerrit使用总结
  2. Git服务器之Gerrit的搭建及第一次使用注意事项
  3. CentOS: How to uninstall gerrit server from CentOS release 6.4
Contents
  1. 1. 开发环境
  2. 2. 安装gerrit
    1. 2.1. 下载gerrit安装包
    2. 2.2. 新建gerrit专用用户
    3. 2.3. 安装gerrit
    4. 2.4. 启动gerrit
  3. 3. Nginx
    1. 3.1. nginx默认配置
    2. 3.2. gerrit.conf配置
    3. 3.3. 重启nginx
    4. 3.4. 登录认证文件
  4. 4. 修改gerrit配置
    1. 4.1. 重启gerrit
  5. 5. gitweb(可选)
    1. 5.1. 安装gitweb
    2. 5.2. 修改gitweb配置文件
    3. 5.3. 修改Apache配置文件
    4. 5.4. 修改gerrit配置
  6. 6. 补充内容
    1. 6.1. 卸载Gerrit
    2. 6.2. 删除git工程
    3. 6.3. 退出gerrit网页
    4. 6.4. 参考文献: