0%

gerrit服务搭建与维护

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既是安装程序,也是一个服务端管理工具。支持initreindex等子命令。更加详细的信息可以查看官方文档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。升级的注意事项:

  1. 升级之前建议手工启动一次备份脚本。避免升级失败,导致服务奔溃或数据丢失。
  2. 当版本号跨度较大时,不建议一次性升级。建议分多次升级。
  3. 升级之前,可以阅读一下目标版本的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