開發同事提議在線上部署一套gerrit代碼審覈環境,廢話很少說,部署gerrit的操做記錄以下:
提早安裝好java環境,mysql環境,nginx環境
測試系統:centos6.5
下載下面三個包,放到/root目錄下(下載地址:http://pan.baidu.com/s/1nuP0X9R (提取密碼gqj5))
mysql-connector-java-5.1.21.jar
bcpkix-jdk15on-1.52.jar
gerrit-2.11.3.warhtml
--------------------------------------------gerrit歷史版本下載地址-----------------------------------------------java
http://gerrit-releases.storage.googleapis.com/index.htmlmysql
---------------------------------------------------------------------------------------------------------------nginx
1)建立gerrit數據庫,並自定義編碼爲utf8
mysql>create database gerritdb CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql>grant all on gerritdb.* to 'gerrituser'@'localhost' identified by 'gerritpass';
2)添加帳號
[root@115 ~]#useradd gerrit
[root@115 ~]#su - gerrit
[gerrit@115 ~]$
在root帳號下操做
[root@115 ~]# cp /root/gerrit-2.11.3.war /home/gerrit
下面一步很重要,就是說提早把下面的兩個軟件放到相應的位置,以防在gerrit安裝過程當中再去執行下載操做(由於安裝過程當中再去下載,因爲網速問題會failed!)
[root@115 ~]#mkdir -p /home/gerrit/gerrit_site/lib
[root@115 ~]#cp /root/mysql-connector-java-5.1.21.jar /home/gerrit/gerrit_site/lib/
[root@115 ~]#cp /root/bcpkix-jdk15on-1.52.jar /home/gerrit/gerrit_site/lib/
[root@115 ~]#chown -R gerrit.gerrit /home/gerritgit
接着在gerrit帳號下進行安裝
除了選用mysql數據庫,Verified,http認證代理,其餘的都是默認! web
[gerrit@115 ~]$ java -jar gerrit-2.11.3.war init -d ~/gerrit_site
Using secure store: com.google.gerrit.server.securestore.DefaultSecureStoresql
*** Gerrit Code Review 2.11.3
*** shell
*** Git Repositories
*** 數據庫
Location of Git repositories [git]: vim
*** SQL Database
***
Database server type [h2]: mysql
Gerrit Code Review is not shipped with MySQL Connector/J 5.1.21
** This library is required for your configuration. **
Download and install it now [Y/n]?
Renaming mysql-connector-java-5.1.10.jar to .mysql-connector-java-5.1.10.jar.backupDownloading http://repo2.maven.org/maven2/mysql/mysql-connector-java/5.1.21/mysql-connector-java-5.1.21.jar ... OK
Checksum mysql-connector-java-5.1.21.jar OK
Server hostname [localhost]:
Server port [(mysql default)]:
Database name [reviewdb]: gerritdb
Database username [gerrit]: gerrituser
gerrituser's password :
confirm password :
*** Index
***
Type [LUCENE/?]:
The index must be rebuilt before starting Gerrit:
java -jar gerrit.war reindex -d site_path
*** User Authentication
***
Authentication method [OPENID/?]: http
Get username from custom HTTP header [y/N]?
SSO logout URL :
*** Review Labels
***
Install Verified label [y/N]? y
*** Email Delivery
***
SMTP server hostname [localhost]:
SMTP server port [(default)]:
SMTP encryption [NONE/?]:
SMTP username :
*** Container Process
***
Run as [gerrit]:
Java runtime [/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre]:
Copy gerrit-2.11.3.war to /home/gerrit/gerrit_site/bin/gerrit.war [Y/n]?
Copying gerrit-2.11.3.war to /home/gerrit/gerrit_site/bin/gerrit.war
*** SSH Daemon
***
Listen on address [*]:
Listen on port [29418]:
Gerrit Code Review is not shipped with Bouncy Castle Crypto SSL v151
If available, Gerrit can take advantage of features
in the library, but will also function without it.
Download and install it now [Y/n]?
Renaming bcpkix-jdk15on-1.52.jar to .bcpkix-jdk15on-1.52.jar.backupDownloading http://www.bouncycastle.org/download/bcpkix-jdk15on-151.jar ... !! FAIL !!
error: http://www.bouncycastle.org/download/bcpkix-jdk15on-151.jar: 302 Found
Please download:
http://www.bouncycastle.org/download/bcpkix-jdk15on-151.jar
and save as:
/home/gerrit/gerrit_site/lib/bcpkix-jdk15on-151.jar
Press enter to continue
Continue without this library [Y/n]?
Generating SSH host key ... rsa(simple)... done
*** HTTP Daemon
***
Behind reverse proxy [y/N]?
Use SSL (https://) [y/N]?
Listen on address [*]:
Listen on port [8080]:
Canonical URL [http://Zabbix-server:8080/]:
*** Plugins
***
Installing plugins.
Install plugin download-commands version v2.11.3 [y/N]?
Install plugin reviewnotes version v2.11.3 [y/N]?
Install plugin singleusergroup version v2.11.3 [y/N]?
Install plugin replication version v2.11.3 [y/N]?
Install plugin commit-message-length-validator version v2.11.3 [y/N]?
Initializing plugins.
No plugins found with init steps.
Initialized /home/gerrit/gerrit_site
注意:
一鍵安裝後,默認沒有安裝上任何插件的,若是用到插件,須要過後手動安裝。
手動安裝插件(好比replication同步插件)的方法請見於:[原創]CI持續集成系統環境--Gitlab+Gerrit+Jenkins完整對接(文章結尾有介紹)
*************************************************************************
第一次手動啓動gerrit服務,可能會有下面連個報錯
1)
[gerrit@115 ~]$/home/gerrit/gerrit_site/bin/gerrit.sh start
** ERROR: GERRIT_SITE not set
解決辦法:
在/home/gerrit/gerrit_site/bin/gerrit.sh啓動文件裏添加下面一行,即指定gerrit2的路徑
GERRIT_SITE=/home/gerrit/gerrit_site
2)
[gerrit@115 ~]$ /home/gerrit/gerrit_site/bin/gerrit.sh start
Starting Gerrit Code Review: FAILED
查看日誌,報錯以下:
[gerrit@115 ~]$ tail -f /home/gerrit/gerrit_site/logs/error_log
[2016-07-14 10:52:07,317] INFO com.google.gerrit.server.cache.h2.H2CacheFactory : Enabling disk cache /home/gerrit/gerrit_site/cache
[2016-07-14 10:52:08,110] INFO com.google.gerrit.server.config.ScheduleConfig : gc schedule parameter "gc.interval" is not configured
[2016-07-14 10:52:08,859] INFO org.eclipse.jetty.util.log : Logging initialized @4743ms
[2016-07-14 10:52:09,278] INFO com.google.gerrit.server.git.LocalDiskRepositoryManager : Defaulting core.streamFileThreshold to 2047m
[2016-07-14 10:52:09,320] INFO com.google.gerrit.server.plugins.PluginLoader : Loading plugins from /home/gerrit/gerrit_site/plugins
[2016-07-14 10:52:09,322] ERROR com.google.gerrit.pgm.Daemon : Unable to start daemon
com.google.inject.ProvisionException: Unable to provision, see the following errors:
1) No index versions ready; run Reindex
1 error
at com.google.gerrit.lucene.LuceneVersionManager.start(LuceneVersionManager.java:119)
at com.google.gerrit.lifecycle.LifecycleManager.start(LifecycleManager.java:74)
at com.google.gerrit.pgm.Daemon.start(Daemon.java:293)
at com.google.gerrit.pgm.Daemon.run(Daemon.java:205)
at com.google.gerrit.pgm.util.AbstractProgram.main(AbstractProgram.java:64)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.google.gerrit.launcher.GerritLauncher.invokeProgram(GerritLauncher.java:166)
at com.google.gerrit.launcher.GerritLauncher.mainImpl(GerritLauncher.java:93)
at com.google.gerrit.launcher.GerritLauncher.main(GerritLauncher.java:50)
at Main.main(Main.java:25)
解決辦法:運行reindex
[gerrit@115 ~]$ java -jar gerrit-2.11.3.war reindex -d /home/gerrit/gerrit_site
[2016-07-14 10:03:43,957] [main] WARN com.google.gerrit.pgm.util.ThreadLimiter : Limiting program to 8 threads due to database.poolLimit
[2016-07-14 10:03:44,031] [main] INFO com.google.gerrit.server.git.LocalDiskRepositoryManager : Defaulting core.streamFileThreshold to 2047m
[2016-07-14 10:03:44,492] [main] INFO com.google.gerrit.server.cache.h2.H2CacheFactory : Enabling disk cache /home/gerrit/gerrit_site/cache
Reindexing changes: done
Reindexed 0 changes in 0.0s (0.0/s)
再次啓動gerrit就成功了
[gerrit@115 ~]$ /home/gerrit/gerrit_site/bin/gerrit.sh start
Starting Gerrit Code Review: OK
**************************************************************************
修改/home/gerrit/gerrit_site/etc/gerrit.config配置文件
注意下面兩個配置項,修改後以下:
[gerrit]
basePath = git
canonicalWebUrl = http://103.10.86.30/ //nginx的代理端口
.........
[httpd]
listenUrl = http://*:8080/
下面是nginx的認證代理配置記錄
[root@115 vhosts]# pwd
/usr/local/nginx/conf/vhosts
[root@115 vhosts]# cat gerrit.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
auth_basic "Gerrit Code Review";
auth_basic_user_file /home/gerrit/gerrit_site/etc/passwords; //AuthUserFile路徑
proxy_pass http://103.10.86.30:8080; //注意後面不能加"/",不然會出現「Code Review - Error The page you requested was not found....permission to view this page」的報錯
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
}
}
可是nginx進程用戶(這裏是www)無權訪問此路徑,須要對/home/gerrit進行賦權:
[gerrit@115 ~]# setfacl -m g:www:rx /home/gerrit
這一步很重要!不然,訪問gerrit的時候會報500的錯!
[或者 setfacl -R -m u:www:rx /home/gerrit 上面是針對所屬組進行受權,這裏能夠針對用戶受權]
建立認證權限(也就是登錄的時候輸入的權限)
注意:第一次加-c參數是爲了建立密碼文件,默認第一個用戶是系統管理員
[root@115 vhosts]#htpasswd -c /home/gerrit/gerrit_site/etc/passwords gerrit
New password:
Re-type new password:
Adding password for user gerrit
[root@115 vhosts]#htpasswd /home/gerrit/gerrit_site/etc/passwords wangshibo
New password:
Re-type new password:
Adding password for user wangshibo
[root@115 vhosts]#htpasswd /home/gerrit/gerrit_site/etc/passwords jenkins
New password:
Re-type new password:
Adding password for user jenkins
查看下認證帳號文件信息
[root@115 vhosts]# cat /home/gerrit/gerrit_site/etc/passwords
重啓nginx服務
[root@115 vhosts]# /usr/local/nginx/sbin/nginx -s reload
訪問http://ip,輸入上面建立的用戶信息便可登錄gerrit
*************** *************** *************** *************** ***************
激活以後,在設置欄裏就有郵箱可選擇了
------------------------------------------------------------------------------------------------------------------------
注意:
用htpasswd建立第一個用戶時默認是系統管理員,ID爲1000000,默認只有這個系統管理員纔有Create權限(建立group和Project),
其餘的都只有「List」查看權限
用htpasswd建立的用戶時,並無往gerrit中添加帳號,只有當該用戶經過web登錄gerrit服務器時,該帳號纔會被添加進gerrit數據庫中。
退出admin帳號從新登錄(HTTP認證模式不支持Sign Out,須要先Sign Out退出帳號,關閉瀏覽器後再登錄才能出現http驗證密碼的對話框
---------------------------------------------git中文編碼問題------------------------------------------------------------
爲妥善解決中文編碼的問題,對全部git repository作以下約定:
a、全部文本文件都必須存儲成utf8編碼
b、對git作以下設置:
git config --global core.quotepath false
git config --global i18n.logoutputencoding utf8
git config --global i18n.commitencoding utf8
安裝gerrit的時候對於數據庫(選擇myqsl方式的話)的編碼設定爲utf8
--------------------------------------------gerrit對接gitweb-----------------------------------------------------
上面搭建好的gerrit,登錄進去在Projects項目裏的右邊沒有gitweb的超連接
1.須要先搭建gitweb,而後進行相關配置
[root@115 ~]# yum install -y gitweb 【或者直接yum install -y git*】
gitweb安裝後的目錄路徑是/var/www/git
********************** ********************** ********************
gitweb仍是蠻實用的。
能夠經過打開gerrit上某個工程的gitweb,查看到這個工程代碼近期的全部動向!
【默認狀況下:只有gerrit的管理員權限才能查看gitweb】
【普通用戶要想訪問gitweb,須要後續添加訪問權限,具體參照http://www.cnblogs.com/kevingrace/p/5651447.html文章底部的介紹】
以下:
--------------------------------------------------ssh公鑰設置-------------------------------------------
[gerrit@115]$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqvdgToL4veIqVe4D2iOwpzggdnGU8eGfRpwZH5hsCPdrIfjMgAMYz4TCKzmD9yv8VXrG/hCOX1zgL63ZLJ1NUTTG4zJ48UefRA0i3YqDez0RH5fhI/T69KalBNfPaRcaCqcdTfJcSW5FxZ4CMsHj7uyKrGry6sA3VkYhy08WA4CVcXHPI4R+va+Ga0KvTVKxBqpEiR+1r8+hECTyWo1XngqRVQpfJismQwUXe2J9U41T+DaQfJDaB+hdYPm2Xoeu7LlsyPFrUn/Jq3vy4YeU1XVD4BIMGXxg87MUdmZh0CzbeUSc1TgKYccUccTgnVDfgwgvwY/gJYbb7csCrlW5+w== gerrit@xqshijie.cn
[gerrit@115]$vim /home/gerrit/.bashrc
[gerrit@115]$source /home/gerrit/.bashrc
[gerrit@115]$cat /home/gerrit/.bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
alias ssh-gerrit='ssh -p 29418 -i ~/.ssh/id_rsa 103.10.86.30 -l gerrit'
# User specific aliases and functions
[gerrit@115]$ssh-gerrit
**** Welcome to Gerrit Code Review ****
Hi gerrit管理員, you have successfully connected over SSH.
Unfortunately, interactive shells are disabled.
To clone a hosted Git repository, use:
git clone ssh://gerrit@Zabbix-server:29418/REPOSITORY_NAME.git
Connection to 103.10.86.30 closed.
上面介紹了gerrit環境的部署,下面介紹下gerrit權限:
Abandon
此權限容許用戶丟棄一個提交的change。若是用戶有push權限,給用戶分配此權限的同時用戶也被分配了restore a change的權限。
Create Reference
此權限管理用戶是有能夠建立references,branches,tags。此權限通常與普通的push權限一塊兒被分配。
Forge Author
僞造發起人權限,此權限容許用戶繞過提交時的身份驗證(Gerrit默認會匹配提交信息中author或者committer行中的email地址,若是 Email地址不匹配,則不容許提交)。
Forge Committer
僞造提交者權限,此權限容許用戶繞過提交時的身份驗證(Gerrit默認會匹配提交信息中author或者committer行中的email地址,若是 Email地址不匹配,則不容許提交 )。
Forge Server
僞造Gerrit服務器權限,此權限容許在committer行中使用server owner和email
Owner
此權限容許用戶修改香項目的配置,具體以下:
修改項目描述
經過ssh的"create-branch"命令建立分支
在web UI界面建立/刪除branch
容許/撤銷任何訪問權限,包括Owner權限。
Push
此分類控制用戶被容許怎樣推送新commit到Gerrit。
Direct Push
全部已存在的branch能夠快進到新的commit。建立新分支受「Create Reference」控制,不容許刪除已存在的分支,這是最安全的模式(由於commit不能夠被丟棄)。
Force option
容許已存在的branch被刪除。開啓此選項能夠從項目歷史中刪除提交記錄。
此權限主要用來給那些只想用Gerrit的訪問控制,不須要Gerrit的代碼審查功能的工程使用。
Upload To Code Review
此push權限分配在refs/for/refs/heads/BRANCH命名空間上,容許用戶提交一個未合併(non-merge)的commit到refs/for/BRANCH命名空間,建立一個新的代碼審查change。
用戶必須可以clone和fetch一個工程才能夠提交change,因此用戶還必須擁有Read權限。
Push Merge Commits
此權限容許用戶提交merge commits,它是Push權限的附屬物,若是想只容許經過Gerrit作merge操做,那麼應該只分配Push僅限而不分配此權限。
Push Annotated Tag
此類權限容許用戶向工程倉庫提交一個annotated tag。一般使用如下兩種方式提交:
git push ssh://USER@HOST:PORT/PROJECT tag v1.0
或者:
git push https://HOST/PROJECT tag v1.0
Tags必須被註釋(使用git tag -a),必須在refs/tags/下存在,並且必須是新的。
通常在工程達到了穩定且可發佈的時候會打一個Tag。
此權限容許建立一個未簽名的Tag。打Tag者的email地址必須與當前用戶的一致。
若是要提交不是本身打的Tag,則必須同時分配Forge Committer Identity權限。
若是要提交輕標籤(lightweight tags)分配Create Reference權限給引用/refs/tags/*
若是要刪除或覆蓋一個已存在的tag,分配Push權限並開啓Force option。
Push Signed Tag
此類權限容許用戶向工程倉庫提交一個PGP簽名的 tag。一般使用如下兩種方式提交:
git push ssh://USER@HOST:PORT/PROJECT tag v1.0
或者:
git push https://HOST/PROJECT tag v1.0
Tags必須被註釋(使用git tag -a),必須在refs/tags/下存在,並且必須是新的。
Read
此類權限控制工程的changes, comments,和code diffs可見性,和是否可經過SSH或HTTP訪問Git。
若是在單獨工程的ACL中設置的此權限,那麼全局ACL中的設置將不起做用。
Rebase
此類僅限容許用戶經過web頁面的「Rebase Change」按鈕衍合(Rebase)修改
Remove Reviewer
此類權限容許用戶在一個change的reviewers list中移除其餘用戶。
change所屬者能夠移除0分或負分的reviewers(即便沒有此權限)。
項目全部者和網站管理員能夠移除全部reviewers(即便沒有此權限)。
沒有此權限的用戶只能夠移除本身。
Review Labels
// TODO
Submit
此類權限容許用戶提交changes。
提交一個change會使該change儘量快的合併到目的分支,使其做爲項目歷史永久的一部分。
爲了提交change,全部的labels都必須容許提交,而且不能block它。
若是要快速提交一個push上的change,用戶須要在refs/for/<ref>(e.g. on refs/for/refs/heads/master)有此權限。
Submit(On Behalf Of)
此類權限容許有Submit權限的用戶表明其餘用戶提交change。
在project.config文件中,此權限被命名爲submitAs。
View Drafts
此類權限容許用戶查看其餘用戶提交的drafts changes
change所用者和任何明確添加的reviewers也能夠查看(即便沒用此權限)
Publish Drafts
此類權限容許用戶發佈其餘用戶提交的drafts changes
change所用者和任何明確添加的reviewers也能夠查看(即便沒用此權限)
Delete Drafts
此類權限容許用戶刪除其餘用戶提交的drafts changes
change所用者和任何明確添加的reviewers也能夠查看(即便沒用此權限)
Edit Topic Name
容許用戶編輯提交到review的change的話題名。
change所用者,分支所用者,項目所用者和網站管理員均可以編輯此話題名(即便沒有此權限)。
「Force Edit」標識控制是否能夠編輯已關閉的change標題,若是此標識設置只能編輯open changes,則不能夠編輯已關閉的change 標題。
Edit Hashtags容許用戶在提交到reviews的changes上添加或移除hashtags。change所用者和任何明確添加的reviewers也能夠查看(即便沒用此權限)