持续集成CI

持续集成(CI)正是针对软件质量问题的一个开发实践。团队开发人员常常集成他们的工做,每次集成都经过自动化的构建(包括编译、部署和测试)来验证,从而可以尽快的发现问题、解决问题。java

Jenkins是一种开源的持续集成的工具,它具备容易安装、配置,集成RSS/Email实时通知机制,支持分布式构建,丰富的插件支持等特性。node

CI的目标

CI的核心价值在于它的任何一个环节都是自动完成的,无需人工的干预,减小了重复的工做,可以节省时间和人力成本;还有就是它保证了开发人员提交的代码可以及时的获得测试验证,可以尽早的发现问题,缩短开发的周期。linux

CI什么时候触发构建?

CI工程按触发构建的时间点分为如下三类:git

Check-In构建web

当检测到开发人员有代码提交到代码管理库上时,CI工程开始Check-In构建。shell

Daily构建windows

天天可定时CI构建,构建时间点和构建次数均可根据实际状况设定。例如咱们的CI能够设定为天天的中午十二点和凌晨十二点准时开启构建。服务器

Release构建架构

当有版本须要发布的时,手动开启CI工程Release版本构建。框架


上述的三类构建分别针对及时验证提交代码质量、持续跟踪保证代码质量和交付产品质量的需求,作到了自动化、持续的构建。

下面说明如何在Jenkins CI框架中设置构建策略。点击你须要设置的job工程,而后点击“配置”项,便可看到配置界面,如图2所示。


2 Jenkinsjobs配置界面

2所示配置界面是一个总体的截图,看上去不是很清晰(请放大看)。图中用红色框标出的“构建触发器”部分就是设置构建策略的。图3就是“构建触发器”配置图。


图3 “构建触发器”配置图

Build whenever a SNAPSHOT dependency is built】选项是基于快照的构建,当源码管理中配置的git(或者SVN)有修改时就构建项目。此选项须要在建立job时选择“构建一个maven项目”。

Poll SCM】选项是定时检查源码并构建,若是源码没更改,不进行构建。勾选上Poll SCM就会出现图4 所示Poll SCM配置图,日程表中的“H/5 * * * *”就是咱们设置的时间策略,具体设置方法可点击右侧红框标示的“?”提示按钮。“H/5 * * * *”的格式和cron相似(具体不详述),这里的含义是每五分钟检查一次,正如蓝色框的提示部分所示。


图4 Poll SCM配置图



Build periodically】选项是周期性进行项目构建,不关心源码是否改变。它的设置方法和上面Poll SCM是同样的,请参看Poll SCM的设置。

Build after other projects are built】选项用来设置几个jobs的构建顺序。

经过上面“构建触发器”中的构建策略的选择,咱们就能到作到check-in构建和daily构建。


CI如何确保产品质量?

CI依靠持续运行自动化的测试用例,尽量早的暴漏代码可能存在的缺陷,验证代码的可用性、健壮性,以达到提升代码质量的目的。为此CI工程中须要集成大量有针对性的测试,如图5测试用例框架中,按照CI工程的分类和测试用例自己的维度两个方便进行了划分与组合。

按照开发的阶段,能够将测试用例分为单元测试(Unit Test)、集成测试(Intergation Test)和压力测试(Stress Test);按照是否运行程序,能够分为静态检查(Static Inspection)和动态检查(Dynamic Inspection);除此还有就是一些性能测试(Performance Test)等。

按照CI工程的分类,如今设计是Check-In Build类工程进行单元测试和冒烟测试;Daily Build类工程进行集成测试、代码静态检查和代码动态检查;Release Build类工程进行压力测试和性能测试。


测试用例框架



CI框架

构建流程

按照上节中CI的构建目标,CI的框架设计如图6所示。


6 CI框架

CI框架包括如下几个步骤:

1、对于Check-In Build类工程,当检测到代码库上对应的代码有更新时,下载最新的代码到本地;对于Daily Build类工程,会在设定的时间同步代码库上代码到本地;对于Release Build类工程,则构建的一开始就同步代码库上的代码到本地。

2、代码更新完以后,调用脚本自动的编译最新的代码。

3、部署最新编译出来的产品。

4、自动化的测试。对于上述三类不一样的工程,选择不一样的测试套运行。

5、生成构建报告,CI报告包含整个构建流程(更新代码、编译、部署、测试的日志)。

