一,CI系统流程
开发人员将本地Git仓库中的代码更新后,push到Gerrit系统上对应的项目仓库中;该动作会触发Gerrit系统发送邮件通知给Owner,Owner此时需要登录Gerrit Web页面,进行Code Review(代码审核)。如果审核通过,则Owner进行Submit提交动作。此时开发人员push的代码才会Merge(合并)到Gerrit服务器上的对应项目仓库中。如果审核不通过,则开发人员需要修改代码后再次push,直到审核通过为止。而Jenkins被Gerrit系统上某一事件触发(可以为Submit,也可以是push,在Jenkins系统上可以自行设定),就会构建该项目,包括编译、打包、上传到指定的服务上等。
以上就是CI系统工作流程,其中还可以在Jenkins上加入代码单元测试等。只有当测试通过,才会构建项目并发布到服务器上。具体如何做单元测试,还在研究中。
二、CI系统环境
Git+Gerrit+Jenkins(安装Gerrit Trigger插件)
Gerrit服务器:172.16.206.133
Jenkins服务器:172.16.206.129
这两台服务器上都必须安装Git,他们工作都依赖于Git环境
Gerrit和Jenkins的前面的文档里面有,这里不再演示。需要注意的是:
1、安装Gerrit时,在交互安装过程中,系统会问你是否安装Label Verified ,默认是不安装的,如果要搭建CI,这里需要选择安装。如果系统中没有安装这个东西,后期可以再装上,但是网上的几个方法试下来都失败了,所以我只能重新执行Gerrit安装命令:java -jar /path/to/gerrit.war /path/to/gerrit_dir
重新安装了一遍,重装前,先停掉gerrit服务,交互安装过程中,很多步骤使用老的配置,唯独Label Verified 选择y,表示安装。
2、Jenkins安装Gerrit Trigger插件
Jenkins官网有介绍这个插件的用法:
https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger#GerritTrigger-Gerritaccessrights
三、Gerrit上的配置
1、在Gerrit服务器上为Jenkins服务器创建一个账号,如jenkins。用该账号登录Gerrit Web,将该账号加入系统预设的Non-Interactive Users组。该组默认就已有监听Stream Events权限,Steam Events的原理是:Gerrit收到代码提交后,会以event的形式发给Jenkins,从而触发Jenkins自动构建。
2、为该账号设置SSH Key,即将Jenkins服务器的root账户下的公钥传到Gerrit系统为Jenkins服务器创建的jenkins账号下的SSH Public Keys中,如果不知道如何设置,请参考前面的Gerrit用户配置文档。
3、设置Non-Interactive Users组的权限,这个权限在All-Projects上设置
注意,对于Label Verified权限,很多文章里面只说给Non-Interactive Users组权限,但是测试下来,如果不给Administrators和Project Owners组Verified权限的话,这两个组就没有Submit权限了。因为只有先Verified,才会有Submit。具体这个Verified权限是干嘛的我还没有研究。应该可以不需要这个权限,有些文章里面说是双重保障。
四、Jenkins上的配置
1、安装Gerrit Trigger插件
系统管理==>管理插件==>可选插件,搜索Gerrit Trigger,安装后重启Jenkins
2、配置Gerrit Trigger
系统管理==>Gerrit Trigger==>Add New Server
测试成功就会显示Success,注意hostname这里我填的是Gerrit服务器IP,可以填主机名,但是必须能解析才行。到此为止,配置基本完成了。
五、创建一个Project,演示如何搭建CI环境。
1、Gerrit上创建Project,名为CITEST。Administrators组内成员才能创建项目。
2、登录Jenkins,创建构建一个自由风格的项目
源码管理这里选择Git,Repository URL就是Gerrit Web上的为匿名用户提供的地址,注意把地址中的
git clone命令去掉,Jenkins服务器自身安装了git,集成了git环境。
构建触发器选择Gerrit event
Choose a server:视情况选择Any Server或具体特定server。我这里选择前面配置的Gerrit Server
Trigger on:可以不配置,不配的话保存job后会默认自动选中事件 Patchset Created(最关键的就是这个事件,是提交代码(push而不是Submit)后就触发的事件) 和 Draft Published。我选择的是Change Merged,表示当代码审核通过后,Owner点击Submit,Merge后才出发构建。
Gerrit Project:需填完整 Pattern 和 Branches 内容才有效,例如Type选Plain,值填、Branches的Type选Plain、值填master;或Type选Path,Pattern填**,Branches的Type选Path,Pattern填**匹配任何project和branch,更详细的介绍可点相应问号查看。其他选项是什么意思还没来得及去研究。
构建后用邮件通知,这个需要安装Email相关插件,如果不清楚如何配置,可以查看之前的Jenkins相关文档。
到这里CI环境就搭建好了。
六、跑一个项目
1、git全局配置,配置用户名和邮箱,这里的用户名和邮箱必须要与Gerrit Web上的账户名邮箱一致,
否则在执行git push命令时报错:remote: ERROR: does not match your user account.
[user1@host2 ~]$git config --global user.name "user1" [user1@host2 ~]$git config --global user.email "XXX@qq.com" [user1@host2 ~]$ git config --list user.name=user1 user.email=XXX@qq.com
2、登录普通用户user1,将CITEST项目克隆到本地
[user1@host2 ~]$ git clone ssh://user1@172.16.206.133:29418/CITEST && scp -p -P 29418 user1@172.16.206.133:hooks/commit-msg CITEST/.git/hooks/ Initialized empty Git repository in /home/user1/CITEST/.git/ remote: Counting objects: 2, done remote: Finding sources: 100% (2/2) remote: Total 2 (delta 0), reused 0 (delta 0) Receiving objects: 100% (2/2), done. commit-msg 100% 4662 4.6KB/s 00:00 [user1@host2 ~]$ ls CITEST
3、进入到CITEST文件夹,新建一个citest.sh文件,内容随便填。
[user1@host2 CITEST]$ ls citest.sh
4、push该文件到Gerrit服务器
[user1@host2 CITEST]$ git add citest.sh
[user1@host2 CITEST]$ git commit -m "创建了文件citest.sh"
[master dfd5972] 创建了文件citest.sh
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 citest.sh
[user1@host2 CITEST]$ git push origin master:refs/for/master
Counting objects: 4, done.
Writing objects: 100% (3/3), 311 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Processing changes: new: 1, refs: 1, done
remote:
remote: New Changes:
remote: http://172.16.206.133:8081/18 创建了文件citest.sh
remote:
To ssh://user1@172.16.206.133:29418/CITEST
* [new branch] master -> refs/for/master
5、用Gerrit管理员账号登录Web UI进行审核
注意Code-Review时,值的范围是-2到+2,-2是审核不通过,+2是审核通过,-1、0、1只能作为参考选项选项,如果要通过代码审核,必须至少有一个+2,而且不能有-2,两个+1不等于+2。
管理员做代码审核后,立马就说到Gerrit管理员邮箱发出来的邮件。
当管理员点击Submit后,立即出发了Jenkins构建。
Jenkins上项目构建完成后,发送邮件通知给相关人员
原文地址:http://zengestudy.blog.51cto.com/1702365/1772709