Jenkins+Gitlab搭建持续集成(CI)环境

Permalink:  2013-09-08 22:04:00 by  hyhx2008in  intern tags:  jenkins  gitlab  distcc  ci

此次实习的任务之一就是搭建一个持续集成(Continuous Integration)环境。html

咱们选择Jenkins做为持续集成工具,其优势是提供web GUI配置界面,方便配置,还能够安装不少第三方插件(plugin)进行定制与扩展,功能强大。前端

其次选择Gitlab做为git server。Gitlab的功能和Github差很少,可是是开源的,能够用来搭建私有git server,也提供很是强大的web GUI,好比开发者互相review源代码的时候就会很方便。java

本文首先介绍整个系统的结构,而后再一一叙述各个组件的安装及使用方法。linux

1.系统概览git

系统结构以下图所示:github

figure_1

系统的工做流程大概分为如下几步:web

1> 开发者将新版本push到git server (Gitlab)。shell

2> Gitlab随后触发jenkins master结点进行一次build。(经过web hook或者定时检测)bootstrap

3> jenkins master结点将这个build任务分配给若干个注册的slave结点中的一个,这个slave结点根据一个事先设置好的脚本进行build。这个脚本能够作的事情不少,好比编译,测试,生成测试报告等等。这些本来须要手动完成的任务均可以交给jenkins来作。ubuntu

4> 咱们在build中要进行编译,这里使用了分布式编译器distcc来加快编译速度。

notes

jenkins的工做原理是先将源代码从gitlab中拷贝一份到本地,而后根据设置的脚本进行build。咱们能够看出,整个系统的关键就是那个build脚本,用来告诉jenkins在一次集成中须要执行的任务。

2.Jenkins的安装与配置

1> 安装Jenkins

首先说如何安装 jenkins ,必定要安装最新版本才不会出各类奇怪的问题,参考官网wiki, Installing Jenkins on Ubuntu 上的指示,

$ wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
$ sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list' $ sudo apt-get update $ sudo apt-get install jenkins 

便可以获得最新版的jenkins。

Jenkins安装完毕后,能够经过浏览器访问其Dashboard,例如192.168.16.183:8080,IP地址即为Jenkins所在机器的IP地址。

2> Jenkins插件安装

Jenkins其实没有什么须要特别配置的,因为此次任务中须要利用Jenkins与git,gitlab协做,因此须要安装一些插件。在主面板上点击Manage Jenkins -> Manage Plugins。

因为公司使用代理链接外网,首先须要为Jenkins插件安装配置proxy。点击Advanced标签即进入proxy设置页面。

Aailable标签下就是能够安装的插件。

要让Jenkins能够自动build git repo中的代码,须要安装GIT Client Plugin和GIT Plugin。

要想Jenkins能够收到Gitlab发来的hook从而自动build,须要安装 Gitlab Hook Plugin。

要让Jenkins能够在build完成以后根据TAP(test anything protocol)文件生成graph,须要安装 TAP Plugin。

3> Jenkins Job

咱们尝试新建一个Jenkins Job,必须填的内容不是不少,并且每一项后面都有意一个问号,点击后会有关于这项的一些提示。

(1)首先是Project name;

(2)而后在Source Code Management 中选择Git,咱们只须要提供Repository URL便可,这个URL能够是Jenkins机器上的一个本地repo,例如/home/woody/repo;也能够是一个远程机器上的repo,例如Gitlab上经过ssh链接的repo: git@192.168.16.194:user/test_gitlab_repo.git

注意,咱们须要在Jenkins机器上设置Git username 和 email,否则后面会build不成功。

(3)下面须要在Build中选择Add build step,这里以最熟悉的shell为例,选择Execute shell。Jenkins的工做原理很简单,就是从刚才的Repository URL里clone到当前的一个workspace中并切换到最新的branch而后执行Execute shell中的command,若是每条command都返回0则build成功,不然则算失败。 因此咱们的shell command能够是简单的编译指令例如:

#!/bin/sh
make 

(这须要你的git repo中有一个makfile)

也能够执行repo中的另外一个脚本,例如

#!/bin/sh
perl test.pl 

甚至能够什么都不作,或者是只输入一些字符。

(4)接下来咱们须要设置一个触发选项,在Build Triggers中,Jenkins提供三个选择

Build after other projects are built 顾名思义

Build periodically 周期性地build

Poll SCM 周期性的检测SCM(如Git)中是否有新的提交,若是有则build

选择后面两项咱们都须要在Schedule中设置周期,点击后面的问号能够查看的设置周期的语法。

到这一步结束后咱们就能够Save配置了,能够在面板中点击Build Now看看是否能够正常工做。在下面的Build History中有该Job的全部build历史,点击任意一条进去后能够进行查看,特别说明能够在Console Output中看到执行此次build时控制台的输出信息。

(5)若是安装了TAP Plugin,咱们还能够配置Job在build完成后根据TAP result生成一副Graph例以下图:

figure_2

这幅图显示了每次build中成功与失败次数的走势。

想要获得这张图的话,须要在Configure的Post-build Action中选择Add post-build action -> Publish TAP result。 而后在test result 中输入你的TAP result文件的路径,例如tap.tap指的就是当前文件下的tap.tap文件。也就是说在你的Execute Shell中,你须要在编译完成后根据结果本身生成一个TAP文件,TAP的语法能够参考Jenkins TAP Plugin的说明。

4> 搭建Jenkins Master - Slaves 架构

咱们在配置Jenkins时,有一个# of executors 选项,这项表明了Jenkins能够同时处理的Job的数量。

Jenkins还支持将Job分给Slave处理的功能。这就须要咱们为Jenkins配置一些Slaves。

