1. 从零开始:Gerrit环境搭建与管理员初体验
很多刚接触Gerrit的团队负责人或者运维同学,第一感觉往往是“这界面有点复古”,尤其是习惯了GitLab那种现代风格之后。但别急着下结论,Gerrit在代码审查和权限控制的精细度上,绝对是“老而弥坚”的代表。我刚开始带团队搭建Gerrit时也走过弯路,今天就把这些年踩过的坑和总结的经验,用最直白的方式分享给你,目标是让你看完就能动手,从零搭建一套清晰、安全的权限管理体系。
首先,你得有个Gerrit服务跑起来。这里我强烈建议直接用Docker部署,省心省力。假设你已经有了一台Linux服务器,安装好Docker和Docker Compose,那么搭建过程可以简化到几分钟。下面是我在线上环境用了很久的一个docker-compose.yml配置,你可以直接拿去用,记得替换里面的域名和初始管理员邮箱。
version: '3'
services:
gerrit:
image: gerritcodereview/gerrit:latest
container_name: gerrit
restart: always
ports:
- "29418:29418" # SSH端口,用于Git操作
- "8080:8080" # Web界面端口
volumes:
- ./gerrit_volume:/var/gerrit/review_site # 数据持久化
environment:
- CANONICAL_WEB_URL=http://your-gerrit-domain.com:8080 # 你的访问地址
- AUTH_TYPE=DEVELOPMENT_BECOME_ANY_ACCOUNT # 初期测试用,生产环境要改!
执行 docker-compose up -d,等一会儿服务就起来了。第一次访问 http://你的服务器IP:8080 时,会有一个初始化向导。这里有个关键点:第一个注册的账户会自动成为超级管理员(Administrators组成员)。所以,请务必用你计划中的管理员账号(比如你的公司邮箱)来完成首次登录和注册。这个账号将拥有生杀大权,后续所有组和项目的创建都依赖它。
登录成功后,别急着创建项目。我们先来做一件至关重要的事:配置SSH免密访问。这是所有后续操作(包括用命令行创建项目、同步权限配置)的基础。在你的个人电脑上(无论是Windows的Git Bash还是Linux/Mac的终端),打开命令行,输入:
ssh-keygen -t rsa -C "your-email@company.com"
一路回车,会在 ~/.ssh/ 目录下生成 id_rsa(私钥)和 id_rsa.pub(公钥)。然后,登录Gerrit网页,点击右上角你的用户名 -> Settings -> SSH Keys。把刚才生成的公钥(用 cat ~/.ssh/id_rsa.pub 查看)完整粘贴进去,点击添加。搞定这一步,你才算是真正“连接”上了Gerrit,后续的很多命令行操作才会畅通无阻。
2. 权限基石:理解Gerrit的组(Group)与引用(Ref)
在开始配置具体项目权限之前,我们必须先理解Gerrit权限系统的两大核心概念:组(Group)和引用(Ref)。如果把权限配置比作盖房子,组就是不同的“工种”(比如电工组、水管工组),而引用则是房子的“不同区域”(比如主卧室电路、厨房水管)。权限规则,就是规定哪个工种能在哪个区域做什么事。
组(Group)是权限的载体。Gerrit里默认有几个内置组,最常用的是:
- Administrators:超级管理员组,拥有全部权限,谨慎添加成员。
- Project Owners:项目所有者组,通常指具体项目的创建者或维护者,拥有该项目的最高权限(但可能不及Administrators)。
- Registered Users:所有已注册用户的集合。这是一个非常关键的组,通常用于配置所有用户的基线权限,比如“所有人都能克隆代码”。
- Non-Interactive Users:非交互用户组,专门给CI/CD系统(如Jenkins)用的。Jenkins自动构建、验证代码时,就用这个组的身份,避免使用真人账号。
我们自己的权限规划,主要就是创建新的自定义组。比如,为“智能硬件嵌入式组”创建一个 embedded-team,为“前端开发组”创建一个 frontend-team。创建组很简单,在网页上点击 BROWSE -> Groups -> CREATE NEW,输入组名即可。创建好后,记得在组的 Members 页面里,把对应的用户添加进去。一个用户可以属于多个组,他的最终权限是所有组权限的叠加。
引用(Ref)是权限的作用范围。它其实就是Git仓库里的各种“路径”。Gerrit的权限是按引用(Ref)来配置的,这是它比很多其他Git系统更精细的地方。最常见的几个引用模式:
refs/heads/*:匹配所有分支。这是配置分支相关权限(如推送、合并、创建分支)的主要位置。refs/tags/*:匹配所有标签。用来控制谁可以打标签、删除标签。refs/for/*:这是Gerrit的“魔法引用”,所有提交代码审查(Code Review)的变更(Change)都推送到这里。如果你想控制谁可以发起代码审查,就必须配置这个引用。refs/meta/config:存放项目权限配置文件的特殊分支。谁有权限推送到这个引用,谁就能修改这个项目的权限规则,权力极大。
理解了这个“组-引用”模型,我们再去看权限配置界面就不会发懵了。当你进入一个项目的 Access 页面,点击 EDIT 后,添加一条规则,本质上就是在说:对于某个引用(Ref),授予某个组(Group)某些权限(Permission)。
3. 实战规划:一个清晰的权限模型设计
纸上谈兵结束,我们来点实际的。假设我们要为一个名为 iot/gateway/firmware 的智能硬件网关固件项目配置权限。拍脑袋直接配很容易配乱,我建议你先在纸上或文档里画出一个清晰的权限矩阵。下面这个模型是我在多个硬件项目中验证过的,兼顾了安全与效率:
角色与组规划:
- 项目管理员 (Project Owner):组名
iot-gateway-owners。成员:固件团队负责人(张三)。权限:全权负责项目配置、权限分配、紧急情况处理。 - 核心审查员 (Core Reviewers):组名
iot-gateway-core-reviewers。成员:2-3名资深固件工程师(李四、王五)。权限:代码审核+2(批准)、提交合并、创建发布分支和标签。 - 开发者 (Developers):组名
iot-gateway-devs。成员:所有固件开发工程师。权限:克隆代码、创建特性分支、推送代码审查请求。 - 集成系统 (CI Bot):使用内置组
Non-Interactive Users。权限:自动验证代码(Verified +1/-1)、读取所有代码。
分支策略设计:
refs/heads/master:保护分支。只允许core-reviewers组提交(Submit)。所有合并必须通过代码审查。refs/heads/develop:集成分支。允许developers组推送,但合并仍需core-reviewers审核。用于日常集成测试。refs/heads/feature/*:特性分支。允许developers组自由创建和推送,用于开发新功能。refs/heads/release/*:发布分支。由core-reviewers从master创建,用于版本发布前的最后测试和修复。refs/tags/*:标签。只允许core-reviewers和owners创建带签名的标签(Push Signed Tag),用于标记正式版本。
有了这个蓝图,我们接下来的配置就是按图索骥,非常清晰。记住,好的规划是成功的一半,在Gerrit里乱改权限很容易导致开发者无法推送或者权限泄露,回退起来还挺麻烦。
4. 逐步实施:从项目创建到精细权限配置
现在,我们按照上面的规划,一步步在Gerrit上实现。首先,用管理员账号SSH登录(或者用网页界面)创建项目。命令行方式更高效:
# 通过SSH连接到Gerrit服务器执行命令
ssh -p 29418 your-admin@your-gerrit-server gerrit create-project --empty-commit iot/gateway/firmware
--empty-commit 参数会创建一个空的初始提交,这样仓库就不是完全空的了,方便后续操作。创建成功后,网页上就能在 BROWSE -> Repositories 里看到它。
接下来,创建我们规划好的自定义组。全部在 BROWSE -> Groups 页面完成:
- 点击 CREATE NEW,创建
iot-gateway-owners,把你自己的管理员账号加进去。 - 创建
iot-gateway-core-reviewers,把李四、王五加进去。 - 创建
iot-gateway-devs,把所有固件开发工程师加进去。
组建好了,重头戏来了:配置项目权限。进入 iot/gateway/firmware 项目的 Access 页面,点击 EDIT。我们一条条来加:
第一步:配置基础可见性与克隆权限。
这是为了让组内成员至少能看到项目。点击 ADD REFERENCE,输入 refs/*,点击 Add Permission... 选择 Read。
- 在 Add Group 框里,依次添加
iot-gateway-owners,iot-gateway-core-reviewers,iot-gateway-devs, 以及 Registered Users 组。 - 关键操作:勾选这条规则右边的 Exclusive 复选框。这是什么意思?它表示这条
Read权限是“独占”的,只有列表里的这些组有读取权限,其他任何组(包括后续可能不小心加进来的)都没有。这是保证项目私密性的重要设置。 - 点击 SAVE CHANGES 保存。
第二步:配置分支开发与推送权限。
现在配置谁能在哪些分支上做什么。添加一条新的规则,引用填 refs/heads/feature/*。
- Add Permission... 选择 Push。在弹出来的选项中,不要勾选 Force Push(防止强制覆盖历史),然后添加组
iot-gateway-devs。这表示开发者可以在feature/下创建和推送特性分支。 - 再点击 Add Permission... 选择 Create Reference,同样添加给
iot-gateway-devs组。这样他们才能创建新的feature/分支。 - 保存。
第三步:配置代码审查(Code Review)流程权限。
这是Gerrit的核心。添加一条新规则,引用填 refs/for/refs/heads/*。这个引用模式覆盖所有推送到审查流程的变更。
- Add Permission... 选择 Push,添加组
iot-gateway-devs。这样开发者才能发起代码审查。 - Add Permission... 选择 Push Merge Commit,同样添加给
iot-gateway-devs。允许他们推送合并提交进行审查(如果需要)。 - 保存。
第四步:配置代码审核与合并权限。
添加规则,引用填 refs/heads/master(保护分支)。
- Add Permission... 选择 Label Code-Review。这是配置打分权限。在范围(Range)里,给
iot-gateway-core-reviewers组设置-2..+2,表示他们可以打-2到+2分。通常+2表示通过,-2表示拒绝。给iot-gateway-devs组设置-1..+1,表示他们可以参与评审但无权直接通过或拒绝。 - Add Permission... 选择 Submit,只添加给
iot-gateway-core-reviewers组。这是最关键的一步:只有他们能把审核通过的代码合并到master分支。 - Add Permission... 选择 Push,但这次要勾选 Force Push,然后只添加给
iot-gateway-owners组。这是“保险丝”,只在极端情况下(比如误合了严重Bug需要回退)由管理员使用。 - 保存。
第五步:配置自动化验证权限。
添加规则,引用还是 refs/heads/master。
- Add Permission... 选择 Label Verified。这是给CI系统用的验证标签(比如编译是否通过、单元测试是否成功)。
- 将
-1..+1的权限分配给 Non-Interactive Users 组。这样,Jenkins等CI工具在完成构建后,就可以自动为这次变更打上 Verified +1 或 -1 的标签。 - 保存。
按照这个步骤,依次配置 develop、release/* 和 refs/tags/* 的权限。整个过程虽然条目多,但逻辑是清晰的:为不同的引用(工作区域),给不同的组(工种)分配合适的权限(动作)。
5. 高阶技巧:权限继承、标签策略与故障排查
当你配置了几个项目后,可能会发现很多配置是重复的。比如,所有项目可能都需要给 Registered Users 组基础的 Read 权限,都需要给 Non-Interactive Users 组 Verified 标签权限。这时候,Gerrit的 权限继承(Inheritance) 功能就派上用场了。
Gerrit有一个特殊的项目叫 All-Projects,它是所有项目的父项目。在这里配置的权限,会被所有子项目继承。我们可以把一些全局性的、通用的权限规则放在这里。例如,在 All-Projects 的 refs/for/refs/heads/* 上,给 Registered Users 组配置 Push 权限,那么所有新创建的项目,开发者默认就都能发起代码审查了,无需在每个项目重复配置。
但是要非常小心!在 All-Projects 配置的权限是全局生效的。通常只建议放一些最基础的、安全的权限。更常见的做法是创建一个“权限模板项目”,比如叫 Permission-Templates/Base,在这个项目里配置好你公司常用的角色组和权限模型。然后,当创建新项目时,在创建页面或创建后的设置中,指定它的父项目(Parent Project)为这个模板项目。这样,新项目就自动继承了模板的所有权限,你只需要微调即可,大大减少了配置工作量。
关于代码审核标签(Label),Gerrit默认只有 Code-Review 和 Verified 两个。但在复杂流程中,你可能需要更多,比如“设计评审”、“安全扫描”。你可以在项目的 refs/meta/config 分支下的 project.config 文件里自定义标签。这需要直接编辑配置文件并推送,稍微高级一点,但能实现非常定制化的流程。
在实际操作中,最容易出问题的地方是权限冲突和用户权限不生效。这里分享几个我常用的排查命令:
- 测试用户权限:用
ssh -p 29418 your-gerrit-server gerrit ls-user-abilities --project iot/gateway/firmware可以查看指定用户在某个项目上的具体能力列表,非常直观。 - 查看生效权限:在项目的 Access 页面,点击右上角的 List 按钮,可以以文本形式查看所有生效的权限规则,比在网页上一条条看更全面,有助于发现冲突或遗漏的规则。
- 记住权限优先级:Gerrit的权限规则是从上到下应用的,后面的规则可以覆盖前面的。同时,更具体的引用模式(如
refs/heads/master)会比宽泛的模式(如refs/heads/*)优先级更高。如果用户权限不符合预期,很可能是被后面某条规则或更具体的规则给覆盖或拒绝了。
最后,权限配置不是一劳永逸的。随着团队结构调整、项目阶段变化,你需要定期回顾和调整。每次修改权限,尤其是收紧权限时,最好先在测试项目上验证,并提前通知团队成员。Gerrit的权限系统就像一套精密的齿轮,理解其原理后,你就能用它为团队构建出既安全又高效的代码协作流水线。

268

被折叠的 条评论
为什么被折叠?