6、上述环节中若有失败,将邮件通知相应人员;最终的构建报告也可选择邮件通知。


分布式架构

Jenknis支持msater/slave的架构,咱们的CI根据实际须要也能够搭建分布式的CI架构,一个master节点和多个slave节点,每一个节点能够运行在不一样的系统平台(Linuxwindows)上面。


7 CI分布式架构

如图7所示,CI支持分布式架构,Master提供web接口让用户来管理jobslave节点,能够将CI的工做放在多个不一样的slave节点上,而后由master节点集中管理这几个节点,这样能减小每一个节点的负荷。

下面以linux masterlinux slave的状况来讲明如何配置slave

Slave的配置

Linux slave(示例slave机器ip192.168.1.70)的配置方法以下:

① 建立jenkins用户,并设置密码

root@joseph:/var/lib(0)#useradd -m jenkins -d /home/Jenkins

root@joseph:/var/lib(0)# passwd jenkins

② 确保ant,javasshd的安装

③ 切换到jenkins用户,运行ssh-keygen建立公钥和秘钥

④ 建立authorized_keys

$ cd .ssh

$ cat id_rsa.pub > authorized_keys

⑤ 将秘钥id_rsa拷贝到master机器上面(示例是拷贝到192.168.1.169 master机器的/var/lib/Jenkins/目录下)


Master的配置

Master的配置步骤以下:

① 首先须要安装SSH Slaves Plugin,安装方法请参见本文档中“插件安装”一节。

② 新建node。点击“系统管理”à“管理节点”à“新建节点”,进入slave节点配置界面。


Name】新建slave节点名

远程工做目录slave机器上的目录,这里设定的是上面slave配置中jenkins用户的home目录。

标签】这里的字符符号在masterjob中会用到,建议使用有意义的命名。

标签】启动方法这里选择的是SSH的方式。可选的启动方法有四种,这里不一一说明。

host】指定的是slave机器的ip地址。

Credentials】这里指定masterslave的通讯凭证。

点击Credentials处的Add按钮,会提示输入认证方式。用户名就是slave配置中建立的jenkins用户,密码就是Jenkins对应的密码。


3 设置完,保存以后,就会看到新建的slave节点的信息。


完成上面slavemaster的配置以后,就搭建起一个linux master加上一个linux slave的分布式Jenkins CI环境。


代码库管理

一个代码管理库是CI不可缺乏的部分。咱们须要一个统一的版本控制软件来保证团队成员提供的代码是可以成功集成的。目前公司开发团队选择的是Git库管理咱们的代码,CI开始构建时首先会从咱们的git库上pull最新的代码到CI服务器上,而后进行后续构建工做。

下面讲述在Jenkins CI中如何使用gitgit代码仓库中pull代码到CI本地机器。

首先须要安装Git相关的插件,在Jenkins主界面中选择“系统管理”à“插件管理”进入jenkins的插件管理界面,而后选择安装Git Plugin;安装以后,选择“系统管理”à“系统设置”进入系统设置界面,git部分采用默认配置便可。

接下来就是在相应的job中进行设置,点击“配置”便可见图所示Git配置图,首先勾选上Git,而后如蓝色框中所示,填上代码的git仓库地址,并可选择远端和本地分支。注意:咱们须要将Jenkins用户的公钥拷贝到git仓库机器的相应用户.ssh目录下的authorized_keys文件中,这样在git同步代码的时候就能够免密码输入了。


上面是以Git为例说明Jenkins中代码库的管理配置,SVN的管理也是相似的,这里不作说明。


编译

CI工程同步了代码管理库上的代码后,接下来就是编译最新的代码。目前公司git库上的代码pull下来后,能够选择在CI中用shell脚本直接make编译。若是有windows平台代码,CI中支持选择batch command的方式运行命令编译。

下面说明jenkins CI的构建方法。在进入相应job的配置界面后,在“构建”部分点击“增长构建步骤”,就能够见到图13所示几种供选择的构建方法。


图13 构建配置图

Execute Windows batch command】选项用于调用windows的批处理脚本

Execute shell】选项调用shell脚本,或直接调用linux命令

Invoke Ant】选项调用Ant构建工具

这里以linux平台环境为例,点击“Execute shell”后,如图14 Execute shell配置图所示,出现一个command文本框,里面能够直接调用Linux命令,也能够调用脚本。


编译过程的日志能够在Console output中查看。若是编译失败,也能够选择发送邮件给相应的责任人。