[原创]CI持续集成系统环境---部署gerrit环境完整记录

 

开发同事提议在线上部署一套gerrit代码审核环境,废话很少说,部署gerrit的操做记录以下:
提早安装好java环境,mysql环境,nginx环境
测试系统:centos6.5
下载下面三个包,放到/root目录下(下载地址:http://pan.baidu.com/s/1nuP0X9R (提取密码gqj5))
mysql-connector-java-5.1.21.jar
bcpkix-jdk15on-1.52.jar
gerrit-2.11.3.warhtml

--------------------------------------------gerrit历史版本下载地址-----------------------------------------------java

http://gerrit-releases.storage.googleapis.com/index.htmlmysql

 

---------------------------------------------------------------------------------------------------------------nginx

1)建立gerrit数据库,并自定义编码为utf8
mysql>create database gerritdb CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql>grant all on gerritdb.* to 'gerrituser'@'localhost' identified by 'gerritpass';
2)添加帐号
[root@115 ~]#useradd gerrit
[root@115 ~]#su - gerrit
[gerrit@115 ~]$
在root帐号下操做
[root@115 ~]# cp /root/gerrit-2.11.3.war /home/gerrit
下面一步很重要,就是说提早把下面的两个软件放到相应的位置,以防在gerrit安装过程当中再去执行下载操做(由于安装过程当中再去下载,因为网速问题会failed!)
[root@115 ~]#mkdir -p /home/gerrit/gerrit_site/lib
[root@115 ~]#cp /root/mysql-connector-java-5.1.21.jar /home/gerrit/gerrit_site/lib/
[root@115 ~]#cp /root/bcpkix-jdk15on-1.52.jar /home/gerrit/gerrit_site/lib/
[root@115 ~]#chown -R gerrit.gerrit /home/gerritgit

接着在gerrit帐号下进行安装
除了选用mysql数据库,Verified,http认证代理,其余的都是默认! web

[gerrit@115 ~]$ java -jar gerrit-2.11.3.war init -d ~/gerrit_site
Using secure store: com.google.gerrit.server.securestore.DefaultSecureStoresql

*** Gerrit Code Review 2.11.3
*** shell


*** Git Repositories
*** 数据库

Location of Git repositories [git]: vim

*** SQL Database
***

Database server type [h2]: mysql

Gerrit Code Review is not shipped with MySQL Connector/J 5.1.21
** This library is required for your configuration. **
Download and install it now [Y/n]?
Renaming mysql-connector-java-5.1.10.jar to .mysql-connector-java-5.1.10.jar.backupDownloading http://repo2.maven.org/maven2/mysql/mysql-connector-java/5.1.21/mysql-connector-java-5.1.21.jar ... OK
Checksum mysql-connector-java-5.1.21.jar OK
Server hostname [localhost]:
Server port [(mysql default)]:
Database name [reviewdb]: gerritdb
Database username [gerrit]: gerrituser
gerrituser's password :
confirm password :

*** Index
***

Type [LUCENE/?]:

The index must be rebuilt before starting Gerrit:
java -jar gerrit.war reindex -d site_path

*** User Authentication
***

Authentication method [OPENID/?]: http
Get username from custom HTTP header [y/N]?
SSO logout URL :

*** Review Labels
***

Install Verified label [y/N]? y

*** Email Delivery
***

SMTP server hostname [localhost]:
SMTP server port [(default)]:
SMTP encryption [NONE/?]:
SMTP username :

*** Container Process
***

Run as [gerrit]:
Java runtime [/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre]:
Copy gerrit-2.11.3.war to /home/gerrit/gerrit_site/bin/gerrit.war [Y/n]?
Copying gerrit-2.11.3.war to /home/gerrit/gerrit_site/bin/gerrit.war

*** SSH Daemon
***

Listen on address [*]:
Listen on port [29418]:

Gerrit Code Review is not shipped with Bouncy Castle Crypto SSL v151
If available, Gerrit can take advantage of features
in the library, but will also function without it.
Download and install it now [Y/n]?
Renaming bcpkix-jdk15on-1.52.jar to .bcpkix-jdk15on-1.52.jar.backupDownloading http://www.bouncycastle.org/download/bcpkix-jdk15on-151.jar ... !! FAIL !!


error: http://www.bouncycastle.org/download/bcpkix-jdk15on-151.jar: 302 Found
Please download:

http://www.bouncycastle.org/download/bcpkix-jdk15on-151.jar

and save as:

