1 - 持续集成简介

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

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

1.1 适合使用持续集成实现自动化的工作类型

  • 应用程序的静态测试(静态检查):不用实际运行应用程序就可以进行的测试,例如语法错误和编码规范等
  • 应用程序的构建:验证依赖关系等问题
  • 应用程序的动态测试:单元测试和集成测试等

1.2 持续集成的优点

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

  2. 自动化流水线,削减工作成本
    CI的精髓在于持续,持续意味着自动化。
    自动化验证代码变更的过程,可以在软件开发的早期发现缺陷和与其他代码和组件的集成问题。

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

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

  5. 状态可视化,信息透明化
     轻松快捷地确认更改信息、提交过程和测试结果,所有信息公开共享,利于协作

1.3 持续集成的难点

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

1.4 持续集成的注意点

工具

持续集成工具必须能够定义触发操作的时机、确认操作的状态、保存操作的记录。

代码仓库

对于持续集成来说,建议只维护一个源码仓库,对于新需求一般采取创建分支的方式,这也可以降低版本管理的复杂度。

CI流程的触发方式

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

代码审核

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

1.4 实现持续集成的一些方法与途径

  • 从操作步骤上,将多个处理关联起来实现自动化
  • 通过自动化测试快速执行大量测试,尽量覆盖所有场景
  • 基于时间或者提交进行细颗粒度测试
  • 立即通知测试结果,例如直接显示、邮件通知、关联即时通讯工具等
  • 避免测试等待,优化测试时间,例如分割测试用例、并行测试等
  • 重复进行多种测试,为发布做好准备

2 - CI流程

从持续集成的组成部分来理解CI流程,其实就是将应用程序的开发与基础设施的构建流程合并起来,在一个流程内对二者进行测试。

2.1 典型的CI流程

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

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

2.2 通用的CI流程

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

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

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

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

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

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

  7. 回滚:
    如果当前版本发生问题,就回滚到上一个版本的构建结果
    一般来说,CI服务器会配置成在遇到故障时发送邮件相关人员,可以快速知晓故障并且尽快采取更正措施。

2.3 实际使用场景中一次提交改动的过程

  1. 团队成员提交改动
  2. Gerrit做代码审核,提交到GitLab,并通过邮件通知相关人员
  3. Sonar做代码扫描,并把结果通知相关人员
  4. 在GitLab中打tag(通过WebHook触发Jenkins作业),或者手工触发Jenkins Job,
  5. Maven开始下拉代码进行编译,然后进行单元测试和打包
  6. 利用Docker cli构建镜像,并把镜像上传到镜像仓库中
  7. Jenkins作业触发容器管理工具在测试环境中启动容器,下拉镜像,并根据配置启动容器
  8. 容器管理工具自动或按规则调度容器运行,并负责容器声明周期管理(启动、运行、监控、健康检查、扩展等)
  9. 进行自动化测试
  10. 测试通过后,Jenkins触发容器管理工具在生产环境中更新测试通过的改动,或者选择手动发布

3 - CI与TDD结合

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

4 - 参考消息

DevOps - 持续集成(Continuous Integration)的更多相关文章

  1. devops持续集成

    目录 Devops 版本控制系统 Git安装 Git使用 git四种状态 git基础命令 git分支 git合并冲突 git标签 git命令总结 Github使用 创建仓库 HTTP协议 SSH协议 ...

  2. 构建gitlab+Jenkins+harbor+kubernetes的DevOps持续集成持续部署环境

    构建gitlab+Jenkins+harbor+kubernetes的DevOps持续集成持续部署环境 整个环境的结构图. 一.准备工作 gitlab和harbor我是安装在kubernetes集群外 ...

  3. DevOps - 持续集成

    最近在担任公司部门的DevOps Champion的角色,一直觉得这个只是一个协调者的角色(而不是一个SME的角色),我的工作大概就是将每个项目的devops工具收集一下,然后用图表的形式去体现大家用 ...

  4. devops持续集成,Centos7.6下gitlab+jenkins(pipeline)实现代码自动上线

    持续集成 gitlab+jenkins(pipeline)实现代码自动上线 环境准备:Centos7.6版本ip:192.168.0.13 主机名:gitip:192.168.0.23 主机名:jen ...

  5. <自动化测试方案_9>第九章、持续集成平台搭建

    第九章.持续集成平台搭建 (一)什么是持续集成 参考文章地址:https://blog.csdn.net/qq_32261399/article/details/76651376 敏捷软件开发(英语: ...

  6. 基于 CODING 的 Spring Boot 持续集成项目

    本文作者:CODING 用户 - 廖石荣 持续集成的概念 持续集成(Continuous integration,简称 CI)是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少 ...

  7. CI/CD持续集成/持续部署 敏捷开发

    敏捷软件开发(英语:Agile software development),又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力.它 ...

  8. 持续集成之Jenkins+Gitlab简介 [一]

    转载:http://blog.csdn.net/abcdocker/article/details/53840449 持续集成概念 持续集成Continuous Integration 持续交付Con ...

  9. 04: CI(持续集成)/CD(持续交付/持续部署)

    1.1 持续集成.持续交付 介绍   参考博客:https://www.cnblogs.com/cay83/p/8856231.html 1.传统交付 1. 传统软件的开发与交付的周期都很漫长,从需求 ...

随机推荐

  1. Web API系列(二) Filter的使用以及执行顺序

    在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...

  2. Linux中三种SCSI target的介绍之SCST

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/scaleqiao/article/deta ...

  3. PHP Socket 编程之9个主要函数的使用之测试案例

    php的socket编程算是比较难以理解的东西吧,不过,我们只要理解socket几个函数之间的关系,以及它们所扮演的角色,那么理解起来应该不是很难了,在笔者看来,socket编程,其实就是建立一个网络 ...

  4. PHP 源码安装常用配置参数和说明

    常用的配置参数1. --prefix=/usr/local/php指定 php 安装目录install architecture-independent files in PREFIX 默认/usr/ ...

  5. PHP实现系统编程(一) --- 网络Socket及IO多路复用【网摘】

    一直以来,PHP很少用于socket编程,毕竟是一门脚本语言,效率会成为很大的瓶颈,但是不能说PHP就无法用于socket编程,也不能说PHP的socket编程性能就有多么的低,例如知名的一款PHP ...

  6. [matlab工具箱] 神经网络Neural Net

    //目的是学习在BP神经网络的基础上添加遗传算法,蚁群算法等优化算法来优化网络,这是后话. 先简单了解了MATLAB中的神经网络工具箱,工具箱功能还是非常强大的,已经可以拟合出非常多的曲线来分析了. ...

  7. golang-笔记2

    结构体: 是一种数据 类型. type Person struct { —— 类型定义 (地位等价于 int byte bool string ....) 通常放在全局位置. name string ...

  8. P1108 低价购买——最长下降子序列+方案数

    P1108 低价购买 最长下降子序列不用多讲:关键是方案数: 在求出f[i]时,我们可以比较前面的f[j]; 如果f[i]==f[j]&&a[i]==a[j] 要将t[j]=0,去重: ...

  9. Linux文件的权限的基本介绍

    一. ls  -l    显示的内容如下: 二.rwx权限详解 1.rwx作用到文件 2. rwx作用在目录 三.文件及目录实际案例 四.修改权限  -  chmod 1. 基本说明: 2.第一种方式 ...

  10. V语言 基本使用

    新手必看-如何安装配置vlang运行环境(linux,macOS篇) 前置条件 发稿截止前只有Linux 或者 macOS系统能编译通过. 你需要安装clang或gcc 如果是macOS上需运行xco ...