centos 6.3 + gerrit-2.8.6 + repo 实践

安装环境,基础文件下载

# cat /proc/version
Linux version 2.6.32-279.el6.x86_64 (mockbuild@c6b9.bsys.dev.centos.org) (gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) ) #1 SMP Fri Jun 22 12:19:21 UTC 2012

redhat系linux,查看具体型号

# cat /etc/issue
CentOS release 6.3 (Final)

root 权限下操作

创建专用下载目录

# mkdir -p /home/download

下载要用到的文件:

# wget http://gerrit-releases.storage.googleapis.com/gerrit-2.8.6.war
# wget http://www.java.net/download/jdk7u60/archive/b15/binaries/jdk-7u60-ea-bin-b15-linux-x64-16_apr_2014.tar.gz
# wget http://nginx.org/download/nginx-1.6.0.tar.gz
# chmod 755 nginx-1.6.0.tar.gz
# tar -xzvf nginx-1.6.0.tar.gz
# cd nginx-1.6.0/
# ./configure --prefix=/home/server/nginx-1.6.0 --with-http_realip_module
# cd /home/server/nginx-1.6.0/
# sbin/nginx -t 
nginx: the configuration file /home/server/nginx-1.6.0/conf/nginx.conf syntax is ok
nginx: configuration file /home/server/nginx-1.6.0/conf/nginx.conf test is successful

安装mysql

# yum install mysql-server
# service mysqld start //启动mysql

进入mysql,执行sql

mysql > show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

更改mysql字符集,

# vi /etc/my.cnf 

增加如下配置

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character_set_server = utf8
default-collation= utf8_general_ci

重启mysql

# service mysqld restart

查看字符集

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

创建全新用户,废弃无密码用户:

mysql> grant all privileges on *.* to gerrit@127.0.0.1 identified by 'gerrit';
mysql> use mysql;
mysql> update user set password='abc123' where password='';
mysql> quit

重启让配置生效:

# service mysqld restart

安装git

# yum install git

查看git 配置,将git配置成全局utf-8的字符集

# git config --list
fatal: error processing config file(s)

出错原因是没有配置文件,so,创建配置文件

# touch ~/.gitconfig

对git做如下设置

# git config --global core.quotepath false
# git config --global i18n.logoutputencoding utf8
# git config --global i18n.commitencoding utf8

查看配置

# git config --list
core.quotepath=false
i18n.logoutputencoding=utf8
i18n.commitencoding=utf8

安装gerrit

# mkdir /home/webapp
# java -jar gerrit-2.8.6.war init -d /home/webapp/gerrit-2.8.6

完成,查看配置清单

# cat /home/webapp/gerrit-2.8.6/etc/gerrit.config
[gerrit]
  basePath = /home/repository
  canonicalWebUrl = http://localhost/
[database]
  type = mysql
  hostname = 127.0.0.1
  port = 3306
  database = gerrit_db
  username = gerrit
[auth]
  type = HTTP
[sendemail]
  smtpServer = smtp.[域名].com
  smtpServerPort = 25
  smtpUser = fengxiao
  smtpEncryption = SSL
[container]
  user = root
  javaHome = /usr/java/jdk1.7.0_25/jre
[sshd]
  listenAddress = *:29418
[httpd]
  listenUrl = proxy-http://*:8081/
[cache]
  directory = cache

开启gerrit

# /home/webapp/gerrit-2.8.6/bin/gerrit.sh start

设置反向代理
nginx配置
在conf/nginx.conf 中加入如下一行,将配置放到单独的配置文件中

