DevOps - 持续集成(Continuous Integration)

持续集成

简介

持续集成(Continuous integration,简称CI)是软件的开发和发布标准流程中最重要的部分。
做为一种开发实践,在CI中能够经过自动化等手段高频率地去获取产品反馈并响应反馈的过程。
简单来讲,就是持续不断地(一天屡次)将代码合并(集成)到主干源码仓库,让产品能够快速迭代,同时保持高质量。html

代码每次集成到主干以前,必须经过自动化测试,以便快速发现和定位错误。
持续集成并不能消除错误,而是让它们很是容易发现和改正。git

优势

  1. 缩减开发周期,快速迭代版本
     尽早的持续集成,尽快进入迭代之中,就能够尽早的暴露出问题,提前解决,尽可能在规定时间内完成任务。web

  2. 自动化流水线操做带来的高效
    CI的精髓在于持续,持续意味着自动化。
     自动化验证代码变动的过程,能够在软件开发的早期发现缺陷和与其余代码和组件的集成问题。服务器

  3. 随时可部署
     高频率的集成能够尽量地保证随时部署上线,缩短开发复杂软件的市场交付时间。架构

  4. 极大程度避免低级错误
     减小大块内容合并到主干分支的状况,避免代码合并冲突和没法预料的行为。
     低级错误:编译错误,安装问题,接口问题,性能问题等。函数

难点

  • 迁移遗留代码到现有CI系统,须要的投入一般在预料以外
  • 在文化和组织上若是没有采用敏捷原则或DevOps的工做方式,那么极可能没有持续不断的提交,那么CI的存在乎义不大
  • 随着业务增加、工具的更替、技术的演进,CI系统也必然随之改动,每每会致使阶段性的不稳定和人力物力的耗费
  • 若是CI的基本设定不到位,开发流程将会增长特别的开销

注意点

CI流程的触发方式:

  • 跟踪触发式:在每次提交到源码版本管理系统时触发
  • 计划任务:预配置好的计划,例如一次凌晨的构建
  • 手动:不管是经过CI服务器的管理界面仍是脚本,用户能够手工执行CI工做流

代码审核

  • 可在持续集成服务器里使用代码分析工具(例如Sonar)来执行自动代码审查
  • 自动代码审查经过后,可发起一我的工代码审查,揪出那些自动审查没法找出的问题,即验证业务需求,架构问题,代码是否可读,以及是否易于扩展。
  • 可灵活配置代码审核策略,例如:若是某些人没有审查代码便阻止对主干分支的任何提交。
  • 最经常使用的工具是Gerrit

CI流程

典型的CI流程

一个完整的CI系统应该包含3个基本模块:工具

  • 一个能够自动构建的过程,自动编译代码,能够自动分发,部署和测试。
  • 一个代码仓库,例如Git。
  • 一个持续集成的服务器。

通用的CI流程

  1. 签出代码:
    从源码管理系统里签出或者克隆最新的代码到本地开发环境gitlab

  2. 提交(commit):
    基于主干分支建立一个新的功能分支,并在此分支编写代码,并向仓库提交代码性能

  3. 测试(第1轮):
    代码仓库对commit操做配置了钩子(hook), 每一次提交代码都会触发测试
    单元测试(针对函数或模块的测试)和功能测试(集成测试)将会被执行、根据须要设置是否执行端对端测试
    通常来讲,这些测试也会被打包到代码里。单元测试

  4. 构建(build):
    经过测试(第1轮)后,将源码转换为能够运行的实际代码,好比安装依赖,配置各类资源等
    实现一个CI流程的惟一必要条件即是得有一个自动构建系统。
    源代码通常是自包含构建的,即CI流程所需的构建脚本是放在源码仓库里的。

  5. 测试(第2轮):
    以自动化为主的全面测试,包括单元测试和集成测试,必要时作端对端测试,确保新版本的每个更新点都必须测试到

  6. 合并:
    经过测试(第2轮)后,将代码更新集成到主干

  7. 回滚:
    若是当前版本发生问题,就回滚到上一个版本的构建结果
    通常来讲,CI服务器会配置成在遇到故障时发送邮件相关人员,能够快速知晓故障而且尽快采起更正措施。

CI与TDD结合

Continuous integration (CI) 与test-driven development (TDD)结合,分红了12个步骤:

参考消息

参考示例

使用gitlab, jenkins搭建CI(持续集成)系统

  1. 准备环境:http://www.noobyard.com/article/p-ozhjisjh-dh.html
  2. 配置webhook触发构建:http://www.noobyard.com/article/p-tlyufgmj-gb.html
  3. 根据不一样触发条件执行不一样的构建任务:http://www.noobyard.com/article/p-pgqlxrxj-cw.html
  4. 灰度发布publish:http://www.noobyard.com/article/p-opvfabct-bs.html

CI持续集成系统环境的部署