持续集成的定义和常用 CI 系统对比
定义
持续集成(Continuous Integration,简称CI)是一种软件开发实践,指的是将代码频繁地集成到主干分支,并且在提交、合并代码时对项目进行构建、编译和测试,如果测试不过,则不能集成,整个流程如下图所示:
与持续集成相似的还有两个概念,那就是持续交付和持续部署。
持续交付(Continuous Delivery)指的是频繁地将集成到主干后的软件新版本,手动部署到准生产环境,交付给质量团队或者用户以供评审,如果评审通过,则可以发布上线,可以看作是持续集成的下一步:
持续部署(Continuous Deployment)则是在持续交付的基础上,把部署到生产环境的过程自动化:
目标
持续集成主要有两个好处:
- 更早发现错误:每完成一点更新,就集成到主干,可以更早发现错误,定位错误也比较容易;
- 防止分支大幅偏离主干:如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
持续集成的主要目标,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
工作流程
下面我们用一张图来介绍持续集成的工作流程:
- 开发人员在自己的本地计算机上检查(测试)代码
- 检查完成后,将本地开发分支代码变更提交/合并到主干
- 代码仓库触发请求到 CI 系统
- CI 服务器运行任务(测试、代码覆盖率、检查语法等)
- CI 服务器发布已保存的工件(Artifacts)用于测试
- 如果构建或测试失败,CI 服务器会向开发人员发出警报
- 开发人员修复问题,再次进行提交/合并代码
可见要实现持续集成,我们需要使用一个代码仓库来对代码分支进行管理,常见的代码仓库包括 Github、Gitlab、CODING、码云等,此外代码集成到主干前的所有构建、测试工作都是在 CI 系统中完成的,常见的 CI 系统有 CircleCI、Travis 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 系统来实现持续集成。
4 Comments
这种只有在大公司实践才能学到的知识网络上少之又少,希望后续能结合实践来演示,给学员君点赞
马上就要开始了 事实上很多所谓的大公司做的也不是那么好
有没有各种软件发布一个集合 例如压力测试,单元测试,各自都用的什么软件,目前最好的有哪几款
目前没有一个集大成者 压力测试工业化软件是 JMeter 什么都用工具 这种工作可以交给自动化程序去执行就好了 不需要人工维护 要程序员干嘛