gerrit在linux上能跑起来的核心是:java和git版本正确、gerrit.war用专用用户初始化、http/ssh端口未被占用;java仅支持11或17,必须用jdk而非jre,init必须非root用户执行并严格设置目录权限,http访问必须经反向代理,否则无法登录。

直接上结论:Gerrit 在 Linux 上能跑起来,核心就三件事——Java 和 Git 必须装对版本,gerrit.war 初始化必须用专用用户执行,HTTP/SSH 端口不能被防火墙或已有服务占着。其他配置(比如反向代理、数据库、LDAP)都是可选项,但跳过它们不代表能省事,反而容易在登录、克隆、提交时卡住。
Java 版本和路径必须匹配 Gerrit 要求
Gerrit 3.4+ 官方只支持 Java 11 或 Java 17(部分 3.8+ 开始实验性支持 Java 21),Java 8 已被彻底弃用;Java 13–16、Java 18–20 全部不兼容。运行 java -version 输出必须是类似 11.0.22 或 17.0.8 这样的格式,不能是 13.0.1 或 20.0.2。
- 用
yum install java-11-openjdk-devel(CentOS/RHEL)或apt install openjdk-11-jdk(Ubuntu/Debian)安装,别用default-jre,它可能拉来错版本 -
which java和readlink -f $(which java)要指向 JDK 的bin/java,不是 JRE;否则gerrit.war init会报NoClassDefFoundError: javax/xml/bind/JAXBContext - 不要手动设
JAVA_HOME后再改/etc/profile—— Gerrit 启动脚本(bin/gerrit.sh)默认读的是$JAVA_HOME/bin/java,若路径不对,服务起不来但日志里只显示 “Failed to start”
init -d 必须用非 root 用户且目录权限要收紧
用 root 执行 java -jar gerrit.war init -d /opt/gerrit 看似省事,实则埋雷:生成的 SSH host key、Git 仓库、数据库文件全归 root,后续 bin/gerrit.sh start 切换到 gerrit 用户后根本读不了,日志里反复出现 Permission denied (publickey) 或 Cannot lock ref。
- 先
adduser --home /home/gerrit --shell /bin/bash gerrit创建专用用户 - 把
gerrit.war放进/home/gerrit/,然后su - gerrit再执行java -jar gerrit.war init -d ~/review_site - 初始化完立刻执行
chown -R gerrit:gerrit ~/review_site;特别注意~/review_site/git/和~/review_site/etc/两个目录,漏一个都会导致项目创建失败或配置无法保存
HTTP 访问必须走反向代理,裸端口 8080 无法登录
即使你按默认配了 Listen on port [8080],浏览器打开 http://ip:8080 也会卡在登录页,点“Sign In”没反应,控制台报 Failed to load resource: net::ERR_CONNECTION_REFUSED。这不是 Gerrit 没启动,而是它的 Session 和 Cookie 机制强制要求 canonicalWebUrl 域名与实际访问域名一致,且协议、端口、路径全部匹配。
- 要么用 Nginx 做反代(推荐),配好
proxy_pass http://127.0.0.1:8080后,在review_site/etc/gerrit.config里写死:[gerrit] canonicalWebUrl = https://gerrit.example.com - 要么用 Apache +
mod_proxy_http,但必须启用ProxyRequests Off和ProxyPreserveHost On,否则 Gerrit 收不到真实 Host 头 - 别信“先用 8080 跑通再加代理”的说法——HTTP 认证流程从第一步就依赖反代头,跳不过
SSH 克隆失败常见于密钥格式和端口冲突
执行 git clone ssh://admin@gerrit.example.com:29418/All-Projects 报 Connection refused 或 Permission denied (publickey),大概率不是密码错了,而是:
-
review_site/etc/sshd_config里的listenAddress是*:29418,但服务器防火墙(firewalld或ufw)没放行该端口;检查用ss -tlnp | grep :29418,没输出说明 Gerrit SSH daemon 根本没监听 - 客户端用的是 RSA 密钥,但 Gerrit 3.6+ 默认禁用
ssh-rsa签名(因 SHA-1 不安全),得在客户端~/.ssh/config加:Host gerrit.example.com PubkeyAcceptedAlgorithms +ssh-rsa HostkeyAlgorithms +ssh-rsa - 或者更稳妥:服务端生成 ED25519 密钥(
ssh-keygen -t ed25519 -f review_site/etc/ssh_host_ed25519_key),并在review_site/etc/gerrit.config中指定:[sshd] hostKey = ssh_host_ed25519_key
最常被忽略的一点:Gerrit 初始化后不会自动创建 All-Projects 仓库,首次登录 Web 界面时,必须用管理员账号(初始化时设置的那个)手动点 “Create new project”,勾选 “Create initial empty commit”,否则所有 git clone 都会失败,错误信息却只显示 “Repository not found”。