/home/gerrit/gerrit_site/lib/bcpkix-jdk15on-151.jar

Press enter to continue
Continue without this library [Y/n]?
Generating SSH host key ... rsa(simple)... done

*** HTTP Daemon
***

Behind reverse proxy [y/N]?
Use SSL (https://) [y/N]?
Listen on address [*]:
Listen on port [8080]:
Canonical URL [http://Zabbix-server:8080/]:

*** Plugins
***

Installing plugins.
Install plugin download-commands version v2.11.3 [y/N]?
Install plugin reviewnotes version v2.11.3 [y/N]?
Install plugin singleusergroup version v2.11.3 [y/N]?
Install plugin replication version v2.11.3 [y/N]?
Install plugin commit-message-length-validator version v2.11.3 [y/N]?
Initializing plugins.
No plugins found with init steps.    

Initialized /home/gerrit/gerrit_site

注意:
一键安装后,默认没有安装上任何插件的,若是用到插件,须要过后手动安装。
手动安装插件(好比replication同步插件)的方法请见于:[原创]CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接(文章结尾有介绍)

************************************************************************* 

第一次手动启动gerrit服务,可能会有下面连个报错

1)

[gerrit@115 ~]$/home/gerrit/gerrit_site/bin/gerrit.sh start

** ERROR: GERRIT_SITE not set

解决办法:

在/home/gerrit/gerrit_site/bin/gerrit.sh启动文件里添加下面一行,即指定gerrit2的路径

GERRIT_SITE=/home/gerrit/gerrit_site

2)

[gerrit@115 ~]$ /home/gerrit/gerrit_site/bin/gerrit.sh start
Starting Gerrit Code Review: FAILED

查看日志,报错以下:
[gerrit@115 ~]$ tail -f /home/gerrit/gerrit_site/logs/error_log
[2016-07-14 10:52:07,317] INFO com.google.gerrit.server.cache.h2.H2CacheFactory : Enabling disk cache /home/gerrit/gerrit_site/cache
[2016-07-14 10:52:08,110] INFO com.google.gerrit.server.config.ScheduleConfig : gc schedule parameter "gc.interval" is not configured
[2016-07-14 10:52:08,859] INFO org.eclipse.jetty.util.log : Logging initialized @4743ms
[2016-07-14 10:52:09,278] INFO com.google.gerrit.server.git.LocalDiskRepositoryManager : Defaulting core.streamFileThreshold to 2047m
[2016-07-14 10:52:09,320] INFO com.google.gerrit.server.plugins.PluginLoader : Loading plugins from /home/gerrit/gerrit_site/plugins
[2016-07-14 10:52:09,322] ERROR com.google.gerrit.pgm.Daemon : Unable to start daemon
com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) No index versions ready; run Reindex

1 error
at com.google.gerrit.lucene.LuceneVersionManager.start(LuceneVersionManager.java:119)
at com.google.gerrit.lifecycle.LifecycleManager.start(LifecycleManager.java:74)
at com.google.gerrit.pgm.Daemon.start(Daemon.java:293)
at com.google.gerrit.pgm.Daemon.run(Daemon.java:205)
at com.google.gerrit.pgm.util.AbstractProgram.main(AbstractProgram.java:64)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.google.gerrit.launcher.GerritLauncher.invokeProgram(GerritLauncher.java:166)
at com.google.gerrit.launcher.GerritLauncher.mainImpl(GerritLauncher.java:93)
at com.google.gerrit.launcher.GerritLauncher.main(GerritLauncher.java:50)
at Main.main(Main.java:25)

解决办法:运行reindex
[gerrit@115 ~]$ java -jar gerrit-2.11.3.war reindex -d /home/gerrit/gerrit_site
[2016-07-14 10:03:43,957] [main] WARN com.google.gerrit.pgm.util.ThreadLimiter : Limiting program to 8 threads due to database.poolLimit
[2016-07-14 10:03:44,031] [main] INFO com.google.gerrit.server.git.LocalDiskRepositoryManager : Defaulting core.streamFileThreshold to 2047m
[2016-07-14 10:03:44,492] [main] INFO com.google.gerrit.server.cache.h2.H2CacheFactory : Enabling disk cache /home/gerrit/gerrit_site/cache
Reindexing changes: done
Reindexed 0 changes in 0.0s (0.0/s)

再次启动gerrit就成功了
[gerrit@115 ~]$ /home/gerrit/gerrit_site/bin/gerrit.sh start
Starting Gerrit Code Review: OK

**************************************************************************

