使用Gerrit、Gitlab、Jenkins构建一个CI系统

这篇文章的目的是学习如何使用Gerrit、gitlab、Jenkins构建一个CI系统。总体目的是跑通这个流程,所以很多地方会有所忽略。

架设这么一套系统的学习的顺序是:gitlab -》 gerrit -》 jenkins

1.gitlab
首先先安装gitlab:
下载地址:https://about.gitlab.com/downloads/

首先先配置一些依赖:

sudo yum install openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld

然后执行下面命令安装即可(会比较慢,我是用的下载工具的离线下载下的):

curl -O https://downloads-packages.s3.amazonaws.com/centos-7.0.1406/gitlab-7.8.4_omnibus-1.el7.x86_64.rpm
sudo rpm -i gitlab-7.8.4_omnibus-1.el7.x86_64.rpm

如果要使用自己的smtp服务器,可以在/etc/gitlab/gitlab.rb 中配置邮件信息。

安装好后,使用下面命令生效下配置(比如邮件的配置):

gitlab-ctl reconfigure

从输出看应该是用的chef帮我们配置数据库、redis等组件。

配置好后直接就能在浏览器中访问了,默认的用户名和密码是root/5iveL!fe。

gitlab的用法和github是一样的,建立项目,上传公钥,然后就可以通过git来使用了。

2.gerrit
首先是下载gerrit,下载地址是(需要翻墙):https://code.google.com/p/gerrit/
然后是安装:
执行下面命令设置账号:

[root@RHEL01 test]# adduser gerrit2
[root@RHEL01 test]# su gerrit2

启动:

[gerrit2@RHEL01 ~]$ mkdir gerrit
[gerrit2@RHEL01 ~]$  java -jar gerrit-2.10.war init -d /home/gerrit2/gerrit

期间会问很多的问题,回答就行。如果是测试,认证方式可以选择development_become_any_account。

启动好后就能直接访问了。

gerrit的工作模式是所有真正的merge由gerrit负责,我们的提交只是提交给了gerrit,gerrit会通知项目的负责人来审核代码,同时也会调用一些自动化测试构建工具来检查代码是否符合要求,只有都通过后才会的合并进主干代码。所以可以把gerrit看成是代码和提交者之间的一道门。

我们下来试着用gerrit来管理一个gitlab管理的项目。要明确一点:代码是由gerrit管理的,gitlab上的代码是由gerrit在每次有成功的merge请求后push到gitlab上的(这个操作是通过某个命令执行后触发的,因此两个代码库上的代码不一定是时时同步的)。

首先,建立配置文件:

[gerrit2@RHEL01 gerrit]$ pwd
/home/gerrit2/gerrit
[gerrit2@RHEL01 gerrit]$ vi etc/replication.config

replication.config由一个一个remote开头的section来设置配置,每个remote代表一个要被推送的代码库。说明可以看这里:https://gerrit-documentation.googlecode.com/svn/Documentation/2.3/config-replication.html

在这里小秦的配置是:

