gerrit 各種問題

http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105680224203c5743ca08d572888d20ec03502564711befb723f6659828223305de91a1ab1ad6a6f665e7ce3c09d9f4aabeec5686fd36123706bdc074d8d0dea960673ce75c71aa9f45ff0ba8173c8fb8ec4df250e8d15&p=9c60c64ad48111a05decc5224840&newp=833bde15d9c640f10dbe9b7c454292694c05d67c6b8bcf5428b9974b92700d1a2a22b4fb66794d58dcc17d6000a54b5feff33172300926bc99c28249c9fdff6978ca28632c4ad814&user=baidu&fm=sc&query=gerrit+sign+out&qid=91be66bd000523e3&p1=4


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

Javaversion "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 ([email protected]).

  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://[email protected]: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    | [email protected] | NULL     | mailto:[email protected]

 1000001    | NULL                | NULL     | gerrit:user1

 1000001    | NULL                | NULL     | username:user1

 1000001    | [email protected]       | NULL     | mailto:[email protected]

 1000002    | NULL                | NULL     | username:user99

 1000002    | [email protected]      | NULL     | mailto:[email protected]

 1000003    | NULL                | NULL     | username:user98

 1000003    | [email protected]      | NULL     | mailto:[email protected]

 1000003    | NULL                | NULL     | gerrit:user98

 1000004    | NULL                | 1234     | username:user97

 1000004    | [email protected]      | NULL     | mailto:[email protected]

 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,全名爲“張三” ,郵箱爲[email protected]的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 [email protected] --full-name張三 --ssh-key -<it create-account --email [email protected] --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    | [email protected] | NULL     | mailto:[email protected]

 1000001    | NULL                | NULL     | username:user1

 1000001    | [email protected]       | NULL     | mailto:[email protected]

(5 rows; 2 ms)

gerrit>

gerrit> select FULL_NAME, PREFERRED_EMAIL, ACCOUNT_ID from ACCOUNTS;

 FULL_NAME | PREFERRED_EMAIL     | ACCOUNT_ID

 ----------+---------------------+-----------

 NULL      | [email protected]  | 1000000

 張三       | [email protected]       | 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)。

如果你想更改,比如你想把[email protected]作爲發件人,通過163郵件發送確認郵件到註冊的郵箱地址,可以在如下設置gerrit.config配置文件的[sendemail]字段:

[sendemail]

smtpServer = smtp.163.com

smtpUser = [email protected]

from = [email protected]

smtpPass = mima  //郵箱的密碼

         這裏順便記錄下用我公司的郵箱的設置方法:

[sendemail]

         smtpServer = smtp.exmail.qq.com

    smtpServerPort = 465

    smtpEncryption = SSL

         smtpUser = [email protected]

         smtpPass = ******* // 密碼

         from = [email protected]

5.5.2. 通過gerrit set-account修改

如果你gerrit服務器所在環境發送郵件有困難,那麼你可以選擇通過管理遠程設置/修改gerrit用戶的郵箱地址。命令如下,用該方法設置/修改email,方便快捷,而且能夠立即生效(這點有別於下面要介紹的第三種方式)。

ssh ha gerrit set-account --add-email [email protected] 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', '[email protected]', 'NULL', 'mailto:[email protected]');

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    | [email protected] | NULL     | mailto:[email protected]

(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 = '[email protected]'

     -> 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 [email protected] user99

 

◆問:一個gerrit賬號可以有多個email郵箱地址?

◇答:可以,你可以通過ssh ha gerrit set-account命令來爲gerrit賬號添加n個郵箱地址(體現在數據庫表ACCOUNT_EXTERNAL_IDS中)。如下圖6‑2所示,但是同一時間內用到的郵箱地址只有一個(體現在數據庫表ACCOUNTS中的“PREFERRED_EMAIL”)。

6‑2 一個gerrit用戶可以有n個郵箱地址,但只有一個生效



http://blog.csdn.net/benkaoya/article/details/8680886

http://blog.sina.com.cn/s/blog_4b5039210102e5mw.html

http://blog.csdn.net/nadyhuayue/article/details/8292117

http://www.05935.com/bc/362308/

http://openwares.net/linux/gerrit_privilege_setup.html

http://www.cnblogs.com/evakang/p/5752924.html

http://www.jianshu.com/p/b77fd16894b6


如何部署全局git commit-msg hook,不用每個倉克隆了再去一次次拷貝?

問題:

Git和gerrit對接,git commit的時候都提示“missing Change-Id in commit message footer”。知道是因爲change-id搞的鬼,也知道從gerrit上或者其他地方拷個commit-msg腳本兒,放到.git/hooks目錄下就完事兒了。但是,每次重新克隆時,就有得再來一遍拷貝動作,很低效。

注:

單倉拷貝,不用repo。

方法:

部署本地全局Hook即可:

  1. $mkdir -p ~/.git_template/hooks  
  1. $cp commit-msg ~/.git_template/hooks  
  1. $git config --global init.templatedir ~/.git_template  

參考:
http://git-scm.com/docs/git-config.htmlhttps://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration


http://blog.csdn.net/edhroyal/article/details/9039501

http://blog.csdn.net/edhroyal/article/details/9187727

http://blog.csdn.net/zwwjs/article/details/8736314

http://blog.csdn.net/xbl1986/article/details/18706467

http://blog.csdn.net/sayangnala/article/details/52796919

關於Gerrit的郵件設置問題

  1. [gerrit]  
  2.     basePath = git  
  3.     canonicalWebUrl = http://127.0.0.1:8090/  
  4. [database]  
  5.     type = mysql  
  6.     hostname = localhost  
  7.     database = gerritdb  
  8.     username = gerrituser  
  9. [auth]  
  10.     type = HTTP  
  11. [sendemail]  
  12.     smtpServer = smtp.163.com  
  13.     smtpServerPort = 465  
  14.     smtpEncryption = ssl  
  15.     smtpUser = [email protected]  
  16.     smtpPass = xxxx  
  17.     sslVerify = false  
  18.     from=CodeReview<[email protected]>  
  19. [container]  
  20.     user = xxx  
  21.     javaHome = /usr/lib/jvm/java-6-openjdk-amd64/jre  
  22. [sshd]  
  23.     listenAddress = *:29418  
  24. [httpd]  
  25.     listenUrl = proxy-http://*:8090/  
  26. [cache]  
  27.     directory = cache 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章