修改/home/gerrit/gerrit_site/etc/gerrit.config配置文件

注意下面两个配置项,修改后以下:

[gerrit]
basePath = git
canonicalWebUrl = http://103.10.86.30/                  //nginx的代理端口 

.........

[httpd]
listenUrl = http://*:8080/

下面是nginx的认证代理配置记录

[root@115 vhosts]# pwd

/usr/local/nginx/conf/vhosts

[root@115 vhosts]# cat gerrit.conf

server {

listen 80;

server_name localhost;

#charset koi8-r;

    #access_log  /var/log/nginx/log/host.access.log  main;

location / {

          auth_basic              "Gerrit Code Review";

          auth_basic_user_file    /home/gerrit/gerrit_site/etc/passwords;            //AuthUserFile路径

          proxy_pass       http://103.10.86.30:8080;          //注意后面不能加"/",不然会出现“Code Review - Error The page you requested was not found....permission to view this page”的报错

          proxy_set_header        X-Forwarded-For $remote_addr;

          proxy_set_header        Host $host;

    }

}

可是nginx进程用户(这里是www)无权访问此路径,须要对/home/gerrit进行赋权: 
[gerrit@115 ~]# setfacl -m g:www:rx /home/gerrit
这一步很重要!不然,访问gerrit的时候会报500的错!

[或者 setfacl -R -m u:www:rx /home/gerrit  上面是针对所属组进行受权,这里能够针对用户受权] 

建立认证权限(也就是登录的时候输入的权限)

注意:第一次加-c参数是为了建立密码文件,默认第一个用户是系统管理员

[root@115 vhosts]#htpasswd -c /home/gerrit/gerrit_site/etc/passwords  gerrit

New password:

Re-type new password:

Adding password for user gerrit

[root@115 vhosts]#htpasswd /home/gerrit/gerrit_site/etc/passwords wangshibo

New password:

Re-type new password:

Adding password for user wangshibo

[root@115 vhosts]#htpasswd /home/gerrit/gerrit_site/etc/passwords jenkins

New password:

Re-type new password:

Adding password for user jenkins

查看下认证帐号文件信息

[root@115 vhosts]# cat /home/gerrit/gerrit_site/etc/passwords

重启nginx服务

[root@115 vhosts]# /usr/local/nginx/sbin/nginx -s reload

访问http://ip,输入上面建立的用户信息便可登录gerrit

 *************** *************** *************** *************** ***************

下面是设置邮箱的操做!!!
在gerrit一键安装的时候,邮箱环节采用的是默认安装。
安装后登录gerrit,默认状况下邮箱是空的。
 
这个时候,能够手动设置。
注册邮箱并激活,具体设置以下:
 
切换到gerrit帐号下
[gerrit@115etc]$ pwd
/home/gerrit/gerrit_site/etc
[gerrit@115 etc]$ cat gerrit.config
............
[sendemail]
        smtpServer = smtp.xqshijie.cn                  【此处设置的是发件邮箱信息】
        smtpUser = ops@xqshijie.cn
        from = ops@xqshijie.cn
        smtpPass = iJWxSmXcOz9hs4xH                     
 
[gerrit@115 etc]$ cat secure.config
[auth]
  registerEmailPrivateKey = 65RWiWt5/ZxKN0ISPv8U8dee9vL2+cLidPk=
  restTokenPrivateKey = O9k9OAlvWxdtOspz4Mjff85ZoUlZJfxvxDU=
[sendemail]
  smtpPass = iJWxSmXcOz9hs4xH
 
注意:
sendmail的密码会另保存到secure.config文件里,必定要保证gerrit.config文件里的密码和secure.config里的密码一致!
而后重启gerrit服务便可!
[gerrit@115 etc]$ /home/gerrit/gerrit_site/bin/gerrit.sh restart
Stopping Gerrit Code Review: OK
Starting Gerrit Code Review: OK
 
-------------------上面采用的是阿里企业邮箱,也能够采用其余邮箱帐号进行发件,好比163邮箱等------------------------
[sendemail]
smtpServer = smtp.163.com
smtpUser = wang_shibo1987@163.com
from = wang_shibo1987@163.com
smtpPass = x1nN13ZcJcNKenl1
-------------------------------------------------------------------------------------------------------------------------------
而后登录gerrit界面进行邮箱注册
默认状况下不注册邮箱,在设置栏里是没有邮箱能够选择的
 
