gerrit权限控制
2016-01-27 23:06
3031 查看
Access controls in Gerrit are group based. Every user account is a member of one or more groups, and access and privileges are granted to those groups. Access rights cannot be granted to individual users.
在gerrit中权限控制是基于群组的. 每个用户有一个或者多个群组, 访问权限被赋予这些群组.访问权限不能赋予个人用户.
Anonymous Users
Change Owner
Project Owners
Registered Users
当前只有
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/04/391f830ed1e423783c4d6f97b16fb2bd)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/04/ff76aece413b51121b69668e4777426b)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/04/14b24c7f3cec1b2591113cc7ca6aaa34)
Administrators
Non-Interactive Users
在
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/04/7ab13025f4223037865b6247f529c0a0)
对一个群组赋予
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/04/1646f2b6b37e780a88bac33addbbb999)
在
如果仅仅推送标签,给
这个权限通常用在创建某个命名空间下的分支, 如:某个部门自由创建分支权限
给某用户自由创建分支权限, 给
如果你这样赋予
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/04/9a4900c56bd35a07c00ab93644e7e5f3)
通常Gerrit需要在
默认在
在
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/04/5633fd2844ddaaf9546845e0c23590e2)
改变项目描述
通过SSH创建新的分支
通过Web界面创建和删除分支
赋予和撤销任何访问权限,包括
子命名空间的所有权可以通过命名空间格式来委派. 要委派以
Force选项
允许分支被删除. 由于
用户在自己环境下提交代码需要
对于开源公开的Gerrit安装方式,
赋予
标签的
如果需要推送
如果需要删除或者重写标签, 给
这个权限非常特殊, 先计算项目中的
如果项目中赋予
其他用户只能将他们自己从审查者列表中移除.
Gerrit带有配置好的
The label that the reviewer selects determines what can happen next. The +1 and -1 level are just an opinion where as the +2 and -2 levels are allowing or blocking the change. In order for a change to be accepted it must have at least one +2 and no -2 votes. Although these are numeric values, they in no way accumulate; two +1s do not equate to a +2.
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/04/c067b4d90f4e0352a191c3a3e4f4adf6)
如果需要没有一个人能更新或者删除标签, 连项目
在父项目中
Gerrit管理员能够集中精力管理
在不违反
在这个阻塞规则
如果群组
在同一个项目的同一个访问区域,ALLOW
由于所有人都是
可能项目
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/04/5558fa889bda1d18cc668f43ed262341)
允许其他用户使用
默认配置, 用户默认使用
BATCH, 赋予这个群组的用户使用独立的
INTERACTIVE, 除非用户赋予了
代码回顾的学习重点是团队成员共同识别模式,这里的模式是指程序员编写代码的习惯,包括”好模式”和”反模式”. 像富有表达力的命名, 单一职责的方法, 良好的格式缩进等,都是”好模式”. 团队成员通过阅读最近编写的测试代码和生产代码来识别”好模式”和”反模式”.既是团队成员之间相互学习的过程, 也是团队整体达成整洁代码共识的过程.
https://github.com/lovexiaov/blogs/blob/master/source/_posts/Gerrit-Access-Control.md
Cannot push tags in Git
Gerrit configuration
在gerrit中权限控制是基于群组的. 每个用户有一个或者多个群组, 访问权限被赋予这些群组.访问权限不能赋予个人用户.
System Groups
在Gerrit系统自带下面的群组
Anonymous Users
Change Owner
Project Owners
Registered Users
Anonymous Users
所有用户都是匿名用户成员, 所有用户都能继承
Anonymous Users所有访问权限.
当前只有
Read access权限值得赋予给
Anonymous Users群组, 因为其他权限都需要认证.
Project Owners
Project Owners的访问权限在
Project范围内有效
Change Owner
Change Owner的访问权限在
Change范围内有效
Registered Users
所有在页面上登录成功的用户都会自动注册为gerrit用户,属于Registered Users群组
Registered Users群组通常被赋予
Code-Review -1..+1权限, 允许给需要审查代码投票, 但不会引起审查被批准和拒绝
Predefined Groups
system groups在Gerrit系统内部就定义好了, 而普通群组信息被保存在
ACCOUNT_GROUPS表中,
Predefined groups群组信息也保存在
ACCOUNT_GROUPS表中.
Predefined groups群组在Gerrit初始化时创建并且拥有唯一的
UUID值
All-Projects -> meta/config -> groups文件内容
# UUID Group Name # 5210215f92225c45a5ad123016c8706336f55a7d Administrators df9b717d413c614cb51e39525619b311f077ec15 Non-Interactive Users global:Anonymous-Users Anonymous Users global:Project-Owners Project Owners global:Registered-Users Registered Users
Gerrit自带两个
predefined groups:
Administrators
Non-Interactive Users
Administrators
Administrators是
Gerrit root角色, 在Gerrit初始化时
Administrate Server权限被赋予给这个
Predefined Groups群组.
在
Administrators组的成员可以管理所有项目, 但是不意味着任何其他权限.
Administrators组不会自动获得代码审查批准和提交权限.
Non-Interactive Users
Interactive Users比如在web页面上审查代码, 在提交/获取代码的用户
Non-Interactive Users是可以通过Gerrit接口进行操作的组, 在Gerrit初始化时
Priority BATCH和
Stream Events权限被赋予给这个
Predefined Groups组.
Non-Interactive Users和
Interactive Users使用不同的线程池, 防止交互式用户抢占线程. 当系统资源紧张时确保了交互式的用户可以继续工作.
Project Access Control Lists
All Projects
在All Projects项目中的访问权限会自动被其他项目继承, 只有
Administrate Server capability能够编辑
All-Projects权限.
Per-Project
先计算子项目的访问权限, 再计算All Projects的访问权限, 允许一些权限可以被覆盖.
对一个群组赋予
DENY限制时, 通常只对
READ权限有效.
Special and magic references
refs/heads/*和
refs/tags/*是Git常用的引用命名空间, 一个用来存储分支一个用来标签
在
refs/*命名空间下的引用都是有效的,Gerrit在
refs/*有一些特殊用处的命名空间和引用
Special references
这些特殊的引用的内容由Gerrit生成或者包含重要的项目配置信息refs/changes/* #用于存储审查的补丁 #获取某个补丁集需要审查序号和补丁集序号 #'refs/changes/'<last two digits of change number>/ <change number>/ <patch set number> refs/meta/config #项目配置的分支 refs/meta/dashboards/* # refs/notes/review #保存代码审查信息的分支
Magic references
refs/for/<branch ref> #进行代码审查时需要提交代码到这个命名空间 refs/publish/* #和refs/for/*命名空间作用一样 refs/drafts/* #用于草案代码审查,和refs/for/*的区别在于只有部分人可见
添加新的补丁
#审查者对代码进行修改, 审查的代码是修改后的补丁 git fetch ssh://admin@localhost:29418/gerrit_ci refs/changes/03/3/1 git branch fix_xxx FETCH_HEAD && git checkout fix_xxx vi README git add README git commit --amend git push origin HEAD:refs/for/master
查看远程引用
git ls-remote ssh://admin@localhost:29418/gerrit_ci 61fd289472707d79f73289216a4c5f0ca4cee4e1 HEAD eeaef9da4ea27d7c23bfb5f9a2ed1b5357ebbba8 refs/changes/01/1/1 5f8ed98b0f88787c22e705595e2818db62874f56 refs/changes/02/2/1 bfdb700f4aab3afc32ec79a29b0e25f8be758f8f refs/changes/03/3/1 effa7b004eec0b85e722fe10be6468e4ed9b78d3 refs/changes/03/3/2 61fd289472707d79f73289216a4c5f0ca4cee4e1 refs/heads/master 9f282c08d5108c6817dd1504e8bec0e94ba59d47 refs/meta/config 405030285eed7406b1ac7cfa6a5211331165b8e2 refs/notes/review
修改项目配置文件
git clone ssh://admin@localhost:29418/All-Projects && scp -p -P 29418 admin@localhost:hooks/commit-msg All-Projects/.git/hooks/ #refs/meta/config 是All-Projects的引用 git fetch origin refs/meta/config:refs/remotes/origin/meta/config git checkout meta/config #现在目录下有groups project.config两个文件 #提交修改 git add . git commit -m "modify config" git push origin meta/config:meta/config
Access Categories
Abandon
代码审查时允许用户丢弃这个审查。如果对change有
push权限,同时具有
push,
abandon,
restore权限
Create Reference
用户可以创建新的references,
branches or tags, 创建时引用必须不存在,不能删除已经创建的引用
如果仅仅推送标签,给
refs/tags/*赋予
Create Reference权限
这个权限通常用在创建某个命名空间下的分支, 如:某个部门自由创建分支权限
refs/heads/hello/*
给某用户自由创建分支权限, 给
refs/heads/sandbox/${username}/*赋予
Create Reference权限
如果你这样赋予
Create Reference权限,记得同时赋予
push force权限, 这样拥有清理
Forge Author && Forge Committer && Forge Server
查看提交中Author和
Committer
git log --format=full commit 2dfae738781a3ba641ee06c913fd51162335a941 Author: admin <c2290910211@163.com> Commit: gerrit_test <c2290910211@aliyun.com> admin gerrit_test Change-Id: I0830cf061306101e977f9adf55270c9b3a3f59c4
Author一般表示谁创建了这个提交,也可以用
git commit --amend --reset-author等命令修改
Committer一般表示谁修改了这个提交,在使用
git commit --amend等命令时修改
通常Gerrit需要在
Author和提交的
Committer认证信息中至少一个,与
uploading user注册过的邮箱地址匹配,
Forge Author和
Forge Committer允许用户绕过提交时的身份验证
Forge Author允许提交中
Author信息不经过验证, 这个权限在下面场景非常有效,通过邮件接收第三方补丁,
cherry-pick其他人的分支提交,审查合并前修改其他人的一些次要问题.
默认在
All-Projects赋予
Registered Users组
Forge Author权限.
Forge Committer允许提交中
Committer信息不经过验证和不验证匿名标签对象,通常在需要其他服务器自动提交时有用
Forge Server允许在提交中
Committer信息使用
Server的用户名和邮箱. 这个权限在强制推送
git filter-branch修改过信息的提交和由这个
Gerrit Code Review server创建的合并提交时有用.
在
etc/gerrit.config可以配置
Server的用户名和邮箱,
user.name默认值
Gerrit Code Review,
user.email默认值在启动时生成
gerrit@hostname
Owner
允许修改项目以下配置:改变项目描述
通过SSH创建新的分支
通过Web界面创建和删除分支
赋予和撤销任何访问权限,包括
Owner权限
子命名空间的所有权可以通过命名空间格式来委派. 要委派以
qa/开始的所有分支权限给QA群组,给
refs/heads/qa/*添加
Owner权限。 QA小组的成员可以进一步细分访问权限,但只能对
refs/heads/qa/开始的分支有效.
Push
这类分支控制用户如何上传提交到Gerrit. 根据命名空间赋予的Push权限, 可以允许绕过代码审查直接推送到分支, 也可以允许创建新的
change进行代码审查.
Direct Push
在Direct Push权限下,任何已经存在的分支都接收
fast-forward提交,创建新的分支需要
Create Reference权限. 删除已经存在的分支会被拒绝,因为在这个最安全的模式下, 提交不会被丢弃.
Force选项
允许分支被删除. 由于
force push实际上删除分支后会创建这个分支,但是这是个原子操作并且会被记录,也允许
force push更新分支. 带有
force选项会导致项目历史中的提交被丢弃.
force选项对只想使用Gerrit访问权限功能而不需要代码审查的项目有效, 对于需要进行代码审查的项目不应该分配这个权限.
Upload To Code Review
Upload To Code Review权限授权在
refs/for/refs/heads/BRANCH命名空间上,允许用户上传
non-merge提交到
refs/for/BRANCH命名空间,创建新的
change进行代码审查.
用户在自己环境下提交代码需要
clone/fetch项目代码,所以必须赋予
Read权限
对于开源公开的Gerrit安装方式,
All-Projects中
refs/for/refs/heads/*通常给
Registered Users赋予
Read和
Push权限. 很多私有安装, 通常
refs/for/refs/heads/*通常给
all users简单的赋予
Read和
Push权限.
force选项赋予
refs/for/refs/heads/*命名空间没有作用.
Push Merge Commits
Push Merge Commits权限允许用户上传
merge commits.这是
Push附加的访问权限,所以只赋予
Push Merge Commits权限是不够的. 一些项目希望只能由Gerrit自动合并提交, 可以通过只赋予
Push权限而不赋予
Push Merge Commit权限.
赋予
Push Merge Commit权限通常必须以
refs/for/为前缀,例如
refs/for/refs/heads/BRANCH.
refs/heads/BRANCH作为补充, 赋予
Read权限后允许直接推送
non-merge提交,赋予
Push Merge Commit权限后也允许直接提交一个
merge提交.
Push Annotated Tag
允许推送带注释的标签到远程仓库, 标签必须带有
注释.
#创建带注释的标签 git tag -a <tagname> -m <comment> #提交标签到远程仓库 git push origin --tags #获取标签 git fetch --tags
标签的
Push Annotated Tag和
Forge Committer Identity权限.
git show v1.0 tag v1.0 Tagger: username <email>
如果需要推送
轻量级标签(
不带注释), 给
refs/tags/*命名空间赋予
Create Reference权限, 轻量级标签就像Git中的分支一样.
如果需要删除或者重写标签, 给
refs/tags/*命名空间赋予
带force选项的Push权限,删除标签需要和删除分支一样的权限.
Push Signed Tag
允许推送PGP签证的标签到远程仓库
git tag -u "gpg-key-id" -m "tag comment" <tagname>
Read
Read权限控制查看项目的
change,
comment,
code diff和通过SSH或者HTTP协议访问仓库的权限
这个权限非常特殊, 先计算项目中的
Read权限, 再计算
all-projects的
Read权限.
如果项目中赋予
DENY Read权限,
all-projects项目不管是否赋予
ALLOW READ都将无效.这个权限对于隐藏一些项目非常有用.
Rebase
允许用户在web页面上进行rebase changes,
change作者和提交者可以通过页面进行
rebase changes(尽管没有赋予
Rebase权限)
Remove Reviewer
允许用户从审查者列表中移除其他用户.Change owners能够移除那些审查分数为0或者负数的审查者.(尽管没有赋予
Remove Reviewer权限)
Project owners和
site administrators能够移除任何审查者(尽管没有赋予
Remove Reviewer权限)
其他用户只能将他们自己从审查者列表中移除.
Review Labels
在项目中配置label My-Name,
label My-Name和定义好的范围分数相关联. 同时也关联
labelAs-My-Name权限, 可以允许编辑用户定义的
label.
Gerrit带有配置好的
Code-Review标签
[access "refs/heads/*"] label-Code-Review = -2..+2 group Administrators label-Code-Review = -2..+2 group Project Owners label-Code-Review = -1..+1 group Registered Users [label "Code-Review"] function = MaxWithBlock defaultValue = 0 copyMinScore = true copyAllScoresOnTrivialRebase = true value = -2 This shall not be merged value = -1 I would prefer this is not merged as is value = 0 No score value = +1 Looks good to me, but someone else must approve value = +2 Looks good to me, approved
Submit
允许用户提交审查通过的提交. 提交审查代码后会合并到对应的分支上.The label that the reviewer selects determines what can happen next. The +1 and -1 level are just an opinion where as the +2 and -2 levels are allowing or blocking the change. In order for a change to be accepted it must have at least one +2 and no -2 votes. Although these are numeric values, they in no way accumulate; two +1s do not equate to a +2.
Code-Review标签
+2是通过,
-2是否定,
-1~+1只是代表意见并不会影响投票, 审查被通过至少需要一个
+2投票并且没有
-2投票. 两个
+1并不会等于
+2
[access "refs/heads/*"] submit = group Administrators submit = group Project Owners
View Drafts
允许用户查看其他人提交的draft changes.
draft changes作者和添加为审查者都能看见
draft changes(尽管没有赋予
View Drafts权限)
Publish Drafts
允许用户公开其他人提交的draft changes.
draft changes作者可以公开
draft changes(尽管没有赋予
Publish Drafts权限)
Delete Drafts
允许用户删除其他人提交的draft changes.
draft changes作者可以删除
draft changes(尽管没有赋予
Delete Drafts权限)
Edit Topic Name
允许修改change的主题
topic
change owner, branch owners, project owners, and site administrators可以修改主题(尽管没有赋予
Edit Topic Name权限)
Enforcing site wide access policies
通过赋予一个群组Owner访问权限在
refs/*命名空间, Gerrit管理员可以委派这个项目的访问控制权限给这个群组.
如果需要没有一个人能更新或者删除标签, 连项目
owners都没有权限.
ALLOW和
DENY规则并不能达到这样的目的, 因为项目
owners可以赋予任何他们自己想要的访问权限. 覆盖任何从
All-Projects或者其他父项目继承的权限是非常有效的方法.
在父项目中
BLOCK权限, 使得就算是子项目
owners也不能设置
block权限为
ALLOW. 尽管这样, 也应该保留
owners所有
non-blocked权限.
Gerrit管理员能够集中精力管理
site wide策略并且提供有意义的默认访问权限.
在不违反
site wide策略的情况下, 项目
owners可以管理他们自己项目的访问权限.
‘BLOCK’ access rule
BLOCK规则是全局范围的权限. 子项目不能重载继承的
BLOCK规则. 从父项目链表中搜索
BLOCK规则, 忽略在访问区域中的独占(
Exclusive)标志.
push权限赋予
BLOCK规则,
push和
force push等推送都将被阻塞.
force push权限赋予
BLOCK规则只有
force push被阻塞, 但是如果
push权限具有
ALLOW规则的话可以进行
non-forced提交.
BLOCK也可以赋予
label投票范围. 下面的配置可以阻塞
group X投
+2和
-2票,仍然可以投
-1 ~ +1的票.
[access "refs/heads/*"] label-Code-Review = block -2..+2 group X
在这个阻塞规则
min..max范围的目的是: 阻塞
-INFINITE..min和
max..INFINITE投票,也意味着
-1..+1投票范围不受阻塞影响.
BLOCK’ and ‘ALLOW’ rules in the same access section
当相同访问区域同时包含BLOCK和
ALLOW规则,
ALLOW规则会重载
BLOCK规则.
[access "refs/heads/*"] push = block group X push = group Y
如果群组
X和群组
Y都包含了同一个用户, 这个用户依然能够
push到
refs/heads/*命名空间.
在同一个项目的同一个访问区域,ALLOW
规则才会重载BLOCK
规则.在同一个项目不同访问区域和子项目的同一个访问区域, ALLOW规则不会重载
BLOCK规则.
BLOCK
规则示例
确保没有人能够更新或者删除tag
在All-Projects中阻塞
Anonymous Users组的
push权限
[access "refs/tags/*"] push = block group Anonymous Users
由于所有人都是
Anonymous Users组成员, 所以可以阻塞所有人.
可能项目
owner需要创建
tag权限
[access "refs/tags/*"] push = block group Anonymous Users
pushTag = group Project Owners
pushSignedTag = group Project Owners
某个命名空间只让一个特殊的群组投票
假设提交到发布分支Release-Process需要更为严格的过程, 假设我们需要确信只有
Release Engineers群组可以投票,就算是项目
owner权限也不可以投票. 在
All-Projects我们定义下面的规则.
[access "refs/heads/stable*"] label-Release-Process = block -1..+1 group Anonymous Users label-Release-Process = -1..+1 group Release Engineers
Global Capabilities
Access Database
允许用户通过gsql命令访问数据库, 以及包含代码审查信息的分支
refs/notes/review
Administrate Server
影响Gerrit中owner和
administrator角色. 赋予
administrateServer能力能够赋予任何群组访问权限.
Priority
Gerrit中有两类线程池用来给INTERACTIVE Users和
Non-Interactive Users使用,防止抢占线程.
允许其他用户使用
Non-Interactive Users的保留线程池.
默认配置, 用户默认使用
INTERACTIVE线程池
BATCH, 赋予这个群组的用户使用独立的
Non-Interactive线程池
INTERACTIVE, 除非用户赋予了
BATCH选项,否则使用
INTERACTIVE线程池
Stream Events 允许执行Gerrit触发的事件流.
获取All-Projects中
refs/meta/config分支并修改权限配置
git clone ssh://admin@localhost:29418/All-Projects && scp -p -P 29418 admin@localhost:hooks/commit-msg All-Projects/.git/hooks/ #refs/meta/config 是All-Projects的引用 git fetch origin refs/meta/config:refs/remotes/origin/meta/config git checkout meta/config #现在目录下有groups project.config两个文件 #groups文件包含project.config中需要的用户组和对应的UUID #提交修改 git add . git commit -m "modify config" git push origin meta/config:meta/config
在公司文档看到大神写的很不错的一小段话
code review的目的是团队成员在一起共同学习,而不是相互”挑错”.将code review称为代码回顾好一些, 如果大家放弃”挑错”来共同学习,那么代码回顾中学习什么呢?
代码回顾的学习重点是团队成员共同识别模式,这里的模式是指程序员编写代码的习惯,包括”好模式”和”反模式”. 像富有表达力的命名, 单一职责的方法, 良好的格式缩进等,都是”好模式”. 团队成员通过阅读最近编写的测试代码和生产代码来识别”好模式”和”反模式”.既是团队成员之间相互学习的过程, 也是团队整体达成整洁代码共识的过程.
参照
http://localhost:8090/Documentation/error-invalid-committer.htmlhttps://github.com/lovexiaov/blogs/blob/master/source/_posts/Gerrit-Access-Control.md
Cannot push tags in Git
Gerrit configuration
相关文章推荐
- Android自动跳转activity
- 14.浮点数取余和自增自减
- hdu 5573 Binary Tree
- android网络请求网络连接状态判断 & 监控网络状态改变
- leetcode笔记:Count Primes
- 1027. 打印沙漏(20)
- linux查看当前用户id、whoami用户列表、用户组、用户权限/etc/passwd、/etc/group、/etc/shadow以及切换用户身份、su、sudo、/etc/sudoers
- javaweb学习总结(三十四)——使用JDBC处理MySQL大数据
- [转]Hibernate设置时间戳的默认值和更新时间的自动更新
- Linux学习之iptables
- [Java视频笔记]day06
- git pull命令将git服务器的文件更新到本地
- Linux 的 nginx 安装
- Python爬虫学习稿(四)
- javaweb学习总结(三十三)——使用JDBC对数据库进行CRUD
- 有限状态机HDL模板
- hdu-1053-Entropy && poj-1521-Entropy (哈夫曼编码)
- Androidx学习笔记(28)--- 网络图片查看器---HttpURLConnection
- Java 入门 之 集合 Collection
- mysql root修改密码