gerrit代码评审服务器搭建
一、准备工作
安装CentOS7操作系统,准备Gerrit软件安装包:gerrit-2.10.war。
安装sendmail:
[[email protected] ~]#yum install -y sendmail
安装apache:
[[email protected] ~]#yum install -y httpd创建一个用户用于安装Gerrit:
[[email protected] ~]#adduser gerrit
二、安装Gerrit
首先切换到gerrit用户:
[[email protected] ~]#su gerrit
[[email protected] root]$cd[[email protected] ~]$
安装Gerrit软件:
- [[email protected] ~]$java -jar gerrit-2.10.war init -d review2
- *** Gerrit Code Review 2.10
- ***
- Create '/home/gerrit/review2' [Y/n]?
- *** Git Repositories
- ***
- Location of Git repositories [git]:
- *** SQL Database
- ***
- Database server type [h2]:
- *** Index
- ***
- Type [LUCENE/?]:
- *** User Authentication
- ***
- Authentication method [OPENID/?]: HTTP
- Get username from custom HTTP header [y/N]?
- SSO logout URL :
- *** Review Labels
- ***
- Install Verified label [y/N]?
- *** 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.7.0-openjdk-1.7.0.75-2.5.4.2.el7_0.x86_64/jre]:
- Copy gerrit-2.10.war to /home/gerrit/review2/bin/gerrit.war [Y/n]?
- Copying gerrit-2.10.war to /home/gerrit/review2/bin/gerrit.war
- *** SSH Daemon
- ***
- Listen on address [*]:
- Listen on port [29418]:
- Gerrit Code Review is not shipped with Bouncy Castle Crypto SSL v149
- If available, Gerrit can take advantage of features
- in the library, but will also function without it.
- Download and install it now [Y/n]?
- Downloading http://www.bouncycastle.org/download/bcpkix-jdk15on-149.jar ... !! FAIL !!
- error: www.bouncycastle.org
- Please download:
- http://www.bouncycastle.org/download/bcpkix-jdk15on-149.jar
- and save as:
- /home/gerrit/review2/lib/bcpkix-jdk15on-149.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]? y
- Proxy uses SSL (https://) [y/N]?
- Subdirectory on proxy server [/]: /gerrit
- Listen on address [*]:
- Listen on port [8081]:
- Canonical URL [http://localhost/gerrit]: http://10.1.5.116/gerrit
- *** Plugins
- ***
- Install plugin commit-message-length-validator version v2.10 [y/N]?
- Install plugin download-commands version v2.10 [y/N]?
- Install plugin replication version v2.10 [y/N]?
- Install plugin reviewnotes version v2.10 [y/N]?
- Install plugin singleusergroup version v2.10 [y/N]?
- Initialized /home/gerrit/review2
- Executing /home/gerrit/review2/bin/gerrit.sh start
- Starting Gerrit Code Review: OK
- Waiting for server on 10.1.5.116:80 ... OK
- Opening http://10.1.5.116/gerrit/#/admin/projects/ ...FAILED
- Open Gerrit with a JavaScript capable browser:
- http://10.1.5.116/gerrit/#/admin/projects/
设置gerrit开机启动:
[[email protected] root]$sudo ln -s /home/gerrit/review2/bin/gerrit.sh /etc/init.d/gerrit.sh
[[email protected] root]$sudo chkconfig --level 345 gerrit.sh on
三、配置Apache反向代理
在/etc/httpd/init.d中创建gerrit.conf文件,填入下列内容:
- <Directory />
- Options FollowSymLinks
- AllowOverride None
- </Directory>
- SetEnv GIT_PROJECT_ROOT /git-repo/
- SetEnv GIT_HTTP_EXPORT_ALL
- ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
- ServerName localhost
- ProxyRequests Off
- ProxyVia Off
- ProxyPreserveHost On
- <Proxy *>
- Order deny,allow
- Allow from all
- </Proxy>
- <Location "/gerrit/login/">
- AuthType Basic
- AuthName "Gerrit Code Review"
- AuthBasicProvider file
- AuthUserFile /etc/gerrit.passwd
- Require valid-user
- </Location>
- ProxyPass /gerrit http://localhost:8081/gerrit
[[email protected] ~]#service httpd restart
设置httpd开机启动:
[[email protected] ~]#chkconfig --level 345 httpd on
四、注册Gerrit用户
登录Gerrit服务器,执行:
这样就注册了一个用户user1。
在浏览器中输入:http://10.1.5.116/gerrit,回车(10.1.5.116是gerrit服务器的IP):
输入用户名和密码,点击“确定”:
点击"Register New Email"注册Email:
填入邮箱地址后,点击“Register”。如果网络没有问题则注册邮箱会收到下面的邮件:
- Welcome to Gerrit Code Review at 10.1.5.116.
- To add a verified email address to your user account, please
- click on the following link while signed in as user1:
- http://10.1.5.116/gerrit/#/VE/a9ShrHrDxyxviNhDPGF/9YYu9l1NkC716+LOJQ==$MTAwMDAwMTp1c2VyMUB0ZXN0LmNvbQ==
- If you have received this mail in error, you do not need to take any
- action to cancel the account. The address will not be activated, and
- you will not receive any further emails.
- If clicking the link above does not work, copy and paste the URL in a
- new browser window instead.
- This is a send-only email address. Replies to this message will not
- be read or answered.
可以看出这封注册邮件被延迟了。根据Q-ID查找被延迟的消息:
将链接“http://10.1.5.116/gerrit/#/VE/a9ShrHrDxyxviNhDPGF/9YYu9l1NkC716+LOJQ==$MTAwMDAwMTp1c2VyMUB0ZXN0LmNvbQ==”输入浏览器:
邮箱注册成功!
第一个注册的用户自动具有管理员权限,以后注册的用户默认没有管理员权限,权限的修改可以由管理员完成。
下面说明一下将非第一个注册的用户user1设置为管理员的过程。首先需要用具有管理员权限的用户登录,点击“People-->List Groups”:
点击“Administrators”:
输入用户名:
输入首字母系统就会列出匹配的条目。选中后点击“Add”:
user1就称为管理员用户组中的一员了,具备了管理员权限。
user1的默认名称为“Anonymous Coward”,可以修改一下:
点击“Settings”:
点击“Contact Information”:
在“Full Name”中输入新名称:
点击“Save Changes”:
看右上角,名称已经变了!
下面需要填入客户端公钥。创建一个用户ttt,切换到ttt用户,执行ssh-******生成公钥:
将id_rsa.pub中的内容全部复制,然后在网页中点击右上角的全名:
点击“Settings-->SSH Public Keys”:
点击“How to Generate an SSH Key”可以查看如何生成Public Key:
将复制的公钥粘贴上去:
点击“Add”:
公钥添加完成!一个用户可以添加多个公钥。
五、创建代码库
点击“Projects->Create New Project”:
在"Project Name"中填入代码库名称,并选中“Create initial empty commit”:
点击“Create Project”:
在“Description”中填入描述信息,点击"Save Changes"。点击"Projects-->List":
可见新的代码库已经创建成功。
创建这个代码库的用户会默认关注这个库的变化。关注的意思是有代码提交等行为时关注这个库的用户会收到邮件通知。其它用户可以设置关注此库:
点击“Browse”可以查看已有的代码库:
双击选中的库:
这样new-repo这个库就被当前用户关注了。
我们可以为这个新建立的库配置权限,点击“Projects-->LIst-->new-repo-->Access”:
默认new-repo是继承All-Projects的权限。点击All-Projects可以编辑全局权限,通常全局权限编辑完成后新项目不需要再设置权限(除非有特殊需求)。为说明权限设置方法,先单独为new-repo设置本地权限,本地权限的优先级高于全局权限。通常设置评审代码权限和提交权限即可,其中前者是使项目提交的代码能够被评审,后者是允许评审者在评审通过后合入所提交的代码。
点击“Edit”:
点击“Add Reference”:
Reference是代码提交的目的地(分支或Tag),Gerrit的权限管理是基于reference进行。默认reference是“refs/heads/*”,这个通常不需要修改。"refs/*"是控制所有提交的reference。点击“Add Permission”:
添加代码评审权限需要选中“Label Code-Review”:
添加组名,使得组内的成员拥有该权限:
点击“Add”,再点击“Add Reference”添加提交权限:
选中"Submit":
点击“Save Changes”使设置生效:
六、检出代码
在Git bash环境下执行“git config --global credential.helper store”。这样就可以保存密码信息,不用每次都输入密码。
点击"Projects-->List-->new-reo-->Gernal":
点击右下角那个小方框(或双击git clone那行字符串然后复制),在git bash终端中粘贴:
用户名填入user1,密码的获取则要麻烦一些。点击右上角的全名:
点击“Settings-->HTTP Password”:
点击“Generate Passsword”:
双击“Password”对应的条目,复制密码,填入"Passwor for"对应的项中:
clone成功!
七、代码提交评审
在提交代码之前,需要进入到代码库主目录下执行:
- gitdir=$(git rev-parse --git-dir); scp -p -P 29418 [email protected]:hooks/commit-msg ${gitdir}/hooks/
然后可以用git命令提交代码。提交完毕后需要push到Gerrit评审服务器,push命令为:
- git push origin HEAD:refs/for/master
如果提交到名称为new-branch的分支则提交命令为:
- git push origin HEAD:refs/for/new-branch
为简化命令,编辑new-repo/.git/config:
如图所示,在[remote "origin"]一行下面添加“push = HEAD:refs/for/master”,这样就可以用“git push”提交代码评审了:
八、评审代码
new-repo库中有代码提交后,关注这个代码库的用户会收到一个邮件通知:
- cool has uploaded a new change for review.
- http://10.1.5.116/gerrit/4
- Change subject: add
- ......................................................................
- add
- Change-Id: I6cfb4a809b39685df0c62fad0396c0d3d8593057
- ---
- M zzz
- 1 file changed, 1 insertion(+), 1 deletion(-)
- git pull ssh://10.1.5.116:29418/new-repo refs/changes/04/4/1
- --
- To view, visit http://10.1.5.116/gerrit/4
- To unsubscribe, visit http://10.1.5.116/gerrit/settings
- Gerrit-MessageType: newchange
- Gerrit-Change-Id: I6cfb4a809b39685df0c62fad0396c0d3d8593057
- Gerrit-PatchSet: 1
- Gerrit-Project: new-repo
- Gerrit-Branch: master
- Gerrit-Owner: cool <[email protected]>
- Gerrit-Reviewer: jason <[email protected]>
可以点击画红框的“Side-by-SIde”位置查看diff,点击Review填写评审意见。填写评审意见后如果没有问题可点击“Submit Patch Set1”合入代码,如果发现问题则点击“Abandon Change”丢弃修改。
点击“Side-by-SIde”后会弹出页面:
点击“Review”会进入:
如果没有发现问题,可以合入代码,则在“Code-Review”选项中选择“+2 Looks ...”;如果代码需要合入则必须有人评审而且选择此选项。
如果没有发现问题但需要他人同意才能合入代码,则选择“+1 Looks ...”;
如果没有任何建设性意见则选择“0 No score”;
如果没有发现问题但不建议合入则选择“-1 I would ...”;
如果发现问题不允许合入则选择“-2 This shall ...”;但如果其他评审人员认为可以合入,且选择了“+2 Looks ...”,在点击“Submit Patch Set1”时代码仍然可以合入。
评审意见可以在Cover Message下面的框中填入(也可以不填),然后点击“Publish Comments”:
点击“Submit Patch Set1”合入代码:
可以看到Gerrit显示代码已经成功合入。
在提交代码的客户端上,需要执行"git pull"同步代码:
代码同步完成。一次代码评审过程结束。