安装#
安装 JDK#
Gerrit 基于 Java 开发,因此依赖 JAVA 的运行环境,当前最新 3.13 版本要求至少 Java 21。因此需要先安装 JRE。
# 创建jdk存放目录
mkdir /usr/local/java
# 将压缩包解压到上述目录当中
tar -zxvf jdk-21_linux-64_bin.tar.gz -C /usr/local/java
# 创建软连接
# 需要先删除系统可能自带的软连接
# 然后重新创建 java 软链接到 /usr/bin/ 目录下
ln -s /usr/local/java/jdk-21.0.5/ /usr/bin/java
# 编辑系统配置文件
em /etc/profile
# 输入以下内容
export JAVA_HOME=/usr/bin/java
export PATH=$JAVA_HOME/bin:$PATH
# 激活配置文件
source /etc/profile
java --versionbash安装 Gerrit#
Gerrit 账号创建并使用:
sudo adduser gerrit
sudo su gerrit
cd /home/gerritbashGerrit 安装
java -jar gerrit-3.10.1.war init -d /home/gerritbash安装时初始参数:
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增加用户用 -mbash此时 gerrit/etc/gerrit.conf 配置如下:
[gerrit]
basePath = git
canonicalWebUrl = <http://192.168.52.46:8088>
serverId = 3d9af676-03aa-4cc6-a75c-98d76682443e
[container]
javaOptions = "-Dflogger.backend_factory=com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance"
javaOptions = "-Dflogger.logging_context=com.google.gerrit.server.logging.LoggingContext#getInstance"
user = gerrit
javaHome = /usr/local/java/jdk-25.0.1
[index]
type = lucene
[auth]
type = HTTP
userNameCaseInsensitive = true
[receive]
enableSignedPush = false
[sendemail]
smtpServer = 192.168.52.46
smtpServerPort = 25
smtpUser = gerrit
[sshd]
listenAddress = *:29418
[httpd]
listenUrl = proxy-http://*:8088/
[cache]
directory = cachebash配置反向代理#
设置 nginx#
em /etc/nginx/conf.d/gerrit.conf
server {
listen 81; # 代理监听81端口
server_name 192.168.52.46;
auth_basic "Welcome to Gerrit Code Review Site!";
auth_basic_user_file /home/gerrit/gerrit/etc/gerrit.password; # 代理使用 gerrit.password
location / {
proxy_pass <http://192.168.52.46:8088>; # 代理指向gerrit本地服务url,这个url要和gerrit.config中的canonicalWebUrl相同
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_set_header Cache-Control "no-store";
proxy_set_header Pragma "no-cache";
proxy_set_header Expires "-1";
}
location = /logout {
return 302 <http://logout:logout@192.168.52.46:81/>;
}
}bash其中
location = /logout {
return 302 <http://logout:logout@192.168.52.46:81/>;
}bash这一部分是因为:
Gerrit 的 HTTP 验证通常依赖外部的反向代理(如 Nginx、Apache)来处理用户的认证,客户端通过浏览器发送 HTTP basic authentication 的头部信息(Authorization: Basic <credentials>)来完成验证。
HTTP 验证的特点是:
- 用户的登录状态由浏览器缓存的 Basic Authentication 凭据维持,不存储在 Gerrit 中。
- 用户点击
Sign out后,Gerrit 本身无法清除浏览器上缓存的凭据。 - 此外,现代浏览器的 HTTP Basic Auth 无法通过 JS 或页面行为主动触发清理,退出登录变得较为困难。
**浏览器缓存了 Basic Authentication 凭证,**即使点击了 Sign out,浏览器依然用之前缓存的凭据重新发送认证请求,导致用户无法登出。
基于火狐内核的解决方案:
- 浏览器会对包含
logout:logout@这样形式的 URL 自动处理,直接向目标服务器发送带有Authorization头的请求。 - 因为提供的用户名和密码(
logout:logout)在服务器端被拒绝,导致浏览器认为当前凭据已经失效,从而清除缓存的 HTTP Basic Authentication 会话。