參考:https://gerrit-review.googlesource.com/Documentation/install.html
一、Gerrit的簡介
Gerrit是Google開源的一套基於web的代碼review工具,它是基於git的版本管理系統。Google開源Gerrit旨在提供一個輕量級框架,用於在代碼入庫之前對每個提交進行審閱。每個修改都將提交到gerrit上,但實際上沒有真正意義的成爲項目的一部分,直到提交被管理員review和submit。它是標準開源過程的一個簡單工具來支持提交補丁程序,然後由項目成員在應用到代碼庫之前進行review。
二、Gerrit的搭建步驟
- 安裝java環境
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-7-jdk
這個是openjdk,使用標準jdk也可以jdk-8u161-linux-x64.tar.gz
2、安裝配置Apache2
- 下載Apache2
sudo apt-get install apache2
- 修改配置文件,後面會用到Apache的反射
sudo vi /etc/apache2/httpd.conf
這種方式是通過vi在命令裏面修改
或者sudo gedit /etc/apache2/httpd.conf
這種方式是通過打開一個文本編輯器進行修改 - 具體的修改的內容如下,我寫了註釋的地方需要注意根據自己的需求進行修改
<VirtualHost *:8081> //這裏是反射代理的端口號,
ServerName 10.180.152.83 //這裏是填寫Apache反射代理的ip地址,也就是你服務器的ip地址
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
AuthBasicProvider file
AuthUserFile /home/gerrit/review_site/passwords //這個路徑是gerrit賬戶密碼管理,後續的步驟中會創建此文件。路徑有寫正確
</Location>
AllowEncodedSlashes On
ProxyPass / http://127.0.0.1:8091/ nocanon //這裏是代理反射,照着寫就OK了
</VirtualHost>
注意:
如果http.conf沒有Include到apache2.conf中,就需要手動添加:sudo vi /etc/apache2/apache2.conf
添加如下,Include http.conf
- 修改配置文件,添加對8081端口的監聽:sudo vi /etc/apache2/ports.conf
添加,Listen 8081 //這裏的8081端口號是上面配置的Apache2反射端口
- 開啓SSL、Proxy、Rewrite等模塊:cd /etc/apache2/mods-enabled
在這個路徑下面,輸入下面的命令
sudo ln -s ../mods-available/proxy.load
sudo ln -s ../mods-available/proxy.conf
sudo ln -s ../mods-available/proxy_http.load
sudo ln -s ../mods-available/proxy_balancer.conf
sudo ln -s ../mods-available/proxy_balancer.load
sudo ln -s ../mods-available/rewrite.load
sudo ln -s ../mods-available/ssl.conf
sudo ln -s ../mods-available/ssl.load
以上可能本身就設置好了就查看下就可以。
3、安裝配置gerrit
gerrit的最新下載地址:https://www.gerritcodereview.com/
當前最新版本爲 3.1.0 本教程使用的是gerrit-3.1.0
- 進入到下載好的gerrit軟件目錄
cd home/gerrit/download
- 安裝解壓下載好的war包
java -jar gerrit-3.1.0.war init -d ~/review_site
這裏的review_site是解壓出來的包名,最好不要修改。避免不必要的錯誤 - 安裝的時候,選擇默認配置,一路回車,安裝完成之後。打開瀏覽器輸入 loccalhost:8080就能看到gerrit的界面了。
- 但是最好不要默認安裝,如下:
-
#java -jar gerrit-3.1.0.war init -d ~/review_site Using secure store: com.google.gerrit.server.securestore.DefaultSecureStore [2019-12-19 13:58:02,378] [main] INFO com.google.gerrit.server.config.GerritServerConfigProvider : No /home/git/review_site/etc/gerrit.config; assuming defaults *** Gerrit Code Review 3.1.0 *** Create '/home/git/review_site' [Y/n]? y *** Git Repositories *** Location of Git repositories [git]: /home/git/repositories *** Index *** Type [lucene]: *** User Authentication *** Authentication method [openid/?]: HTTP Get username from custom HTTP header [y/N]? SSO logout URL : Enable signed push support [y/N]? *** Review Labels *** Install Verified label [y/N]? *** Email Delivery *** SMTP server hostname [localhost]: SMTP server port [(default)]: SMTP encryption [none/?]: SMTP username : *** Container Process *** Run as [git]: Java runtime [/tools/jdk1.8.0_161/jre]: Copy gerrit-3.1.0.war to /home/git/review_site/bin/gerrit.war [Y/n]? Copying gerrit-3.1.0.war to /home/git/review_site/bin/gerrit.war *** SSH Daemon *** Listen on address [*]: Listen on port [29418]: Generating SSH host key ... rsa... ed25519...unknown key type ed25519 ecdsa 256... ecdsa 384... ecdsa 521... 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 [8081]: 8091 Canonical URL [http://null/]: http://192.168.0.198:8081/ *** Cache *** *** Plugins *** Installing plugins. Install plugin codemirror-editor version v3.1.0 [y/N]? Y Installed codemirror-editor v3.1.0 Install plugin commit-message-length-validator version v3.1.0 [y/N]? Y Installed commit-message-length-validator v3.1.0 Install plugin delete-project version v3.1.0 [y/N]? Y Installed delete-project v3.1.0 Install plugin download-commands version v3.1.0 [y/N]? Y Installed download-commands v3.1.0 Install plugin gitiles version v3.1.0 [y/N]? Y Installed gitiles v3.1.0 Install plugin hooks version v3.1.0 [y/N]? Y Installed hooks v3.1.0 Install plugin plugin-manager version v3.1.0 [y/N]? Y Installed plugin-manager v3.1.0 Install plugin replication version v3.1.0 [y/N]? Y Installed replication v3.1.0 Install plugin reviewnotes version v3.1.0 [y/N]? Y Installed reviewnotes v3.1.0 Install plugin singleusergroup version v3.1.0 [y/N]? Y Installed singleusergroup v3.1.0 Install plugin webhooks version v3.1.0 [y/N]? Y Installed webhooks v3.1.0 Initializing plugins. Initialized /home/git/review_site Init complete, reindexing projects with: reindex --site-path /home/git/review_site --threads 1 --index projects Reindexing projects: 100% (39/39) Reindexed 39 documents in projects index in 1.0s (38.1/s) Executing /home/git/review_site/bin/gerrit.sh start Starting Gerrit Code Review: WARNING: Could not adjust Gerrit's process for the kernel's out-of-memory killer. This may be caused by /home/git/review_site/bin/gerrit.sh not being run as root. Consider changing the OOM score adjustment manually for Gerrit's PID=3571 with e.g.: echo '-1000' | sudo tee /proc/3571/oom_score_adj FAILED error: cannot start Gerrit: exit status 1 Waiting for server on 192.168.0.198:80 ... OK Opening http://192.168.0.198/#/admin/projects/ ...OK
- 當然了,作爲一名優秀的程序員,我們不能止步於默認配置。所以,我們對配置文件進行按需修改
sudo vi ~/review_site/etc/gerrit.config
-
#sudo vi ~/review_site/etc/gerrit.config [gerrit] basePath = /home/git/repositories canonicalWebUrl = http://192.168.0.198:8081/ serverId = 0e067cd7-94c4-44f1-aa68-0a73873adc45 [container] javaOptions = "-Dflogger.backend_factory=com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance" javaOptions = "-Dflogger.logging_context=com.google.gerrit.server.logging.LoggingContext#getInstance" user = git javaHome = /tools/jdk1.8.0_161/jre [index] type = lucene [auth] type = HTTP [receive] enableSignedPush = false [sendemail] smtpServer = localhost [sshd] listenAddress = *:29418 [httpd] listenUrl = proxy-http://*:8091/ [cache] directory = cache
具體的修改內容如下: -
[gerrit] basePath = git //這裏是配置gerrit項目管理倉庫的名字。可以所以修改 serverId = 02481fa0-9b63-4b6a-9869-8b4e2a4364ee canonicalWebUrl = http://110.180.152.83:8081/ //這裏就是打開gerrit管理系統的地址了。這個地方和前面配置的Apache2的反射文件要一致 [database] type = h2 //這裏是選擇數據庫,gerrit支持h2/mysql/postsql三種,一般不是那種超級大型的團隊管理,我們選擇h2就夠用了。 database = /home/gerrit/review_site/db/ReviewDB //這裏是數據庫的位置 [auth] type = HTTP //這裏一定要改,改成HTTP的方式。 [receive] enableSignedPush = false [sendemail] //這裏是郵箱配置,如果是公司內網,發送郵件不方便的話,可以配置爲sendemail = fasle就行了。後面我會教大家,繞過郵箱認證賬號的方法。 smtpServer = smtp.company.com smtpServerPort = *** smtpEncryption = ssl smtpUser = [email protected] //這裏填寫要發送驗證信息的郵箱 smtpPass = ****** //這裏輸密碼 sslVerify = false from = Code Review < [email protected] > //填寫郵箱 [container] user = gerrit //這裏不要改動,選擇gerrit登陸 javaHome = /usr/lib/jvm/java-7-openjdk-amd64/jre //這裏是默認選擇的Java路徑 [sshd] listenAddress = *:29418 //這裏不準改,這裏就選擇默認的29418 [httpd] listenUrl = proxy-http://*:8091/ //這裏修改端口,*可以替換成對應的ip也可以不換 [cache] directory = cache [http] proxy = http://192.168.0.198:8080 proxyUsername = git proxyPassword = git
- basePath = git //這裏是配置gerrit項目管理倉庫的名字。可以所以修改,
- 當發現改變這個倉庫目錄後,啓動gerrit時Starting Gerrit Code Review: FAILED ,這是因爲你添加的目錄裏面沒有默認的All-Projects.git All-Users.git 這2個倉庫,將這2個倉庫拷貝過去後可解決這個問題。
- 配置一個gerrit的管理員賬號:
touch ~/review_site/passwords
//這個文件就是上面Apache配置的賬號路徑sudo htpasswd -b ~/review_site/passwords admin admin
//新增賬號admin和密碼 - 安裝配置gitweb
- 下載安裝gitweb
sudo apt-get install gitweb
- 查看相關配置文件的安裝路徑
dpkg -L gitweb
得到輸出如下:
- 下載安裝gitweb
-
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/gitweb
/usr/share/doc/gitweb/examples
/usr/share/doc/gitweb/examples/index.aux-generation
/usr/share/doc/gitweb/README.Debian
/usr/share/doc/gitweb/copyright
/usr/share/doc/gitweb/README
/usr/share/doc/gitweb/NEWS.Debian.gz
/usr/lib
/usr/lib/cgi-bin
/etc
/etc/apache2
/etc/apache2/conf.d
/etc/apache2/conf.d/gitweb
/etc/gitweb.conf
/usr/share/doc/gitweb/changelog.Debian.gz
/usr/lib/cgi-bin/gitweb.cgi
打開gerrit的config:sudo gedit ~/review_site/etc/gerrit.config
添加從上面路徑的最後一行
[gitweb]
type = gitweb
cgi = /usr/lib/cgi-bin/gitweb.cgi
- 重啓gerrit和Apache2
sudo ~/review_site/bin/gerrit.sh restart
sudo /etc/init.d/apache2 restart
- 訪問gerrit管理界面
瀏覽器輸入:http://192.168.130.10:8081/
設置gerrit自啓動
在它的下面有個 bin/gerrit.sh文件
把這個文件拷貝到/etc/init.d下 改名叫做 gerrit
然後用sysv-rc-conf工具,這個沒有可以直接apt-get install進行安裝
然後執行sysv-rc-conf,找到gerrit的那一行,我把2~5都X上
然後重啓下系統,/etc/rc*.d下面就都有對應的文件了,我這裏是S20gerrit文件
不知道要不要重啓,反正重啓一下保險點
然後一般安裝gerrit的時候都建立了一個新的用戶,我把安裝目錄給放到新用戶下面了
在我自己的用戶下面沒有寫權限,就給把那個用戶chmod 777 -R了
然後在/etc/init.d/gerrit腳本里把GERRIT_SITE給設置一下
這裏,我用 都是修改GERRIT_SITE_1的值爲絕對路徑GERRIT_SITE_1="/home/git/review_site"
然後重啓,gerrit這個服務就已經啓動了
以上測試不成功:
方法1
1.通過如下步驟設置gerrit服務開機自啓動:
1 2 3 4 5 |
|
2.服務自動啓動腳本/etc/init.d/gerrit.sh需要通過/etc/default/gerritcodereview(該申明被卸載gerrit.sh腳本里面)文件來提供一些配置。該文件的內容爲:
1 2 3 |
|
3.如果不能啓動,可能需要查看下權限
1 |
|
實際操作:
sudo ln -snf /home/gerrit/review_site/bin/gerrit.sh /etc/init.d/gerrit
然後用sysv-rc-conf工具,這個沒有可以直接apt-get install進行安裝
然後執行sysv-rc-conf,找到gerrit的那一行,我把2~5都X上
sudo vi /etc/default/gerritcodereview
寫入
GERRIT_SITE=/home/gerrit/review_site
NO_START=0
保存後重啓,成功
三、問題與總結
Q1: gerrit服務器搭在公司內部局域網,沒有辦法發送外部郵箱進行賬號驗證怎麼辦?
A1: 我們可以直接遠程操作數據庫進行修改賬號的郵箱地址,具體方法如下:
- 爲ssh的主機配置設置別名,在~/.ssh/config文件中添加:
Host review
Hostname 10.180.152.81
User admin //這個名字要和網站上管理員的名字相同
Port 29418
IdentityFile ~/.ssh/id_rsa
這樣就可以簡單通過ssh訪問gerritl了。效果如下:
# 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://[email protected]:29418/REPOSITORY_NAME.git
Connection to review.tafdc.org closed.
然後,通過ssh遠程連接gerrit進行賬號郵箱的配置。ssh review gerrit set-account --add-email xxxxx@郵箱 admin
Q2:訪問出現:
Q3:
Starting Gerrit Code Review: FAILED
1、因爲8081端口和Apache2 重複了,嚴格按以上配置,8091的地方不要改成8081
2、端口沒有問題,還是不行
查看錯誤日誌: cat ~/review_site/logs/error_log
1) No index versions ready; run Reindex
1 error
at com.google.gerrit.lucene.LuceneVersionManager.start(LuceneVersionManager.java:118)
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解決:java -jar ~/gerrit-2.11.war reindex -d ~/review_site/
java -jar ~/gerrit-2.11.war reindex -d ~/review_site/
[2019-12-09 14:48:59,845] INFO com.google.gerrit.server.git.LocalDiskRepositoryManager : Defaulting core.streamFileThreshold to 220m
[2019-12-09 14:49:00,452] INFO com.google.gerrit.server.cache.h2.H2CacheFactory : Enabling disk cache /home/git/review_site/cache
Reindexing changes: done
Reindexed 0 changes in 0.0s (0.0/s)
[2019-12-09 14:49:01,895] WARN com.google.gerrit.server.cache.h2.H2CacheImpl : Cannot build BloomFilter for jdbc:h2:file:/home/git/review_site/cache/diff_intraline
org.h2.jdbc.JdbcSQLException: Error opening database: "Sleep interrupted" [8000-174]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:332)
at org.h2.message.DbException.get(DbException.java:161)
at org.h2.store.FileLock.getExceptionFatal(FileLock.java:450)
at org.h2.store.FileLock.sleep(FileLock.java:445)
at org.h2.store.FileLock.lockFile(FileLock.java:348)
at org.h2.store.FileLock.lock(FileLock.java:133)
at org.h2.engine.Database.open(Database.java:575)
at org.h2.engine.Database.openDatabase(Database.java:236)
at org.h2.engine.Database.<init>(Database.java:231)
at org.h2.engine.Engine.openSession(Engine.java:56)
at org.h2.engine.Engine.openSession(Engine.java:160)
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:139)
at org.h2.engine.Engine.createSession(Engine.java:122)
at org.h2.engine.Engine.createSession(Engine.java:28)
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:323)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:105)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:90)
at org.h2.Driver.connect(Driver.java:73)
at com.google.gerrit.server.cache.h2.H2CacheImpl$SqlHandle.<init>(H2CacheImpl.java:636)
at com.google.gerrit.server.cache.h2.H2CacheImpl$SqlStore.acquire(H2CacheImpl.java:604)
at com.google.gerrit.server.cache.h2.H2CacheImpl$SqlStore.buildBloomFilter(H2CacheImpl.java:365)
at com.google.gerrit.server.cache.h2.H2CacheImpl$SqlStore.open(H2CacheImpl.java:337)
at com.google.gerrit.server.cache.h2.H2CacheImpl.start(H2CacheImpl.java:167)
at com.google.gerrit.server.cache.h2.H2CacheFactory$1.run(H2CacheFactory.java:113)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at org.h2.store.FileLock.sleep(FileLock.java:443)
... 23 more
[2019-12-09 14:49:01,902] INFO com.google.gerrit.server.cache.h2.H2CacheFactory : Finishing 4 disk cache updates
#sudo ~/review_site/bin/gerrit.sh restart
Stopping Gerrit Code Review: start-stop-daemon: warning: failed to kill 4558: No such process
1 pids were not killed
No process in pidfile '/home/git/review_site/logs/gerrit.pid' found running; none killed.
OK
Starting Gerrit Code Review:
OK
Q3:登錄網頁顯示如下:
解決辦法:
touch ~/review_site/passwords
//這個文件就是上面Apache配置的賬號路徑sudo htpasswd -b ~/review_site/passwords admin admin
//新增賬號admin和密碼
sudo /etc/init.d/apache2 restart
Q4:gerrit網頁創建項目後沒有下載地址,沒有下圖界面:
原因:安裝的時候我使用的是默認安裝
java -jar gerrit.war init --batch -d /gerrit
沒有安裝插件download-commands