在Dashboard中点击 Mamage Jenkins -> Manage Nodes -> New Node

而后输入Node name 并选择Dumb Slave 点击OK后进入配置页面。须要填的内容以下图所示:

figure_3

# of executors指的是该slave上容许同时处理的job数量; 其余选项也都顾名思义, 咱们这里选择用SSH的方式进行链接,Host即为Slave的IP地址。

Slave上不须要安装Jenkins,只须要安装java环境和git便可:

$ sudo aptitude install default-jre
$ sudo aptitude install git 

还须要为slave的jenkins用户配置git user.name & user.email

这里须要说明一个地方,Jenkins在工做时是利用一个名为jenkins的用户登入机器的。

在master节点上,安装Jenkins时自动为系统添加了一个名为jenkins的用户,因为slave机器上不须要安装jenkins,因此咱们须要在slave机器上手动添加一个名为jenkins的用户。并且Jenkins master只能经过不用输入密码的SSH方式链接slave,须要在master上用jenkins用户生成一对ssh密钥,并把公钥加入slave机器上jenkins用户的用户目录里.ssh/authorized_keys中。

注意,没有密码的用户在ubuntu下可能切换不成功,咱们用下面的方法:

$ sudo su jenkins
$ bash 

3.Gitlab的安装与配置

Gitlab的功能和Github差很少,都是做为git server。

Gitlab是开源的,咱们能够利用Gitlab搭建本身私有的git server。

咱们能够在bitnami上下载 Gitlab 。

公司有现成的Gitlab,因此我没有尝试Gitlab的安装,看上去成功安装并不容易。

为了测试,仍是在虚拟机环境下配置了Gitlab,直接下载了Virtual Machine镜像,因为镜像是Vmware的,还须要将其转为Virtual Box镜像,方法参见http://wiki.bitnami.com/Virtual_Appliances_Quick_Start_Guide

在虚拟机上跑起来后,发现是一个没有GUI的ubuntu。。。系统用户名和密码都是bitnami。

咱们还能够经过访问其IP地址登入Gitlab,初始用户名为user,密码为bitnami,看上去和github很象。


因为在此次任务中Jenkins须要从Gitlab中获取文件并build,因此咱们须要在Gitlab的工程中设置一些东西。

首先是settings -> Deploy Keys, 这里须要加入Jenkins所在机器jenkins用户的公钥。

若是Jenkins中使用slave,还须要将slave的公钥加入deloy keys中。 由于slave的工做原理是收到master的指示直接clone repository。

而后是一个叫Web Hooks的东东。还记得咱们在Jenkins中安装过Gitlab Hook Plugin么,若是设置了Web Hooks,Gitlab就会在每次push上来后发送一条消息到指定的地址(即hook的地址),Jenkins Gitlab Hook Plugin收到消息后当即build。

不过我按照Gitlab Hook Plugin的说明设置里hooks后并无什么做用,多是那个插件的bug吧。。

后来大哥告诉我一个巧妙的办法,就是将Jenkins Job里的build now链接做为hook地址,例如http://192.168.16.183:8080/job/test_gitlab/build?delay=0sec

这样每次Gitlab收到push后就会促使Jenkins当即build。

4.distcc的安装与配置

distcc是一个分布式的编译器,他能够将编译任务分配给多个其余机器上的destccd-daemon,从而加速编译过程。

1> 安装

ubuntu下distcc很容易安装

$ sudo aptitude install distcc

2> 配置

distcc分为前端和守护进程,前端的用法和gcc差很少,用来编译源代码文件。

守护进程即distcc-daemon,须要一些配置。

守护进程的配置文件在 /etc/default/distcc 中,

$ sudo vim /etc/default/distcc

STARTDISTCC="true" //这项容许distccd启动 ALLOWEDNETS=“192.168.16.0/24” //这项指出里容许那些IP的distcc链接上来, /24指的是子网掩码前24位为1,后面为0,即表明192.168.16.0 ~ 192.168.16.255 LISTENER=“192.168.16.183” //这项应该填本机的IP地址,即须要监听的IP地址 ZEROCONF = “false” //这项指出不开启zeroconf,咱们先讲不开启zeroconf,后面再讨论使用它的状况 

这样一个distccd就配置完成了。

经过如下命令能够开启和中止distccd

$ sudo service distcc start
$ sudo service distcc stop 

在进行编译前,由于distccd都没有开启zeroconf,因此distcc没法知道有哪些host可供使用,因此这里须要在环境变量中加入,例如

export DISTCC_HOSTS="192.168.16.183 192.168.16.198"

使用下面的命令能够查看hosts是否配置成功。

$ distcc --show-hosts

而后就可使用distcc进行分布式编译,例如编译linux kernel,

$ make CC=distcc 

下面讲当咱们为distccd开启ZEROCONF时即配置

ZEROCONF=“true”

这就说明distcc能够不须要手动配置hosts地址便可以发现可用的hosts,具体原理不是很清楚,反正用命令

$ distcc --show-hosts

能够看到distccd的地址。

可是这里貌似对IPv6的解析上有一个bug,百度里一下说须要关闭avahi的IPv6

编辑 /etc/avahi/avahi-daemon.conf

修改如下内容

use-ipv6=no

便可。

而后还须要在调用distcc的用户的环境变量中加入

export DISTCC_HOSTS="+zeroconf"

咱们还能够在调用distcc的用户中用如下命令查看编译的进度

$ distccmom-text 5

Comments

 

Powered by Pelican, theme based on Bootstrap, from Twitter.

© hyhx2008 2011

相关文章
相关标签/搜索