Gerrit+apache+H2数据库简单安装配置及建库流程

时间:2022-04-06 20:30:44
Gerrit 是一个基于 Web 的代码评审和项目管理的工具,面向基于 Git 版本控制系统的项目。因此需要Apache、Mysql、GIT等相关软件的支持
系统配置:
新装的UBANTU LINUX系统请先更新自己的系统软件包
$sudo apt-get dist-upgrade
$sudo adduser project
以新用户身份操作
$sudo su - project
$sudo apt-get install  git-core apache2.2-bin apache2.2-common apache2-utils apache2-mpm-worker

安装Gerrit

1.创建一个以项目名称命名的新用户,以project为例(如以创建可省)
$sudo adduser project

以新用户身份操作

$sudo su - project
2.创建安装目录,以项目名命令。(建议直接拷贝使用其它项目的gerrit安装目录)
$mkdir -p review_site_project
3.下载gerrit
 http://code.google.com/p/gerrit/downloads/list?can=1&q=&colspec=Filename+Summary+Uploaded+ReleaseDate+Size+DownloadCount
4.安装并配置初始化gerrit
 java -jar gerrit-2.6.1.war init -d review_site_project/
 
Create '/home/gerrit2/review-site' [Y/n]?

*** Git Repositories
*** Location of Git repositories [git]: *** SQL Database
*** Database server type [H2/?]: //改成MYSQL或者使用H2 *** User Authentication
*** Authentication method [OPENID/?]: HTTP //注意这个不要按回车跳过去了,否则不是HTTP认证,是需要用google的OPENID
Get username from custom HTTP header [y/N]? :
SSO logout URL : *** Email Delivery
*** SMTP server hostname [localhost]: smtp.company.com //自己改成自己的邮箱smtp
SMTP server port [(default)]:
SMTP encryption [NONE/?]:
SMTP username [?]: yourname@company.com //自己改成自己的邮箱
yourname@xxxxx.com's password :
confirm password : *** Container Process
*** Run as [project]:
Java runtime [/usr/lib/jvm/java-6-sun-1.6.0.24/jre]:
Copy gerrit.war to /home/gerrit2/review-site/bin/gerrit.war [Y/n]?
Copying gerrit.war to /home/gerrit2/review-site/bin/gerrit.war *** SSH Daemon
*** Listen on address [*]:
Listen on port [29418]: //如果同一个用户下建多个gerrit,请不用都公用29418这个端口号 如39418 49418 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
//使用反向代理的话必须选择y来配置,默认是N
Proxy uses SSL (https://)      [y/N]? n
Subdirectory on proxy server   [/]: /project/     //可以选择直接跳过,那样你的gerrit最后的URL是http://192.168.11.73:80
Listen on address              [*]: 
Listen on port                 [8081]:          //切记,此端口号一定不要和apache2占用相同的端口号,多个gerrit可以8082 8083 8084                                                			//否则就会Starting Gerrit Code Review:Failed
Canonical URL                  [http://*/]:http://192.168.11.73/project/    //上一步Subdirectory on proxy server 跳过不填则是http://192.168.11.73:80  (80为你将要在apache 给gerrit设置的端口)
Initialized /home/gerrit2/review-siteExecuting 
/home/gerrit2/review-site/bin/gerrit.sh start
Starting Gerrit Code Review: OK
=========================================QA=======================================================================================
Q:Configuration ErrorCheck the HTTP server's authentication settings.The HTTP server did not provide the username in the Authorizationheader when it forwarded the request to Gerrit Code Review.If the HTTP server is Apache HTTPd, check the proxy configurationincludes an authorization directive with the proper location, ensuringit ends with '/':
In error_log:ERROR com.google.gerrit.httpd.auth.container.HttpLoginServlet : Unableto authenticate user by Authorization request header.  Check containeror server configuration.
A:You cannot run these on the same port. Your Apache NameVirtualHostshould be on a different port than the internal Jetty web sever thatGerrit is using.
即gerrit和apache2占用相同的端口号
例如:

cat review_site_project/etc/gerrit.config:

[httpd]       listenUrl = http://x.x.x.x:8081/

cat /etc/apache2/apache2.conf :

NameVirtualHost x.x.x.x:8081

<VirtualHost x.x.x.x:8081>

apache2和gerrit都使用了8081,肯定有一个启动不来的,一般是gerrit

5.按下面内容修改review_site_project/etc/gerrit.conf 及GERRIT的配置文件
[gerrit]
basePath = git //指定被gerrit管理的所有git库存放位置,即review_site_project/git/
canonicalWebUrl = http://192.168.11.73/project/ //指定web访问gerrit的网址//填自己的ip和端口号,勿完全抄
[database]
type = H2 //指定gerrit所默认数据库类型,可以选用mysql
database = db/ReviewDB
[auth]
type = HTTP //指定浏览器登录gerrit时的认证方式
[sendemail]
        smtpServer = smtp.company.com //指定smtp服务器地址       
smtpUser = yourname@company.com [container]
user = project //指定gerrit所在机器的用户身份与上文创建的用户对应一致
javaHome = /usr/lib/jvm/java-6-sun-1.6.0.24/jre //系统本身自带
[sshd]
listenAddress = *:29418 //指定sshd服务监听的端口号
[httpd]
listenUrl = proxy-http://127.0.0.1:8081/project/ //指定http代理地址
[cache]
directory = cache //缓存位置

配置Apache

$sudo apt-get install  apache2.2-bin apache2.2-common apache2-utils apache2-mpm-worker

1.创建编辑apache配置文件,添加如下内容(下面以Ubuntu系统为例请注意不同操作系统apache配置文件的区别)也可配置 apache2.conf httpd.conf,我们这里配置的是/etc/apache2/sites-available/gerrit

$sudo vi /etc/apache2/sites-available/defalt   

    NameVirtualHost   192.168.11.73:80  //填自己的ip和端口号,勿完全抄
<VirtualHost 192.168.11.73:80> //填自己的ip和端口号,勿完全抄
    ServerName 192.168.11.73     ProxyRequests Off
    ProxyVia Off
    ProxyPreserveHost On     <Proxy *>
          Order deny,allow
          Allow from all
    </Proxy>     <Location "/project/login/">
      AuthType Basic
      AuthName "Gerrit Code Review"
      Require valid-user
      AuthUserFile /etc/apache2/passwords //指定http登录认证的的paassword文件所在位置,放哪都行,根据后来
//sudo htpasswd -cb  /etc/apache2/passwords scm scm
    </Location>     AllowEncodedSlashes On
    RedirectMatch  ^/project$                /project/
    ProxyPass /project/ http://127.0.0.1:8081/project/
    ProxyPassReverse /project/ http://127.0.0.1:8081/project/
</VirtualHost>
保存退出
$cd /etc/apache2/sites-enabled/
$sudo ln ../sites-available/gerrit .
2.创建passwd文件,添加gerrit登录用户,-c参数为创建,仅限第一次添加用户时使用
$sudo htpasswd -cb  /etc/apache2/passwords scm scm
第二次添加其他用户时,不要加-c了:
$sudo htpasswd -b  /etc/apache2/passwords test test
3继续配置apache2
$sudo vi /etc/apache2/http.conf //在文件中加入以下内容
ServerName localhost

$cd /etc/apache2/mods-enabled
$sudo ln -s /etc/apache2/mods-available/proxy.conf proxy.conf
$sudo ln -s /etc/apache2/mods-available/proxy.load proxy.load
$sudo ln -s /etc/apache2/mods-available/proxy_http.load proxy_http.load
配置apache2的监听端口:
/etc/apache2$sudo vi ports.conf
NameVirtualHost *:80
Listen 80
Listen 8080 //不要给gerrit!
Listen 8000 //不要给gerrit!
添加apache2的tcp端口号,切记不要把gerrit的,即
Listen on port                 [8081]: 不要输入上面配置给apache2的端口号,切记!!!
可以用sudo netstat -lnp | grep 80 查看相关80的所有端口使用情况
否则gerrit 起不来的
搭建多个gerrit 时Listen on port [8081]:可以用8082 8083 8084 等

Apache2 配置安装 FQA:

Q:启动apache报错

Syntax error on line 300 of /etc/apache2/apache2.conf:Invalid command 'ProxyPass', perhaps misspelled or defined by a module not included in the server configuration   ...fail!
A:配置了反向代理,但是没有打开module,执行下面操作
cd /etc/apache2/mods-enabled
ln -s /etc/apache2/mods-available/proxy.conf proxy.conf
ln -s /etc/apache2/mods-available/proxy.load proxy.load
 ln -s /etc/apache2/mods-available/proxy_http.load proxy_http.load
Q:启动Apache报错
No apache MPM package installed
A:安装apache2-mpm-worker软件包
$sudo apt-get install apache2-mpm-worker
Q:启动Apache报错
 apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
A:修改/etc/apache2/http.conf文件,在文件中加入以下内容
ServerName localhost
Q:(13)Permission denied: make_sock: could not bind to address 0.0.0.0:80

A:需要用ROOT用户执行   直接 sudo  /etc/init.d/apache2 restart  就OK了  

启动服务

1.启动apache
sudo /etc/init.d/apache2 restart
2.启动gerrit服务
$review_site_project/bin/gerrit.sh start

登录gerrit

在浏览器地址栏中输入

192.168.11.73/project/    

注:Subdirectory on proxy server [/]:选择直接跳过  则192.168.11.73:80

在显示的登录框中输入用户名/密码,

即之前配置passwords

$sudo htpasswd -cb  /etc/apache2/passwords scm scm

scm

scm

Note: 请注意第一个登入的用户,Gerrit会自动将其定义为管理员

Gerrit 配置及建库流程

建库及Gerrit配置操作命令

1.创建只用于权限管理的库,可以使用如下命令(请注意端口号以实际为准)
ssh -p 29418 scm@192.168.11.73 gerrit create-project -p All-Projects -n project --empty-commit --permissions-only
2.创建代码库,以manifest为例命令如下:
ssh -p 29418 scm@192.168.11.73 gerrit create-project -p project -n project/manifest --empty-commit
批量建库,可以通过整理库列表,使用如下脚本来完成
for i in `cat project-list`;do ssh -p 29418 scm@192.168.11.73 gerrit create-project -p project -n project/$i --empty-commit;done

修改gerrit Group组命令:ssh -p 29418 192.168.11.73 gerrit rename-group Anonymous\' \'Users Verifier

详细gerrit命令见:ssh -p 29418 192.168.11.73 gerrit --help

直接使用GIT命令推送代码命令:git push origin HEAD:refs/for/master

3. gerrit管理员之命令行服务端直接操作数据库(h2)的配置,删除无用的Group、提交 等等
  优点:不需要认证,尤其是在管理员账号尚未建立之前就可以查看和更改数据库
  缺点:先登录到服务器,而且操作数据库时还需要先停止服务

3.1 进入gerrit超级管理员模式
gerrit2@ubuntu:~/review_site$ ./bin/gerrit.sh stop
Stopping Gerrit Code Review: OK
gerrit2@ubuntu:~/review_site$ ls bin
gerrit.sh  gerrit.war
gerrit2@ubuntu:~/review_site$ java -jar bin/gerrit.war gsql
[2013-05-01 01:05:57,003] INFO  com.google.gerrit.server.git.LocalDiskRepositoryManager : Defaulting core.streamFileThreshold to 220m
Welcome to Gerrit Code Review 2.6-rc1
(H2 1.3.168 (2012-07-13))

Type '\h' for help.  Type '\r' to clear the buffer.

gerrit> \h
General
  \q        quit

Query Buffer
  \g        execute the query buffer
  \p        display the current buffer
  \r        clear the query buffer

Informational
  \d        list all tables
  \d NAME   describe table
gerrit> \d
                     List of relations
 TABLE_SCHEM | TABLE_NAME                           | TABLE_TYPE
 ------------+--------------------------------------+-----------
 PUBLIC      | ACCOUNTS                             | TABLE
 PUBLIC      | ACCOUNT_DIFF_PREFERENCES             | TABLE
 PUBLIC      | ACCOUNT_EXTERNAL_IDS                 | TABLE
 PUBLIC      | ACCOUNT_GROUPS                       | TABLE
 PUBLIC      | ACCOUNT_GROUP_INCLUDES_BY_UUID       | TABLE
 PUBLIC      | ACCOUNT_GROUP_INCLUDES_BY_UUID_AUDIT | TABLE
 PUBLIC      | ACCOUNT_GROUP_MEMBERS                | TABLE
 PUBLIC      | ACCOUNT_GROUP_MEMBERS_AUDIT          | TABLE
 PUBLIC      | ACCOUNT_GROUP_NAMES                  | TABLE
 PUBLIC      | ACCOUNT_PATCH_REVIEWS                | TABLE
 PUBLIC      | ACCOUNT_PROJECT_WATCHES              | TABLE
 PUBLIC      | ACCOUNT_SSH_KEYS                     | TABLE
 PUBLIC      | CHANGES                              | TABLE
 PUBLIC      | CHANGE_MESSAGES                      | TABLE
 PUBLIC      | PATCH_COMMENTS                       | TABLE
 PUBLIC      | PATCH_SETS                           | TABLE
 PUBLIC      | PATCH_SET_ANCESTORS                  | TABLE
 PUBLIC      | PATCH_SET_APPROVALS                  | TABLE
 PUBLIC      | SCHEMA_VERSION                       | TABLE
 PUBLIC      | STARRED_CHANGES                      | TABLE
 PUBLIC      | SUBMODULE_SUBSCRIPTIONS              | TABLE
 PUBLIC      | SYSTEM_CONFIG                        | TABLE
 PUBLIC      | TRACKING_IDS                         | TABLE

重新配置Group,删除原有不需要的Group(如匿名),使新创建的Group都可以添加删除用户,
gerrit>  delete from ACCOUNT_GROUPS  where NAME = 'Anonymous Users';

设置权限

1.Gerrit管理员权限

由于Gerrit管理员要完成代码推送、创建TAG,且可能涉及到多套库的操作,编辑“All-Projects”中的“Access”, 

2.project项目用户权限

project项目用户对代码库的权限设置,请在"project"的“Access”中完成,如图所示:

3.操作方法:
  1. 选择“All-Projects”中的“Access”,点击“”按钮;
  2. 点击“Add Reference”,填写正确的“Reference”,如果"refs/heads/*",具体的某个分支“refs/heads/dev”;
  3. 选择“Add Permissioned...”列表中的权限,如“Read”;
  4. 填写“Group Name”,如“project_read”,点击“Add”按钮;
  5. 设置权限的分值,“ALLOW” “DENY” “+1” “-2”等;
  6. 设置完成后,点击“”按钮

Note: 

代码需要经过Gerrit review之后才可以入库,因此push权限的“

Reference

”应该填写“refs/for/refs/heads/*”

推送代码

在已经有的代码库中,执行
 repo forall -c 'git remote add ts ssh://scm@192.168.11.73:29418/$REPO_PROJECT'
repo forall -c 'git push ts HEAD:refs/heads/project-dev'

配置manifest

1.下载manifest库
git clone ssh://192.168.11.73:29418/project/manifest.git
默认下载的是master分支,且只有一个空提交
2.生成default.xml

请注意更改default.xml中如下两行:

<remote fetch=".." name="origin" review="192.168.11.73/project" />
<default remote="origin" revision="project-dev" />

Note: review的内容为Gerrit地址,revision的内容务必与实际代码库中的分支保持一致

3.推送manifest分支
git add default.xml
git commit -m "init manifest"
git push origin master:project-dev

Note: 此处“project-dev”分支是manifest分支,与实际代码库中的分支可以相同也可以不同

添加Gerrit用户

执行如下命令

htpasswd -b passwords <username> <password>

添加用户权限

新用户首次登录后,才可以给其添加权限。

Gerrit身份权限说明
Project_admin 该项目管理员,可以为用户添加Gerrit身份;
Project_read 拥有gerrit用户名密码,设置了全名和邮箱的用户;拥有下载代码,提交代码,Code Review +1 的权限;
Project_super_review 负责查看该项目代码Review,拥有Code Review +2 的权限;
Project_verify 负责该项目编译验证代码,拥有Verified +1 的权限
Project_submit 当该次提交代码Code Review +2 并且Verified +1后,负责将代码Merge到代码库中

下载代码测试

repo init -u ssh://<gerrit user>@192.168.11.73:29418/project/manifest -b project-dev

Note: 建议使用普通Gerrit帐户下载测试

Gerrit Review代码

Gerrit上代码提交的三种状态

代码提交至Gerrit之后,有三种状态,分别是:Open、Merged、Abandoned。

Open

 状态的代码需要经过Review,Verify,Submit操作后才会真正入库,即成为Merged状态

Merged

 状态的代码已经入库,不能再Abandoned,只能Revert.

Open

 状态的代码由于各种原因不能入库的可以放弃,即Abandoned状态。

Abandoned

 状态的代码不能再入库,如有需要,可以“Restore”。

Gerrit上代码提交的详细信息

代码提交之后,登录Gerrit,可以看到此次提交已经显示在列表中,如下图

  • 绿箭头所指是目前查看的代码状态,即Open状态的列表。
  • 列表显示的信息依次是
ID Subject Owner Project Branch Updated CR V
ChangeId 提交信息的第一行 提交人 库名 分支名 最后变更的时间 Review的状态 Verify的状态
  • CR 的状态有四种,分别为 ✘ (-2),-1,+1,√ (+2)
其中-1并不影响入库,但-2则需要重新提交新的Patch Set,或者设置-2的成员批准才能入库。
  • V 的状态有两种,分别是 ✘ (-1),√ (+1)
其中-1的状态不能入库,需要重新编译验证(Verify)通过才可以入库。

点击列表中的“ID”或“Subject”,则可以显示该提交更详细的信息。下图的放大效果中显示了该提交当前的状态。

  • Rerviewer Jenkins成员给该提交 -1 ,这是Jenkins系统的自动任务,在这里用于检查提交信息(git log)的格式;
  • Need Verified 表示该提交还没有进行编译验证;
  • Need Code-Review 表示该提交还没有进行代码Review,请注意,这里指Review +2

Note: Review +2表示更高一级的Review权限,即需要有此权限的成员Review代码后判断是否允许代码入库。两个Review +1并不能获得同等的效果

下图显示了提交详细信息中的下半部分,主要有每次提交的Patch Set详情,该提交修改的文件列表,以及每次Review的说明信息。

  • 两个Patch Set表示该提交在入库前又做过一次修改:代码入库前允许有多次修改,包括对git log的改动;
  • 点击修改文件列表中显示的文件(红色横线标识),显示该文件修改前后的对比,如图中绿色箭头所指(实际效果为在新的页面中展示);
  • 文件修改的对比版本可以*选择是与Base或是与某一个Patch Set作对比,请注意图中“Old Version History”(浅紫色框)下拉菜单的选择;
  • Comments信息是Review代码时填写的信息。

代码的Review

点击Review按钮(上图红圈标识),可以对当前提交做Review的操作,如下图:

  • 不同权限,可以看到左右不同的页面,选择相应Review的分数即可;
  • 信息框中可以填写此次Review的更详细的信息,并点击“Publish”按钮。

代码的Verify

一般情况下,代码都是通过Jenkins的

Verify 任务

完成编译验证并自动打分。有Verify权限的成员,可以在确认代码编译验证通过之后,手动打分(极不推荐),选择Verfiy的分数,填写信息,并点击“Publish”按钮。如下图:

代码的Submit

代码经过Review +2和Verify +1之后才可以Submit入库;Review和Verify的顺序没有要求。

如图,可以看到两个按钮“Publish Comments”和“Publish and Submit”

  • 点击“Publish Comments”只进行Review或Verify的打分;
  • 点击“Publish and Submit”在Review或Verify的打分同时直接Submit。

如果只选择了给Review或Verify打分,也可以进行Submit,如下图,点击“Submit”按钮

至此,该提交Review完成,正式提交入库,状态变为“Merged”