当前位置: 首页 > news >正文

Ubuntu20.04部署Gerrit代码审查平台:从零到生产环境实战指南

1. 环境准备:搭建Gerrit的基石

在Ubuntu 20.04上部署Gerrit之前,我们需要先准备好运行环境。就像盖房子需要打地基一样,这一步决定了后续所有工作的稳定性。我遇到过不少因为环境配置不当导致的诡异问题,比如Java版本不兼容引发的服务崩溃,或是数据库连接超时导致的评审数据丢失。

1.1 Java环境配置

Gerrit是用Java编写的,所以首先需要安装合适的JDK。虽然官方文档说支持Java 8+,但我强烈推荐使用OpenJDK 11——这是目前最稳定的选择。执行以下命令安装:

sudo apt update sudo apt install -y openjdk-11-jdk

安装完成后别急着往下走,先验证下版本(这个坑我踩过):

java -version

你应该看到类似这样的输出:

openjdk version "11.0.22" 2024-01-16 OpenJDK Runtime Environment (build 11.0.22+7-post-Ubuntu-0ubuntu220.04.1) OpenJDK 64-Bit Server VM (build 11.0.22+7-post-Ubuntu-0ubuntu220.04.1, mixed mode, sharing)

如果显示的是Java 8或者其他版本,可能需要用update-alternatives来切换默认Java版本。

1.2 Git与必要依赖

Gerrit本质上是Git仓库的增强版管理工具,所以Git是必须的:

sudo apt install -y git

生产环境还需要考虑数据库选择。虽然Gerrit自带H2数据库,但在实际项目中我发现当评审量超过5000条时,H2的性能会明显下降。MySQL是更稳妥的选择:

sudo apt install -y mysql-server

安装完成后记得运行安全脚本:

sudo mysql_secure_installation

这里有个小技巧:新版本MySQL默认使用auth_socket认证,会导致Gerrit连接失败。解决方法是在MySQL中创建专用用户:

CREATE USER 'gerrit'@'localhost' IDENTIFIED BY '你的密码'; CREATE DATABASE gerritdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON gerritdb.* TO 'gerrit'@'localhost'; FLUSH PRIVILEGES;

2. Gerrit安装与初始化

2.1 获取Gerrit安装包

到Gerrit官网下载页面时要注意版本匹配——我就曾因为用了最新版Gerrit导致插件不兼容。目前3.8.x系列是最稳定的生产版本:

wget https://gerrit-releases.storage.googleapis.com/gerrit-3.8.0.war

如果下载速度慢,可以尝试国内镜像:

wget https://mirrors.tuna.tsinghua.edu.cn/gerrit/gerrit-releases/gerrit-3.8.0.war

2.2 初始化Gerrit站点

初始化命令看起来简单,但里面的选项直接影响后续使用体验:

java -jar gerrit-3.8.0.war init -d /var/gerrit

初始化过程中有几个关键选择:

  1. 数据库类型:选择MySQL(生产环境必选)
  2. 认证方式:初次使用建议选HTTP(后面可以改成LDAP)
  3. SMTP配置:务必填写真实邮箱服务器,否则团队成员收不到评审通知

初始化完成后,检查/var/gerrit/etc/gerrit.config文件,重点确认这些配置:

[gerrit] basePath = git canonicalWebUrl = http://你的域名:8080/ [database] type = mysql hostname = localhost database = gerritdb username = gerrit [auth] type = HTTP logoutUrl = http://你的域名/logout

2.3 启动与验证

使用内置脚本启动服务:

/var/gerrit/bin/gerrit.sh start

检查状态是否正常:

tail -f /var/gerrit/logs/error_log

看到Gerrit Code Review 3.8.0 ready就说明启动成功了。此时可以访问http://服务器IP:8080,应该能看到Gerrit的登录界面。

3. Apache反向代理配置

直接暴露8080端口不安全,我们需要通过Apache做反向代理和访问控制。这里我分享一个生产级配置方案。

3.1 基础代理设置

首先安装Apache并启用必要模块:

sudo apt install -y apache2 sudo a2enmod proxy proxy_http headers sudo systemctl restart apache2

创建配置文件/etc/apache2/sites-available/gerrit.conf

