Gerrit是Google编写的一个免费、开放源代码的代码审查软件。也可以将Gerrit当作本地的git服务器使用。本文介绍如何安装并维护Gerrit服务。
文档
Gerrit提供了非常丰富的文档,包含了安装、使用、管理等方方面面。本文绝大部分参考了官方文档。
安装
JDK
在安装Gerrit之后,系统需要安装好OracleJDK,不能是OpenJDK。目前最新版的Gerrit(3.4.1)需要JDK11。可以从以下站点下载JDK。
JDK解压好之后,设置相关的环境变量。使用命令java --version测试安装是否成功。
1 2 3
| export JAVA_HOME=/usr/local/jdk-11.0.12 export CLASSPATH=$JAVA_HOME/lib export PATH=$JAVA_HOME/bin:$PATH
|
Gerrit
点击进入Gerrit官网,可以下载到最新版的Gerrit。使用如下命令安装Gerrit。更多关于安装的信息可以参考Gerrit快速安装。
1
| java -jar /path/to/gerrit.war init -d gerrit_path
|
认证方式
Gerrit支持HTTP、OpenID等多种认证方式。这里选择最简单的HTTP。使用如下命令创建一个密码文件,添加一个用户admin,密码是123456。
1 2 3
| htpasswd -b -c /gerrit/gerrit.htpasswd admin 123456 # -b 指定密码 # -c 创建文件
|
设置Gerrit网站
在宝塔面板添加一个网站,并为网站设置HTTP认证,文件选择刚刚创建的。
1 2
| auth_basic "Restricted"; auth_basic_user_file /gerrit/gerrit.htpasswd;
|
添加反向代理,代理到Gerrit的HTTP端口,默认是8080。
Gerrit服务设置
端口
默认情况下,gerrit网页使用8080端口,git服务使用29418端口,可以在$GERRIT_SITE/etc/gerrit.config更改默认的端口。需要在宝塔放开这两个端口,才能正常使用Gerrit提供的服务。
启动参数
https://gerrit-documentation.storage.googleapis.com/Documentation/3.4.1/pgm-daemon.html
$GERRIT_SITE/bin/gerrit.sh脚本中的RUN_ARGS变量。
gerrit.war
gerrit.war既是安装程序,也是一个服务端管理工具。支持init、reindex等子命令。更加详细的信息可以查看官方文档Server Side Administrative Tools。
导入现有git仓库
首先在Gerrit上创建一个仓库,不要创建一个空的初始化提交。
假设git仓库存储在/gerrit/git目录中,执行下列命令导入现有仓库的提交。
1 2 3
| git clone --mirror url cd xxxxx.git git push --mirror file:///gerrit/git/xxxxx.git
|
设置邮件
示例是使用的office365的邮件服务。如果是其他的邮件服务,设置不完全一样。有关sendemail的更多设置,可以参考官方文档。
1 2 3 4 5 6 7 8 9
| export GERRIT_SITE=/gerrit git config -f $GERRIT_SITE/etc/gerrit.config sendemail.enable true git config -f $GERRIT_SITE/etc/gerrit.config sendemail.smtpServer smtp.office365.com git config -f $GERRIT_SITE/etc/gerrit.config sendemail.smtpServerPort 587 git config -f $GERRIT_SITE/etc/gerrit.config sendemail.smtpEncryption TLS git config -f $GERRIT_SITE/etc/gerrit.config sendemail.sslVerify true git config -f $GERRIT_SITE/etc/gerrit.config sendemail.smtpUser user@host git config -f $GERRIT_SITE/etc/gerrit.config sendemail.smtpPass password git config -f $GERRIT_SITE/etc/gerrit.config sendemail.from CodeReview<user@host>
|
仓库的URL
1 2 3 4 5
| export GERRIT_SITE=/gerrit # 使用HTTP协议clone仓库的URL git config -f $GERRIT_SITE/etc/gerrit.config gerrit.gitHttpUrl http://gerrit.pk.inc:8080 # 使用SSH协议clone仓库的URL git config -f $GERRIT_SITE/etc/gerrit.config gerrit.canonicalGitUrl ssh://gerrit.pk.inc:29418
|
开机启动
这里使用systemd来管理gerrit服务。在/lib/systemd/system目录在创建文件gerrit.service,并输入以下内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| [Unit] SourcePath=/etc/rc.d/init.d/gerrit Description=LSB: Start/stop Gerrit Code Review Before=runlevel2.target Before=runlevel3.target Before=runlevel4.target Before=runlevel5.target Before=shutdown.target After=nss-lookup.target After=remote-fs.target After=network-online.target After=synchrony.service Conflicts=shutdown.target
[Service] Type=forking User=root Group=root Restart=no TimeoutSec=5min IgnoreSIGPIPE=no KillMode=process GuessMainPID=no RemainAfterExit=yes ExecStart=/gerrit/bin/gerrit.sh start ExecStop=/gerrit/bin/gerrit.sh stop
[Install] WantedBy=multi-user.target
|
然后就可以使用systemctl命令来管理Gerrit服务了。
1 2 3 4 5 6
| # 开机自启动 systemctl enable gerrit # 手动启动Gerrit systemctl start gerrit # 手动停止Gerrit systemctl stop gerrit
|
备份与还原
备份
备份的方法很简单,停止gerrit服务,然后将整个站点目录打包即可。下面是一个示例的备份脚本,在宝塔面板添加一个定时任务,定时运行此脚本即可。
如果数据库MySQL等外部数据库,而不是内置的db2,则还需要备份数据库。以下脚本没有备份数据库。
git仓库保存在/gerrit/git目录下,所以这个脚本会一起备份。如果git仓库在不同的目录,需要修改脚本,同时备份git仓库。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| #!/bin/bash # backup gerrit site
BACKUP_DIR="/backups/gerrit" GERRIT_SITE="/gerrit"
LOCK_FILE="/tmp/gerrit_bakcup_lock"
[ -d $BACKUP_DIR ] || mkdir -p $BACKUP_DIR
function LOG() { if [ $# = 0 ]; then return fi echo -n `date +"%Y-%m-%d %H:%M:%S"` echo -n " " echo $* }
while [ -f $LOCK_FILE ] do LOG "lock file exist, wait..." sleep 1 done
touch $LOCK_FILE
LOG "stop gerrit service..." #$GERRIT_SITE/bin/gerrit.sh stop systemctl stop gerrit sync sleep 1
LOG "tar gerrit site..." FILE_NAME=gerrit_backup_$(date +"%Y%m%d-%H%M%S").tar.gz tar -czf $FILE_NAME $GERRIT_SITE if [ $? != 0 ]; then LOG "tar fail, please check..." rm -rfv $FILE_NAME rm -rf $LOCK_FILE exit 1 fi mv $FILE_NAME $BACKUP_DIR
LOG "start gerrit service..." #$GERRIT_SITE/bin/gerrit.sh start systemctl start gerrit
LOG "start sync backup file to cloud..." /root/bin/rsync_bakcup.sh
rm -rf $LOCK_FILE
|
还原
将备份好的压缩包解压之后,即可使用$GERRIT_SITE/bin/gerrit.bin start启动服务。由于etc/gerrit.config中存在一个叫做gerrit.serverId的设置。建议在那一台服务器备份的,就在那一台服务器还原。还原之后,最好检查一下etc/gerrit.config中的相关设置是否有效。
升级
如果gerrit有新版本了,可以使用gerrit.war的init命令来升级gerrit。升级的注意事项:
- 升级之前建议手工启动一次备份脚本。避免升级失败,导致服务奔溃或数据丢失。
- 当版本号跨度较大时,不建议一次性升级。建议分多次升级。
- 升级之前,可以阅读一下目标版本的release note。例如3.3的是3.3.html。
1 2 3 4 5 6
| export GERRIT_SITE=/gerrit systemctl stop gerrit # 或使用原生的停止脚本 #$GERRIT_SITE/bin/gerrit.sh stop # -b 表示批处理,不使用交互模式 java -jar path/to/gerrit_new_version.war init -d ${GERRIT_SITE} -b
|
插件
从https://gerrit-ci.gerritforge.com下载插件,放入目录$GERRIT_SITE/plugins,重新Gerrit即可。
集成gitweb
官方文档Gitweb Integration提供了两种集成gitweb的方法。一种是内置式,由gerrit来管理的gitweb。一种是外挂式,手工管理的gitweb。我这里选择第二种方式,gitweb的搭建可以参考在宝塔面板使用nginx搭建Gitweb服务。搭建好gitweb之后,使用如下命令设置Gerrit,然后重启即可。
1 2 3 4
| export GERRIT_SITE=/gerrit git config -f $GERRIT_SITE/etc/gerrit.config gitweb.type gitweb git config -f $GERRIT_SITE/etc/gerrit.config --unset gitweb.cgi git config -f $GERRIT_SITE/etc/gerrit.config gitweb.url http://gitweb.pk.inc
|