持续集成(Continuous integration,简称 CI)
开发中,我们经常遇到一些奇怪问题,比如:

本地可以编译成功的代码但是同事们更新代码后编译出错;
在项目有多个Target(目标)的时候,资源文件只添加到了当前的Target,另外一个Target这个时候是不能正常编译的;
写的工具类,被同事改了,或者自己有改动,很多地方用到了,怎么保证这个类的行为没有发生变化而影响到项目中的其它模块呢?
诸如此类。
引起各种奇怪问题的原因有很多,比如:

开发环境比较复杂不干净;
IDE的bug;
提交前有一些必要的检查需要做,但是开发时因为各种原因没做。
那么这些问题可否避免呢?当然是可以避免的,如果代码有新的改动,提交到版本库中的时候,有一个人帮我们检查必要事项,然后做做测试。这个当然是可以的,前提是老板同意专门招一个这样的人。

这些机械重复的事情我们可以找一个工具来帮我们完成,这个工具跑在一个专门的服务器上,该服务器环境相对干净、可以运行一些自动化操作(自动编译,代码检查,测试等环节)。那么这种工具,就是接下来讲的“持续集成”。

1.2、简单理解持续集成

为解决程序代码提交质量低,提交内容导致原有系统的bug,按时或按需自动编译版本,自动进行自动化测试。

1.3、详细理解持续集成

早集成、频繁的集成能够帮助项目开发者在早期发现项目风险和质量问题,越到后期发现的问题,解决的成本越高,从而有可能导致项目延期或者项目失败。

持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就是一个团队每天将集成多次,每次的集成都通过自动化的构建(包括编译,发布,自动化测试)来验证。简单来说,就是持续的定时的在多个团队成员的工作中进行集成,并且给予反馈。

1.4、持续集成的核心价值

持续集成中重复的编译发布等环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量;
持续集成保障了每个时间点上团队成员提交的代码是能成功集成的。换言之,任何时间点都能第一时间发现软件的集成问题,使任意时间发布可部署的软件成为了可能;
持续集成还能利于软件本身的发展趋势,这点在需求不明确或是频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同时建立团队对开发产品的信心。
1.5、业界普遍认同的持续集成的原则

需要版本控制软件保障团队成员提交的代码不会导致集成失败。常用的版本控制软件有IBM Rational ClearCase、CVS、Subversion 等;
开发人员必须及时向版本控制库中提交代码,也必须经常性地从版本控制库中更新代码到本地;
需要有专门的集成服务器来执行集成构建。根据项目的具体实际,集成构建可以被软件的修改来直接触发,也可以定时启动,如每半个小时构建一次;
必须保证构建的成功。如果构建失败,修复构建过程中的错误是优先级最高的工作。一旦修复,需要手动启动一次构建;
不更新构建失败的代码。
1.6、持续集成系统的组成

一个自动构建过程,包括自动编译、分发、部署和测试等。可帮助我们节省大量时间,完成这个过程的自动化后,在以后的开发过程中,我们需要做的,就是只是提交代码到版本库中,构建自动完成,基本不再需要人工干预。
一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库。
一个持续集成服务器。最好有一台服务器单独作为持续集成服务器,一方面保证了环境的纯净,一方面不影响开发,而且持续集成服务器一般是随时准备开始构建的,所以一般也不关机。本文中介绍的 Jenkins 就是一个配置简单和使用方便的持续集成服务器。
1.7、集成操作步骤:首先要有统一的代码库,服务器不断从版本控制服务器上检查代码状态,看代码是否有更新。如果发现有代码更新,那么就从版本控制服务器下载最新的代码。等代码完全更新以后,调用自动化编译脚本,进行代码编译。然后运行所有的自动化测试,并且进行代码分析。如果其中任何一个步骤失败,就表示build失败,持续集成服务器会给予响应的反馈。每次代码提交之后,都会在持续集成服务器上触发一个定时构建,然后进行编译、部署。

1.8、Jenkins
提到 Jenkins 就不得不提另一个持续集成工具——Hudson , Hudson 由 Sun 公司开发,2010 年 Sun 公司被 Oracle 公司收购, oracle 公司声称对 hudson 拥有商标所有权。 Jenkins是从 Hudson 中分离出来的一个可扩展的持续集成引擎,并将继续走 Open Source 的道路。二者现在由不同的团队在维护。[2]
Jenkins 在持续集成领域市场份额中居于主导地位,被各种大小规模的团队用于用各种语言实现的各类项目中,语言包括.NET、Java、Ruby、Groovy、Grails、PHP 等。[5]

Jenkins是一个独立的基于Java开发的一种开源持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。可用于自动化各种任务,如构建、测试和部署软件。[4]
Jenkins可以建立一个软件项目或工作运行的计划任务。 [2]

1.9、Jenkins特点[4]

开源免费。
跨平台,支持所有的平台。
安装配置超级简单。可以通过本机系统包Docker安装,甚至可以通过安装Java Runtime Environment的任何机器独立运行。[4]
易于使用。web形式的可视化的用户管理页面,简单、直观、友好,发布工作人员只需要通过简单的 UI 操作就可以替代原来繁琐的发布工作。[5]
master/slave支持分布式的build。
tips及时快速的帮助。
拥有良好的扩展性。已有的200多个开源插件可供使用,而且几乎每周会有新的开源插件贡献进来,这些插件的安装都十分快捷和简单。[5]
发展良好。Jenkins 开源社区的规模变得越来越大、活跃度也变得越来越高,发展速度非常快。[5]
1.10、Jenkins 的两个功能

不断地进行项目的构建/测试软件。
监控外部运行的作业: 如计划任务作业和 Qrocmail 的工作,即使是那些在远程机器上运行的计划任务。 Jenkins 生成这些日志并且很容易让你注意到错误的出现。实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。[1]
1.11、jenkins的工作步骤

典型的工作流包括以下几个步骤:[7]

开发
提交
编译
测试
发布
有了Jenkins的帮助,除了第1步,后续的4步都是自动化完成的。具体的,当你完成了提交,Jenkins会自动运行你的编译脚本,编译成功后,再运行你的测试脚本,这一步成功后,接着它会帮你把新程序发布出去,特别的,在最后一步,你可以选择手动发布,或自动发布,毕竟发布这件事情,还是需要人为的确认一下比较好。