持续集成工具Jenkins
# 一. 持续集成是什么?解决什么问题?
场景问题:
客户的要求反复变化
- 在传统的软件开发中,项目的整合是在项目开发结束所有人提交了代码之后;而持续集成是在项目的开发过程中不断地进行环境构建、功能的测试与集成
- 持续集成(CI)是一种实践,可以让团队在持续的基础 上收到反馈并进行改进,不必等到开发周期后期才寻找和修复缺陷。通俗一点儿说,就是指对于开发人员的每一次代码提交,都自动地把Repository中所有代码Check out到一个空目录,并且自动运行所有Test Case。如果成功则接受这次提交,否则告诉所有人,这是一个失败的Revision。
- 解放劳动力:自动化部署工作可以解放集成、测试、部署等重复性劳动,而机器集成的频率明显比手工高很多。
- 避免人为失误:在重复性动作上,人容易犯错,而机器犯错的几率几乎为零。避免文件编辑错误,命令输入错误等人为失误
- 提高效率:随时部署,自动构建
- 质量持续反馈:每日构建或者每小时构建,可以自动触发自动化测试体系,实时提供当前版本质量如何?有问题直接收到报告,开发直接拿到
- 质量保障:实时进行自动化测试,有问题第一时间通知。集成服务器往往提供代码质量检测等功能,对不规范或有错误的地方会进行标致,也可以设置邮件和短信等进行警告。
# 二. 知识体系
# 持续集成示意图
除了「持续集成(Continuous Integration)」外,还有「持续交付(Continuous Delivery)」和「持续部署(Continuous Deployment)」
从上图可以看到,持续集成应该至少包括以下几部分:
- 自动化构建Continuous Build
- 自动化测试Continuous Test
- 自动化集成Continuous Intergration
- 持续集成需要你频繁地向主干提交代码,所以,如果没有自动化技术的支持,持续集成就会是一句空话。
- 现在已经有一些持续集成的工具使得这一任务得到简化。当你选择并安装好合适的持续集成工具之后,只要通过简单地配置,让可以让它找到版本控制库,让它在必要时运行哪个脚本进行编译,并能执行你预设的自动化测试用例,将通过或不通过的结果以何种方式通知给你。
# CI具体流程
# 自动化构建
- 自动化构建的重要性
- 可以将一堆源代码文件进行打包构建为一个文件(如 .exe),方便客户使用查看,及时反馈需求
- 包括以下过程
- 将源码编译成为二进制码
- 打包二进制码
- 运行自动化测试
- 生成文档
- 生成分发媒体(例如:Debian DEB、Red Hat RPM或者Windows MSI文件)
- 所以,自动化构建,从功能角度分,最关键的是三部分:版本控制工具、构建工具、CI服务器。而其中最核心的又是构建工具。其他开源的、与持续集成相关的工具也有很多,但大多数是辅助性的工具。
- 版本控制工具
- 有时,版本控制又称为配置管理(SCM),所以版本控制工具同时也是配置管理工具。
- 在各类版本控制的开源软件中,最著名的莫过于CVS、SVN(Subversion)、GIT三个了。
- 这三个工具各有千秋。其中,GIT支持离线工作,更适合开源软件或者开发人员不能集中办公情况下的版本管理工作。同时,SVN和GIT可以配合使用。
- 构建工具
- 构建工具是持续集成的核心,它对源代码进行自动化编译、测试、代码检查,以及打包程序、部署(发布)到应用服务器上。从配置管理工具上下载最新源代码后,所有的后续工作几乎都可以通过构建工具完成。
- 在java开发中,比较有名的构建工具就是Ant、Maven、Gradle。在PHP开发中,Phing(基于Ant)也比较有名。同样的,Maven也可通过相关的PHP-Maven插件完成对PHP开发构建的支持。
- CI服务器
- CI服务器的主要作用就是提供一个平台,用于整合版本控制和构建工作,并管理、控制自动化的持续集成。
- 开源软件中,比较有名的CI服务器包括Jenkins、CruiseControl、Continuum。
- 而比较有名的商业化CI服务器是TeamCity、Bamboo、Pulse等。
- 其他工具
- 很多工具可以通过与构建工具、CI工具相结合(当然,其中有很多工具也可以单独工作),来完成更多的自动测试、报告生成等工作。
- 根据工具不同,其具体的结合方法也不同,但大体都是通过插件形式进行结合的。
- 版本控制工具
# 自动化测试
- 自动化测试是持续集成必不可少的一部分,基本上,没有自动化测试的持续集成,都很难称之为真正的持续集成。我们希望持续集成能够尽早的暴露问题,但这远非配置一个 Hudson/Jenkins服务器那么简单,只有真正用心编写了较为完整的测试用例,并一直维护它们,持续集成才能孜孜不倦地运行测试并第一时间报告问题。
- 测试自动化是使用特定的软件(独立于被测试的软件)来控制测试的执行以及比较实际输出与预期输出。测试自动化可以将某些重复但必要的任务自动化,或者执行某些难以手动执行的额外测试。
- 自动化测试还包括单元测试、集成测试、系统测试、验收测试、性能测试等,在不同的场景下,它们都能为软件开发带来极大的价值。
目前持续集成(CI)已成为当前许多软件开发团队在整个软件开发生命周期内侧重于保证代码质量的常见做法。它是一种实践,旨在缓和和稳固软件的构建过程。并且能够帮助您的开发团队应对如下挑战:
- 软件构建自动化 :配置完成后,CI系统会依照预先制定的时间表,或者针对某特定事件,对目标软件进行构建。
- 构建可持续的自动化检查 :CI系统能持续地获取新增或修改后签入的源代码,也就是说,当软件开发团队需要周期性的检查新增或修改后的代码时,CI系统会不断确认这些新代码是否破坏了原有软件的成功构建。这减少了开发者们在检查彼此相互依存的代码中变化情况需要花费的时间和精力。
- 构建可持续的自动化测试 :构建检查的扩展部分,构建后执行预先制定的一套测试规则,完成后触发通知(Email,RSS等等)给相关的当事人。
- 生成后后续过程的自动化 :当自动化检查和测试成功完成,软件构建的周期中可能也需要一些额外的任务,诸如生成文档、打包软件、部署构件到一个运行环境或者软件仓库。这样,构件才能更迅速地提供给用户使用。
# 三、持续集成CI工具集
- Buildbot
- ThoughtWorks
- Urbancode deploy
- Jenkins
- Perforce
- Bamboo
- Hudson
- TeamCity
- Circle CI
- Codeship
- Cruise control
- Go
- Travis
- Integrity
- Strider
# Jenkins
Jenkins 是当今已知且最常用的持续集成工具。根据各种比较,Jenkins 位居榜首。Jenkins 是基于开源持续集成服务器的持续性应用程序,使开发人员可以更快地构建,自动化和测试任何软件项目。它最初是由河口晃介(Kohsuke Kawaguchi)于2004年启动的 Hudson 项目的一部分,但后来于2011年以 Jenkins 的名称发布。该工具经过多年的发展,已成为最可靠的软件交付自动化工具。
Jenkins 是一个开源的持续集成工具,使用 Java 编程语言编写的。它有助于实时检测和报告较大代码库中的单一更改。该软件可帮助开发人员快速查找和解决代码库中的问题并自动测试其构建。
特点:
- 支持海量节点扩展并在节点中同等分发工作负载
- 跨平台:在各版本Linux、Mac OS 或 Windows 等全平台轻松更新
- 提供了 WAR 格式的简易安装包,执行导入 JEE 容器中即可运行安装
- 可以通过 Web 界面轻松设置和配置 Jenkins
- 分布式构建:Jenkins能够让多台计算机( Master&Slaver)一起构建/测试。
- 消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告。
- 丰富的插件支持: 支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等。
# Travis CI
Travis 是一款流行的 CI 工具,可免费用于开源项目。在托管时,不必依赖任何平台。此 CI 工具为许多构建配置和语言提供支持,如 Node,PHP,Python,Java,Perl 等。
特点:
- Travis 使用虚拟机构建应用程序
- 可通过 Slack,HipChat,电子邮件等通知
- 允许运行并行测试
- 支持 Linux、Mac 以及 iOS
- 易于配置,无需安装。
- 强大的 API 和命令行工具
# Jenkins简介
Jenkins 是一个可扩展的持续集成引擎(CI工具)。
可以根据设定持续定期编译,运行相应代码;运行UT或集成测试;将运行结果发送至邮件,或展示成报告
# Jenkins 和持续集成什么关系
Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
没错,它就是一个具体的持续集成解决方案。基于 Java 实现。
主要用于实现:
- 持续、自动地构建/测试软件项目,版本发布/测试;
- 监控外部调用执行的工作,监控一些定时执行的任务;
# 为什么选择Jenkins
Jenkins之前叫做Hudson。
- 是所有CI产品中在安装和配置上最简单
- 基于Web访问,用户界面非常友好、直观和灵活,在许多情况下,还提供了AJAX的即时反馈。
- Jenkins是基于Java开发的(如果你是一个Java开发人员,这是非常有用的),但它不仅限于构建基于Java的软件。
- Jenkins拥有大量的插件。这些插件极大的扩展了Jenkins的功能;它们都是开源的,而且它们可以直接通过web界面来进行安装与管理。
# Jenkins的目标
Jenkins的主要目标是监控软件开发流程,快速显示问题。所以能保证开发人员以及相关人员省时省力提高开发效率。
CI系统在整个开发过程中的主要作用是控制:当系统在代码存储库中探测到修改时,它将运行构建的任务委托给构建过程本身。如果构建失败了,那么CI系统将通知相关人员,然后继续监视存储库。它的角色看起来是被动的;但它确能快速反映问题。
特别是它具有以下优点:
- Jenkins一切配置都可以在web界面上完成。有些配置如MAVEN_HOME和Email,只需要配置一次,所有的项目就都能用。当然也可以通过修改XML进行配置。
- 支持Maven的模块(Module),Jenkins对Maven做了优化,因此它能自动识别Module,每个Module可以配置成一个job。相当灵活。
- 测试报告聚合,所有模块的测试报告都被聚合在一起,结果一目了然,使用其他CI,这几乎是件不可能完成的任务。
- 构件指纹(artifact fingerprint),每次build的结果构件都被很好的自动管理,无需任何配置就可以方便的浏览下载。
# 基于Jenkins的持续集成流程设计
基于Jenkins的服务端持续集成,实施流程如下图:
# 基于Jenkins的持续集成体系
# 工作原理
部署一个CI系统需要的最低要求是,一个可获取的源代码的仓库,一个包含构建脚本的项目。
# 基于Jenkins的持续集成体系
- 基础的:Linux+Git+Jenkins+Maven+Jdk
- 扩展型:安装其他插件
- 开发主导 or 运维主导,主推应该是质量团队去推