Gerrit是一款被Android开源项目广泛采用的code review(代码审核)系统。普通用户将远程git库里的项目clone到本地,修改代码后,不能直接push到代码中心 ,而是通过git review(需要单独安装)提交到gerrit中的git库里进行审核。gerrit相关审核员看到review信息后,判断是否通过,通过即commit提交。然后,gerrit代码会和远程git库完成同步。
gerrit的精髓在于不允许直接将本地修改同步到远程仓库。客户机必须先push到远程仓库的refs/for/*分支上,等待审核。
gerrit上也可以对比代码审核提交前后的内容状态。
很多时间,我们希望在对代码进行review之前能先跑一遍代码分析和单元测试后,再进行人式review,这个时间可以使用Jenkins的自动化部署实现。
当用户git review提交后,代码先提交到Gerrit的临时git库。所以需要当Gerrit项目仓库有变化时,先通过Jenkins来进行自动化测试和代码分析,Jenkins测试通过后,打上Verified,然后再交给人工review,人工review通过后,自动同步到远程git库中。Gerrit 自带一个 Replication 功能,同时我们在安装 Gerrit 时候默认安装了这个 Plugin,通过添加replication.config 给 Gerrit即可。
用户git review提交代码 -> 提交到Gerrit库 -> 触发Jenkins自动测试,测试通过Verified -> 人工审核Review,review通过 -> Gerrit执行Replication -> push Git remote
Gerrit是一个基于Web的服务,提供代码的Review功能,Gerrit肯定要启动Web服务器,并且安装Gitweb。
1. 用户git review时自动将代码提交到Gerrit库,而不是远程Git库:在工程目录下添加.gitreview的配置信息,指定Gerrit库并且用户需要有Gerrit的库的访问权限,通过ssh访问
2. Jenkins要集成Gerrit的触发功能:安装Gerrit Trigger Plugin插件,并且配置Trigger的时机条件
3. Jenkins配置自动化测试及代码分析功能:通过SonarQube实现代码分析
4. Jenkins通过测试后给代码打上Verified:Gerrit通过启动SSH服务允许Jenkins来直接与Gerrit进行通信,Jenkins要添加Jenkins用户并配置Gerrit Server信息并且可以请求成功
5. Gerrit配置Code Review需要两步:Jenkins Verified和人工Review:将Jenkins用户添加到指定None-Interactive-Group里并将其赋有Verified功能。
6. Gerrit配置replication.confg,在代码Review通过后,自动将patch合并到远程Git库的master上:需要在远程Git库上添加SSH Public Key,并且在Gerrit服务器上配置config及Known_hosts。
1. 创建用户ssh
#ssh-keygen -t rsa -C michaeltang@openmore.org
# cat ~/.ssh/id_rsa.pub
将id_rsa.pub添加到Gerrit上新创建的用户的SSH公钥里。
为Git项目添加.gitreview配置
# vim .gitreview
1 2 3 4 | |
2. Jenkins安装Gerrit Trigger
Jenkins->系统管理->管理插件->可用插件->搜索Gerrit Trigger->安装
配置Gerrit Trigger
Jenkins系统管理->Gerrit Trigger
测试下能否连接Gerrit Server。
自动Scanner Shell
cd /tmp
# 将代码放到tmp里
if [ -d sonar_tmp ];then
echo 'sonar_tmp exist'
rm -rf sonar_tmp/*
else
mkdir sonar_tmp
fi
cd sonar_tmp
# clone代码
git clone http://xx.xx.xx.xx/p/ipottery.git
cd *
# 获得所有的changes
git fetch http://xx.xx.xx.xx/p/ipottery.git refs/changes/*:refs/changes/*
# 获得最新的修改
CommitNo=`tail -n1 .git/FETCH_HEAD | awk '{print$1}'`
# 合并到当前临时分支
git merge $CommitNo
/home/gerrit/sonar-scanner-3.0.3.778-linux/bin/sonar-scanner -Dsonar.host.url=http://sonar.wenxy.cc -Dsonar.sourceEncoding=UTF-8 -Dsonar.projectName=pottery_code_review -Dsonar.projectVersion=1.0.1 -Dsonar.projectKey=pottery_code_review -Dsonar.sources=src -Dsonar.projectBaseDir=.
3. Jenkins自动化测试及代码分析
1> 创建Jenkins job
2> git里选择Repository URL 填写Gerrit的库地址:http://xx.xx.xx.xx:7081/p/testgerrit.git
3> 构建触发器,选择Gerrit Event,选择前面2配置的Server名,Dynamic Trigger Configuration里选择Plain/testproject/Plain/master,构建里选择Execute SonarQube Scanner
4. Jenkins Verified
1> 在Gerrit里创建Jenkins用户,并且为Jenkins生成SSH密钥,将公钥添加到Jenkins的Gerrit帐户上。
2> 为所有的Gerrit添加Verified功能的支持
$ git remote add origin ssh://gerrit@103.10.86.30:29418/All-Projects
$ git pull origin refs/meta/config
$ vim project.config
[label "Verified"]
function = MaxWithBlock
value = -1 Fails
value = 0 No score
value = +1 Verified
$ git commit -a -m 'Updated permissions'
$ git push origin HEAD:refs/meta/config
5.
Jenkins Verified和人工Review
1> 将Jenkins用户添加到Non-Interactive User组内
Projects->List->All-Projects
Projects->Access
Global Capabilities->Stream Events 点击 Non-Interactive Users
添加 Jenkins@zjc.com 用户到 ‘Non-Interactive Users’ 组
2> 在Gerrit里添加上对Jenkins Verified的支持
Projects -> List -> All-Projects
Projects -> Access -> Edit -> 找到 Reference: refs/heads/* 项 -> Add Permission -> Label Verified -> Group Name 里输入 Non-Interactive Users -> 回车 或者 点击Add 按钮 -> 在最下面点击 Save Changes 保存更改。
6. 配置replication.config
# cd /home/gerrit/gerrit_site/etc/
# vim replication.config
|
更新known_hosts文件:
# sh -c "ssh-keyscan -t rsa xx.xx.xx.xx >> /home/gerrit/.ssh/known_hosts"
# sh -c "ssh-keygen -H -f /home/gerrit/.ssh/known_hosts"
# chmod 600 ~/.ssh/config
设置gerrit用户的 ~/.ssh/config
# vim /home/gerrit/.ssh/config
|
OK,just enjoy it.
参考:
权限配置:
http://openwares.net/linux/gerrit_privilege_setup.html