CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接

来源:互联网 发布:win10备份c盘数据 编辑:程序博客网 时间:2024/06/05 01:58

原文地址:http://www.cnblogs.com/kevingrace/p/5651447.html

近年来,由于开源项目、社区的活跃热度大增,进而引来持续集成(CI)系统的诞生,也越发的听到更多的人在说协同开发、敏捷开发、迭代开发、持续集成和单元测试这些拉风的术语。然而,大都是仅仅听到在说而已,国内也很少有公司能有完整的 CI 体系流程。反之一些开源项目都有完整的 CI体系,比如openstack。
为了实现代码托管->代码审核->代码发布的一套自动化流程,我特意在IDC服务器上部署了Gitlab+Gerrit+Jenkins对接环境,以下记录了操作过程:
----------------------------------------------------------------------------------------------------------------------------------------
1)Gitlab上进行代码托管
在gitlab上创建的项目设置成Private,普通用户对这个项目就只有pull权限,不能直接进行push
Git自带code review功能
强制Review :在 Gitlab 上创建的项目,指定相关用户只有Reporter权限,这样用户没有权限使用git push功能,只能git review到Gerrit 系统上,Jenkins在监听Gerrit上的项目事件会触发构建任务来测试代码,Jenkins 把测试结果通过 ssh gerrit 给这个项目打上 Verified (信息校验)成功或失败标记,成功通知其它人员 Review(代码审核)
Gitlab保护Master 分支:在 Gitlab 上创建的项目可以把 Master 分支保护起来,普通用户可以自己创建分支并提交代码到自己的分支上,没有权限直接提交到Master分支,用户最后提交申请把自己的分支 Merge 到 Master ,管理员收到 Merge 请求后, Review 后选择是否合并。
可以将gitlab和gerrit部署在两台机器上,这样gitlab既可以托管gerrit代码,也可以作为gerrit的备份。
因为gitlab和gerrit做了同步,gerrit上的代码会同步到gitlab上。
这样即使gerrit部署机出现故障,它里面的代码也不会丢失,可以去gitlab上拿。
2)Gerrit审核代码
Gerrit是一款被Android开源项目广泛采用的code review(代码审核)系统。普通用户将gitlab里的项目clone到本地,修改代码后,虽不能直接push到代码中心 ,但是可以通过git review提交到gerrit上进行审核。gerrit相关审核员看到review信息后,判断是否通过,通过即commit提交。然后,gerrit代码会和gitlab完成同步。
grrit的精髓在于不允许直接将本地修改同步到远程仓库。客户机必须先push到远程仓库的refs/for/*分支上,等待审核。
gerrit上也可以对比代码审核提交前后的内容状态。
3)jenkins代码发布
当用户git review后,代码通过jenkins自动测试(verified)、人工review 后,代码只是merge到了Gerrit的项目中,并没有merge到 Gitlab的项目中,所以需要当 Gerrit 项目仓库有变化时自动同步到Gitlab的项目仓库中。Gerrit 自带一个 Replication 功能,同时我们在安装 Gerrit 时候默认安装了这个 Plugin,通过添加replication.config 给 Gerrit即可(下文有介绍)
----------------------------------------------------------------------------------------------------------------------------------------

一、基础环境搭建(参开下面三篇文档)
CI持续集成系统环境---部署gerrit环境完整记录
CI持续集成系统环境---部署Gitlab环境完整记录
CI持续集成系统环境---部署Jenkins完整记录

二、Gitlab+Gerrit+Jenkins的对接
1)Gitlab配置
gitlab上的管理员账号是gerrit,邮箱是gerrit@xqshijie.cn
创建了一个普通账号wangshibo,邮箱是wangshibo@xqshijie.cn
[root@115]# su - gerrit
[gerrit@115 ~]$ ssh-keygen -t rsa -C gerrit@xqshijie.cn         //产生公私钥
[gerrit@115 ~]$ cat ~/.ssh/id_rsa.pub
将上面gerrit账号的公钥内容更新到Gitlab上。
使用gerrit账号登陆Gitlab,点击页面右上角的Profile Settings - 点击左侧的SSH Keys小钥匙图标 - 点击Add SSH Key。
在Key对应的输入框中输入上段落$cat .ssh/id_rsa.pub显示的公钥全文,点击Title,应该会自动填充为gerrit@xqshijie.cn。如下:

在Gitlab上创建wangshibo用户
然后在机器上生成wangshibo公钥(先提前在机器上创建wangshibo用户,跟上面一样操作),然后将公钥内容更新到Gitlab上(用wangshibo账号登陆Gitlab)
用gerrit登陆Gitlab,新建group组为dev-group,然后创建新项目test-project1(在dev-group组下,即项目的Namespace为dev-group,将wangshibo用户添加到dev-group组内,权限为Reporter),具体如下截图:







在linux系统上登录wangshibo账号下,克隆工程test-project1.git,测试权限
[root@115]# su - wangshibo
[wangshibo@115 ~]$ git clone git@103.10.86.30:dev-group/test-project1.git
Initialized empty Git repository in /home/wangshibo/test-project1/.git/
remote: Counting objects: 15, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 15 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (15/15), done.
[wangshibo@115 ~]$ cd ~/test-project1/
[wangshibo@115 ~]$ git config --global user.name 'wangshibo'
[wangshibo@115 ~]$ git config --global user.email 'wangshibo@xqshijie.cn'
[wangshibo@115 ~]$ touch testfile
[wangshibo@115 ~]$ git add testfile
[wangshibo@115 ~]$ git commit -m 'wangshibo add testfile'
[wangshibo@115 ~]$git push
GitLab: You are not allowed to push code to this project.
fatal: The remote end hung up unexpectedly

上面有报错,因为普通用户没有直接push的权限。需要先review到gerrit上进行审核并commit后,才能更新到代码中心仓库里。
2)Gerrit配置
在linux服务器上切换到gerrit账号下生成公私钥
[gerrit@115]$ ssh-keygen -t rsa -C gerrit@xqshijie.cn
将id_rsa.pub公钥内容更新到gerrit上(管理员gerrit账号登陆)的SSH Public Keys里


同样的,将gerrit的其他两个普通账号wangshibo和jenkins也在linux服务器上生产公私钥,邮箱分别是wangshibo@xqshijie.cn和jenkins@xqshijie.cn
并将两者的公钥id_rsa.pub内容分别更新到各自登陆的gerrit的SSH Public Keys里
3)Jenkins配置
Jenkins系统已经创建了管理员账户jenkins并安装了Gerrit Trigger插件和Git plugin插件
“系统管理”->“插件管理"->”可选插件"->搜索上面两个插件进行安装
使用jenkins账号登陆jenkins,进行Jenkins系统的SMTP设置 (根据具体情况配置)
“主页面->系统管理->系统设置”,具体设置如下:
首先管理员邮件地址设置成jenkins@xqshijie.cn


Add New Server : Check4Gerrit
勾选 Gerrit Server With Default Configurations


-----------------------------------------------------------------------------------------
如果上一步在点击“Test Connection”测试的时候,出现下面报错:
解决办法:
管理员登录gerrit
Projects->List->All-Projects
Projects->Access
Global Capabilities->Stream Events 点击 Non-Interactive Users
添加 Jenkins@zjc.com 用户到 ‘Non-Interactive Users’ 组
-----------------------------------------------------------------------------------------


4)Gerrit 和 Jenkins 整合
让Gerrit支持Jenkins
如果安装Gerrit时没有或者没有选择添加Verified标签功能[‘lable Verified’],需要自己添加。
如下是手动添加Verified标签功能的设置(由于我在安装Gerrit的时候已经选择安装Verified标签功能了,所以下面橙色字体安装操作可省略)
[如果在安装gerrit的时候没有选择安装这个标签功能,就需要在此处手动安装下。具体可以登陆gerrit,ProjectS->list->All-Projects->Access->Edit->Add Permission 看里面是否有Verfied的选项]
# su - gerrit
$ git init cfg; cd cfg
$ git config --global user.name 'gerrit'
$ git config --global user.email 'gerrit@xqshijie.cn'
$ 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
$ rm -rf cfg

用gerrit管理员账号登录Gerrit
现在提交的Review请求只有Code Rivew审核,我们要求的是需要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组内)
权限修改结果如下:




Gitlab上设置test-project1工程
前面我们在Gitlab上搭建了一个 test-project1 的工程,普通用户是没有办法去 push 的,只能使用 git review 命令提交. 而 git review 命令需要 .gitreview 文件存在于项目目录里。
用 gerrit用户添加.gitreview 文件
[root@115]# su - gerrit
[gerrit@115]$ git clone git@103.10.86.30:dev-group/test-project1.git
[gerrit@115]$ cd test-project1
[gerrit@115]$ vim .gitreview

添加.gitreview到版本库
[gerrit@115]$git add .gitreview
[gerrit@115]$git config --global user.name 'gerrit'
[gerrit@115]$git config --global user.email 'gerrit@xqshijie.cn'
[gerrit@115]$git commit .gitreview -m 'add .gitreview file by gerrit.'
[gerrit@115]$git push origin master

用gerrit用户添加.testr.conf 文件
Python 代码我使用了 testr,需要先安装 testr 命令
[root@115]# easy_install pip
[root@115]# pip install testrepository

在 test-project1 这个项目中添加 .testr.conf 文件
[root@115]#su - gerrit
[gerrit@115]$cd test-project1
[gerrit@115]$vim .testr.conf


提交到版本库中
[gerrit@115]$git add .testr.conf
[gerrit@115]$git commit .testr.conf -m 'add .testr.conf file by gerrit'
[gerrit@115]$git push origin master

Gerrit上设置 test-project1工程
在Gerrit上创建 test-project1 项目
要知道review是在gerrit上,而gerrit上现在是没有项目的,想让gitlab上的项目能在gerrit上review的话,必须在gerrit上创建相同的项目,并有相同的仓库文件.
用gerrit用户在 Gerrit 上创建 test-project1 项目
[root@115]# su - gerrit
[gerrit@115]$ ssh-gerrit gerrit create-project test-project1 (gerrit环境部署篇里已经设置好的别名,方便连接gerrit)
登陆gerrit界面,发现test-project1工程已经创建了。(这种方式创建的项目是空的)

clone --bare Gitlab上的仓库到 Gerrit(gerrit上的项目最好是从gitlab上git clone --bare过来,并且项目不要为空)
因为gerrit用户无访问gitlab的权限。所以要先看是否gerrit用户下已经存在了id_rsa密钥,如果没有则创建,然后把公钥加入到gitlab的管理员账户上(因为后面Gerrit系统还会有个复制git库到 Gitlab的功能需要管理员权限)(这个测试环境,gitlab和gerrit的管理员我用的都是gerrit,所以秘钥也是共用)
[gerrit@115]$ cd /home/gerrit/gerrit_site/git/            //即登陆到gerrit安装目录的git下
[gerrit@115 git]$ rm -fr test-project1.git
[gerrit@115 git]$ git clone --bare git@103.10.86.30:dev-group/test-project1.git             //创建并将远程gitlab上的这个项目内容发布到gerrit上
[gerrit@115 git]$ ls
All-Projects.git test-project1.git
[gerrit@115 git]$ cd test-project1.git/
[gerrit@115 git]$ ls                                 //即test-project1工程和gerrit里默认的All-Projects.git工程结构是一样的了
branches config description HEAD hooks info objects packed-refs refs

同步 Gerrit的test-project1 项目到 Gitlab 上的 test-project1 项目目录中
当用户git review后,代码通过 jenkins 测试、人工 review 后,代码只是 merge 到了 Gerrit 的 test-project1 项目中,并没有 merge 到 Gitlab 的 test-project1 项目中,所以需要当Gerrit test-project1 项目仓库有变化时自动同步到 Gitlab 的 test-project1 项目仓库中。
Gerrit 自带一个 Replication 功能,同时我们在安装 Gerrit 时候默认安装了这个 Plugin。

现在只需要添加一个 replication.config 给 Gerrit
[gerrit@115]$ cd /home/gerrit/gerrit_site/etc/
[gerrit@115]$ vim replication.config


0 0
原创粉丝点击