Files
gerrit/Gerrit安装使用指南.md
2025-12-22 17:12:39 +08:00

856 lines
20 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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: 系统更新
```bash
# 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 系统
```bash
# 安装 Git 和 wget
sudo apt install -y git wget
# 安装 OpenJDK 17
sudo apt install -y openjdk-17-jdk
# 验证安装
java -version
git --version
```
#### CentOS/Rocky Linux 系统
```bash
# 安装 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: 创建工作目录
```bash
# 创建 Gerrit 工作目录
sudo mkdir -p /opt/gerrit
sudo chown $USER:$USER /opt/gerrit
cd /opt/gerrit
```
### 步骤 4: 下载 Gerrit.war 文件
```bash
# 下载最新稳定版本(以 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 数据库)
```bash
# 初始化 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] 是
```
**注意**: 如果希望非交互式初始化,可以使用以下命令:
```bash
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 服务
```bash
# 进入 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、初始化并启动服务。
### 创建安装脚本
```bash
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
```
### 运行安装脚本
```bash
# 直接运行(使用默认配置)
./install_gerrit.sh
# 或者指定版本和端口
GERRIT_VERSION=3.8.0 GERRIT_PORT=8080 ./install_gerrit.sh
```
---
## 使用指南
### 1. 首页访问与管理员账户创建
#### 访问 Gerrit
1. 打开浏览器,访问 `http://你的服务器IP:8080`
2. 首次访问会看到 Gerrit 欢迎页面
#### 创建管理员账户
**方式一:开发模式(推荐个人使用)**
如果使用 `DEVELOPMENT_BECOME_ANY_ACCOUNT` 认证方式:
1. 点击右上角 "Sign In"
2. 输入任意用户名(例如:`admin`
3. 点击 "Sign In"
4. **第一个登录的用户自动成为管理员**
**方式二HTTP 认证**
1. 首次访问会提示创建账户
2. 输入用户名和邮箱
3. 设置密码
4. 第一个账户自动成为管理员
#### 验证管理员权限
登录后,点击右上角用户名 → "Settings" → 左侧菜单应显示 "Administration" 选项。
### 2. 创建项目仓库
#### 在 Web 界面创建项目
1. 登录 Gerrit
2. 点击顶部菜单 "Projects" → "Create Project"
3. 填写项目信息:
- **Project Name**: `my-project`(例如)
- **Parent**: `All-Projects`(默认)
- **Description**: 项目描述(可选)
- **Submit Type**: `Merge If Necessary`(推荐)
- **Create initial empty commit**: 勾选(推荐)
4. 点击 "Create Project"
#### 通过命令行创建项目
```bash
# 使用 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 用户信息
```bash
# 设置全局用户信息
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
```
#### 克隆仓库
```bash
# 方式一:通过 SSH推荐
git clone ssh://admin@你的服务器IP:29418/my-project
# 方式二:通过 HTTP
git clone http://你的服务器IP:8080/my-project
```
#### 配置 Git 远程仓库
如果已经有一个本地 Git 仓库,可以添加 Gerrit 作为远程仓库:
```bash
cd your-existing-repo
git remote add gerrit ssh://admin@你的服务器IP:29418/my-project
# 或者
git remote add gerrit http://你的服务器IP:8080/my-project
```
### 4. 开发提交流程
#### 标准提交流程(代码评审)
```bash
# 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. 在网页界面进行代码评审并合并
#### 查看变更
1. 推送成功后,复制 Gerrit 返回的 URL
2. 在浏览器中打开该 URL或登录 Gerrit 后点击 "Changes" 查看
#### 代码评审流程
1. **查看变更详情**
- 点击 Change 进入详情页
- 查看文件差异Diff
- 查看提交信息
2. **添加评论**
- 在代码行上点击,添加行内评论
- 在页面底部添加整体评论
3. **评审投票**
- **Code-Review**:
- `+2` = 批准合并
- `+1` = 看起来不错,但需要其他人批准
- `-1` = 需要修改
- `-2` = 拒绝
- **Verified**:
- `+1` = 验证通过
- `-1` = 验证失败
4. **提交者修改代码**(如果需要)
```bash
# 修改代码后,追加提交(会自动关联到同一个 Change
git add .
git commit --amend # 修改最后一次提交
git push origin HEAD:refs/for/master
```
5. **合并变更**
当满足以下条件时,变更可以自动合并:
- Code-Review: +2
- Verified: +1如果启用了 Verified 标签)
或者管理员可以手动点击 "Submit" 按钮合并。
#### 合并后的操作
```bash
# 更新本地仓库
cd my-project
git checkout master
git pull origin master
# 删除已合并的特性分支
git branch -d feature/new-feature
```
### 6. 常用技巧
#### 跳过评审直接推送(个人使用)
如果只是个人使用,可以配置直接推送:
```bash
# 方法一:推送到 refs/heads/master绕过评审
git push origin HEAD:refs/heads/master
# 方法二:配置项目权限,允许直接推送
# 在 Gerrit Web 界面:
# Projects → my-project → Access → Edit
# 添加权限:
# Reference: refs/heads/*
# Push: 允许你的用户组
```
#### 修改端口
编辑配置文件:
```bash
sudo nano /opt/gerrit/review_site/etc/gerrit.config
```
修改以下部分:
```ini
[httpd]
listenUrl = http://*:9090/ # 修改为 9090 端口
[sshd]
listenAddress = *:29419 # 修改 SSH 端口为 29419
```
重启服务:
```bash
/opt/gerrit/review_site/bin/gerrit.sh restart
```
#### 备份数据
```bash
# 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
```
#### 恢复数据
```bash
# 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
```
#### 查看日志
```bash
# 实时查看日志
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
```
#### 修改管理员账户
```bash
# 通过 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'));"
```
#### 配置邮件通知(可选)
编辑配置文件:
```bash
sudo nano /opt/gerrit/review_site/etc/gerrit.config
```
添加邮件配置:
```ini
[sendemail]
smtpServer = smtp.example.com
smtpServerPort = 587
smtpEncryption = tls
smtpUser = your-email@example.com
smtpPass = your-password
from = Gerrit Code Review <noreply@example.com>
```
#### 性能优化
对于个人使用,可以调整以下配置:
```bash
sudo nano /opt/gerrit/review_site/etc/gerrit.config
```
```ini
[cache]
directory = cache
[core]
packedGitOpenFiles = 128
packedGitLimit = 100m
packedGitWindowSize = 8k
```
---
## 常用命令速查
### 服务管理
```bash
# 启动
/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 操作
```bash
# 推送代码评审
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 命令行工具
```bash
# 创建项目
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 界面
**检查项**
1. 服务是否运行:`/opt/gerrit/review_site/bin/gerrit.sh status`
2. 端口是否被占用:`netstat -tlnp | grep 8080`
3. 防火墙是否开放端口:
```bash
# Ubuntu/Debian
sudo ufw allow 8080/tcp
# CentOS
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
```
4. 查看错误日志:`tail -f /opt/gerrit/review_site/logs/gerrit.log`
### 问题 2: SSH 连接失败
**检查项**
1. SSH 服务是否运行:检查 Gerrit 日志
2. 端口是否正确:默认 29418
3. 用户权限:确保用户已注册
### 问题 3: 推送失败
**常见错误**
- `Permission denied`: 检查项目权限配置
- `Branch refs/for/master not found`: 确保推送到 `refs/for/master` 而不是 `master`
- `Authentication failed`: 检查 SSH 密钥或 HTTP 认证配置
---
## 总结
恭喜!你已经完成了 Gerrit 的安装和基本配置。现在你可以:
1. ✅ 通过 Web 界面管理代码评审
2. ✅ 使用 Git 推送代码进行评审
3. ✅ 在网页上进行代码审查和合并
4. ✅ 管理项目仓库和用户权限
**下一步建议**
- 配置邮件通知(如果需要)
- 设置项目权限规则
- 安装常用插件download-commands, replication
- 配置定期备份
祝你使用愉快!如有问题,请查看 Gerrit 官方文档https://www.gerritcodereview.com/