Gerrit+apache+H2數據庫簡單安裝配置及建庫流程

Ubantu Gerrit 安裝

安裝相關軟件(ubantu)
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 [?]: [email protected]              //自己改成自己的郵箱
[email protected]'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 = [email protected]

[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 [email protected] gerrit create-project -p All-Projects -n project --empty-commit --permissions-only
2.創建代碼庫,以manifest爲例命令如下:
ssh -p 29418 [email protected] gerrit create-project -p project -n project/manifest --empty-commit
批量建庫,可以通過整理庫列表,使用如下腳本來完成
for i in `cat project-list`;do ssh -p 29418 [email protected] 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';

修改gerrit Group組命令(下面的例子是將原有的Approver改爲ApproverTest):

update ACCOUNT_GROUPS set NAME='ApproverTest' where GROUP_UUID='8cc77752bca3fb8b9daa9d7be6386c4872ddefda';

設置權限

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

 

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