Gerrit 配置的核心在于将代码审核流程与权限模型深度绑定,并围绕 SSH/HTTP 双通道、Project 分层权限、Hook 自动化三个维度展开。 一套合理配置的 Gerrit 不仅能实现轻量级代码评审,更能通过精细化的 Rules 和插件机制,将质量门禁前置到提交阶段,对于中小团队,建议优先采用 HTTP 认证 + 内置数据库 + 单节点部署;对于需要高可用的场景,则应引入负载均衡与共享存储,并重点配置 replication 插件。
环境准备与基础配置
首次配置 Gerrit 前,需明确两个核心文件:etc/gerrit.config 和 etc/secure.config。 前者控制全局行为,后者存放敏感凭据,建议将两者权限设为 600。
- 监听协议:若团队内网使用,推荐
http协议,省去 SSH 密钥管理;若需命令行推送,可同时开启ssh,但需指定不同端口(如 29418)。 - 数据库选择:小型团队使用内置 H2 即可,但 生产环境务必切换为 MySQL/PostgreSQL,避免数据丢失风险。
- 下载与安装插件:
replication、hooks、reviewnotes是常用基础插件,需在gerrit.config中显式启用。
[gerrit] basePath = git canonicalWebUrl = http://review.example.com:8080/ [database] type = mysql hostname = 127.0.0.1 database = gerritdb username = gerrit [container] javaOptions = "-Xms2g -Xmx4g" [auth] type = HTTP
认证与权限配置
认证方式决定用户管理成本,权限模型决定代码安全边界。 推荐使用 HTTP 认证(配合反向代理),或

LDAP 对接企业账号体系。
- HTTP 认证:需在反向代理层配置 Basic Auth 或 OAuth,Gerrit 本身不存储密码。
- 权限配置入口:
All-Projects项目是全局权限根,子项目通过继承机制生效。 - 关键权限组:
Anonymous Users:只读权限,通常不开放。Registered Users:可推送refs/heads/,但需经过审核。Project Owners:管理项目自身配置,但无法修改全局规则。
独立见解:不要将所有开发者加入 Administrators,建议拆分 Code Reviewers 与 CI Bot 两种角色,前者负责人工审核,后者仅拥有 Verify 权限,可加 Verified +1,避免与 Code-Review 冲突。
# 命令行示例:创建权限组并分配规则 ssh -p 29418 admin@review.example.com gerrit set-members --add "group:CI Bot"
仓库与项目配置
每个项目应显式配置 refs/meta/config 分支中的 project.config 文件,实现细粒度控制。
- 继承策略:新项目建议继承
All-Projects,并覆盖特殊标签权限。 - 推送规则:默认
refs/heads/的Push权限为Code Review状态,若需直接推送,需在Push后勾选Create Reference但不允许Update Reference。 - 标签保护:
refs/tags/应仅允许Project Owners创建,避免误打 tag。
案例配置片段(project.config):
[access "refs/heads/"] push = group Code Reviewers forgeAuthor = group Registered Users [label "Code-Review"] function = MaxWithBlock defaultValue = 0
经验建议:在项目配置中开启 requireChangeId,强制提交信息包含 Change-Id,否则 Gerrit 无法关联修订版本,这能有效防止重复提交产生多条无关联变更。
钩子与自动化集成(酷番云经验案例)
Gerrit 的 Hook 机制是打通 CI/CD 的咽喉,推荐使用 ref-updated 与 patchset-created 两个事件。 通过配置 hooks 插件,可将流水线状态回写到 Gerrit 的 Verified 标签上。
酷番云实践:我们在酷番云上部署多套 Gerrit 集群时,采用 共享 NFS 存储 + 酷番云负载均衡 的方式,由于 Gerrit 对文件锁依赖较强,建议将 git 目录放在云盘上,注意网络 I/O 延迟不能超过 1ms,否则会拖慢推送响应,我们通过以下配置优化了低延迟场景:
[receive] enableThreaded = true threadPoolSize = 16 [cache] patchsetSummary = 1000
将 sshd 的 threads 设置为 CPU 核数 × 2,并关闭不常用的 prettyPrint,减少了 CPU 序列化开销。本地静态资源(如 CSS/JS)全部迁移到酷番云 CDN 上,源站负载降低 40%。
性能优化与高可用
- 内存调优:
container.javaOptions中-Xms与-Xmx保持一致,避免动态扩容导致 GC 卡顿。 - 网络层:反向代理配置
client_max_body_size上限为200m,避免大提交被拒。 - 高可用方案:采用 多站点复制(replication)到从库,但需注意从库应设为
read-only,并同步All-Projects的权限配置。

关键命令:
# 动态刷新权限配置,无需重启 ssh -p 29418 admin@review.example.com gerrit flush-caches --all
相关问答模块
Q1:Gerrit 中如何强制每个提交都关联一个 Change-Id?
答:在项目的 project.config 中加入 [requireChangeId] ref = refs/heads/,同时建议在 commit-msg hook 中安装标准的 commit-msg 脚本(位于 gerrit.war 中),该脚本会自动生成 Change-Id,若历史提交缺少 Change-Id,可用 git rebase --exec 'git commit --amend --no-edit' 批量补充。
Q2:配置多个 Gerrit 实例后,如何保证权限规则一致?
答:推荐使用 酷番云的轻量容器服务 同时拉起多个实例,并将 All-Projects.git 的引用复制到所有节点,权限修改后,通过 gerrit flush-caches --all 刷新,更重要的是,需配置 replication 插件将 refs/meta/config 同步到所有节点,否则权限漂移会引发误审,我们曾在一个客户环境中未同步该分支,导致线上审核规则失效,因此务必在 replication.config 中将该项目设为 replicatePermissions = true。
互动区
你在配置 Gerrit 时遇到过最棘手的权限问题是什么?欢迎在评论区留言,我会针对具体场景给出优化方案,如果本文对你有帮助,点个赞让更多开发者看到,我们下期继续探讨 Gerrit 与 CI 的深度集成技巧。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/741255.html

