1. 前言
最近在摸索Git + gerrit代码审核的工作模式,需要安装gerrit服务器,经过一阵折腾,走了不少弯路,在此做下笔记,以便自己或者他人参考。有误的地方请指教。
我的环境如下:
环境 | IP | 说明 |
Windows XP | 192.168.1.100 | 客户端web访问gerrit服务器 |
虚拟机中的Linux (用的是CentOS) | 192.168.1.101 | 安装gerrit服务器 |
2. 安装
Gerrit有很好的帮助手册,可以参考其安装指南:
http://gerrit-documentation.googlecode.com/svn/Documentation/2.5.2/install-quick.html
2.1. 安装git
在root用户下安装git,这个就不用说了。
2.2. 安装java
也是在root用户下安装Java。
Gerrit是由Java开发的,被封装为一个war包。所以要先检查你的linux环境是否已经安装了java,通过以下指令查看:
$ java -version Java version "1.6.0_18" OpenJDK Runtime Environment (IcedTea6 1.8.13) (6b18-1.8.13-0+squeeze2) OpenJDK Client VM (build 14.0-b16, mixed mode, sharing) |
如果没有安装,下载个JDK安装(要求版本在1.6以上),可以到官网下载:
官网:http://www.oracle.com/technetwork/java/javase/downloads/index.html
提示:我下载的JDK文件名是jdk-6u41-linux-i586-rpm.bin,下载完后在终端无法运行,后来发现是,要先设置JDK文件的执行权限:
# chmod o+x ./jdk-6u41-linux-i586-rpm.bin |
然后运行之(以管理员身份运行):
# ./jdk-6u41-linux-i586-rpm.bin Unpacking... Checksumming... Extracting... UnZipSFX 5.50 of 17 February 2002, by Info-ZIP (Zip-Bugs@lists.wku.edu). inflating: jdk-6u41-linux-i586.rpm inflating: sun-javadb-common-10.6.2-1.1.i386.rpm inflating: sun-javadb-core-10.6.2-1.1.i386.rpm inflating: sun-javadb-client-10.6.2-1.1.i386.rpm inflating: sun-javadb-demo-10.6.2-1.1.i386.rpm inflating: sun-javadb-docs-10.6.2-1.1.i386.rpm inflating: sun-javadb-javadoc-10.6.2-1.1.i386.rpm Preparing... ########################################### [100%] package jdk-2000:1.6.0_41-fcs.i586 is already installed
Java(TM) SE Development Kit 6 successfully installed. |
2.3. 安装gerrit
2.3.1. 下载war包
我下载的版本是:gerrit-full-2.5.2.war
官网:https://code.google.com/p/gerrit/
2.3.2. 新建专用用户
新建一个专用的用户(gerrit2)来安装gerrit(当然你可以选择跳过此步骤)。
sudo adduser gerrit2 sudo su gerrit2 |
2.3.3. 安装过程简介
安装gerrit过程会有几个问题,例如:
•Git代码库的位置 [git]
•导入现有代码库 [Y/n]
•数据库服务器类型 [H2/?]
•身份验证方法 [OPENID/?]
•SMTP服务器主机名 [localhost]
•SMTP服务器端口 [(default)]
•SMTP加密 [NONE/?]
•SMTP用户名
•以何种身份运行 [you]
•Java运行时 [/path/to/jvm]
•将gerrit.war复制到/path/to/location/bin/gerrit.war [Y/n]
•监听地址 [*]
•监听端口 [29418]
•下载并安装Bouncy Castle[Y/n]
•位于HTTP反向代理之后 [y/N]
•使用SSL [y/N]
•监听地址 [*]
•监听端口 [8080]
需要注意的是有一个步骤要下载Bouncy Castle,因此要求能电脑能上网。但如果所安装的电脑确实不能上网,怎么解决????TODO
我认为gerrit安装比较难的地方在于它有多种身份验证方法,身份验证方法决定了如何登录Gerrit。如果你想挂入某个现有的身份验证提供方(例如GoogleAccounts),那么可以使用OpenID。如果是用于测试和学习,可以选择最简单的development_become_any_account。HTTP认证也是可选的认证方式,此认证方式下需要配置Apache的反向代理,并在Apache中配置Web站点的口令认证,通过口令认证后gerrit在创建账号的过程中会询问用户的邮件地址并发送确认邮件。
另一个就是gerrit数据库的选择,可以选择默认的H2,无须任何配置即可使用。
2.3.4. development_become_any_account认证模式
为了学习和测试gerrit,在下面交互式安装过程中,认证模式我选择了development_become_any_account之外,其他全部按默认(直接回车)。
[gerrit2@bogon bin]$ java -jar ~/gerrit-full-2.5.2.war init -d ~/gerrit_site
*** Gerrit Code Review 2.5.2 ***
Create '/home/gerrit2/gerrit_site' [Y/n]?
*** Git Repositories ***
Location of Git repositories [git]:
*** SQL Database ***
Database server type [H2/?]:
*** User Authentication ***
Authentication method [OPENID/?]: ? Supported options are: openid openid_sso http http_ldap client_ssl_cert_ldap ldap ldap_bind custom_extension development_become_any_account Authentication method [OPENID/?]: development_become_any_account
*** Email Delivery ***
SMTP server hostname [localhost]: SMTP server port [(default)]: SMTP encryption [NONE/?]: SMTP username :
*** Container Process ***
Run as [gerrit2]: java runtime [/usr/java/jdk1.6.0_41/jre]: Copy gerrit.war to /home/gerrit2/gerrit_site/bin/gerrit.war [Y/n]? Copying gerrit.war to /home/gerrit2/gerrit_site/bin/gerrit.war
*** 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
*** HTTP Daemon ***
Behind reverse proxy [y/N]? Use SSL (https://) [y/N]? Listen on address [*]: Listen on port [8080]:
*** Plugins ***
Prompt to install core plugins [y/N]?
Initialized /home/gerrit2/gerrit_site Executing /home/gerrit2/gerrit_site/bin/gerrit.sh start Starting Gerrit Code Review: OK Waiting for server to start ... OK Opening browser ... |
安装完后,Gerrit服务会自己启动,你可以看到Gerrit服务打开了两个端口,其中29418是默认的Gerrit SSH端口,而8080是默认的Gerrit Web端口。如果这两个默认的端口被占用了,就要换个了。
# netstat -ltpn | grep -i gerrit tcp 0 0 :::29418 :::* LISTEN 8079/GerritCodeRevi tcp 0 0 :::8080 :::* LISTEN 8079/GerritCodeRevi |
Gerrit启动后,会在本地自动打开一个浏览器,显示Gerrit主页。如果没有启动,你也可以通过以下命令来操作。
# /home/gerrit2/gerrit_site/bin/gerrit.sh start //启动
# /home/gerrit2/gerrit_site/bin/gerrit.sh stop // 停止
# /home/gerrit2/gerrit_site/bin/gerrit.sh restart //重启 |
登录的第一个用户将自动成为管理员(Account ID为1000000的就是管理员),所有后续登录的用户都是无权限用户(需要管理员指定权限)。如果你选择了development_become_any_account,在页面顶端会有一个Become链接,通过它可以进入注册/登录页面。
自此,Gerrit安装过程就完成了,可以在windows平台下通过web访问Gerrit(当然也可以直接用虚拟机本地的浏览器访问),即在浏览器中输入http://192.168.1.101:8080。但是需要注意的是:我用的linux是CentOS,需要先关掉防火墙才能连接上。
# service iptables stop iptables: Flushing firewall rules: [ OK ] iptables: Setting chains to policy ACCEPT: filter [ OK ] iptables: Unloading modules: [ OK ] |
2.3.5. 注册用户
注意,第一个注册的用户默认成了管理员,所以Gerrit安装完毕第一件事要做的就是注册或者登陆,以便初始化管理员账户。点击Become链接,如图2‑1所示。
图2‑1 第一个注册的用户是管理员
◆ Full Name中输入全名,点击SaveChanges保存,Full Name设置完后还可以再修改。
◆ 点击Register New Email设置邮箱,点击SaveChanges保存,邮箱设置完后可以修改。
◆ Username是gerrit的用户名,输入后用户名后,点击Select Username保存,注意Username设置后不可以再修改。
生成SSH密钥对,可以加上-C参数添加说明(如
◆ 图2‑2所示),以便能一眼看出这是谁的密钥,否者默认的说明很杂乱。将公钥文件(注意是公钥)的内容添加注册页面的Add SSH Publi Key中,点击Add即可。
图 2‑2 生成SSH密钥对
2.3.6. 测试下gerrit的SSH连接
图2‑3 gerrit用户的用户名Username
有了Gerrit账号,也为该账号正确配置了公钥,就可以访问Gerrit提供的SSH登录服务。需要注意的是ssh登陆的用户名必须是gerrit注册的账号,即如图2‑3所示Settings > Profile > Username中显示的Username。
$ ssh -p 29418 -i ~/.ssh/admin 192.168.1.101 -l admin
**** Welcome to Gerrit Code Review ****
Hi 管理员, you have successfully connected over SSH.
Unfortunately, interactive shells are disabled. To clone a hosted Git repository, use:
git clone ssh://admin@debian.localdomain:29418/REPOSITORY_NAME.git
Connection to 192.168.1.101 closed. |
每次ssh连接要输入那么长命令,很烦人,可以配置~/.ssh/config文件来为ssh连接设置别名,如下所示:
Host ha HostName 192.168.1.101 User admin # 注意:这里的admin是gerrit注册的用户名 Port 29418 IdentityFile ~/.ssh/admin |
以后就可以用别名来连接ssh,方便快捷:
图2‑4 SSH连接显示出gerrit的Full Name
上图2‑4所示,红色框显示的名字是Gerrit中的Settings > Profile> Full Name,如果Full Name没有设置(即为空),则显示Settings > Profile > Username。
如果你在~/.ssh/config文件中设置的user不是Gerrit的账号,ssh连接时会出现如下错误信息,如果你user设置确实是对的,还出现如下错误,你可以先把./ssh/known_hosts2文件删掉,再连接试试。
$ ssh ha @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is e1:20:1d:08:22:8e:f8:80:c3:58:9c:2d:5c:52:55:14. Please contact your system administrator. Add correct host key in /c/.ssh/known_hosts2 to get rid of this message. Offending key in /c/.ssh/known_hosts2:1 RSA host key for 192.168.1.101 has changed and you have requested strict checkin g. |
3. Gerrit的数据库访问
之所以要介绍对数据库的访问,是因为在web界面往往无法配置对gerrit的一些设置,需要直接修改数据库。Gerrit提供了两种方式来操作数据库。一种是在gerrit服务器端调用gerrit.war包中的命令入口,另外一种方法是远程SSH调用接口。
3.1. gerrit服务端操作
对于第一种方法,需要再服务端执行,而且如果使用的是H2内置数据库还需要先将gerrit服务停止。总结起来操作步骤如下:
◆必须先以安装用户的身份进入Gerrit部署目录下;
◆必须停止gerrit服务;
◆执行命令调用gerrit.war包;
◆完了再运行gerrit服务;
[gerrit2@bogon ~]$ java -jar /home/gerrit2/gerrit_site_http/bin/gerrit.war gsql fatal: not a Gerrit site: '/home/gerrit2' fatal: Perhaps you need to run init first? [gerrit2@bogon ~]$ [gerrit2@bogon ~]$ [gerrit2@bogon ~]$ cd /home/gerrit2/gerrit_site_http/ [gerrit2@bogon gerrit_site_http]$ java -jar bin/gerrit.war gsql fatal: DbInjector failed fatal: Unable to determine SqlDialect fatal: caused by org.h2.jdbc.JdbcSQLException: Database may be already in use: "Locked by another process". Possible solutions: close all other connection(s); use the server mode; SQL statement: fatal: null/13d6e875055d9f00c2655aa808691734b7daf52013c [90020-147] [gerrit2@bogon gerrit_site_http]$ [gerrit2@bogon gerrit_site_http]$ [gerrit2@bogon gerrit_site_http]$ /home/gerrit2/gerrit_site_http/bin/gerrit.sh stop Stopping Gerrit Code Review: OK [gerrit2@bogon gerrit_site_http]$ [gerrit2@bogon gerrit_site_http]$ [gerrit2@bogon gerrit_site_http]$ java -jar bin/gerrit.war gsql Welcome to Gerrit Code Review 2.5.2 (H2 1.2.147 (2010-11-21))
Type '\h' for help. Type '\r' to clear the buffer.
gerrit> gerrit> gerrit> |
这种方法需要先登录到服务器,而且操作H2数据库时还需要先停止服务,显然很不方便。但是这种方法也有存在的必要,就是不需要认证,尤其是在管理员账号尚未建立之前就可以查看和更改数据库。
那么可不可以不停止gerrit服务就直接操作数据库呢?可以的,就是下面要介绍的管理员通过SSH远程操作数据库。
3.2. 管理员远程操作
有了管理员账号,正确为该账号配置公钥之后,管理员就可以远程登录Gerrit的SSH服务器操作数据库,下面就演示一些实例来体会下。
3.2.1. Gerrit帮助说明
先看看管理员通过SSH连接,可以执行的gerrit相关命令有哪些,以下命令列出了所有可以用的命令。
$ ssh ha gerrit --help gerrit COMMAND [ARG ...] [--] [--help (-h)]
-- : end of options --help (-h) : display this help text
Available commands of gerrit are:
approve ban-commit create-account create-group create-project flush-caches gsql ls-groups ls-projects plugin query receive-pack rename-group review set-account set-project set-project-parent set-reviewers show-caches show-connections show-queue stream-events test-submit-rule version
See 'gerrit COMMAND --help' for more information. |
3.2.2. 查询数据库
输入以下命令就可以开始远程操作Gerrit数据库,操作数据库用的都是SQL语法(需要懂得一些SQL语法的东东了)。
$ ssh ha gerrit gsql Welcome to Gerrit Code Review 2.5.2 (H2 1.2.147 (2010-11-21))
Type '\h' for help. Type '\r' to clear the buffer.
gerrit> |
如果之前你无法在Gerrit中注册email,那么可以手工进行注册email,运行GSQL工具更新特定数据字段。
查看Gerrit数据库中所有用户信息,即查看ACCOUNT_EXTERNAL_IDS表记录。
gerrit> select * from ACCOUNT_EXTERNAL_IDS order by ACCOUNT_ID; ACCOUNT_ID | EMAIL_ADDRESS | PASSWORD | EXTERNAL_ID -----------+---------------------+----------+--------------------------- 1000000 | NULL | NULL | gerrit:kaoya 1000000 | NULL | NULL | username:kaoya 1000000 | magic_kaoya@163.com | NULL | mailto:magic_kaoya@163.com 1000001 | NULL | NULL | gerrit:user1 1000001 | NULL | NULL | username:user1 1000001 | user1@163.com | NULL | mailto:user1@163.com 1000002 | NULL | NULL | username:user99 1000002 | user99@163.com | NULL | mailto:user99@163.com 1000003 | NULL | NULL | username:user98 1000003 | user98@163.com | NULL | mailto:user98@163.com 1000003 | NULL | NULL | gerrit:user98 1000004 | NULL | 1234 | username:user97 1000004 | user97@163.com | NULL | mailto:user97@163.com 1000005 | NULL | NULL | gerrit:user99 1000005 | NULL | NULL | username:user999 1000006 | NULL | NULL | gerrit:user80 1000006 | NULL | NULL | username:user80 (17 rows; 18 ms) |
3.2.3. 远程新建账号
通过远程命令创建账号,命令用法可以通过ssh ha gerrit create-account –h查看。如下创建一个用户名为user1,全名为“张三” ,邮箱为user1@163.com的Gerrit账号。
$ ssh-keygen -t rsa -C "张三" -f ~/.ssh/user1 Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/Administrator/.ssh/user1. Your public key has been saved in /home/Administrator/.ssh/user1.pub. The key fingerprint is: 47:33:fe:fc:2a:f6:00:39:12:5e:03:8a:91:6f:be:4f 张三 The key's randomart image is: +--[ RSA 2048]----+ | .. . | | .o . . | | ... . o + | | o. o = o | | o o S o | | . . + o | | .E . o | | .. o. . | | .. . oo.. | +-----------------+
$ cat ~/.ssh/user1.pub | ssh ha gerrit create-account --email user1@163.com --full-name张三 --ssh-key -<it create-account --email user1@163.com --full-name张三 --ssh-key - user1 $ |
查看下数据库,看看有没有创建成功了:
$ ssh ha gerrit gsql Welcome to Gerrit Code Review 2.5.2 (H2 1.2.147 (2010-11-21))
Type '\h' for help. Type '\r' to clear the buffer.
gerrit> select * from ACCOUNT_EXTERNAL_IDS; ACCOUNT_ID | EMAIL_ADDRESS | PASSWORD | EXTERNAL_ID -----------+---------------------+----------+--------------------------- 1000000 | NULL | NULL | gerrit:admin 1000000 | NULL | NULL | username:admin 1000000 | magic_kaoya@163.com | NULL | mailto:magic_kaoya@163.com 1000001 | NULL | NULL | username:user1 1000001 | user1@163.com | NULL | mailto:user1@163.com (5 rows; 2 ms) gerrit> gerrit> select FULL_NAME, PREFERRED_EMAIL, ACCOUNT_ID from ACCOUNTS; FULL_NAME | PREFERRED_EMAIL | ACCOUNT_ID ----------+---------------------+----------- NULL | magic_kaoya@163.com | 1000000 张三 | user1@163.com | 1000001 (2 rows; 2 ms) gerrit> gerrit> select * from ACCOUNT_SSH_KEYS; |
4. 拷贝gerrit提供的文件
可以执行scp命令从gerrit的SSH服务器远程拷贝文件到本地,递归拷贝所有文件到本地gerrit-files目录下:
$ scp -r ha:/ gerrit-files gerrit-cherry-pick 100% 4249 4.2KB/s 00:00 commit-msg 100% 4270 4.2KB/s 00:00
$ find gerrit-files/ -type f gerrit-files/bin/gerrit-cherry-pick gerrit-files/hooks/commit-msg |
当然也可以单独拷贝其中一个文件。
$ scp ha:/hooks/commit-msg commit-msg commit-msg 100% 4270 4.2KB/s 00:00 |
5. Gerrit + HTTP认证模式
前面介绍的gerrit安装时认证模式选择的是development_become_any_account,这种认证模式下任何人都可以自己注册gerrit账号,这仅仅是为了学习gerrit代码审核用的,实际使用中不安全。
下面开始介绍另一种认证模式——http认证。Gerrit如果要用http认证,就必须使用反向代理(如果不知道什么叫“方向代理”,可以问下“度娘”)。我曾试过用http认证,但不使用反向代理,然后用试图用http://192.168.1.101:8080/login/去访问gerrit服务器,结果都是如下图5‑1所示的错误信息。
图5‑1 HTTP认证,但不使用反向代理会出错
5.1. 安装gerrit
同样的,新建一个专用的用户(gerrit2)来安装gerrit。
在安装的过程中,就需要修改两个地方:认证模式选择http和反向代理,其他的都默认。
[gerrit2@bogon Downloads]$ java -jar ./gerrit-full-2.5.2.war init -d ~/gerrit_site_http
*** Gerrit Code Review 2.5.2 ***
Create '/home/gerrit2/gerrit_site_http' [Y/n]?
*** Git Repositories ***
Location of Git repositories [git]:
*** SQL Database ***
Database server type [H2/?]:
*** User Authentication ***
Authentication method [OPENID/?]: http Get username from custom HTTP header [y/N]? SSO logout URL :
*** Email Delivery ***
SMTP server hostname [localhost]: SMTP server port [(default)]: SMTP encryption [NONE/?]: SMTP username :
*** Container Process ***
Run as [gerrit2]: Java runtime [/usr/java/jdk1.6.0_41/jre]: Copy gerrit.war to /home/gerrit2/gerrit_site_http/bin/gerrit.war [Y/n]? Copying gerrit.war to /home/gerrit2/gerrit_site_http/bin/gerrit.war
*** 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
*** HTTP Daemon ***
Behind reverse proxy [y/N]? y Proxy uses SSL (https://) [y/N]? Subdirectory on proxy server [/]: Listen on address [*]: Listen on port [8080]:
*** Plugins ***
Prompt to install core plugins [y/N]?
Initialized /home/gerrit2/gerrit_site_http Executing /home/gerrit2/gerrit_site_http/bin/gerrit.sh start Starting Gerrit Code Review: OK Waiting for server to start ... OK Opening browser ... |
5.2. 安装apache
这个网上很多资料,可以参考我的blog的一片文章《Apache反向代理》:
http://blog.csdn.net/benkaoya/article/details/8670726。
我是以root身份安装的apache。如果你安装好了apache,但当初安装时没有加载proxy模块,不需要重新安装,可以使用如下所示的“动态加载”方法来加载:编译进一个已经装好了的apache中(编译为dso模块)。该方法在以上链接《Apache反向代理》中有详细介绍。
已经装好的apache在 /usr/local/apache2
进入apache源码的模块目录进行编译
cd httpd-2.0.63/modules/proxy/
/usr/local/apache2/bin/apxs -c -i -amod_proxy.c proxy_connect.c proxy_http.c proxy_util.c
从输出里面看到apache的modules目录下已经产生了mod_proxy.so,且已经在httpd.conf中激活了
cd /usr/local/apache2/conf/
ls ../modules/ 看到确实有mod_prxoy.so
编辑配置文件
vi httpd.conf
修改如下
加载模块
LoadModule proxy_module modules/mod_proxy.so(这句是编译激活时产生的)
LoadModule proxy_http_modulemodules/mod_proxy.so (这句是要手动添加的)
5.3. 配置文件
◆Apache配置文件
默认gerrit的web服务端口为8080,通过apache的反向代理就可以使用标准的80(HTTP)来访问gerrit的web界面,在apache的配置文件httpd.conf添加如下反向代理和HTTP认证设置:
<VirtualHost *:80> ProxyRequests Off ProxyVia Off ProxyPreserveHost On
<Proxy *> Order deny,allow Allow from all </Proxy>
<Location /login/> AuthType Basic AuthName "Gerrit Code Review" Require valid-user AuthUserFile /gerrit.password </Location>
ProxyPass / http://127.0.0.1:8080/ </VirtualHost> |
在上面的配置中,指定了HTTP口令文件为/gerrit.password文件,用htpasswd命令来维护口令文件。
[root@bogon Desktop]# touch /gerrit.password [root@bogon Desktop]# htpasswd -m /gerrit.password admin New password: Re-type new password: Adding password for user admin |
查看下文件/gerrit.password文件内容,发现多了一条有关admin的记录:
[root@bogon Desktop]# cat /gerrit.password admin:$apr1$1251W0Gw$UBRT.AZHFm5typwny6gwq0 |
这里的admin就是以后用来登录gerrit的用户名。以后要为gerirt增加用户,也需要通过htpasswd命令在此gerrit.password文件中添加用户。
用htpasswd创建的用户时,并没有往gerrit中添加账号,只有当该用户通过web登陆gerrit服务器时(如下图5‑2所示),该账号才会被添加进gerrit数据库中。
图5‑2 HTTP身份验证
◆Gerrit配置文件
Gerrit的配置文件/home/gerrit2/gerrit_site_http/etc/gerrit.config。
[gerrit] basePath = git canonicalWebUrl = http://192.168.1.101:8080/ [database] type = H2 database = db/ReviewDB [auth] type = HTTP [sendemail] smtpServer = localhost [container] user = gerrit2 javaHome = /usr/java/jdk1.6.0_41/jre [sshd] listenAddress = *:29418 [httpd] listenUrl = proxy-http://*:8080/ [cache] directory = cache |
5.4. 立刻注册gerrit管理员
在浏览器输入http://192.168.1.101访问gerrit服务器,出现熟悉的HTTP Basic Auth认证,输入刚才htpasswd命令创建的用户名和密码,系统就会自动将该用户注册为gerrit的账户。第一个登陆的用户自动注册为管理员(gerrit账号ID为1000000的账户)。
注意:用htpasswd命令创建HTTP认证时,并没有在gerrit数据库中创建账号信息,当登陆成功后,gerrit会自动创建同名的gerrit用户。
如果在htpasswd命令创建的账号之前,gerrit数据库中已经存在同名的gerrit用户(如:通过直接操作数据库添加的),那么web登录时,不会将htpasswd命令创建的账号和gerrit数据库中同名用户关联起来,而是自动新创建一个gerrit用户与之关联(即一个新的gerrit用户ID),而且会要求你手动输入gerrit用户名。
接下来是在web中完成email、Full Name和SSH Public Key的设置。
5.5. 设置/修改gerrit用户邮箱
我这里介绍三种方法来设置/修改gerrit用户的邮箱地址。
◆gerrit自动发送确认邮件(默认方法);
◆通过gerrit set-account修改(强烈推荐);
◆通过SQL语法修改数据库(建议不要用);
5.5.1. gerrit自动发送确认邮件
跟development_become_any_account认证模式不同,http认证模式下通过web注册(或者更改)gerrit用户的email时,gerrit会自动发送一封确认邮件到你输入的邮箱地址,gerrit安装过程默认使用服务器本机的SMTP发送邮件(即localhost)。
如果你想更改,比如你想把magic_kaoya@163.com作为发件人,通过163邮件发送确认邮件到注册的邮箱地址,可以在如下设置gerrit.config配置文件的[sendemail]字段:
[sendemail] smtpServer = smtp.163.com smtpUser = magic_kaoya@163.com from = magic_kaoya@163.com smtpPass = mima //邮箱的密码 |
这里顺便记录下用我公司的邮箱的设置方法:
[sendemail] smtpServer = smtp.exmail.qq.com smtpServerPort = 465 smtpEncryption = SSL smtpUser = xuzhenping@yaxon.com smtpPass = ******* // 密码 from = xuzhenping@yaxon.com |
5.5.2. 通过gerrit set-account修改
如果你gerrit服务器所在环境发送邮件有困难,那么你可以选择通过管理远程设置/修改gerrit用户的邮箱地址。命令如下,用该方法设置/修改email,方便快捷,而且能够立即生效(这点有别于下面要介绍的第三种方式)。
ssh ha gerrit set-account --add-email user99@163.com user99 |
5.5.3. 通过SQL语法修改数据库
注意:不提倡用该方法来设置/修改用户email,这里列举出来仅仅是为了加强对gerrit数据库的理解。以下分三步来介绍修改过程:
◆第一步:修改表ACCOUNT_EXTERNAL_IDS
$ ssh ha gerrit gsql Welcome to Gerrit Code Review 2.5.2 (H2 1.2.147 (2010-11-21))
Type '\h' for help. Type '\r' to clear the buffer.
gerrit> gerrit> select * from ACCOUNT_EXTERNAL_IDS; ACCOUNT_ID | EMAIL_ADDRESS | PASSWORD | EXTERNAL_ID -----------+---------------+----------+--------------- 1000000 | NULL | NULL | gerrit:admin 1000000 | NULL | NULL | username:admin (2 rows; 2 ms) gerrit> gerrit> insert into ACCOUNT_EXTERNAL_IDS -> values -> ('1000000', 'magic_kaoya@163.com', 'NULL', 'mailto:magic_kaoya@163.com'); UPDATE 1; 1 ms gerrit> gerrit> select * from ACCOUNT_EXTERNAL_IDS; ACCOUNT_ID | EMAIL_ADDRESS | PASSWORD | EXTERNAL_ID -----------+---------------------+----------+--------------------------- 1000000 | NULL | NULL | gerrit:admin 1000000 | NULL | NULL | username:admin 1000000 | magic_kaoya@163.com | NULL | mailto:magic_kaoya@163.com (3 rows; 1 ms) |
到此为止,你退出admin账号重新登陆(HTTP认证模式不支持Sign Out,需要先Sign Out退出账号,关闭浏览器后再登陆才能出现http验证密码的对话框,见5.6章节所述)。在Settings > Contact Information中就会发现我们新加的邮箱地址,如下图5‑3所示。但在Settings > Profile中发现Email Address却是空的(如图5‑4所示)。那这到底算不算设置成功了呢?不急往下走。
图5‑3 Settings > ContactInformation
图5‑4 Settings >Profil
第二步:更新表ACCOUNTS
接下来在另一个表中更新“首选”邮箱:
gerrit> update ACCOUNTS set PREFERRED_EMAIL = 'magic_kaoya@163.com' -> where ACCOUNT_ID = '1000000'; UPDATE 1; 1 ms |
到此为止,你也许会明白一件事了:一个gerrit用户可以同时有多个邮箱地址(体现在数据库表ACCOUNT_EXTERNAL_IDS中),但同一时间内只能由一个邮箱地址有效(体现在数据库表ACCOUNTS中的“PREFERRED_EMAIL”)。
设置完后,用该用户登陆web去看Settings > Profile中发现Email Address还是空的。
第三步:使配置立刻生效
我们前面两步直接操作数据库,虽然已经修改成功,但修改的参数不会立刻生效,有两种方法可以使参数立刻生效:用ssh ha gerrit flush-caches命令,或者重启gerrit服务。显然前者比较方便。
$ ssh ha gerrit flush-caches |
这时候在登陆,如图5‑5所示,就能看到在Settings > Profile中Email Address也是对的了。
图5‑5 配置的email生效了
5.6. 为什么不能Sign Out
也行你会发现用gerrit+HTTP认证,通过web登陆后,点击右上角的Sign Out无法登出。要么是依然保持登陆的状态,要么就是直接出错。
不要以为怎么了,其实这是正常现象,以下这段话是从网上看到的: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.
6. gitweb
Gitweb实际上是用perl写的CGI脚本,一般都是在Apache中使用。在Gerrit中,它也可以直接被调用转换成HTML显示。
我此前有写过一篇关于搭建gitweb服务的文章(http://blog.csdn.net/benkaoya/article/details/8094295),在这篇文章中介绍的是http正向代理,需要设置Apache的配置文件httpd.conf和gitweb配置文件gitweb.conf。
而要在Gerrit中使用gitweb来浏览版本库,并不需要设置上面提到的两个配置文件。可以参考gerrit帮助手册中Gerrit Code Review- Gitweb Integration章节。我简要总结下操作步骤:
◆确保安装git时安装了gitweb;
◆找出gitweb.cgi所在路径(如/var/www/git/gitweb.cgi);
◆修改gerrit配置文件gerrit.config,可以手动输入:
[gitweb] cgi = /var/www/git/gitweb.cgi |
也可以通过命令配置
git config --file $site_path/etc/gerrit.config gitweb.cgi /var/www/git/gitweb.cgi |
◆重启gerrit服务,再通过web登录后,就会发现在Projects中多出gitweb的链接。如下图6‑1所示。
图6‑1 gerrit中的gitweb
7. 疑难问题
◆问:Gerrit+http认证模式下,管理员是否可以通过SSH远程添加新账号(如user99,ID为1000001),然后用该账号通过web登陆gerrit服务器??
◇答:gerrit管理可以通过SSH远程添加新账号user99,如3.2.3章节所示那样添加。添加完后管理员也可以登陆web为user99分配权限。如果配置了SSH公钥,User99也可以通过SSH协议git clone版本库。但是user99不能登陆web,要登陆web必须通过htpasswd来注册账号,如5.3章节所示。
注意:如果在这种情况下你用htpasswd/gerrit.password user99为HTTP认证添加账号,你也没办法跟gerrit数据库中的user99关联起来,你用HTTP账号user99登陆web,会自动产生新的gerrit的ID用户。然后你设定Username为user99会失败,gerrit会提示该用户已存在。
见章节5.4章节有描述该问题。
◆问:Gerrit+http认证模式下,管理员通过SSH远程修改gerrit数据库中的用户邮箱,修改后的邮箱什么时候起效,不重启gerrit服务能起效?
◇答:如果管理员是通过命令ssh ha gerrit gsql对gerrit数据库直接操作,即直接在数据库中修改email,修改的email参数不会立刻生效,你登陆web就能发觉到。为了能是参数立刻生效,有两种方法:1、重启gerrit服务;2、不重启gerrit服务器,通过 ssh ha gerrit flush-caches来使新设置生效。
注意:不建议用gerrit gsql直接操作数据库,可以用如下命令来修改用户(如user99)的邮箱地址,用gerritset-account命令修改邮箱马上就生效,不用重启gerrit服务。
ssh ha gerrit set-account --add-email user99@163.com user99 |
◆问:一个gerrit账号可以有多个email邮箱地址?
◇答:可以,你可以通过ssh ha gerrit set-account命令来为gerrit账号添加n个邮箱地址(体现在数据库表ACCOUNT_EXTERNAL_IDS中)。如下图6‑2所示,但是同一时间内用到的邮箱地址只有一个(体现在数据库表ACCOUNTS中的“PREFERRED_EMAIL”)。
图6‑2 一个gerrit用户可以有n个邮箱地址,但只有一个生效