32.2 架设Gerrit的服务器
1.下载war包
Gerrit是由Java开发的,被封装为一个war包:gerrit.war,安装非常简洁。如果需要从源码编译出war包,可以参照相关文档[1]。不过最简单的就是从Google Code上直接下载编译好的war包。
从下面的地址下载Gerrit的war包:http://code.google.com/p/gerrit/downloads/list。在下载页面会有一个文件名类似Gerrit-x.x.x.war的war包,这个文件就是Gerrit的全部。示例中使用的是2.1.5.1版本,把下载的Gerrit-2.1.5.1.war包重命名为Gerrit.war。下面的介绍就是基于这个版本。
2.数据库选择
Gerrit需要数据库来维护账户信息和跟踪评审任务等。目前支持的数据库类型有PostgreSQL、MySQL及嵌入式的H2数据库。
选择使用默认的H2内置数据库是最简单的,因为这样无须任何设置。如果想使用更为熟悉的PostgreSQL或MySQL,则需要预先建立数据库。
对于PostgreSQL,在数据库中创建一个用户gerrit,并创建一个数据库reviewdb。
createuser-A-D-P-E gerrit
createdb-E UTF-8-O gerrit reviewdb
对于MySQL,在数据库中创建一个用户gerrit并为其设置口令(不要真如下面那样将口令设置为"secret"),并创建一个数据库reviewdb。
$mysql-u root-p
mysql>CREATE USER 'gerrit' @ 'localhost' IDENTIFIED BY 'secret';
mysql>CREATE DATABASE reviewdb;
mysql>ALTER DATABASE reviewdb charset=latin1;
mysql>GRANT ALL ON reviewdb.*TO 'gerrit '@ 'localhost';
mysql>FLUSH PRIVILEGES;
3.以一个专用用户账号执行安装
在系统中创建一个专用的用户账号如:gerrit。以该用户身份执行安装,将Gerrit的配置文件、内置数据库、war包等都自动安装在该用户主目录下的特定目录中。
$sudo adduser gerrit
$sudo su gerrit
$cd~gerrit
$java-jar gerrit.war init-d review_site
在安装过程中会提出一系列问题。
(1)创建相关目录。
默认Grerit在安装用户主目录下创建review_site,并把相关文件安装在这个目录之下。Git版本库的根路径默认位于此目录之下的git目录中。
*Gerrit Code Review 2.1.5.1
Create '/home/gerrit/review_site' [Y/n]?
*Git Repositories
Location of Git repositories[git]:
(2)选择数据库类型。
选择H2数据库是简单的选择,无须额外的配置。
*SQL Database
Database server type[H2/?]:
(3)设置Gerrit Web界面认证的类型。
默认为openid,即使用任何支持OpenID的认证源(如Google、Yahoo!)进行身份认证。此模式支持用户自建账号,用户通过OpenID认证源的认证后,Gerrit会自动从认证源获取相关属性如用户全名和邮件地址等信息创建账号。Android项目的Gerrit服务器即采用此认证模式。
如果有可用的LDAP服务器,那么ldap或ldap_bind也是非常好的认证方式,可以直接使用LDAP中的已有账号进行认证,不过此认证方式下Gerrit的自建账号功能是关闭的。此安装示例选择的就是LDAP认证方式。
HTTP认证也是可选的认证方式,此认证方式需要配置Apache的反向代理,并在Apache中配置Web站点的口令认证,通过口令认证后Gerrit在创建账号的过程中会询问用户的邮件地址并发送确认邮件。
*User Authentication
Authentication method[OPENID/?]:?
Supported options are:
openid
http
http_ldap
ldap
ldap_bind
development_become_any_account
Authentication method[OPENID/?]:ldap
LDAP server[ldap://localhost]:
LDAP username:
Account BaseDN:dc=foo,dc=bar
Group BaseDN[dc=foo,dc=bar]:
(4)发送邮件设置。
默认使用本机的SMTP发送邮件。
*Email Delivery
SMTP server hostname[localhost]:
SMTP server port[(default)]:
SMTP encryption[NONE/?]:
SMTP username:
(5)Java相关设置。
使用OpenJava和Sun Java均可。Gerrit的war包要复制到review_site/bin目录中。
*Container Process
Run as[gerrit]:
Java runtime[/usr/lib/jvm/java-6-sun-1.6.0.21/jre]:
Copy gerrit.war to/home/gerrit/review_site/bin/gerrit.war[Y/n]?
Copying gerrit.war to/home/gerrit/review_site/bin/gerrit.war
(6)SSH服务相关设置。
Gerrit的基于SSH协议的Git服务非常重要,默认的端口为29418。换成其他端口也无妨,因为repo可以自动探测到该端口。
*SSH Daemon
Listen on address[*]:
Listen on port[29418]:
Gerrit Code Review is not shipped with Bouncy Castle Crypto v144
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/bcprov-jdk16-144.jar...OK
Checksum bcprov-jdk16-144.jar OK
Generating SSH host key…rsa…dsa…done
(7)HTTP服务相关设置。
默认启用内置的HTTP服务器,端口为8080,如果该端口被占用(如Tomcat),则需要更换为其他端口,否则服务启动失败。如下例就换成了8081端口。
*HTTP Daemon
Behind reverse proxy[y/N]?y
Proxy uses SSL(https://)[y/N]?y
Subdirectory on proxy server[/]:/gerrit
Listen on address[*]:
Listen on port[8081]:
Canonical URL[https://localhost/gerrit]:
Initialized/home/gerrit/review_site
4.启动Gerrit服务
Gerrit服务正确安装后,运行Gerrit启动脚本来启动Gerrit服务。
$/home/gerrit/review_site/bin/gerrit.sh start
Starting Gerrit Code Review:OK
服务正确启动之后,会看到Gerrit服务打开两个端口,这两个端口是在Gerrit安装时指定的。您的输出和下面的示例可能略有不同。
$sudo netstat-ltnp|grep-i gerrit
tcp 0 0 0.0.0.0:8081 0.0.0.0:*LISTEN
26383/GerritCodeRev
tcp 0 0 0.0.0.0:29418 0.0.0.0:*LISTEN
26383/GerritCodeRev
5.设置Gerrit服务开机自动启动
Gerrit服务的启动脚本支持start、stop、restart参数,可以作为init脚本开机自动执行。
$sudo ln-snf\
/home/gerrit/review_site/bin/gerrit.sh\
/etc/init.d/gerrit.sh
$sudo ln-snf../init.d/gerrit.sh/etc/rc2.d/S90gerrit
$sudo ln-snf../init.d/gerrit.sh/etc/rc3.d/S90gerrit
服务自动启动脚本/etc/init.d/gerrit.sh需要通过/etc/default/gerritcodereview提供一些默认的配置。以下面的内容来创建该文件。
GERRIT_SITE=/home/gerrit/review_site
NO_START=0
6.Gerrit认证方式的选择
如果是开放的Gerrit服务,使用OpenId认证是最好的方法,就像谷歌Android项目的代码审核服务器配置的那样。任何人只要在可以作为OpenId提供者的网站上(如Google、Yahoo!等)拥有账号,就可以直接通过OpenId注册,Gerrit会在用户登录OpenId提供者网站成功后,自动获取(经过用户的确认)用户在OpenId提供者站点上的部分注册信息(如用户全名或邮件地址)在Gerrit上自动为用户创建账号。
如果架设有LDAP服务器,并且用户账号都在LDAP中进行管理,那么采用LDAP认证也是非常好的方法。登录时提供的用户名和口令通过LDAP服务器验证之后,Gerrit会自动从LDAP服务器中获取相应的字段属性为用户创建账号。因为创建账号的用户全名和邮件地址来自于LDAP,因此不能在Gerrit中更改,但是用户可以注册新的邮件地址。我在配置LDAP认证时遇到了一个问题就是创建账号的用户全名是空白的,这是因为没有正确设置LDAP的相关字段。如果LDAP服务器使用的是OpenLDAP,Gerrit会从displayName字段获取用户全名,如果使用Active Directory则用givenName和sn字段的值拼接形成用户全名。
Gerrit还支持使用HTTP认证,这种认证方式需要架设Apache反向代理,在Apache中配置HTTP认证。用户若要访问Gerrit网站,首先需要通过Apache配置的HTTP Basic Auth认证,当Gerrit发现用户已经登录后,会要求用户确认邮件地址。当用户确认邮件地址后,再填写其他必须的字段完成账号注册。HTTP认证方式的缺点除了在口令文件管理上需要管理员手工维护比较麻烦之外,还有一个缺点就是用户一旦登录成功后,想退出登录或更换其他用户账号登录会变得非常麻烦,除非关闭浏览器。关于用户切换有一个小窍门:例如Gerrit登录URL为https://server/gerrit/login/,则用浏览器访问https://nobody:wrongpass@server/gerrit/login/,即用错误的用户名和口令覆盖掉浏览器缓存的认证用户名和口令,这样就可以重新认证了。
在后面的Gerrit演示和介绍中,为了设置账号的方便,使用了HTTP认证,因此下面再介绍一下HTTP认证的配置方法。
7.配置Apache代理访问Gerrit
默认Gerrit的Web服务端口为8080或8081,通过Apache的反向代理就可以使用标准的80(HTTP)或443(HTTPS)来访问Gerrit的Web界面。
ProxyRequests Off
ProxyVia Off
ProxyPreserveHost On
<Proxy*>
Order deny,allow
Allow from all
</Proxy>
ProxyPass/gerrit/http://127.0.0.1:8081/gerrit/
如果要配置Gerrit的HTTP认证,则还需要在上面的配置中插入HTTP Basic Auth认证的设置。
<Location/gerrit/login/>
AuthType Basic
AuthName "Gerrit Code Review"
Require valid-user
AuthUserFile/home/gerrit/review_site/etc/gerrit.passwd
</Location>
在上面的配置中,指定了口令文件的位置:/home/gerrit/review_site/etc/gerrit.passwd。可以用htpasswd命令维护该口令文件。
$touch/home/gerrit/review_site/etc/gerrit.passwd
$htpasswd-m/home/gerrit/review_site/etc/gerrit.passwd jiangxin
New password:
Re-type new password:
Adding password for user jiangxin
至此为止,Gerrit服务安装完成。在正式使用Gerrit之前,先来研究一下Gerrit的配置文件,以免安装过程中遗漏或因错误的设置而影响使用。
[1]http://gerrit.googlecode.com/svn/documentation/2.1.5/dev-readme.html