centos 6.3 + gerrit-2.8.6 + repo 實踐

安裝環境,基礎文件下載java

# 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,查看具體型號mysql

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

root 權限下操做linux

建立專用下載目錄android

# mkdir -p /home/download

下載要用到的文件:nginx

# 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

 

安裝mysqlgit

# yum install mysql-server
# service mysqld start //啓動mysql

進入mysql,執行sqlweb

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字符集,sql

# vi /etc/my.cnf 

增長以下配置數據庫

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

重啓mysqlcentos

# 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`\n" >> 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 已經能夠看到本次提交。

相關文章
相關標籤/搜索