.
版本:v0.3
作者:河东西望
日期:2022-7-13
.
gerrit系统的上手使用有两个难点:
想要上手使用gerrit的同仁们,搭建部署好gerrit系统之后,会发现gerrit的权限配置不知道从哪里下手。而默认的权限配置非常简单而且开放,不符合企业各种开发管理的需求场景。
gerrit系统上的官方帮助文档很全面,各种概念都讲解得很细致。但是使用gerrit的方式,每个人可能都有不同的方式。只要研发团队用起来上手简单,操作流畅,每种方式都是可行的。
在AOSP的项目开发中,gerrit的使用方式有多种:
本文档不讲解gerrit的概念和原理,主要介绍项目实践中访问控制是如何配置使用的。repo仓库的部署搭建可以参看我的其他博文。
使用gerrit之前,我们还是要了解几个关键概念:群组Group,仓库Repository,引用Refernece,权限Permission。
群组Group
gerrit的权限所授予的对象主要是群组Group(虽然也可以针对个人,但它不是常态的权限配置方式)。每个人总是属于一个或者多个群组。
仓库Repository
gerrit中的仓库有多种:正常的代码仓库,权限仓库,项目清单仓库,repo工具仓库等等。
gerrit的访问控制是通过权限仓库来完成的,默认的两个权限仓库是all-projects和all-users(all-users仓库我个人基本没有用到)。权限仓库对普通用户是只读的。
所有的仓库都是通过继承all-projects来配置权限的。我们要配置权限,就是创建子仓库,然后配置这个子仓库的权限,提供给代码仓库继承来实现的。
引用Reference
就是git仓库的各种引用,包括分支,标签,meta属性等。
权限Permission
权限,也就是访问控制Access Control,它的作用对象是仓库的引用reference。
可以归纳一句话来理解:仓库的访问控制就是把其引用Reference的权限授予给群组。(也不好理解?!往下看)
作为企业的开发团队来说,一般的需求场景是这样的:
我们可以看一下部门矩阵图:
部门├── DEV01│ ├── 项目组│ ├── 评审组│ └── 开发组├── DEV02│ ├── 项目组│ ├── 评审组│ └── 开发组└── DEV03 ├── 项目组 ├── 评审组 └── 开发组
还有仓库分支图:
仓库分支├── develop├── test└── product
根据上述的需求场景,我们可以采取如下权限管理策略:
我这里对应创建三个群组:
在每个仓库中,我们只需要配置如下几个引用,其他以后逐步细化配置:
而在权限配置中,我们只需要配置如下几个基本权限:
权限 | 作用于 |
---|---|
Abandon | git abandon |
Create Reference | git branch/git tag |
Delete Reference | git branch |
Forge Committer Identity | git push origin HEAD:refs/for/xxx |
Push | git push --all |
Add Patch Set | git apply |
Push Merge Commits | git merge |
Create Annotated Tag | git tag -a |
Create Signed Tag | git tag -s |
Read | git clone/pull/fetch |
Rebase | git rebase |
Revert | git revert |
Submit | web页面的submit权限 |
实际上,gerrit权限配置之所以上手比较复杂,就在这两个点上: 一个是reference,一个是permission。弄清他们的意义,以及跟git引用的对应关系,是需要时间的。官网上概念虽然很详细,但是具体怎么用,还是一头雾水。这里就化繁为简,采取简单方式,配置出基本的权限控制策略。
all-projectx仓库的Access控制操作,由管理员在页面上进行,操作步骤:
下面是配置文件Project.config模板:
[access] inheritFrom = All-Projects[submit] action = inherit[access "refs/head/develop"] abandon = group developers abandon = group leaders abandon = group reviewers addPatchSet = group developers addPatchSet = group leaders addPatchSet = group reviewers create = deny group developers create = group leaders create = group reviewers createTag = deny group developers createTag = group leaders createTag = group reviewers delete = deny group developers delete = deny group reviewers delete = group leaders forgeCommitter = group developers forgeCommitter = group leaders forgeCommitter = group reviewers push = group developers push = +force group leaders push = group reviewers pushMerge = group developers pushMerge = group leaders pushMerge = group reviewers read = group developers read = group leaders read = group reviewers rebase = group developers rebase = group leaders rebase = group reviewers revert = group developers revert = group leaders revert = group reviewers submit = deny group developers submit = group leaders submit = group reviewers[access "refs/head/product"] abandon = deny group developers abandon = group leaders abandon = group reviewers addPatchSet = deny group developers addPatchSet = group leaders addPatchSet = group reviewers create = group leaders createTag = deny group developers createTag = group leaders createTag = group reviewers delete = deny group developers delete = group reviewers forgeCommitter = deny group developers forgeCommitter = group leaders forgeCommitter = group reviewers push = deny group developers push = +force group leaders push = group reviewers pushMerge = deny group developers pushMerge = group leaders pushMerge = group reviewers read = group developers read = group leaders read = group reviewers submit = deny group developers submit = group leaders submit = group reviewers[access "refs/for/*"] push = group developers push = +force group leaders push = group reviewers read = group developers read = group leaders read = group reviewersFILE
原文出处:gerrit系统如何配置访问控制