Skip to content
Table of contents

Gerrit 安装

2 min read ··· views #gerrit

安装

安装 JDK

Gerrit 基于 Java 开发,依赖 Java 运行环境。当前最新的 3.13 版本要求至少 Java 21,因此需要先安装 JRE。

安装 Gerrit

先创建 Gerrit 账号并切换到该用户:

sudo adduser gerrit

sudo su gerrit
cd /home/gerrit
bash

Gerrit 安装

java -jar gerrit-3.10.1.war init -d /home/gerrit
bash

安装过程中的初始参数设置如下:

  • Auth 方式输入 HTTP,并使用反向代理;
  • Plugin 相关选项全部选择 y。

配置用户:

htpasswd -c /home/gerrit/gerrit/etc/gerrit.password admin     # 创建第一个用户admin,同时会生成一个gerrit.password文件
htpasswd -m /home/gerrit/gerrit/etc/gerrit.password user1     # 在gerrit.password增加用户用 -m
bash

此时 gerrit/etc/gerrit.conf 配置如下:

配置反向代理

设置 nginx

em /etc/nginx/conf.d/gerrit.conf

其中 location = /logout 这一段用于解决登出问题:

location = /logout {
        return 302 <http://logout:logout@192.168.52.46:81/>;
}
bash

原因如下:Gerrit 的 HTTP 验证通常依赖外部的反向代理(如 Nginx、Apache)来处理用户认证,客户端通过浏览器发送 HTTP basic authentication 头信息(Authorization: Basic <credentials>)来完成验证。

HTTP 验证的特点如下:

  1. 用户的登录状态由浏览器缓存的 Basic Authentication 凭据维持,不存储在 Gerrit 中。
  2. 用户点击 Sign out 后,Gerrit 本身无法清除浏览器上缓存的凭据。
  3. 现代浏览器的 HTTP Basic Auth 无法通过 JS 或页面行为主动触发清理,因此退出登录比较困难。

根本原因在于浏览器缓存了 Basic Authentication 凭证:即使点击 Sign out,浏览器仍会用之前缓存的凭据重新发送认证请求,导致用户无法登出。

基于火狐内核的解决方案如下:

  • 浏览器会自动处理包含 logout:logout@ 形式的 URL,直接向目标服务器发送带 Authorization 头的请求。
  • 由于提供的用户名和密码(logout:logout)在服务器端被拒绝,浏览器会认为当前凭据已失效,从而清除缓存的 HTTP Basic Authentication 会话。