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

张开发
2026/4/12 2:50:57 15 分钟阅读

分享文章

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.227-post-Ubuntu-0ubuntu220.04.1) OpenJDK 64-Bit Server VM (build 11.0.227-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 gerritlocalhost IDENTIFIED BY 你的密码; CREATE DATABASE gerritdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON gerritdb.* TO gerritlocalhost; 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.war2.2 初始化Gerrit站点初始化命令看起来简单但里面的选项直接影响后续使用体验java -jar gerrit-3.8.0.war init -d /var/gerrit初始化过程中有几个关键选择数据库类型选择MySQL生产环境必选认证方式初次使用建议选HTTP后面可以改成LDAPSMTP配置务必填写真实邮箱服务器否则团队成员收不到评审通知初始化完成后检查/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://你的域名/logout2.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.confVirtualHost *: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 /VirtualHost3.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可以设置全局权限我建议这样配置禁止直接push到主分支Reference: refs/heads/masterPush权限设置为Block开启代码评审流程Reference: refs/for/refs/heads/*Push权限设置为Allow设置评审规则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 noreplyyourdomain.com测试邮件发送curl -X POST --user admin:密码 http://localhost:8080/a/accounts/self/emails -d emailtestexample.com4.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.sh5. 插件生态扩展Gerrit的功能可以通过插件扩展。推荐安装这些生产必备插件下载插件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/常用插件列表commit-message-length-check强制提交信息规范replication多仓库同步webhooks事件通知reviewers自动添加评审人插件配置示例 在gerrit.config中添加[plugin commit-message-length-check] maxSubjectLength 50 maxBodyLength 72重启Gerrit后插件会自动加载/var/gerrit/bin/gerrit.sh restart6. 高可用方案对于大型团队单节点Gerrit可能成为瓶颈。这是我实践过的集群方案数据库分离将MySQL迁移到独立服务器共享存储使用NFS或CephFS共享/var/gerrit/git目录负载均衡在多台Gerrit实例前配置HAProxy会话同步配置gerrit.config中的cache部分[cache] directory /var/gerrit/cache web_sessions true web_sessions.maxAge 30d定期备份这个脚本可以自动化备份#!/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. 故障排查指南遇到问题时按这个顺序检查查看日志tail -n 100 /var/gerrit/logs/error_log常见错误端口冲突检查8080端口是否被占用权限问题确保/var/gerrit目录属主是Gerrit运行用户数据库连接测试MySQL连接mysql -u gerrit -p密码 gerritdb调试模式/var/gerrit/bin/gerrit.sh stop java -jar /var/gerrit/bin/gerrit.war daemon -d /var/gerrit --console-log重置管理员密码java -jar /var/gerrit/bin/gerrit.war gsql -d /var/gerrit -c UPDATE account_external_ids SET passwordbcrypt:密文 WHERE email_addressadminexample.com密文可以用Python生成import bcrypt print(bcrypt.hashpw(新密码.encode(), bcrypt.gensalt(12)).decode())

更多文章