gerrit使用总结

Posted on Posted in 介绍及安装说明, 使用说明

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章节所示那样添加。添加完后管理员也可以登陆webuser99分配权限。如果配置了SSH公钥,User99也可以通过SSH协议git clone版本库。但是user99不能登陆web,要登陆web必须通过htpasswd来注册账号,如5.3章节所示。

         注意:如果在这种情况下你用htpasswd/gerrit.password user99HTTP认证添加账号,你也没办法跟gerrit数据库中的user99关联起来,你用HTTP账号user99登陆web,会自动产生新的gerritID用户。然后你设定Usernameuser99会失败,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个邮箱地址,但只有一个生效

顶6踩0

猜你在找【直播】机器学习&数据挖掘7周实训–韦玮【套餐】系统集成项目管理工程师顺利通关–徐朋【直播】3小时掌握Docker最佳实战-徐西宁【套餐】机器学习系列套餐(算法+实战)–唐宇迪【直播】计算机视觉原理及实战–屈教授【套餐】微信订阅号+服务号Java版 v2.0–翟东平【直播】机器学习之矩阵–黄博士【套餐】微信订阅号+服务号Java版 v2.0–翟东平【直播】机器学习之凸优化–马博士【套餐】Javascript 设计模式实战–曾亮

查看评论
16楼 rave 2017-07-05 14:56发表 [回复]博主你好, 整片谢谢分享帮了大忙, 但是在Apache配置的地方,新版本的apache2配置文件里面没有httpd.conf 所以不知道怎么配置, 小白求赐教Re: 许振坪 2017-07-05 15:45发表 [回复]回复rave:抱歉,很久没玩这个,有点忘了,现在我也回答不上 O(∩_∩)O15楼 tumujisuanji 2016-04-23 22:38发表 [回复]楼主你好。你这篇文章是网上说的最详细最系统的教程了,受益匪浅。我有一个问题,请问一下在http反向代理的模式下,我通过htpasswd命令创建了用户,这个用户之后能自己更改密码吗?14楼 anis78 2016-03-23 11:01发表 [回复]多谢楼主,想问下,在搭建好服务器后,对于普通用户如何使用gerrit进行代码review和记录发现的问题呢?
不知有没相关文档?13楼 whustorm1989 2015-12-31 14:26发表 [回复]请教一下,管理员如何给每个用户分配权限呢?在linux里怎么切换,用不同的gerrit用户来取代码12楼 zr0621 2015-10-30 14:47发表 [回复]我也搭建了一个gerrit服务器
http://hubcent.com/?p=4011楼 lhxzgw 2015-09-07 16:06发表 [回复]请问,为什么我提交代码后,看不到changes呢?怎样限制必须有change-id才能提交呢?10楼 lhxzgw 2015-09-07 16:04发表 [回复]请问下,为什么我提交代码后,看不到changes呢?9楼 lzfhot2008 2015-07-15 19:02发表 [回复]楼主,你好:
请教个问题,有什么方法实现git锁流后让代码无法提交到gerrit上面。非常感谢。
有供养需求的同学 可以加我QQ : 116986688楼 lzfhot2008 2015-07-15 19:02发表 [回复]楼主,你好:
请教个问题,有什么方法实现git锁流后让代码无法提交到gerrit上面。非常感谢。
有供养需求的同学 可以加我QQ : 116986687楼 瓦力668 2014-10-10 09:31发表 [回复]谢谢楼主6楼 gerenvip 2014-07-30 21:17发表 [回复]楼主您好,目前我有一个管理员用户,gerrit采用的是http认证模式,请问如何添加其他用户啊?我通过操作gsql数据库,create了一个用户,但是登录不进去5楼 RowRain2013 2014-03-20 11:11发表 [回复]博主你好,最近我在用git tortoisegit apache gerrit ,我在push的时候一直报错,错误如下:
git.exe push –progress “origin” master:master

Counting objects: 8, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 601 bytes | 0 bytes/s, done.
Total 6 (delta 0), reused 0 (delta 0)
remote: Processing changes: refs: 2, done 
To ssh://abc@10.1.37.22:29418/WebProject02.git
! [remote rejected] master -> master (you are not allowed to upload merges)
error: failed to push some refs to ‘ssh://abc@10.1.37.22:29418/WebProject02.git’

