持续集成CI

来源:互联网 发布:咸阳广电网络营业时间 编辑:程序博客网 时间:2024/06/05 20:02

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

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

CI的目标

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

CI何时触发构建?

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

Check-In构建

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

Daily构建

每天可定时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中查看。如果编译失败,也可以选择发送邮件给相应的责任人。





0 0