<VirtualHost *:80> ServerName gerrit.yourdomain.com ProxyRequests Off ProxyPreserveHost On ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/ <Location "/"> AuthType Basic AuthName "Gerrit Code Review" AuthUserFile /var/gerrit/etc/htpasswd Require valid-user RequestHeader set Authorization "expr=%{HTTP:Authorization}" </Location> ErrorLog ${APACHE_LOG_DIR}/gerrit_error.log CustomLog ${APACHE_LOG_DIR}/gerrit_access.log combined </VirtualHost>

3.2 认证配置

创建第一个管理员账户(后续账户可以页面添加):

sudo htpasswd -c /var/gerrit/etc/htpasswd admin

启用站点并测试配置:

sudo a2ensite gerrit.conf sudo apachectl configtest sudo systemctl reload apache2

现在访问http://gerrit.yourdomain.com,应该会弹出认证窗口。用刚才创建的admin账户登录后,你就拥有了Gerrit的管理权限。

4. 生产环境优化

4.1 权限精细控制

Gerrit最强大的功能就是细粒度的权限系统。通过All Projects > Access可以设置全局权限,我建议这样配置:

  1. 禁止直接push到主分支:

    • Reference: refs/heads/master
    • Push权限设置为Block
  2. 开启代码评审流程:

    • Reference: refs/for/refs/heads/*
    • Push权限设置为Allow
  3. 设置评审规则:

    • Label Code-Review: -2..+2范围
    • Label Verified: -1..+1范围
    • 要求至少1个+2的Code-Review和1个+1的Verified才能提交

4.2 邮件通知配置

修改/var/gerrit/etc/gerrit.config的[sendmail]部分:

[sendmail] smtpServer = smtp.你的邮箱服务.com smtpServerPort = 587 smtpEncryption = tls smtpUser = 你的邮箱账号 smtpPass = 你的邮箱密码 from = Code Review <noreply@yourdomain.com>

测试邮件发送:

curl -X POST --user admin:密码 http://localhost:8080/a/accounts/self/emails -d "email=test@example.com"

4.3 定期维护脚本

创建/usr/local/bin/gerrit-maintenance.sh

#!/bin/bash # 数据库优化 mysql -u gerrit -p密码 gerritdb -e "OPTIMIZE TABLE account_patch_reviews, changes, patch_comments" # 清理旧数据 find /var/gerrit/git -name "*.keep" -mtime +30 -delete # 重启服务 /var/gerrit/bin/gerrit.sh restart

添加到crontab每月执行:

0 3 1 * * /usr/local/bin/gerrit-maintenance.sh

5. 插件生态扩展

Gerrit的功能可以通过插件扩展。推荐安装这些生产必备插件:

  1. 下载插件
wget https://gerrit-ci.gerritforge.com/job/plugin-commit-message-length-check-stable-3.8/lastSuccessfulBuild/artifact/bazel-bin/plugins/commit-message-length-check/commit-message-length-check.jar -P /var/gerrit/plugins/
  1. 常用插件列表

    • commit-message-length-check:强制提交信息规范
    • replication:多仓库同步
    • webhooks:事件通知
    • reviewers:自动添加评审人
  2. 插件配置示例: 在gerrit.config中添加:

[plugin "commit-message-length-check"] maxSubjectLength = 50 maxBodyLength = 72

重启Gerrit后,插件会自动加载:

/var/gerrit/bin/gerrit.sh restart

6. 高可用方案

对于大型团队,单节点Gerrit可能成为瓶颈。这是我实践过的集群方案:

  1. 数据库分离:将MySQL迁移到独立服务器
  2. 共享存储:使用NFS或CephFS共享/var/gerrit/git目录
  3. 负载均衡:在多台Gerrit实例前配置HAProxy
  4. 会话同步:配置gerrit.config中的cache部分:
[cache] directory = /var/gerrit/cache web_sessions = true web_sessions.maxAge = 30d
  1. 定期备份:这个脚本可以自动化备份:
#!/bin/bash # 备份数据库 mysqldump -u gerrit -p密码 gerritdb > /backup/gerrit-db-$(date +%Y%m%d).sql # 备份配置 tar czf /backup/gerrit-config-$(date +%Y%m%d).tgz /var/gerrit/etc /var/gerrit/plugins # 备份仓库 rsync -a /var/gerrit/git /backup/gerrit-git-$(date +%Y%m%d)

7. 故障排查指南

遇到问题时,按这个顺序检查:

  1. 查看日志
tail -n 100 /var/gerrit/logs/error_log
  1. 常见错误

    • 端口冲突:检查8080端口是否被占用
    • 权限问题:确保/var/gerrit目录属主是Gerrit运行用户
    • 数据库连接:测试MySQL连接mysql -u gerrit -p密码 gerritdb
  2. 调试模式

/var/gerrit/bin/gerrit.sh stop java -jar /var/gerrit/bin/gerrit.war daemon -d /var/gerrit --console-log
  1. 重置管理员密码
java -jar /var/gerrit/bin/gerrit.war gsql -d /var/gerrit -c "UPDATE account_external_ids SET password='bcrypt:密文' WHERE email_address='admin@example.com'"

密文可以用Python生成:

import bcrypt print(bcrypt.hashpw("新密码".encode(), bcrypt.gensalt(12)).decode())
http://www.jsqmd.com/news/595169/

相关文章:

  • seo关键词买量报价是多少_seo关键词推广报价是多少
  • 别再只用USB3.0了!手把手教你用FPGA实现CoaXPress 2.0 IP核,搞定50Gbps图像采集
  • [C++]函数重载
  • VSCode + Xmake打造高效合宙IAR780E开发环境:手把手教你配置CSDK开发
  • 制造业如何通过发布带有硬核测试数据和公差对比的 Markdown 表格,极大地提升 DeepSeek 的抓取率?
  • Sentaurus非局域隧穿模型:从理论到FTJ仿真的关键配置解析
  • GTE-Chinese-Large应用场景:招聘JD与简历语义匹配推荐系统落地
  • 2026年靠谱的石英砂烘干机/木屑烘干机/工业烘干机/云母烘干机工厂直供推荐 - 品牌宣传支持者
  • 别再死等while循环了!用STM32CubeMX配置外部中断,让你的按键响应快人一步
  • 2026年4月,潞洲挑选绿化好的学区房要点,新房/学区房/70年大产权住宅/实景现房/南都新城,学区房厂商口碑推荐 - 品牌推荐师
  • Deneyap触摸按键模块:基于MSP430的I²C电容触控方案
  • AMD 锐龙 R7 6800H 在性能和定位上
  • 别再死记硬背Attention公式了!用‘找东西’的比喻,5分钟搞懂MADDPG论文里的注意力机制怎么用
  • 全任务零样本学习-mT5中文-base一文详解:中文base模型与large版本增强效果差异
  • 告别串口助手!用Arduino IDE给ESP8266写个MQTT连接OneNET的完整代码(附库安装)
  • 2026年知名的实木相框/徽章奖牌相框/铝合金相框厂家选择指南 - 品牌宣传支持者
  • 从单机到集群:用PHPStudy和VMware模拟搭建你的第一个大数据处理‘小集群’
  • 从YOLOv1到YOLOv7:实时目标检测算法的演进之路
  • LLM 工程师的真实全栈地图:下一词预测之外,你必须掌握的生产级构建路径
  • ABAQUS脚本运行总是出错
  • Arduino Mega 2560 + A4950驱动:手把手教你调出丝滑匀速的编码电机(附完整代码与避坑指南)
  • 2026年质量好的滚筒烘干机/煤泥滚筒烘干机/木屑滚筒烘干机/河沙滚筒烘干机公司选择指南 - 品牌宣传支持者
  • Linux 的 ln 命令
  • 告别马赛克!用PyTorch从零复现SRCNN,手把手教你让模糊老照片变清晰
  • SEO推广策划案如何进行用户体验优化
  • 2026年比较好的不锈钢风管/螺旋风管公司选择指南 - 品牌宣传支持者
  • 最新普通234滑块 _rand算法分析
  • 2026年靠谱的高度数配眼镜/配眼镜金属镜框厂家精选 - 品牌宣传支持者
  • 别再只把DBC当‘字典’了:它在CANape和MF4数据管理中的隐藏用法
  • Pixel Epic智识终端多场景落地:学术研究、产业分析、政策解读全覆盖