git did not exit cleanly (exit code 1) (360 ms @ 2014-3-20 AM9:43:15)

请问这是怎么回事,好几天了,我都没解决了,能否指教一下,谢谢你4楼 dylzxc 2013-09-04 16:43发表 [回复]你好,我的gerrit搭建完成之后选择权限的下拉框是灰色的,不能操作
<IMG src=”file:///C:\Documents and Settings\Administrator\feiq\RichOle\3289445270.bmp”>
想请教该问题3楼 lanterzhow 2013-09-02 16:31发表 [回复]博主,你好。
请问,我的http验证登录,一直登不进去。我已经配置了htpasswd ./review_site/etc/passwords admin,并且将该路径加入到了httpd.conf的“AuthUserFile /home/gerrit/review_site/etc/passwords”。还有什么地儿配置的不对,或者权限出了什么问题吗?Re: dylzxc 2013-09-04 17:47发表 [回复]回复lanterzhow:你最好查看下gerrit服务器上apache的log,error.log 里面可能会给你写提示到底哪里出错了。2楼 甜菜兔子 2013-08-02 10:15发表 [回复]博主你好 请教个问题 commit-msg 我是要 scp 到本地项目的 .git/hooks/ 下吗?
sunqf@kooxoo100:~/test$ git push origin HEAD:refs/for/master 
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (1/1), done.
Writing objects: 100% (2/2), 215 bytes, done.
Total 2 (delta 0), reused 0 (delta 0)
remote: Processing changes: refs: 1, done 
remote: ERROR: missing Change-Id in commit message footer
remote: Suggestion for commit message:
remote: test1
remote: 
remote: Change-Id: I1b08f75f38d3a48d5872288ca8e42a0b00b61f52
remote: 
remote: Hint: To automatically insert Change-Id, install the hook:
remote: scp -p -P 29418 sunqf@kooxoo1-234.kuxun.cn:hooks/commit-msg .git/hooks/
remote: 
remote: 
To ssh://192.168.1.234:29418/test.git
! [remote rejected] HEAD -> refs/for/master (missing Change-Id in commit message footer)

我push 的时候发生了 如上的错误 请问可能是我哪个地方的问题?Re: 董武明 2013-09-26 19:03发表 [回复]回复甜菜兔子:执行下scp -p -P 29418 sunqf@kooxoo1-234.kuxun.cn:hooks/commit-msg .git/hooks/就好了,你的.git/hooks/下面 没有commit-msgRe: libaochun_10 2013-11-16 13:22发表 [回复]楼主你好,我push的时候也遇到了这个问题:
Counting objects: 145, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (42/42), done.
Writing objects: 100% (42/42), 5.14 KiB, done.
Total 42 (delta 29), reused 1 (delta 0)
remote: Resolving deltas: 100% (29/29)
remote: Processing changes: refs: 1, done 
remote: ERROR: missing Change-Id in commit message footer
remote: Suggestion for commit message:
remote: test
remote: 
remote: Change-Id: I0a0e81697919b654f9f6f709fa865566474761df
remote: 
remote: Hint: To automatically insert Change-Id, install the hook:
remote: scp -p -P 29418 libaochun@192.168.180.185:hooks/commit-msg .git/hooks/
To ssh://192.168.180.185:29418/qct/device/qcom/common.git
! [remote rejected] HEAD -> refs/for/test (missing Change-Id in commit message footer)
error: failed to push some refs to ‘ssh://192.168.180.185:29418/qct/device/qcom/common.git’
我检查.git/hooks/下面 已有commit-msg,并且再次执行scp -p -P 29418 libaochun@192.168.180.185:hooks/commit-msg .git/hooks/也没用,这是什么情况?1楼 lanbo_g 2013-05-13 19:36发表 [回复] [引用] [举报]博主,你好
请教一下,其中反向代理处设的是端口<VirtualHost *:80>
,但我想还设成原来的8080端口<VirtualHost *:8080>,但一直未能成功,能否指教一下。Re: TokyoSai 2013-05-15 11:16发表 [回复] [引用] [举报]回复lanbo_g:我配置的就是没用80端口,你要用8080端口首先你要确认你的8080端口是否被占用,如果没有被占用,那你要确认你的8080端口是否已经加入到apache的监听?