持续集成的定义和常用 CI 系统对比


定义

持续集成(Continuous Integration,简称CI)是一种软件开发实践,指的是将代码频繁地集成到主干分支,并且在提交、合并代码时对项目进行构建、编译和测试,如果测试不过,则不能集成,整个流程如下图所示:

与持续集成相似的还有两个概念,那就是持续交付和持续部署。

持续交付(Continuous Delivery)指的是频繁地将集成到主干后的软件新版本,手动部署到准生产环境,交付给质量团队或者用户以供评审,如果评审通过,则可以发布上线,可以看作是持续集成的下一步:

持续部署(Continuous Deployment)则是在持续交付的基础上,把部署到生产环境的过程自动化:

目标

持续集成主要有两个好处:

  • 更早发现错误:每完成一点更新,就集成到主干,可以更早发现错误,定位错误也比较容易;
  • 防止分支大幅偏离主干:如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。

持续集成的主要目标,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。

工作流程

下面我们用一张图来介绍持续集成的工作流程:

  • 开发人员在自己的本地计算机上检查(测试)代码
  • 检查完成后,将本地开发分支代码变更提交/合并到主干
  • 代码仓库触发请求到 CI 系统
  • CI 服务器运行任务(测试、代码覆盖率、检查语法等)
  • CI 服务器发布已保存的工件(Artifacts)用于测试
  • 如果构建或测试失败,CI 服务器会向开发人员发出警报
  • 开发人员修复问题,再次进行提交/合并代码

可见要实现持续集成,我们需要使用一个代码仓库来对代码分支进行管理,常见的代码仓库包括 Github、Gitlab、CODING、码云等,此外代码集成到主干前的所有构建、测试工作都是在 CI 系统中完成的,常见的 CI 系统有 CircleCITravis CI 以及 Jenkins 等,有些系统支持自己搭建,比如 Jenkins,CircleCI、Travis CI 则以云服务的方式提供服务,更加轻量级。

在开始演示持续集成实现示例之前,我们先简单对比介绍下这几个 CI 系统。首先从 CircleCI 开始。

CircleCI

特性:

  • CircleCI 是一个基于云服务的系统,不需要专用服务器,无需对其进行管理和维护,不过,它还是提供了一个本地解决方案,允许您在私有云或数据中心中运行它;
  • 即使是商业帐户,它也提供了免费计划;
  • Rest API:基于这些 API 你可以访问项目、构建和工件,构建的结果将会是工件或工件组,工件可以是已编译的应用程序、可执行文件(例如 Android APK)或元数据(例如关于测试成功的信息);
  • CircleCI 缓存必要的安装,它会检查第三方依赖项,而不是持续安装所需的环境;
  • 如果出现任何问题,你可以通过 SSH 模式访问容器并进行检查;
  • 总而言之,这是一个需要最少配置和调整的、完整的开箱即用解决方案。

与以下产品兼容:

  • Python、Node.js、Ruby、Java、Go、PHP 等;
  • Ubuntu、Mac OS X(付费账户);
  • Github、Bitbucket;
  • AWS、Azure、Heroku、Docker、专用服务器;
  • Jira、HipChat、Slack。

优点:

  • 快速启动;
  • 针对企业项目有免费计划;
  • 容易上手;
  • 轻量级,易读的 YAML 配置;
  • 不需要任何服务器就可以运行。

缺点:

  • 仅支持两个版本的 Ubuntu 免费(12.04、14.04),MacOS 则需要付费;
  • 尽管可以在所有语言中使用,但「开箱即用」则仅支持以下编程语言:Go、Haskell、Java、PHP、Python、Ruby、Scala;
  • 如果想进行自定义,可能会遇到一些问题,需要借助一些第三方软件进行调整;
  • 此外,作为基于云服务的系统本身也是个双刃剑,一方面简单方便易上手,另一方面,它也可以停止支持任何软件,而你对此将毫无招架之力。

Travis CI

Travis CI 和 CircleCI 在功能和使用上基本差不多,它们都基于 YAML 文件进行配置,都是基于云的,都支持基于 Docker 运行测试,此外,Travis CI 提供了一些 CircleCI 所没有的功能:

  • 可选择同时在 Linux 和 Mac OS X 上运行测试;
  • 「开箱即用」支持更多语言:Android、C、C#、C++、Clojure、Crystal、D、Dart、Erlang、Elixir、F#、Go、Groovy、Haskell、Haxe、Java、JavaScript(带 Node.js)、Julia、Objective-C、Perl、Perl6、PHP、Python、R、Ruby、Rust、Scala、Smalltalk、Visual Basic;
  • 支持 Build Matrix。

Travis CI 优点:

  • 开箱即用的 Build Matrix 功能;
  • 快速启动;
  • 轻量级 YAML 配置;
  • 针对开源项目的免费计划;
  • 无需专用服务器。

Travis CI 缺点:

  • 与 CircleCI 相比,价格更高,没有免费的企业计划;
  • 自定义(需要第三方支持)

Jenkins

特性:

  • Jenkins 是一个独立的、基于 Java 的应用程序,需要自己安装和维护,支持 Windows、Mac OS X 和其他类 Unix 的操作系统;
  • 凭借更新中心中的数百个插件,Jenkins 几乎集成了持续集成和持续交付工具链中的所有工具;
  • Jenkins 可以通过插件进行扩展,这为 Jenkins 提供了几乎无限的可能性;
  • 多种作业模式:自由式项目(Freestyle project)、管道(Pipeline)、外部作业(External Job)、多配置项目(Multi-configuration project)、文件夹(Folder)、GitHub 组织(GitHub Organization)、多分支管道(Multibranch Pipeline);
  • Jenkins Pipeline:这是一套插件,用于支持在 Jenkins 中实现和集成持续交付管道。Pipeline 提供了一组可扩展的工具,用于通过 Pipeline DSL 以代码方式对简单到复杂的交付管道进行建模;
  • 允许你启动具有各种条件的构建;
  • 你可以通过 Libvirt,Kubernetes,Docker 来运行 Jenkins;
  • Rest API:基于这些 API 你可以控制获取的数据量、获取/更新 config.xml、删除作业、获取所有构建、获取/更新作业说明、执行构建、禁用/启用作业。

优点:

  • 免费;
  • 自定义;
  • 插件系统;
  • 对系统的完全控制。

缺点:

  • 需要专用服务器来安装和运行,这会导致额外的费用,以及额外的运维成本;
  • 配置/自定义需要花费时间和精力。

结论

介绍完上述常见的 CI 系统,具体要选择哪一个取决于你的需求以及计划使用它的方式:

  • CircleCI 适用于小型项目,其主要目标是尽快开始集成;
  • 如果你开发的是开源项目,建议使用 Travis CI,因为这些项目需要在不同环境中进行测试;
  • Jenkins 适用于大型项目,在这些项目中,需要针对系统和流程进行大量的定制化工作,这些自定义可以通过使用 Jenkins 提供的各种插件来完成。

后续几篇教程,学院君将给大家演示如何基于上面三个 CI 系统来实现持续集成。


Vote Vote Cancel Collect Collect Cancel

<< 上一篇: 通过测试驱动开发构建待办任务项目(二):前端功能和浏览器测试篇

>> 下一篇: 基于 Github + CircleCI 实现 Laravel 项目的持续集成