• gerrit系统如何配置访问控制


    .
    版本:v0.3
    作者:河东西望
    日期:2022-7-13
    .



    gerrit系统的上手使用有两个难点:

    1. 部署repo仓库。
    2. 配置访问控制。

    想要上手使用gerrit的同仁们,搭建部署好gerrit系统之后,会发现gerrit的权限配置不知道从哪里下手。而默认的权限配置非常简单而且开放,不符合企业各种开发管理的需求场景。

    gerrit系统上的官方帮助文档很全面,各种概念都讲解得很细致。但是使用gerrit的方式,每个人可能都有不同的方式。只要研发团队用起来上手简单,操作流畅,每种方式都是可行的。

    在AOSP的项目开发中,gerrit的使用方式有多种:

    1. 仅仅作为代码仓库系统使用,可以跟gitlab一样作为纯git仓库,也可以是大型repo仓库。
    2. 仅仅作为代码评审系统使用。一般较多的使用方式是gitlab+gerrit组合。这种方式不少公司在使用。
    3. 作为完整的代码仓库系统+代码评审系统使用。

    本文档不讲解gerrit的概念和原理,主要介绍项目实践中访问控制是如何配置使用的。repo仓库的部署搭建可以参看我的其他博文。

    1 关键概念

    使用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的权限授予给群组。(也不好理解?!往下看)

    2 需求场景

    作为企业的开发团队来说,一般的需求场景是这样的:

    • 有多个不同的部门,每个部门不能互相看到其他部门的代码。
    • 所有部门有如下几种角色:开发者developer、评审者reviewer,项目owner。
    • 不同部门的项目代码仓库的分支策略可能不一样,但是一般有这几个分支:develop、test、product。
    • 开发组developer只能操作develop分支:clone,push权限,review+1权限,其他分支只可clone,不能push。
    • 评审组reviewer只能操作developer分支:除了developer权限之外,还有review+2,submit权限。
    • 项目组owner可以操作所有分支,权限还包括merge,增删分支、增删标签等。

    我们可以看一下部门矩阵图:

    部门
    ├── DEV01
    │   ├── 项目组
    │   ├── 评审组
    │   └── 开发组
    ├── DEV02
    │   ├── 项目组
    │   ├── 评审组
    │   └── 开发组
    └── DEV03
        ├── 项目组
        ├── 评审组
        └── 开发组
    

    还有仓库分支图:

    仓库分支
    ├── develop
    ├── test
    └── product
    

    3 配置策略

    根据上述的需求场景,我们可以采取如下权限管理策略:

    1. 原始的all-projects仓库不要动,创建自己的权限仓库all-projectx。所有的仓库继承这个权限仓库。
    2. 在all-projectx上修改权限配置。
    3. 如果还想要继续创建更多的权限配置,就继承这个all-projectx。
    4. 在子仓库继承的引用权限中,可以通过Exclusive选项来确认是否需要继承父系权限。

    我这里对应创建三个群组:

    • developers
    • reviewers
    • leaders

    在每个仓库中,我们只需要配置如下几个引用,其他以后逐步细化配置:

    • refs/for/* : 源代码
    • refs/head/XXX: XXX分支
    • refs/tag/*: 标签

    而在权限配置中,我们只需要配置如下几个基本权限:

    权限 作用于
    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控制操作,由管理员在页面上进行,操作步骤:

    • Add Reference (refs/for/, refs/tags/, refs/head/develop, refs/head/product ...)
    • Add Permission (Abandon, Create Reference, ...... Submit)
    • Add Group (developers, reviewers, leaders)
    • 配置控制 (Allow, Deny, Block)。需要给谁什么权限就配置Allow。

    下面是配置文件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
    
    折叠
  • 相关阅读:
    GLTF和GLB的区别,各自生成方法
    CC2541蓝牙低功耗芯片中文资料提供
    成人高等教育本科生学士学位日语水平考试大纲
    while 与 for
    docker+mongo主从仲裁+用户密码认证
    自动化测试的生命周期是什么?
    合并后的以太坊会像一个流域
    Java入门第115课——List的get方法和set方法
    pytorch的模型保存加载和继续训练
    【华为OD机试真题 python】勾股数元组 【2022 Q4 | 100分】
  • 原文地址:https://www.cnblogs.com/aosp/p/16471067.html