虚拟机搭建gerrit教程的核心思路很简单:准备一台干净的Linux虚拟机,装好JDK,下载gerrit.war,执行初始化命令,再配个反向代理就能用。整个过程熟练工半小时搞定,新手第一次折腾大概需要半天,主要卡在环境配置和权限问题上,下面这篇文章会把每一步的坑提前告诉你,照着做就能少走弯路。
虚拟机搭建gerrit教程:新手必看步骤清单(快速上手版)
如果你之前没接触过Gerrit,先记住一句话:Gerrit本质是一个Java应用,它不依赖数据库(默认用H2),所以安装过程比GitLab轻量得多,新手按这个顺序操作就行:
- 准备一台Ubuntu 20.04或22.04的虚拟机,内存建议2GB以上
- 安装OpenJDK 11或17(Gerrit 3.6以后推荐Java 17)
- 创建专用的gerrit系统用户,避免用root跑服务
- 下载gerrit.war文件(版本选3.7.x或3.8.x稳定版)
- 执行
java -jar gerrit.war init交互式初始化 - 配置Nginx或Apache做反向代理(为了让浏览器能通过域名访问)
- 启动Gerrit,确认8080端口畅通
这套流程里,最容易翻车的是Java版本不匹配和存储路径权限问题,我见过不少新手卡在“初始化成功但启动失败”,最后发现是HOME目录没写权限,下面分模块拆解。
gerrit代码审查服务器怎么搭建?先准备虚拟机环境
搭建gerrit前,虚拟机本身要满足三个条件:能联网、静态IP、时间同步,时间不同步会导致SSH认证和HTTP请求报错,这是很多新手忽略的点。
虚拟机配置给多少内存才够用?
行业共识认为,Gerrit在2GB内存下可以流畅支撑一个小团队(10-20人)日常使用,如果你的仓库数量多、并发审查量大,建议给4GB,另外需要注意,Gerrit默认使用H2数据库,所有数据都存在文件里,所以磁盘要预留至少10GB,用free -h和df -h先检查一下,不够就先扩容。
安装JDK和下载gerrit.war的具体命令
在Ubuntu上安装Java很简单:
sudo apt update sudo apt install -y openjdk-17-jdk java -version
然后创建专用用户:
sudo useradd -m -s /bin/bash gerrit sudo passwd gerrit
切换用户,下载war包:
su - gerrit mkdir -p ~/gerrit && cd ~/gerrit wget https://gerrit-releases.storage.googleapis.com/gerrit-3.8.4.war
这里特别提醒:不要用root运行Gerrit,因为初始化时很多文件会归属root,后续Gerrit进程无法写入,报错非常难排查,如果已经用root初始化了,赶紧把目录所有权改回来:
sudo chown -R gerrit:gerrit /home/gerrit/gerrit
初始化Gerrit时最容易踩的3个坑(含gerrit搭建踩坑记录)
执行java -jar gerrit.war init -d ~/gerrit后,会有一连串交互式问答,新手往往被这些英文提示吓到,其实多数问题直接回车用默认值即可,但下面这三个坑必须提前知道。
坑一:认证方式选错了
初始化时会问Authentication method,默认是OPENID,我建议你选HTTP,因为OpenID依赖外部服务,在国内网络环境下经常连不上,选HTTP之后,Gerrit会通过Nginx做基于Basic Auth的登录,简单可控,具体操作:在提示时输入http并回车。
坑二:数据库和索引路径没配好
默认数据库是H2,路径在/home/gerrit/gerrit/db,这个可以继承默认,但有个问题经常出现:默认的Lucene索引路径在/tmp下,重启虚拟机后数据丢失,如果你想保留索引,就在初始化时手动改成:
Index type [lucene]? Index directory [./index]? /home/gerrit/gerrit/index
坑三:监听地址必须是0.0.0.0
初始化过程中会问Listen on,默认是(表示所有接口),如果你手滑改成0.0.1,那么虚拟机外部的浏览器永远访问不了,正确做法是保持默认或明确写0.0.0,这个坑新手经常踩,业内专家指出,九成搭建失败都是网络监听配置错误。
用Nginx反向代理让Gerrit通过域名访问
Gerrit默认监听8080端口,但你肯定不想让用户记端口号,用Nginx把http://review.example.com转发到本机8080就清爽多了。
安装并配置Nginx
sudo apt install -y nginx
编辑配置文件:
sudo nano /etc/nginx/sites-available/gerrit
server {
listen 80;
server_name review.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
这个配置最关键的是要传X-Forwarded-Proto头,否则Gerrit会误判请求协议,导致生成的链接一直是http,登录状态也存不住。
启动Gerrit和Nginx
cd ~/gerrit && ./bin/gerrit.sh start sudo ln -s /etc/nginx/sites-available/gerrit /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx
此时在浏览器访问http://review.example.com,就能看到Gerrit的登录页面了,如果打不开,先检查防火墙:
sudo ufw allow 80/tcp sudo ufw allow 8080/tcp
注意:Nginx反向代理不是可选项,是必选项,因为Gerrit的Web SSH和Git HTTP协议依赖正确的Host头,直接用IP+端口访问很容易出现“仓库路径错误”的诡异问题。
新手常见问题Q&A(围绕gerrit搭建常见问题)
Q1:Gerrit初始化成功后,访问8080端口显示“无法访问此网站”,怎么办?
先确认端口是否在监听:ss -tlnp | grep java,如果看到:8080,说明进程正常,问题出在防火墙或VM网络模式,如果没看到,去查/home/gerrit/gerrit/logs/error_log,常见报错是Address already in use或Permission denied,还有一种情况是你用了桥接网卡的虚拟机,但IP地址和宿主机不在同一网段,这时需要把虚拟机网络改成NAT或桥接模式并重新获取IP。
Q2:Gerrit的SSH端口(29418)总连不上,怎么排查?
Gerrit的SSH端口和Git推送密切相关,首先确认/home/gerrit/gerrit/etc/gerrit.config中有以下配置:
[sshd]
listenAddress = :29418
然后检查虚拟机防火墙是否放行:sudo ufw allow 29418/tcp,最后在客户端测试:ssh -p 29418 yourname@review.example.com,如果提示Permission denied (publickey),说明SSH服务正常,只是公钥没配好,此时需要在Gerrit网页端“Settings → SSH Keys”里添加你的公钥。
Q3:Gerrit启动后内存占用过高,2GB的虚拟机快卡死了,怎么优化?
Gerrit默认给JVM分配了较大的堆内存,可以通过修改/home/gerrit/gerrit/etc/gerrit.config中的heapLimit来限制,
[container]
heapLimit = 1g
修改后重启Gerrit,如果索引数据量大,可以定期执行./bin/gerrit.sh gc清理旧日志,多数情况下,1GB堆内存足够支撑小团队日常使用,不需要盲目加大。