[remote "thuanqin-gitlab"]
  url = RHEL01:/var/opt/gitlab/git-data/repositories/${name}.git
  push = +refs/heads/*:refs/heads/*
  push = +refs/tags/*:refs/tags/*
  threads = 1
  authGroup = bingotree

–不过小秦这里在运行的时候老是报gerrit: replicate: not found这个错误。因为目前还不是真的有需要搭建一个CI,所以没有去研究。如果有人知道哪里做错了,希望能给我留言。多谢!

3.jenkins
jenkins的资料比上面多一些,有一本definition guide可以在网上找到。安装方法类似gerrit,一个war包就行。在公司jenkins用的是hudsons。hudsons是jenkins在sun被oracle收购前的名字,具体的关系可以看definition guide中的内容。

最简单的就是直接运行war包,生产环境则可以运行在tomcat、JBoss上。

[root@RHEL01 tmp]# java -jar jenkins.war --httpPort=7070
Running from: /tmp/jenkins.war
webroot: $user.home/.jenkins
三月 15, 2015 3:20:58 上午 winstone.Logger logInternal
信息: Beginning extraction from war file
三月 15, 2015 3:21:01 上午 org.eclipse.jetty.util.log.JavaUtilLog info
信息: jetty-winstone-2.8
三月 15, 2015 3:21:05 上午 org.eclipse.jetty.util.log.JavaUtilLog info
信息: NO JSP Support for , did not find org.apache.jasper.servlet.JspServlet
Jenkins home directory: /root/.jenkins found at: $user.home/.jenkins
三月 15, 2015 3:21:07 上午 org.eclipse.jetty.util.log.JavaUtilLog info
信息: Started SelectChannelConnector@0.0.0.0:7070
三月 15, 2015 3:21:07 上午 winstone.Logger logInternal
信息: Winstone Servlet Engine v2.0 running: controlPort=disabled
三月 15, 2015 3:21:08 上午 jenkins.InitReactorRunner$1 onAttained
信息: Started initialization
三月 15, 2015 3:21:39 上午 jenkins.InitReactorRunner$1 onAttained
信息: Listed all plugins
三月 15, 2015 3:21:40 上午 jenkins.InitReactorRunner$1 onAttained
信息: Prepared all plugins
三月 15, 2015 3:21:40 上午 jenkins.InitReactorRunner$1 onAttained
信息: Started all plugins
三月 15, 2015 3:21:40 上午 jenkins.InitReactorRunner$1 onAttained
信息: Augmented all extensions
三月 15, 2015 3:21:40 上午 jenkins.InitReactorRunner$1 onAttained
信息: Loaded all jobs
三月 15, 2015 3:21:51 上午 hudson.model.AsyncPeriodicWork$1 run
信息: Started Download metadata
三月 15, 2015 3:21:52 上午 org.jenkinsci.main.modules.sshd.SSHD start
信息: Started SSHD at port 41891
三月 15, 2015 3:21:52 上午 jenkins.InitReactorRunner$1 onAttained
信息: Completed initialization
三月 15, 2015 3:21:52 上午 hudson.WebAppMain$3 run
信息: Jenkins is fully up and running

启动后就能在浏览器中访问了。这里为了避免和gitlab的8080冲突,小秦这边指定了启动端口是7070。另外如果要管理插件,可以指定环境变量启动:

export JENKINS_BASE=/root/jenkins
export JENKINS_HOME=/root/jenkins/jenkins-data
java -jar ${JENKINS_BASE}/jenkins.war --httpPort=7070

现在让我们建立一个项目试一试,在这之前我们先安装下git的插件。在系统管理-》插件管理中可以看到具体的插件。从https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin这里可以下到git的插件,然后在插件管理里边点击上传即可。如果报错提示缺少依赖,则将依赖的插件下载后使用相同方法安装即可。

建立项目,点击“开始创建一个新项目”,然后选择“构建一个自由风格的软件项目”,按照要求输入需要输入的参数。源码管理里选择git,输入git相关的信息,同时设置构建的周期以及构建要执行的命令。这样jenkins就会在适当的时候从我们的git上拉到数据开始进行构建啦。如果我们在执行命令中输入‘ls -l’,我们可以发现当前的目录是git下来的项目的根目录。jenkins有很多环境变量可用,有兴趣的同学可以研究下。

另外可以参考http://bhfsteve.blogspot.com/2012/04/automated-python-unit-testing-code_27.html,其中写了如何自动化python的单元测试。原理其实和上面是一样的,每个项目可以指定post action,即构建完成后做什么。打个比方我们在这里写好nose命令用于生成测试结果,然后通过某个jenkins的插件可以分析这个结果来告诉我们测试是否成功。

4.整合
ok,到目前为止一个简单的CI环境以及可以被构建了。gitlab主要用于托管对外的代码,大家可以从这边下载代码,但是真正的代码是放在gerrit中的。开发者把代码commit到gerrit中,gerrit会的运行jenkins来执行测试用例,查看是否能成功构建,同时也会发邮件通知负责人,询问他们是否同意合并,只有这些条件都满足的时候gerrit才会的合并代码到自己的master分支上。同时,gerrit会定期的将代码复制一份push到gitlab中供外面的人查看。

这里缺失的一个环节是jenkins和gerrit的联动,具体的做法是这样的:jenkins有一个插件叫做gerrit-trigger,文档和下载地址:https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger。安装这个插件后在项目的触发器中可以看到Gerrit event这一项。同时在系统配置里可以增加gerrit的服务器,猜测配置了gerrit服务器后,jenkins会监听gerrit的消息,当满足条件的消息到达后会触发自动构建,并将结果以gerrit投票的方式返回。

1 Response

  1. MatheMatrix 2015年11月23日 / 上午11:26

    zuul

    本句是为了通过spam检测

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*