邮件发送成功!!!!
登录邮箱,如截图中的激活连接以下,点击激活
http://103.10.86.30:80/ #/VE/Mc3qASBMgi9tkXJZZ99YyF9OOnqXnk8qZhz5Cg==$MzpqZW5raW5zQHhxc2hpamllLmNu

 

 激活以后,在设置栏里就有邮箱可选择了

------------------------------------------------------------------------------------------------------------------------

注意:

用htpasswd建立第一个用户时默认是系统管理员,ID为1000000,默认只有这个系统管理员才有Create权限(建立group和Project),

其余的都只有“List”查看权限

用htpasswd建立的用户时,并无往gerrit中添加帐号,只有当该用户经过web登录gerrit服务器时,该帐号才会被添加进gerrit数据库中。

退出admin帐号从新登录(HTTP认证模式不支持Sign Out,须要先Sign Out退出帐号,关闭浏览器后再登录才能出现http验证密码的对话框

---------------------------------------------git中文编码问题------------------------------------------------------------

为妥善解决中文编码的问题,对全部git repository作以下约定:
  a、全部文本文件都必须存储成utf8编码
  b、对git作以下设置:
    git config --global core.quotepath false
    git config --global i18n.logoutputencoding utf8
    git config --global i18n.commitencoding utf8
安装gerrit的时候对于数据库(选择myqsl方式的话)的编码设定为utf8

--------------------------------------------gerrit对接gitweb-----------------------------------------------------

上面搭建好的gerrit,登录进去在Projects项目里的右边没有gitweb的超连接

1.须要先搭建gitweb,而后进行相关配置

[root@115 ~]# yum install -y gitweb     【或者直接yum install -y git*】

gitweb安装后的目录路径是/var/www/git

2. 经过git config配置一下
[root@115 ~]#git config --file /home/gerrit/gerrit_site/etc/gerrit.config gitweb.cgi /var/www/git/gitweb.cgi 
[root@115 ~]#git config --file /home/gerrit/gerrit_site/etc/gerrit.config --unset gitweb.url
3.重启gerrit,而后登录gerrit后,gitweb超连接 效果就有了

********************** ********************** ******************** 

gitweb仍是蛮实用的。

能够经过打开gerrit上某个工程的gitweb,查看到这个工程代码近期的全部动向!

【默认状况下:只有gerrit的管理员权限才能查看gitweb】

【普通用户要想访问gitweb,须要后续添加访问权限,具体参照http://www.cnblogs.com/kevingrace/p/5651447.html文章底部的介绍】

以下:

--------------------------------------------------ssh公钥设置-------------------------------------------

在gerrit本机上使用下面的命令生成管理员帐号(这里将gerrit做为管理员)的公私钥
[gerrit@115]$ ssh-keygen -t rsa -C gerrit@xqshijie.cn
[gerrit@115]$ cd ~/.ssh/                            【~是切换到当前用户家目录下】
[gerrit@115]$ ls  
id_rsa  id_rsa.pub

[gerrit@115]$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqvdgToL4veIqVe4D2iOwpzggdnGU8eGfRpwZH5hsCPdrIfjMgAMYz4TCKzmD9yv8VXrG/hCOX1zgL63ZLJ1NUTTG4zJ48UefRA0i3YqDez0RH5fhI/T69KalBNfPaRcaCqcdTfJcSW5FxZ4CMsHj7uyKrGry6sA3VkYhy08WA4CVcXHPI4R+va+Ga0KvTVKxBqpEiR+1r8+hECTyWo1XngqRVQpfJismQwUXe2J9U41T+DaQfJDaB+hdYPm2Xoeu7LlsyPFrUn/Jq3vy4YeU1XVD4BIMGXxg87MUdmZh0CzbeUSc1TgKYccUccTgnVDfgwgvwY/gJYbb7csCrlW5+w== gerrit@xqshijie.cn

而后将gerrit帐号的公钥id_rsa.pub内容拷贝到gerrit界面的 SSH Public Key里面

接下来能够设置别名,方便使用ssh链接gerrit
能够直接在gerrit用户家目录(/home/gerrit)下的.bashrc文件里设置
以下别名是登录gerrit的admin帐号下的操做:
alias ssh-gerrit='ssh -p 29418 -i ~/.ssh/id_rsa 103.10.86.30 -l gerrit'        【公钥已拷贝到gerrit里,这里用私钥去连】
而后source /home/gerrit/.bashrc使其生效
以下:

[gerrit@115]$vim /home/gerrit/.bashrc
[gerrit@115]$source /home/gerrit/.bashrc
[gerrit@115]$cat /home/gerrit/.bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
alias ssh-gerrit='ssh -p 29418 -i ~/.ssh/id_rsa 103.10.86.30 -l gerrit'
# User specific aliases and functions
[gerrit@115]$ssh-gerrit

**** Welcome to Gerrit Code Review ****

Hi gerrit管理员, you have successfully connected over SSH.

Unfortunately, interactive shells are disabled.
To clone a hosted Git repository, use:

git clone ssh://gerrit@Zabbix-server:29418/REPOSITORY_NAME.git

Connection to 103.10.86.30 closed.

---------------------------------------------------------扩展----------------------------------------------------------
下面是在安装过程当中,选用默认的H2数据库状况下的操做事项:
默认状况下,gerrit登录后,setting处的帐户邮箱是空的
除了上面使用邮箱注册并激活的方法
还能够 直接在数据库中手动插入邮箱
以下:
 
查看数据库,发现默认是没有邮箱信息的
[gerrit@115]$ ssh-gerrit gerrit --help           【ssh-gerrit是上面设置过的别名】
[gerrit@115]$ ssh-gerrit gerrit gsql           【注意:只有管理员才有权限操做数据库!!!!】
gerrit> select * from ACCOUNT_EXTERNAL_IDS;
 ACCOUNT_ID | EMAIL_ADDRESS | PASSWORD | EXTERNAL_ID
 -----------+---------------+----------+---------------------
 1000000    | NULL          | NULL     | gerrit:gerrit
 1000000    | NULL          | NULL     | username:gerrit
 1000001    | NULL          | NULL     | gerrit:wangshibo
 1000001    | NULL          | NULL     | username:wangshibo
 1000002    | NULL          | NULL     | gerrit:jenkins
 1000002    | NULL          | NULL     | username:jenkins
下面就手动插入邮箱
gerrit>insert into ACCOUNT_EXTERNAL_IDS values('1000000', 'gerrit@xqshijie.cn', 'NULL', 'mailto:gerrit@xqshijie.cn');
gerrit>insert into ACCOUNT_EXTERNAL_IDS values('1000001', 'wangshibo@xqshijie.cn', 'NULL', 'mailto:wangshibo@xqshijie.cn');
gerrit>insert into ACCOUNT_EXTERNAL_IDS values('1000002', 'jenkins@xqshijie.cn', 'NULL', 'mailto:jenkins@xqshijie.cn');
gerrit> select * from ACCOUNT_EXTERNAL_IDS;
 ACCOUNT_ID | EMAIL_ADDRESS           | PASSWORD | EXTERNAL_ID
 -----------+-------------------------+----------+-------------------------------
 1000000    | NULL                    | NULL     | gerrit:gerrit
 1000000    | NULL                    | NULL     | username:gerrit
 1000001    | NULL                    | NULL     | gerrit:wangshibo
 1000001    | NULL                    | NULL     | username:wangshibo
 1000002    | NULL                    | NULL     | gerrit:jenkins
 1000002    | NULL                    | NULL     | username:jenkins
 1000000    | ops@xqshijie.cn         | NULL     | mailto:gerrit@xqshijie.cn
 1000001    | wangshibo@xqshijie.cn   | NULL     | mailto:wangshibo@xqshijie.cn
 1000002    | liuxianpeng@xqshijie.cn | NULL     | mailto:jenkins@xqshijie.cn
(9 rows; 1 ms)
gerrit>
使用下面的命令,会使得上面的操做马上生效!!!
[gerrit@115]$# ssh-gerrit gerrit flush-caches
下面登录gerrit,而后选择帐号相对于的邮箱,点击save保存就ok了!
 
 
-----------------------------------------------------------Gerrit权限说明----------------------------------------------

上面介绍了gerrit环境的部署,下面介绍下gerrit权限:

Abandon
此权限容许用户丢弃一个提交的change。若是用户有push权限,给用户分配此权限的同时用户也被分配了restore a change的权限。

Create Reference
此权限管理用户是有能够建立references,branches,tags。此权限通常与普通的push权限一块儿被分配。

Forge Author
伪造发起人权限,此权限容许用户绕过提交时的身份验证(Gerrit默认会匹配提交信息中author或者committer行中的email地址,若是 Email地址不匹配,则不容许提交)。

Forge Committer
伪造提交者权限,此权限容许用户绕过提交时的身份验证(Gerrit默认会匹配提交信息中author或者committer行中的email地址,若是 Email地址不匹配,则不容许提交 )。

Forge Server
伪造Gerrit服务器权限,此权限容许在committer行中使用server owner和email

Owner
此权限容许用户修改香项目的配置,具体以下:

修改项目描述
经过ssh的"create-branch"命令建立分支
在web UI界面建立/删除branch
容许/撤销任何访问权限,包括Owner权限。

Push
此分类控制用户被容许怎样推送新commit到Gerrit。

Direct Push
全部已存在的branch能够快进到新的commit。建立新分支受“Create Reference”控制,不容许删除已存在的分支,这是最安全的模式(由于commit不能够被丢弃)。

Force option
容许已存在的branch被删除。开启此选项能够从项目历史中删除提交记录。
此权限主要用来给那些只想用Gerrit的访问控制,不须要Gerrit的代码审查功能的工程使用。

Upload To Code Review
此push权限分配在refs/for/refs/heads/BRANCH命名空间上,容许用户提交一个未合并(non-merge)的commit到refs/for/BRANCH命名空间,建立一个新的代码审查change。
用户必须可以clone和fetch一个工程才能够提交change,因此用户还必须拥有Read权限。

Push Merge Commits
此权限容许用户提交merge commits,它是Push权限的附属物,若是想只容许经过Gerrit作merge操做,那么应该只分配Push仅限而不分配此权限。

Push Annotated Tag
此类权限容许用户向工程仓库提交一个annotated tag。一般使用如下两种方式提交:

git push ssh://USER@HOST:PORT/PROJECT tag v1.0
或者:
git push https://HOST/PROJECT tag v1.0
Tags必须被注释(使用git tag -a),必须在refs/tags/下存在,并且必须是新的。
通常在工程达到了稳定且可发布的时候会打一个Tag。
此权限容许建立一个未签名的Tag。打Tag者的email地址必须与当前用户的一致。
若是要提交不是本身打的Tag,则必须同时分配Forge Committer Identity权限。
若是要提交轻标签(lightweight tags)分配Create Reference权限给引用/refs/tags/*
若是要删除或覆盖一个已存在的tag,分配Push权限并开启Force option。

Push Signed Tag
此类权限容许用户向工程仓库提交一个PGP签名的 tag。一般使用如下两种方式提交:

git push ssh://USER@HOST:PORT/PROJECT tag v1.0
或者:
git push https://HOST/PROJECT tag v1.0
Tags必须被注释(使用git tag -a),必须在refs/tags/下存在,并且必须是新的。

Read
此类权限控制工程的changes, comments,和code diffs可见性,和是否可经过SSH或HTTP访问Git。
若是在单独工程的ACL中设置的此权限,那么全局ACL中的设置将不起做用。

Rebase
此类仅限容许用户经过web页面的“Rebase Change”按钮衍合(Rebase)修改

Remove Reviewer
此类权限容许用户在一个change的reviewers list中移除其余用户。
change所属者能够移除0分或负分的reviewers(即便没有此权限)。
项目全部者和网站管理员能够移除全部reviewers(即便没有此权限)。
没有此权限的用户只能够移除本身。

Review Labels
// TODO

Submit
此类权限容许用户提交changes。
提交一个change会使该change尽量快的合并到目的分支,使其做为项目历史永久的一部分。
为了提交change,全部的labels都必须容许提交,而且不能block它。
若是要快速提交一个push上的change,用户须要在refs/for/<ref>(e.g. on refs/for/refs/heads/master)有此权限。

Submit(On Behalf Of)
此类权限容许有Submit权限的用户表明其余用户提交change。
在project.config文件中,此权限被命名为submitAs。

View Drafts
此类权限容许用户查看其余用户提交的drafts changes
change所用者和任何明确添加的reviewers也能够查看(即便没用此权限)

Publish Drafts
此类权限容许用户发布其余用户提交的drafts changes
change所用者和任何明确添加的reviewers也能够查看(即便没用此权限)

Delete Drafts
此类权限容许用户删除其余用户提交的drafts changes
change所用者和任何明确添加的reviewers也能够查看(即便没用此权限)

Edit Topic Name
容许用户编辑提交到review的change的话题名。
change所用者,分支所用者,项目所用者和网站管理员均可以编辑此话题名(即便没有此权限)。
“Force Edit”标识控制是否能够编辑已关闭的change标题,若是此标识设置只能编辑open changes,则不能够编辑已关闭的change 标题。

Edit Hashtags容许用户在提交到reviews的changes上添加或移除hashtags。change所用者和任何明确添加的reviewers也能够查看(即便没用此权限)