所需软件
Git:代码版本管理
Java:最低1.7版本
Gerrit:安装包是个war包
数据库:Gerrit支持H2(内置) / MySQL / PostgreSQL,本安装选择PostgreSQL,完全开源且适合大规模数据的部署
身份认证:审核的前提是做身份认证来登陆Web,Gerrit支持OpenID / HTTP / LDAP,本安装选择已经搭建好的LDAP,但会讲解HTTP方式的认证,需要Apache做反向代理。
安装部分以ubuntu为例
Git安装
sudo apt-get install git
JDK安装
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk //当前安装为 jdk1.8.0_101
配置Java环境变量
PATH,指定命令搜索路径,在shell下执行命令时,会到PATH变量指定的路径中查找相应命令程序,如java/javac
CLASSPATH,指定类搜索路径,JVM通过它寻找类
JAVA_HOME,其他软件通过它找到jdk的安装目录
vi /etc/profileexportJAVA_HOME= /usr/java/jdk1.8.0_101/exportCLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATHexportPATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATHsource/etc/profilejava -version
如果安装了多个jdk,就选择一个默认的
sudoupdate-alternatives --config java
PostgreSQL安装(目前用现有的Postgre数据库新建数据库和用户)
sudoapt-get install postgresql
初次安装后,会默认生成名为postgres的Linux系统用户、数据库和数据库用户(作为数据库管理员),首先修改postgres数据库用户的密码,然后增加Gerrit需要的数据库
sudo-u postgres psqlpostgres=# \password postgres(input password twice)postgres=# \q
sudo-u postgres createuser -RDIElPS gerritsudo-u postgres psqlpostgres=# \password gerrit(input password twice)sudo-u postgres createdb -E UTF-8-O gerrit reviewdb
Gerrit安装
从官网下载Gerrit的安装包,为了方便改名为gerrit.war,建议创建一个Linux用户来安装,本人安装在gerrit2用户的review_site目录下
sudoadduser gerritsudosu gerritjava -jar gerrit.war init-d/home/gerrit/review_site
然后就会进行很多配置,大部分默认即可,要注意的是数据库和身份认证,这些配置也可以在安装完成后在~/review_site/etc/gerrit.config文件中修改。
当前gerrit.config配置为:
[gerrit]
basePath = /home/gerrit/git
serverId = 7e182d87-75eb-4046-8547-496b55ea7ad9
canonicalWebUrl =http://gerrit.*****-net.com:8080
[database]
type = postgresql
hostname = 172.17.3.132
database = gerrit
username = gerrit
[auth]
type = LDAP
[ldap]
server =ldap://172.17.3.101
username = svc.jenkins
accountBase = dc=*****-net,dc=com
groupBase = dc=*****-net,dc=com
[receive]
enableSignedPush = false
[sendemail]
smtpServer = 172.17.3.201
smtpUser = svc.jenkins
smtpPass =******* //具体为邮件用户密码
from=CodeReview*****-net.com> //发件人显示
[container]
user = gerrit
javaHome = /usr/java/jdk1.8.0_101/jre
[sshd]
listenAddress = *:29418
[httpd]
listenUrl = proxy-http://*:8080/
[cache]
directory = cache
配置好gerrit.config文件后,启动Gerrit,需要用绝对路径
/home/gerrit/review_site/bin/gerrit.shstart
在浏览器输入http://localhost:8080弹出Gerrit的页面。
登录管理员
第一次登录的用户为管理员账号,ID为1000000,默认只有这个系统管理员才有Create权限(创建group和Project)
在gerrit本机上使用下面的命令生成管理员账号(这里将gerrit作为管理员)的公私钥并将公钥上传至gerrit管理员用户下。
ssh-keygen -t rsa #生成sshkey
ls ~/.ssh/ #可查看sshkey
cat ~/.ssh/id_rsa.pub #查看sshkey
Gitlab配置
Gitlab上的项目必须被保护,被保护的项目只允许master权限的用户进行push操作,其他用户无push提交权限。
普通用户没有直接push的权限。需要先review到gerrit上进行审核并commit后,才能更新到代码中心仓库里。
项目赋予gerrit用户master权限,给普通用户只有develop或者reporter权限。
Gerrit用户配置
普通用户登录gerrit,将本机公钥提交到gerrit,设置邮箱。
提交gerrit的用户名和邮箱必须与git配置相同。
Jenkins配置
Jenkins系统已经创建了管理员账户jenkins并安装了Gerrit Trigger插件和Git plugin插件
在“系统管理”->“插件管理"->”可选插件"->搜索上面两个插件进行安装。
设置Gerrit Trigger
Add New Server :gerrit.*****-net.com
勾选 Gerrit Server With Default Configurations
配置trigger信息并测试连接
如果上一步在点击“Test Connection”测试的时候,出现下面报错:
解决办法:
管理员登录gerrit
Projects->List->All-Projects
Projects->Access
Global Capabilities->Stream Events 点击 Non-Interactive Users
添加Jenkins@zjc.com用户到 ‘Non-Interactive Users’ 组。
Gerrit 和 Jenkins 整合
让Gerrit支持Jenkins
如果安装Gerrit时没有或者没有选择添加Verified标签功能[‘lable Verified’],需要自己添加。
如下是手动添加Verified标签功能的设置
[如果在安装gerrit的时候没有选择安装这个标签功能,就需要在此处手动安装下。具体可以登陆gerrit,ProjectS->list->All-Projects->Access->Edit->Add Permission 看里面是否有Verfied的选项]
# su - gerrit
$ git init cfg; cd cfg
$ git config --globaluser.name'gerrit'
$ git config --global user.email 'gerrit@devops_gerrit'
$ git remote add originssh://gerrit@http://gerrit.*****-net.com: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
$ rm -rf cfg
用gerrit管理员账号登录Gerrit
现在提交的Review请求只有Code Review审核,我们要求的是需要Jenkins的Verified和Code Review双重保障,在 Projects 的 Access 栏里,针对 Reference: refs/heads/ 项添加 Verified 功能,如下如下:
Projects -> List -> All-Projects
Projects -> Access -> Edit -> 找到 Reference: refs/heads/* 项 -> Add Permission -> Label Verified -> Group Name 里输入 Non-Interactive Users -> 回车 或者 点击Add 按钮 -> 在最下面点击 Save Changes 保存更改。
(注意:提前把jenkins用户添加到Non-Interactive Users组内)
权限修改结果如下:
如不需要经过jenkins Verified仅经过code review,则去掉Label Verified设置并暂停jenkins上gerrit trigger服务。
Gerrit工程建立
登录gerrit页面,CreateNewProject。想让gitlab上的项目能在gerrit上review的话,必须在gerrit上创建相同的项目,并有相同的仓库文件。
需要确认gerrit账户在gitlab上是否有权限,如没有权限需要在gitlab上为svc.gerrit用户导入gerrit服务器的id_rsa.pub
ssh登录gerrit服务器
$ /home/gerrit/git
$ rm -rf gerrittest.git
$ git clone --baregit@172.17.3.60:boyang.chen/gerrittest.git
gerrit即存在与gitlab相同的项目。
Gerrit同步到Gitlab配置
当用户修改文件,git add、git commit,提交push到gerrit的repo后,代码通过 jenkins 测试、人工review后,代码只是 merge 到了 Gerrit 的 gerrittest项目中,并没有 merge 到 Gitlab 的 test-project1 项目中,所以需要当Gerrit 项目仓库有变化时自动同步到 Gitlab 的 gerrittest 项目仓库中。
Gerrit 自带一个 Replication 功能,同时我们在安装 Gerrit 时候默认安装了这个 Plugin。
1、现在只需要添加一个 replication.config 给 Gerrit
$ cd /home/gerrit/etc/
$ vim replication.config为项目配置同步信息
[remote "DCode"]
projects = DCode
url =git@gitlab.*****-net.com:sen.zhao/DCode.git
push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
push = +refs/changes/*:refs/changes/*
threads = 3
[remote "ProjectC"]
projects = ProjectC
url =git@gitlab.*****-net.com:boyang.chen/ProjectC.git
push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
push = +refs/changes/*:refs/changes/*
threads = 3
[remote "gerrittest"]
projects = gerrittest
url =git@gitlab.*****-net.com:boyang.chen/gerrittest.git
push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
push = +refs/changes/*:refs/changes/*
threads = 3
2、设置gerrit用户的 ~/.ssh/config
$ vim /home/gerrit/.ssh/config
Hostnamegitlab.*****-net.com
Protocol 2
HostKeyAlgorithms ssh-rsa,ssh-dss
上面设置的~/.ssh/config文件的权限已定要设置成600
不然会报错:“Bad owner or permissions on .ssh/config“
3、在gerrit用户的~/.ssh/known_hosts 中,给gitlab服务器和gerrit服务器 添加 rsa 密钥
$ sh -c "ssh-keyscan -t rsagitlab.*****-net.com,172.17.3.60 >> /home/gerrit/.ssh/known_hosts"
$ sh -c "ssh-keygen -H -f /home/gerrit/.ssh/known_hosts"
$ sh -c "ssh-keyscan -t rsa [gerrit.*****-net.com]:29418,[172.21.129.31] >> /home/gerrit/.ssh/known_hosts"
$ sh -c "ssh-keygen -H -f /home/gerrit/.ssh/known_hosts"
配置后如下:
重新启动 Gerrit 服务
$/home/gerrit/bin/gerrit.sh restart
Gerrit 的复制功能配置完毕。
在 Jenkins 上对 gerrittest项目创建构建任务
Jenkins上首先安装git插件:Git Plugin
登陆jenkins,“系统管理”->“管理插件”->“可选插件”->选择Git Pluin插件进行安装
Jenkins上创建项目
添加 gerrittest工程
下面添加url(gerrit项目地址):ssh://svc.jenkins@gerrit.*****-net.com:29418/gerrittest
添加分支:$GERRIT_BRANCH
添加项目具体单元测试build脚本
Gerrit+Jenkins+Gitlab实现code review流程
普通用户操作:
Git Bash:
1、clone gerrit上项目并下载commit-msg文件:
git clonessh://svc.jenkins@gerrit.*****-net.com:29418/gerrittest&& scp -p -P 29418svc.jenkins@gerrit.*****-net.com:hooks/commit-msg gerrittest/.git/hooks/
2、修改本地文件
3、添加修改文件
git add .
4、提交修改
git commit
输入提交信息
5、提交push到代码审核分支:
git push origin HEAD:refs/for/master
Jenkins自动执行build,build成功
登录Gerrit页面,会看到jenkins自动检测了提交操作并且执行了build操作,build成功,标记Verified +1
开发者可指定审核人进行Review操作,或者管理员及ProjectOwner有权限进行Review评分。
可添加或删除审核人
添加审核人后,审核人会收到邮件提示
开发者等待审核人提交审核反馈,审核人CodeReview评分+2则通过审核。
代码审核者(Administrator,ProjectOwner,CodeReviewer)操作:
收到审核邮件后登陆Gerrit
选择要进行审核的提交记录(Open)
经过jenkins自动评分Verified时:
不经过jenkins进行Verified评分时:
执行Submit后,gerrit会自动同步修改到gitlab库。
可通过查看replication日志了解同步情况:
其他操作:
gerrit手动同步代码到gitlab中心仓库上
[gerrit@devops_gerrit]$ ssh-gerrit gerrit --help//查看帮助,发现gerrit COMMAND --help可查找命令帮忙
[gerrit@devops_gerrit]$ ssh-gerrit replication start --help//查看replication同步命令的用法
replication start [PATTERN ...] [--] [--all] [--help (-h)] [--url PATTERN] [--wait]
PATTERN : project name pattern
-- : end of options
--all : push all known projects
--help (-h) : display this help text
--url PATTERN : pattern to match URL on
--wait : wait for replication to finish before exiting
[gerrit@devops_gerrit]$ ssh-gerrit replication start --all//同步所有工程
重载replication的同步服务
[gerrit@devops_gerrit]$ ssh-gerrit gerrit plugin reload replication
如果报错:fatal: remote plugin administration is disabled
解决办法:
在/home/gerrit/etc/gerrit.config文件里添加下面内容:
[plugins]
allowRemoteAdmin = true
然后重启gerrit服务即可:
[gerrit@devops_gerrit]$ /home/gerrit/bin/gerrit.sh restart
Stopping Gerrit Code Review: OK
Starting Gerrit Code Review: OK
窍门:
Gitbash Push简洁操作:
在工程路径下写入下面的命令:
$ git config remote.origin.push refs/heads/*:refs/for/*
这行命令的意思是,当执行 push 命令时,将会推送到refs/for/当前head所在的分支上。
设置之后即可按照之前的方式提交:
提交时
git push origin master或git push 即push修改内容到refs/for/分支