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


[gerrit]



host=xx.xx.x.xx



port=29418



project= test -project1.git




2.  Jenkins安装Gerrit Trigger

Jenkins->系统管理->管理插件->可用插件->搜索Gerrit Trigger->安装

配置Gerrit Trigger

Jenkins系统管理->Gerrit Trigger

jenkins git parameter 多个仓库 jenkins git 128_代码分析

测试下能否连接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



[remote           "test-project1"          ]          
          projects =           test          -project1         
          url = git@xx.xx.xx.xx:dev-group          /test-project1          .git         
          push = +refs          /heads/          *:refs          /heads/          *         
          push = +refs          /tags/          *:refs          /tags/          *         
          push = +refs          /changes/          *:refs          /changes/          *         
          threads = 3



更新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


Host xx.xx.xx.xx:         
                    IdentityFile ~/.          ssh          /id_rsa         
                    PreferredAuthentications publickey





OK,just enjoy it.



参考:



权限配置:

http://openwares.net/linux/gerrit_privilege_setup.html