20 KiB
20 KiB
Gerrit 个人使用完整安装与使用指南
📋 目录
环境准备
适合的系统
- Ubuntu 18.04+ / 20.04 / 22.04
- Debian 10+ / 11+
- CentOS 7+ / Rocky Linux 8+
云主机建议配置
- CPU: 1-2核
- 内存: 2GB
- 磁盘: 20GB+ (根据项目数量调整)
- 网络: 公网IP(如需远程访问)
必备软件
- Git: 版本控制工具
- JDK: Java 11 或 Java 17(推荐 Java 17)
- wget: 下载工具
手动安装步骤
步骤 1: 系统更新
# Ubuntu/Debian 系统
sudo apt update && sudo apt upgrade -y
# CentOS/Rocky Linux 系统
sudo yum update -y
# 或者 (CentOS 8+)
sudo dnf update -y
步骤 2: 安装依赖软件
Ubuntu/Debian 系统
# 安装 Git 和 wget
sudo apt install -y git wget
# 安装 OpenJDK 17
sudo apt install -y openjdk-17-jdk
# 验证安装
java -version
git --version
CentOS/Rocky Linux 系统
# 安装 Git 和 wget
sudo yum install -y git wget
# 或者 (CentOS 8+)
sudo dnf install -y git wget
# 安装 OpenJDK 17
sudo yum install -y java-17-openjdk java-17-openjdk-devel
# 或者 (CentOS 8+)
sudo dnf install -y java-17-openjdk java-17-openjdk-devel
# 验证安装
java -version
git --version
步骤 3: 创建工作目录
# 创建 Gerrit 工作目录
sudo mkdir -p /opt/gerrit
sudo chown $USER:$USER /opt/gerrit
cd /opt/gerrit
步骤 4: 下载 Gerrit.war 文件
# 下载最新稳定版本(以 3.9.0 为例,可根据需要修改版本号)
GERRIT_VERSION=3.9.0
wget https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war
# 或者下载特定版本
# wget https://gerrit-releases.storage.googleapis.com/gerrit-3.8.0.war
步骤 5: 初始化 Gerrit(使用内置 H2 数据库)
# 初始化 Gerrit,使用 H2 数据库(适合个人使用)
java -jar gerrit-${GERRIT_VERSION}.war init -d review_site
# 初始化过程中会提示以下配置,建议选择:
# - 数据库类型: [2] H2 (默认,适合个人使用)
# - 认证方式: [1] DEVELOPMENT_BECOME_ANY_ACCOUNT (开发模式,方便测试)
# 或者 [2] HTTP (生产环境推荐)
# - Git 仓库位置: 直接回车使用默认值
# - 索引类型: [1] LUCENE (默认)
# - 监听地址: 直接回车使用默认 (0.0.0.0)
# - 监听端口: 直接回车使用默认 (29418) 或输入自定义端口
# - 是否作为守护进程运行: [Y] 是
# - 是否安装 Bouncy Castle: [Y] 是
注意: 如果希望非交互式初始化,可以使用以下命令:
java -jar gerrit-${GERRIT_VERSION}.war init \
-d review_site \
--batch \
--no-auto-start \
--install-plugin=download-commands \
--install-plugin=replication \
--install-plugin=reviewnotes
步骤 6: 启动 Gerrit 服务
# 进入 Gerrit 站点目录
cd /opt/gerrit/review_site
# 启动 Gerrit
bin/gerrit.sh start
# 查看状态
bin/gerrit.sh status
# 查看日志
tail -f logs/gerrit.log
步骤 7: 访问 Gerrit
101.43.95.130 http://101.43.95.130:8080 打开浏览器访问:
- Web 界面:
http://你的服务器IP:8080或http://localhost:8080 - SSH 端口:
29418(默认)
一键自动化安装脚本
以下脚本会自动判断系统类型、安装依赖、下载 Gerrit、初始化并启动服务。
创建安装脚本
cat > install_gerrit.sh << 'EOF'
#!/bin/bash
# Gerrit 一键安装脚本
# 支持 Ubuntu/Debian 和 CentOS/Rocky Linux
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 配置变量
GERRIT_VERSION="${GERRIT_VERSION:-3.9.0}"
GERRIT_HOME="/opt/gerrit"
GERRIT_USER="${USER}"
GERRIT_PORT="${GERRIT_PORT:-8080}"
GERRIT_SSH_PORT="${GERRIT_SSH_PORT:-29418}"
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}Gerrit 自动化安装脚本${NC}"
echo -e "${GREEN}版本: ${GERRIT_VERSION}${NC}"
echo -e "${GREEN}========================================${NC}"
# 检测系统类型
detect_os() {
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$ID
OS_VERSION=$VERSION_ID
elif [ -f /etc/redhat-release ]; then
OS="rhel"
OS_VERSION=$(cat /etc/redhat-release | sed 's/.*release \([0-9]\+\).*/\1/')
else
echo -e "${RED}无法检测操作系统类型${NC}"
exit 1
fi
echo -e "${YELLOW}检测到系统: ${OS} ${OS_VERSION}${NC}"
}
# 安装依赖
install_dependencies() {
echo -e "${GREEN}开始安装依赖...${NC}"
if [[ "$OS" == "ubuntu" ]] || [[ "$OS" == "debian" ]]; then
sudo apt update
sudo apt install -y git wget openjdk-17-jdk
elif [[ "$OS" == "centos" ]] || [[ "$OS" == "rhel" ]] || [[ "$OS" == "rocky" ]]; then
if command -v dnf &> /dev/null; then
sudo dnf install -y git wget java-17-openjdk java-17-openjdk-devel
else
sudo yum install -y git wget java-17-openjdk java-17-openjdk-devel
fi
else
echo -e "${RED}不支持的操作系统: ${OS}${NC}"
exit 1
fi
# 验证 Java 安装
if ! java -version 2>&1 | grep -q "version"; then
echo -e "${RED}Java 安装失败${NC}"
exit 1
fi
echo -e "${GREEN}依赖安装完成${NC}"
}
# 创建工作目录
create_directories() {
echo -e "${GREEN}创建工作目录...${NC}"
sudo mkdir -p ${GERRIT_HOME}
sudo chown ${GERRIT_USER}:${GERRIT_USER} ${GERRIT_HOME}
cd ${GERRIT_HOME}
}
# 下载 Gerrit
download_gerrit() {
echo -e "${GREEN}下载 Gerrit ${GERRIT_VERSION}...${NC}"
cd ${GERRIT_HOME}
if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then
wget https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war
else
echo -e "${YELLOW}Gerrit war 文件已存在,跳过下载${NC}"
fi
}
# 初始化 Gerrit
init_gerrit() {
echo -e "${GREEN}初始化 Gerrit...${NC}"
cd ${GERRIT_HOME}
if [ -d "review_site" ]; then
echo -e "${YELLOW}Gerrit 已初始化,跳过初始化步骤${NC}"
return
fi
# 非交互式初始化
java -jar gerrit-${GERRIT_VERSION}.war init \
-d review_site \
--batch \
--no-auto-start \
-D gerrit.canonicalWebUrl=http://$(hostname -I | awk '{print $1}'):${GERRIT_PORT}/ \
--install-plugin=download-commands \
--install-plugin=replication \
--install-plugin=reviewnotes || true
# 配置认证方式为开发模式(方便个人使用)
cat > review_site/etc/gerrit.config << EOCONFIG
[gerrit]
basePath = git
canonicalWebUrl = http://$(hostname -I | awk '{print $1}'):${GERRIT_PORT}/
serverId = $(uuidgen 2>/dev/null || echo $(date +%s))
[database]
type = h2
database = db/ReviewDB
[auth]
type = DEVELOPMENT_BECOME_ANY_ACCOUNT
[sshd]
listenAddress = *:${GERRIT_SSH_PORT}
[httpd]
listenUrl = http://*:${GERRIT_PORT}/
[cache]
directory = cache
[index]
type = LUCENE
[receive]
enableSignedPush = false
EOCONFIG
echo -e "${GREEN}Gerrit 初始化完成${NC}"
}
# 启动 Gerrit
start_gerrit() {
echo -e "${GREEN}启动 Gerrit 服务...${NC}"
cd ${GERRIT_HOME}/review_site
# 启动服务
bin/gerrit.sh start
# 等待服务启动
sleep 5
# 检查状态
if bin/gerrit.sh status | grep -q "Running"; then
echo -e "${GREEN}Gerrit 服务启动成功!${NC}"
else
echo -e "${RED}Gerrit 服务启动失败,请检查日志${NC}"
echo -e "${YELLOW}查看日志: tail -f ${GERRIT_HOME}/review_site/logs/gerrit.log${NC}"
exit 1
fi
}
# 创建 systemd 服务(可选)
create_systemd_service() {
echo -e "${GREEN}创建 systemd 服务...${NC}"
sudo tee /etc/systemd/system/gerrit.service > /dev/null << EOSERVICE
[Unit]
Description=Gerrit Code Review
After=network.target
[Service]
Type=forking
User=${GERRIT_USER}
Group=${GERRIT_USER}
ExecStart=${GERRIT_HOME}/review_site/bin/gerrit.sh start
ExecStop=${GERRIT_HOME}/review_site/bin/gerrit.sh stop
ExecReload=${GERRIT_HOME}/review_site/bin/gerrit.sh restart
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOSERVICE
sudo systemctl daemon-reload
sudo systemctl enable gerrit
echo -e "${GREEN}systemd 服务创建完成${NC}"
echo -e "${YELLOW}使用以下命令管理服务:${NC}"
echo -e " 启动: sudo systemctl start gerrit"
echo -e " 停止: sudo systemctl stop gerrit"
echo -e " 重启: sudo systemctl restart gerrit"
echo -e " 状态: sudo systemctl status gerrit"
}
# 输出访问信息
print_info() {
SERVER_IP=$(hostname -I | awk '{print $1}')
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}安装完成!${NC}"
echo -e "${GREEN}========================================${NC}"
echo -e "${YELLOW}访问地址:${NC}"
echo -e " Web 界面: http://${SERVER_IP}:${GERRIT_PORT}"
echo -e " SSH 端口: ${GERRIT_SSH_PORT}"
echo -e ""
echo -e "${YELLOW}常用命令:${NC}"
echo -e " 启动服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh start"
echo -e " 停止服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh stop"
echo -e " 重启服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh restart"
echo -e " 查看状态: ${GERRIT_HOME}/review_site/bin/gerrit.sh status"
echo -e " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/gerrit.log"
echo -e ""
echo -e "${YELLOW}配置文件位置:${NC}"
echo -e " ${GERRIT_HOME}/review_site/etc/gerrit.config"
echo -e ""
echo -e "${YELLOW}首次访问:${NC}"
echo -e " 1. 打开浏览器访问 http://${SERVER_IP}:${GERRIT_PORT}"
echo -e " 2. 使用任意用户名登录(开发模式)"
echo -e " 3. 第一个登录的用户将自动成为管理员"
echo -e "${GREEN}========================================${NC}"
}
# 主函数
main() {
detect_os
install_dependencies
create_directories
download_gerrit
init_gerrit
start_gerrit
# 询问是否创建 systemd 服务
read -p "是否创建 systemd 服务以便开机自启? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
create_systemd_service
fi
print_info
}
# 执行主函数
main
EOF
chmod +x install_gerrit.sh
运行安装脚本
# 直接运行(使用默认配置)
./install_gerrit.sh
# 或者指定版本和端口
GERRIT_VERSION=3.8.0 GERRIT_PORT=8080 ./install_gerrit.sh
使用指南
1. 首页访问与管理员账户创建
访问 Gerrit
- 打开浏览器,访问
http://你的服务器IP:8080 - 首次访问会看到 Gerrit 欢迎页面
创建管理员账户
方式一:开发模式(推荐个人使用)
如果使用 DEVELOPMENT_BECOME_ANY_ACCOUNT 认证方式:
- 点击右上角 "Sign In"
- 输入任意用户名(例如:
admin) - 点击 "Sign In"
- 第一个登录的用户自动成为管理员
方式二:HTTP 认证
- 首次访问会提示创建账户
- 输入用户名和邮箱
- 设置密码
- 第一个账户自动成为管理员
验证管理员权限
登录后,点击右上角用户名 → "Settings" → 左侧菜单应显示 "Administration" 选项。
2. 创建项目仓库
在 Web 界面创建项目
- 登录 Gerrit
- 点击顶部菜单 "Projects" → "Create Project"
- 填写项目信息:
- Project Name:
my-project(例如) - Parent:
All-Projects(默认) - Description: 项目描述(可选)
- Submit Type:
Merge If Necessary(推荐) - Create initial empty commit: 勾选(推荐)
- Project Name:
- 点击 "Create Project"
通过命令行创建项目
# 使用 SSH 连接 Gerrit
ssh -p 29418 admin@你的服务器IP gerrit create-project my-project
# 或者使用 HTTP API(需要配置)
curl -X PUT \
--user admin:密码 \
http://你的服务器IP:8080/a/projects/my-project
3. 在本地 Git 配置与克隆仓库
配置 Git 用户信息
# 设置全局用户信息
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 配置 Gerrit 服务器
git config --global review.你的服务器IP:29418.username admin
克隆仓库
# 方式一:通过 SSH(推荐)
git clone ssh://admin@你的服务器IP:29418/my-project
# 方式二:通过 HTTP
git clone http://你的服务器IP:8080/my-project
配置 Git 远程仓库
如果已经有一个本地 Git 仓库,可以添加 Gerrit 作为远程仓库:
cd your-existing-repo
git remote add gerrit ssh://admin@你的服务器IP:29418/my-project
# 或者
git remote add gerrit http://你的服务器IP:8080/my-project
4. 开发提交流程
标准提交流程(代码评审)
# 1. 进入项目目录
cd my-project
# 2. 创建或切换到开发分支
git checkout -b feature/new-feature
# 3. 进行代码修改
echo "# My Project" > README.md
git add README.md
# 4. 提交更改
git commit -m "Add README file"
# 5. 推送到 Gerrit 进行评审
# 关键:推送到 refs/for/master 分支(不是直接推送到 master)
git push origin HEAD:refs/for/master
# 如果配置了 review 用户名,可以使用:
git push gerrit HEAD:refs/for/master
重要说明:
refs/for/master表示推送到master分支的评审队列- 推送后会生成一个 Change(变更),需要经过评审才能合并
- 推送成功后,Gerrit 会返回 Change 的 URL
推送示例输出
remote: Resolving deltas: 100% (1/1)
remote: Processing changes: refs: 1, new: 1
remote:
remote: SUCCESS
remote:
remote: http://你的服务器IP:8080/c/my-project/+/1 [NEW]
remote:
To ssh://你的服务器IP:29418/my-project
* [new branch] HEAD -> refs/for/master
5. 在网页界面进行代码评审并合并
查看变更
- 推送成功后,复制 Gerrit 返回的 URL
- 在浏览器中打开该 URL,或登录 Gerrit 后点击 "Changes" 查看
代码评审流程
-
查看变更详情
- 点击 Change 进入详情页
- 查看文件差异(Diff)
- 查看提交信息
-
添加评论
- 在代码行上点击,添加行内评论
- 在页面底部添加整体评论
-
评审投票
- Code-Review:
+2= 批准合并+1= 看起来不错,但需要其他人批准-1= 需要修改-2= 拒绝
- Verified:
+1= 验证通过-1= 验证失败
- Code-Review:
-
提交者修改代码(如果需要)
# 修改代码后,追加提交(会自动关联到同一个 Change)
git add .
git commit --amend # 修改最后一次提交
git push origin HEAD:refs/for/master
- 合并变更
当满足以下条件时,变更可以自动合并:
- Code-Review: +2
- Verified: +1(如果启用了 Verified 标签)
或者管理员可以手动点击 "Submit" 按钮合并。
合并后的操作
# 更新本地仓库
cd my-project
git checkout master
git pull origin master
# 删除已合并的特性分支
git branch -d feature/new-feature
6. 常用技巧
跳过评审直接推送(个人使用)
如果只是个人使用,可以配置直接推送:
# 方法一:推送到 refs/heads/master(绕过评审)
git push origin HEAD:refs/heads/master
# 方法二:配置项目权限,允许直接推送
# 在 Gerrit Web 界面:
# Projects → my-project → Access → Edit
# 添加权限:
# Reference: refs/heads/*
# Push: 允许你的用户组
修改端口
编辑配置文件:
sudo nano /opt/gerrit/review_site/etc/gerrit.config
修改以下部分:
[httpd]
listenUrl = http://*:9090/ # 修改为 9090 端口
[sshd]
listenAddress = *:29419 # 修改 SSH 端口为 29419
重启服务:
/opt/gerrit/review_site/bin/gerrit.sh restart
备份数据
# 1. 停止 Gerrit 服务
/opt/gerrit/review_site/bin/gerrit.sh stop
# 2. 备份整个站点目录
tar -czf gerrit-backup-$(date +%Y%m%d).tar.gz /opt/gerrit/review_site
# 3. 或者只备份重要数据
# 备份 Git 仓库
tar -czf gerrit-git-$(date +%Y%m%d).tar.gz /opt/gerrit/review_site/git
# 备份数据库(H2)
cp -r /opt/gerrit/review_site/db /backup/gerrit-db-$(date +%Y%m%d)
# 备份配置
cp -r /opt/gerrit/review_site/etc /backup/gerrit-etc-$(date +%Y%m%d)
# 4. 启动服务
/opt/gerrit/review_site/bin/gerrit.sh start
恢复数据
# 1. 停止服务
/opt/gerrit/review_site/bin/gerrit.sh stop
# 2. 恢复备份
tar -xzf gerrit-backup-20240101.tar.gz -C /
# 3. 启动服务
/opt/gerrit/review_site/bin/gerrit.sh start
查看日志
# 实时查看日志
tail -f /opt/gerrit/review_site/logs/gerrit.log
# 查看错误日志
tail -f /opt/gerrit/review_site/logs/error_log
# 查看 SSH 日志
tail -f /opt/gerrit/review_site/logs/sshd_log
修改管理员账户
# 通过 SSH 命令添加管理员
ssh -p 29418 admin@你的服务器IP gerrit set-members --add admin Administrators
# 查看管理员组
ssh -p 29418 admin@你的服务器IP gerrit gsql -c "SELECT account_id, full_name FROM accounts WHERE account_id IN (SELECT account_id FROM account_group_members WHERE group_id IN (SELECT group_id FROM account_groups WHERE name='Administrators'));"
配置邮件通知(可选)
编辑配置文件:
sudo nano /opt/gerrit/review_site/etc/gerrit.config
添加邮件配置:
[sendemail]
smtpServer = smtp.example.com
smtpServerPort = 587
smtpEncryption = tls
smtpUser = your-email@example.com
smtpPass = your-password
from = Gerrit Code Review <noreply@example.com>
性能优化
对于个人使用,可以调整以下配置:
sudo nano /opt/gerrit/review_site/etc/gerrit.config
[cache]
directory = cache
[core]
packedGitOpenFiles = 128
packedGitLimit = 100m
packedGitWindowSize = 8k
常用命令速查
服务管理
# 启动
/opt/gerrit/review_site/bin/gerrit.sh start
# 停止
/opt/gerrit/review_site/bin/gerrit.sh stop
# 重启
/opt/gerrit/review_site/bin/gerrit.sh restart
# 状态
/opt/gerrit/review_site/bin/gerrit.sh status
# 查看日志
tail -f /opt/gerrit/review_site/logs/gerrit.log
Git 操作
# 推送代码评审
git push origin HEAD:refs/for/master
# 直接推送(跳过评审)
git push origin HEAD:refs/heads/master
# 修改提交后重新推送
git commit --amend
git push origin HEAD:refs/for/master
# 查看远程分支
git ls-remote origin
Gerrit 命令行工具
# 创建项目
ssh -p 29418 admin@服务器 gerrit create-project my-project
# 查看项目列表
ssh -p 29418 admin@服务器 gerrit ls-projects
# 查看用户信息
ssh -p 29418 admin@服务器 gerrit query --format=JSON --current-patch-set change:1
故障排查
问题 1: 无法访问 Web 界面
检查项:
- 服务是否运行:
/opt/gerrit/review_site/bin/gerrit.sh status - 端口是否被占用:
netstat -tlnp | grep 8080 - 防火墙是否开放端口:
# Ubuntu/Debian sudo ufw allow 8080/tcp # CentOS sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload - 查看错误日志:
tail -f /opt/gerrit/review_site/logs/gerrit.log
问题 2: SSH 连接失败
检查项:
- SSH 服务是否运行:检查 Gerrit 日志
- 端口是否正确:默认 29418
- 用户权限:确保用户已注册
问题 3: 推送失败
常见错误:
Permission denied: 检查项目权限配置Branch refs/for/master not found: 确保推送到refs/for/master而不是masterAuthentication failed: 检查 SSH 密钥或 HTTP 认证配置
总结
恭喜!你已经完成了 Gerrit 的安装和基本配置。现在你可以:
- ✅ 通过 Web 界面管理代码评审
- ✅ 使用 Git 推送代码进行评审
- ✅ 在网页上进行代码审查和合并
- ✅ 管理项目仓库和用户权限
下一步建议:
- 配置邮件通知(如果需要)
- 设置项目权限规则
- 安装常用插件(如:download-commands, replication)
- 配置定期备份
祝你使用愉快!如有问题,请查看 Gerrit 官方文档:https://www.gerritcodereview.com/