Gerrit2安裝配置
Gerrit是用于Git版本控制系統的代碼審核系統。
下載
當前最新版本的gerrit為2.8.1,從官方下載二進制war包即可。
數據庫設置
gerrit可以使用H2,PostgreSQL,MySql和Oracle數據庫。這個安裝使用PostgreSQL數據庫。
創建gerrit使用的用戶和數據庫:
$ createuser --username=postgres -RDIElPS gerrit2 $ createdb --username=postgres -E UTF-8 -O gerrit2 reviewdb
這里使用PostgreSQL提供的shell工具,也可以登錄PostgreSQL使用psql來CREATE ROLE和CREATE DATABASE。
創建用戶
為gerrit創建單獨的用戶gerrit2,用于運行gerrit,但是禁止gerrit2用戶登錄系統。
# adduser gerrit2 # passwd --delete gerrit2
安裝
切換到gerrit2用戶,使用gerrit2主目錄下的review目錄作為gerrit site的根目錄
# sudo su - gerrit2 # java -jar gerrit-2.8.1.war init -d review
進入交互式安裝,具體的安裝配置如下:
*** Gerrit Code Review 2.8.1 *** 選項中大寫字母為默認選項,如使用默認選項回車即可 Create '/home/gerrit2/review' [Y/n]? *** Git Repositories *** gerrit用于存儲git倉庫的目錄,相對于根目錄review Location of Git repositories [git]: *** SQL Database *** Database server type [h2]: postgresql Server hostname [localhost]: Server port [(postgresql default)]: Database name [reviewdb]: Database username [gerrit2]: gerrit2's password : confirm password : *** User Authentication *** 使用HTTP認證,OPENID需要服務器連接互聯網,還可以使用LDAP認證服務 Authentication method [OPENID/?]: http Get username from custom HTTP header [y/N]? SSO logout URL : *** Email Delivery *** gerrit發送郵件設置,可以使用本地或遠程SMTP服務器, *** 只要在smtp服務器上有帳號即可。 SMTP server hostname [localhost]: mail.openwares.net SMTP server port [(default)]: 25 SMTP encryption [NONE/?]: tls SMTP username [gerrit2]: gerrit2@openwares.net gerrit2@openwares.net's password : confirm password : *** Container Process *** 使用gerrit2用戶運行gerrit Run as [gerrit2]: Java runtime [/usr/lib/jvm/java-7-openjdk-amd64/jre]: Copy gerrit-2.8.1.war to /home/gerrit2/review/bin/gerrit.war [Y/n]? Copying gerrit-2.8.1.war to /home/gerrit2/review/bin/gerrit.war *** SSH Daemon *** gerrit自帶的ssh服務,與服務器自身的ssh服務無關,監聽默認端口即可 *** 注意:如要使用低于1024的特權端口,需authbind授權,否則ssh會綁定端口失敗 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 *** 這里使用nginx反向代理gerrit,所以只在loop接口監聽即可。 *** 如果使用域名訪問gerrit,最好將規范URL設置為域名形式,發送校驗郵件時會使用到 Behind reverse proxy [y/N]? y Proxy uses SSL (https://) [y/N]? Subdirectory on proxy server [/]: Listen on address [*]: 127.0.0.1 Listen on port [8081]: Canonical URL [http://127.0.0.1/]:http://review.domain.tld/ *** Plugins *** 選裝插件 Install plugin download-commands version v2.8.1 [y/N]? Install plugin reviewnotes version v2.8.1 [y/N]? Install plugin replication version v2.8.1 [y/N]? Install plugin commit-message-length-validator version v2.8.1 [y/N]? Initialized /home/gerrit2/review Executing /home/gerrit2/review/bin/gerrit.sh start Starting Gerrit Code Review: *** 因為為ssh服務選在了低于1024的端口,且沒有authbind端口授權,所以會出現如下錯誤,高于1024端口不會。 *** FAILED *** error: cannot start Gerrit: exit status 1 Waiting for server on 127.0.0.1:80 ... OK *** 服務器上沒有X,所以使用瀏覽器打開連接失敗 Opening http://127.0.0.1/#/admin/projects/ ...FAILED Open Gerrit with a JavaScript capable browser: http://127.0.0.1/#/admin/projects/ *** 交互式安裝完畢
gerrit自啟動服務
添加/etc/default/gerritcodereview文件,其內容如下:
GERRIT_SITE=/path/to/gerrit
然后
# ln -sf /home/gerrit2/review/bin/gerrit.sh /etc/init.d/gerrit # ln -sf /etc/init.d/gerrit /etc/rc3.d/S90gerrit
nginx配置
使用nginx反向代理gerrit,并且nginx承擔http認證,gerrit不會對用戶進行認證。gerrit將http認證成功后第一個 登錄的用戶作為管理員,其他用戶皆為普通用戶。用戶第一次http認證成功后,gerrit會為用戶生成同名的gerrit用戶,只要進一步完善賬戶即 可。比如添加email和公鑰。管理員為其他普通用戶授權。
nginx反向代理配置
server { listen 80; server_name review.domain.tld; location / { auth_basic "Gerrit2 Code Review"; auth_basic_user_file /home/gerrit2/htpasswd.conf; proxy_pass http://127.0.0.1:8081; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; } location /login/ { proxy_pass http://127.0.0.1:8081; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; } }
http認證文件
使用htpasswd命令為管理云用戶生成http認證配置文件,如果沒有htpasswd文件需要安裝apache2-utils包。
# htpasswd -d htpasswd.conf admin
以后添加gerrit用戶時,同樣需要先為其配置http認證,然后用戶登錄后gerrit會為其自動生成用戶帳號,名字與http認證名字一致。
賬戶配置
第一次成功登錄的用戶會被gerrit作為管理員用戶。登錄后點擊右上角的”匿名懦夫”Anonymous Coward -> Settings來配置賬戶。
電子郵件
選擇左側Contact Information頁簽,添加用戶全稱。然后注冊新郵件Register New Email,輸入管理員的郵件地址后,gerrit會向新郵箱發送
校驗郵件,校驗通過后才是有效的郵箱。這時候安裝時配置Canonical URL就有用處了,校驗郵件的域名部分就是Canonical URL,如果當時配置的是http://127.0.0.1/,那這時候就要手工修改域名部分再執行驗證了。
發送校驗郵件有時候不太方便,可以使用gerrit提供的遠程ssh shell來為用戶添加有效郵箱。當然首先管理員要添加了SSH公鑰才能遠程訪問gerrit的ssh shell。
語法如下:
# ssh review gerrit set-account --add-email username@openwares.net username
這是review是.ssh/config中配置的遠程ssh主機別名。
也可以通過直接修改gerrit數據庫表的方式來添加用戶郵件,但這活著實有點兒臟,不建議使用。
SSH公鑰
要使用gerrit必須要提供用戶的公鑰。選擇頁面左側的SSH Public Keys為當前用戶添加公鑰。直接將公鑰粘貼到Add SSH Public Key框內,然后點擊add即可。
之后用戶就可以用ssh來訪問gerrit了。當然無法登錄服務器,只能使用gerrit提供的shell。
添加其他普通賬戶
如果采用http認證,那么添加其他賬戶時,需要現添加http認證賬戶。用htpasswd創建的用戶時,并沒有往gerrit中添加賬號,只有 當該用戶通過web登陸gerrit服務器時,該賬號才會被添加進gerrit數據庫中。使用http認證方式,不要使用gerrit ssh shell命令來新增用戶,通過http認證第一次認證成功的用戶,gerrit會為其自動創建賬戶,之后只要完善賬戶就可以了。使用ssh shell創建的用戶無法與http認證后自動創建的用戶關聯起來,即是二者的用戶名是完全一樣的。
其他用戶帳號的配置與管理員的配置方式一樣。
SSH訪問gerrit
添加ssh公鑰后就可以使用ssh來使用gerrit了。
# ssh -p 29418 -i ~/.ssh/id_rsa.gerrit admin@review.domain.tld
如果私鑰名字為id_rsa可以不用使用-i參數。為ssh主機配置別名訪問起來更簡單,~/.ssh/config文件中添加:
Host review Hostname review.domain.tld User admin Port 29418 #如果私鑰名字為id_rsa,可以省略下面一行 IdentityFile ~/.ssh/id_rsa.gerrit
這樣ssh訪問gerrit就可以了:
# ssh review **** Welcome to Gerrit Code Review **** Hi username, you have successfully connected over SSH. Unfortunately, interactive shells are disabled. To clone a hosted Git repository, use: git clone ssh://admin@review.domain.tld:29418/REPOSITORY_NAME.git Connection to review.tafdc.org closed.
查看gerrit shell幫助
# ssh review gerrit --help gerrit [COMMAND] [ARG ...] [--] [--help (-h)] -- : end of options --help (-h) : display this help text Available commands of gerrit are: ban-commit Ban a commit from a project's repository create-account Create a new batch/role account create-group Create a new account group create-project Create a new project and associated Git repository flush-caches Flush some/all server caches from memory gc Run Git garbage collection gsql Administrative interface to active database ls-groups List groups visible to the caller ls-members Lists the members of a given group ls-projects List projects visible to the caller ls-user-refs List refs visible to a specific user plugin query Query the change database receive-pack Standard Git server side command for client side git push rename-group Rename an account group review Verify, approve and/or submit one or more patch sets set-account Change an account's settings set-members Modifies members of specific group or number of groups set-project Change a project's settings set-project-parent Change the project permissions are inherited from set-reviewers Add or remove reviewers on a change show-caches Display current cache statistics show-connections Display active client SSH connections show-queue Display the background work queues, including replication stream-events Monitor events occurring in real time test-submit version Display gerrit version See 'gerrit COMMAND --help' for more information.
導入現存git代碼庫
最簡單的辦法就是直接將現在的git裸倉庫拷貝到gerrit管理的倉庫目錄下
#cp -r /path/to/old.git /path/to/gerrit/git/
或者稍微繁瑣一些的方法:在gerrit中新建一個project,不要做init commit,然后將新建的倉庫做為已經存在倉庫的遠程倉庫,然后push就可以了。
可以設置gerrit該倉庫不經過審核,就可以直接將整個倉庫push過來了。
gitweb集成
debian系統只要安裝了gitweb包, gerrit就可以自動關聯到gitweb,通過gitweb來瀏覽git倉庫。
# apt-get install gitweb
其他問題
SMTP證書
如果為gerrit配置的SMTP服務器是SSL/TLS加密的,并且SMTP服務器的證書是自簽的,當gerrit試圖發送郵件時會拋出異常:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
因為自簽的證書是不受信任的,最簡單的解決辦法就是告訴gerrit不要校驗STMP服務的證書:
編輯~/review/etc/gerrit.config,添加:
[sendmail] sslverify=false
或者更復雜的解決辦法,將SMTP的SSL證書添加到JAVA的truststore里,參考[3]里有對此問題的詳細描述。
Sign Out
使用http認證登錄gerrit后,并無法通過點擊”Sign Out”退出登錄,只能通過直接關閉瀏覽器窗口來退出當前會話。
如果需要重新安裝gerrit,記得將數據庫drop掉再重新創建。
References:
[1]Gerrit Code Review for Git
[2]烤鴨的gerrit使用總結
[3]代碼評審系統 ReviewBoard 和 Gerrit (下)
===
All governments should be pressured to correct their abuses of human rights. --- Richard Stallman