.......
http{
server {
.......
}
include vhosts/*.com;  #加入这一行

创建文件, conf目录下,

# touch conf/vhosts/test.gerrit.[域名].com 

文件里设置内容如下

# cat conf/vhosts/test.gerrit.[域名].com 
upstream 10.237.39.58 {
  server 10.237.39.58:8081;
}
server{
  listen 80;
  server_name 10.237.39.58;
  charset utf-8;

  location / {
    proxy_pass http://10.237.39.58;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    auth_basic "Restricted";
    auth_basic_user_file vhosts/passwd_file;
  }    
}

添加basic认证
在 目录 /home/server/nginx-1.6.0/conf/vhosts/ 下执行如下操作

# printf "USER_NAME:`openssl passwd -apr1`
" >> passwd_file

将USER_NAME设置成想要的值
我的账户密码是 fengxiao / 123456 。
测试环境暂时不需要,去掉basic认证,最终配置

# cat conf/vhosts/test.gerrit.[域名].com 
upstream 10.237.39.58 {
  server 10.237.39.58:8081;
}
server{
  listen 80;
  server_name 10.237.39.58;
  charset utf-8;
  location /login/ {
    proxy_pass http://10.237.39.58;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    #auth_basic "Restricted";
    #auth_basic_user_file vhosts/passwd_file;
  }
  location / {
    proxy_pass http://10.237.39.58;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
  }
}

至此反向代理配置完成。

gerrit基础配置,数据库和账号ldap问题处理

访问gerrit http://10.237.39.58/ , 首次登陆用户是超级管理员。
添加新的工程,Projects -> Create New Project ,名字填写 mytest
设置项目权限,Projects -> List -> mytest, 然后在菜单栏(与List平级)选择 Access ,点Edit,设置权限如下

Reference:    
  refs/heads/*
Read
  DENY Registered Users
  ALLOW xms
Label Code-Review
  -2 +2 xms
Submit
  ALLOW xms

本地客户端获取远程工程

$ git clone ssh://fengxiao@10.237.39.58:29418/mytest
$ cd mytest 
$ touch abc
$ vi abc //写一些内容
$ git add .
$ git commit -m 'recommit with Change-Id'
$ git log -1
commit c5a1cd9b3d06a98fbd297be104197faab7dc2f20
Author: fengxiao <fengxiao@xiaomi.com>
Date: Thu Jul 17 14:16:10 2014 +0800

disanci

N/A

Signed-off-by: fengxiao <fengxiao@xiaomi.com>

执行push操作,gerrit需要提交到 refs/for/master下

$ git push origin HEAD:refs/for/master

报错,如下: remote: ERROR: missing Change-Id in commit message footer
google了一下,是因为提交到gerrit下,需要有一个change-id作为标示,根据文档进行了如下操作
项目根目录,设置change-Id

$ curl -Lo .git/hooks/commit-msg http://10.237.39.58/tools/hooks/commit-msg
$ chmod u+x .git/hooks/commit-msg

重置之前的提交

$ git reset --soft HEAD^
$ git add .
$ git commit -m 'recommit with Change-Id'

$ git log -1
commit 82e9d5376025cc3542a310081e7e8963618581df
Author: fengxiao <fengxiao@xiaomi.com>
Date: Thu Jul 17 14:31:28 2014 +0800

recommit with Change-Id

N/A

Change-Id: I38ecae805912baf187e25a6028bf1b6183ee6ef7
Signed-off-by: fengxiao <fengxiao@xiaomi.com>

这时已经存在Change-Id了,执行push

$ git push origin HEAD:refs/for/master

发现仍然报错:
[remote rejected] HEAD -> refs/for/master (no new changes)
error: failed to push some refs to 'ssh://fengxiao@10.237.39.58:29418/mytest

到服务器上去查看gerrit日志,

# tail -f /home/webapp/gerrit-2.8.6/logs/error_log

说是roll back 报错(具体报错我忘记记录了,= =),
网上查了一下,说下要把mysql设置成auto_commit = off,然后引擎改成innodb,innodb已经改过,修改mysql配置

# vi /etc/my.cnf ,添加下面一行
[mysqld]
autocommit=0

重启mysql

# service mysqld restart

查看mysql配置

mysql > show variables like '%commit%';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| autocommit | ON |
| innodb_commit_concurrency | 0 |
| innodb_flush_log_at_trx_commit | 1 |
+--------------------------------+-------+

发现失效,很奇怪,继续google,在mysql的buglist里发现了,这是mysql5.1的一个bug,高版本会解决,我是用yum安装,正好是mysql5.1,感觉这样下去很费时间,还是用gerrit自带的数据库吧,改用h2.

# cd /home/download
# java -jar gerrit-2.8.6.war init -d /home/webapp/gerrit-2.8.6
*** Gerrit Code Review 2.8.6
***


*** Git Repositories
***

Location of Git repositories [/home/repository2]:

*** SQL Database
***

Database server type [h2]:

*** User Authentication
***

Authentication method [LDAP/?]: 
LDAP server [ldap://10.237.8.2:389]: 
LDAP username [我的配置]: 
Change CN=Xiaomi Authz AccountReadonly,OU=Other,DC=xiaomi,DC=net's password [y/N]? 
Account BaseDN [我的配置]: 
Group BaseDN [我的配置]:

*** Email Delivery
***

SMTP server hostname [smtp.域名.com]: 
SMTP server port [25]: 
SMTP encryption [NONE/?]: 
SMTP username [fengxiao]: inform
Change inform's password [y/N]? y
inform's password : 
confirm password :

*** Container Process
***

Run as [root]: 
Java runtime [/usr/java/jdk1.7.0_25/jre]: 
Upgrade /home/webapp/gerrit-2.8.6/bin/gerrit.war [Y/n]? Y
Copying gerrit-2.8.6.war to /home/webapp/gerrit-2.8.6/bin/gerrit.war

*** SSH Daemon
***

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

*** HTTP Daemon
***

Behind reverse proxy [Y/n]? Y
Proxy uses SSL (https://) [y/N]? N
Subdirectory on proxy server [/]: 
Listen on address [*]: 
Listen on port [8081]: 
Canonical URL [http://10.237.39.58/]:

*** Plugins
***

Install plugin download-commands version v2.8.6 [y/N]? 
Install plugin reviewnotes version v2.8.6 [y/N]? 
Install plugin replication version v2.8.6 [y/N]? 
Install plugin commit-message-length-validator version v2.8.6 [y/N]?

Initialized /home/webapp/gerrit-2.8.6

配置结束,查看最终配置

# cat /home/webapp/gerrit-2.8.6/etc/gerrit.config
[gerrit]
  basePath = /home/repository2
  canonicalWebUrl = http://10.237.39.58/
[database]
  type = h2
  database = db/ReviewDB
[auth]
  type = LDAP
[ldap]
  server = ldap://10.237.8.2:389
  username = 我的配置
  accountBase = 我的配置
  groupBase = 我的配置
[sendemail]
  smtpServer = smtp.xiaomi.com
  smtpServerPort = 25
  smtpUser = inform
  from = inform@xiaomi.com #注意要单独vi,加上这一行,不然会报错
[container]
  user = root
  javaHome = /usr/java/jdk1.7.0_25/jre
[sshd]
  listenAddress = *:29418
[httpd]
  listenUrl = proxy-http://*:8081/
[cache]
  directory = cache

配置完成。
回到客户端,继续进行提交操作:

$ git push origin HEAD:refs/for/master

成功
访问gerrit https://10.237.39.58
在 My -> Changes 的 Outgoing reviews 已经看到本次提交,点review,review成功。
但是发现一个问题,邮件并未发送,回去gerrit服务器,查看日志

# tail -f /home/webapp/gerrit-2.8.6/logs/error_log

发现如下报错
Mail Error: Server smtp.xiaomi.com rejected message body: 550 5.7.1 Client does not have permissions to send as this sender
google后发现为设置from,于是修改配置,增加from配置

# vi /home/webapp/gerrit-2.8.6/etc/gerrit.config 
[sendemail]
from = inform@xiaomi.com

再次进行commit 和review操作,发现邮件已经发送。至此,server端配置完成。


repo配置
gerrit清单库是用来配合repo使用的。清单库中列出了gerrit服务器上的其他版本库。客户端通过repo脚本下载清单库后,脚本会解析清单库中列出的库并自动下载.

第一步 本地机器配置repo工具用到的仓库

首先将repo版本库克隆至本地并push到gerrit服务器。

$ git clone https://android.googlesource.com/tools/repo

先添加远程仓库

$ git add remote gerrit ssh://fengxiao@10.237.39.58:29418/repo //此时origin 已经占用 android.googlesource.com
$ git push gerrit master

发现报错,可能是远程仓库不允许直接上传?so,先添加一个
在gerrit 处操作,Projects -> Create New Project , 名字命名为repo

第二步 配置manifest配置文件仓库

创建一个空的清单库manifest.git,清单库中只有xml文件。
在清单库中创建default.xml文件,将manifest.git通过push传至gerrit服务器。
过程同上,为了简便,可以先在gerrit上添加manifest仓库,然后pull到本地
本地manifest文件夹下,添加文件 default.xml,内容如下:

<manifest>
  <remote fetch="ssh://10.237.39.58:29418" name="remote_name1" review="10.237.39.58"/>
  <default remote="remote_name1" revision="master" />
  <project name="mytest" path="mytest" >
  </project>
</manifest>

推送到gerrit服务器

$ git add .
$ git commit -m 'configure file add'
$ git push origin master

到服务器上的git仓库目录下查看:

# ls -ls
total 16
4 drwxr-xr-x 7 root root 4096 Jul 17 16:51 All-Projects.git
4 drwxr-xr-x 7 root root 4096 Jul 21 14:46 manifest.git
4 drwxr-xr-x 7 root root 4096 Jul 17 18:01 mytest.git
4 drwxr-xr-x 7 root root 4096 Jul 21 14:41 repo.git

第三步 本地机器安装repo

确认 ~/bin 在你当前的环境变量 PATH 里面.

$ mkdir ~/bin
$ PATH=~/bin:$PATH

从 Google 服务器下载 repo,确保其可执行

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

repo配置完成,下面是使用范例。

切换到一个全新的目录下:

$ repo init -u ssh://fengxiao@10.237.39.58:29418/manifest.git -m default.xml --repo-url=ssh://fengxiao@10.237.39.58:29418/repo.git --repo-branch=master --no-repo-verify

fengxiao 这块换成自己的邮箱名,例如,anshanshan

$ repo init -u ssh://anshanshan@10.237.39.58:29418/manifest.git -m default.xml --repo-url=ssh://anshanshan@10.237.39.58:29418/repo.git --repo-branch=master --no-repo-verify

如果报reject,是因为未注册,也未加入ssh的pub key,获取pub key内容

$ cat ~/.ssh/id_rsa.pub

访问 http://10.237.39.58,输入公司邮箱的用户名密码登陆,之后右上角,点setting -> SSH Public Keys 添加公钥。回来继续执行上面的repo init

会有下面的问答,确保是自己的账号/邮箱

$ repo init -u ssh://fengxiao@10.237.39.58:29418/manifest.git -m default.xml --repo-url=ssh://fengxiao@10.237.39.58:29418/repo.git --repo-branch=master --no-repo-verify

Your Name [fengxiao]: 
Your Email [fengxiao@xiaomi.com]:

Your identity is: fengxiao <fengxiao@xiaomi.com>
is this correct [y/n]? y

查看本地目录发现有个.repo 文件夹

$ repo sync

发现 mytest项目已经下载下来。

$ cd mytest
$ repo start dev . // . 不能丢,表示当前工程
$ vi myfile //随便写一些
$ git add .
$ git commit -m 'comment message'
$ repo upload

注意,这里会自动提交到远程的master分支,这是在 .repo/manifest.xml里配置的
<default remote="remote_name1" revision="master" />
访问,http://10.237.39.58, 在 My -> Changes -> Outgoing reviews 已经可以看到本次提交。

原文地址:https://www.cnblogs.com/seanvon/p/3859196.html