参考: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