0%

持续集成持续交付持续部署

持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译、发布、自动化测试)来验证,从而尽早地发现集成错误。

一、持续集成(Continuous Integration)

  1. 定义:一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译、发布、自动化测试)来验证,从而尽早地发现集成错误。
  2. 目标:让产品可以快速迭代,同时还能保持高质量。
  3. 措施:代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
  4. 条件
    • 全面的自动化测试,这是实践持续集成&持续部署的基础,同时,选择合适的自动化测试工具也极其重要
    • 灵活的基础设施,如使用容器,虚拟机的存在让开发人员和QA人员不必再大费周折
    • 版本控制工具,如 Git,CVS,SVN 等
    • 自动化的构建和软件发布流程的工具,如Jenkins,flow.ci等
    • 反馈机制,如构建/测试的失败,可以快速地反馈到相关负责人,以尽快解决达到一个更稳定的版本。
  5. 优点
    • “快速失败”,在对产品没有风险的情况下进行测试,并快速响应
    • 最大限度地减少风险,降低修复错误代码的成本
    • 将重复性的手工流程自动化,让工程师更加专注于代码
    • 保持频繁部署,快速生成可部署的软件
    • 提高项目的能见度,方便团队成员了解项目的进度和成熟度
    • 增强开发人员对软件产品的信心,帮助建立更好的工程师文化
  6. 两个好处
    • 快速发现错误。每完成一点更新就集成到主干,可以快速发现错误,定位错误也比较容易。
    • 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
  7. 如何选持续集成系统
    • 私有型:Self Hosted CI 指的是将软件部署在公司的机房或内网中,需要提供多台服务器来完成 CI 系统的运转,同时需要对不同机器之间进行环境配置。比如Maven 或 Gradle 或 Jenkins ,他们的特点是自由开源,且文档支持广泛。优点在于对构建环境有完全的控制权,能够实现完全定制。但需要搭建环境和配置、维护成本高,需要买专门的机器,花费较多人力物力且更新迁移风险高;
    • 托管型:Hosted CI 指的是由 SaaS 型的 CI 服务,全程在线进行构建配置,不需要考虑装机器,装软件,环境搭建等成本。常见的有 CircleCI,Codeship 和TravisCI 等,还有国内最新的持续集成服务——flow.ci 。SaaS 型的 CI 的特点在于无需额外机器,几分钟就可以用起来。可以根据你的需要动态调度资源。省时,省心,省力。
  8. 流程
    • 提交:流程的第一步,是开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交(commit)。
    • 第一轮测试:代码仓库对commit操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。测试分为多种,如:
      • 单元测试:针对函数或模块的测试
      • 集成测试:针对整体产品的某个功能的测试,又称功能测试
      • 端对端测试:从用户界面直达数据库的全链路测试
    • 构建:通过第一轮测试,代码就可以合并进主干,就算可以交付了。交付后,就先进行构建(build),再进入第二轮测试。
      • 构建指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、JS 脚本、图片)等等。常见工具:Jenkins、Travis、Codeship、Strider等
    • 第二轮测试:构建完成,就要进行第二轮测试。(如果第一轮已经涵盖了所有测试内容,第二轮可以省略,当然这时构建步骤也要移到第一轮测试前面)第二轮是全面测试,单元测试和集成测试都会跑,有条件的话,也要做端对端测试。所有测试以自动化为主,少数无法自动化的测试用例,就要人工跑。需要强调的是,新版本的每一个更新点都必须测试到。如果测试的覆盖率不高,进入后面的部署阶段后,很可能会出现严重的问题。
    • 部署:通过了第二轮测试,当前代码就是一个可以直接部署的版本。将这个版本的所有文件打包存档,发到生产服务器。生产服务器将打包文件解包成本地的一个目录,再将运行路径的符号链接指向这个目录,然后重新启动应用。这方面的部署工具有 Ansible,Chef,Puppet等。
    • 回滚:一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指向上一个版本的目录。

二、持续交付(Continuous Delivery)

  1. 定义:在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的类生产环境中。给测试人员或者用户,以供评审。如果评审通过代码没有问题,可以继续手动部署到生产环境中。
    • 持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。
  2. 目标:持续交付用来确保让代码能够快速、安全的部署到生产环境中,它通过将每一次改动都提交到一个模拟生产环境中,使用严格的自动化测试,确保业务应用和服务能符合预期。
  3. 好处
    • 快速发布,能够应对业务需求,并更快地实现软件价值
    • 编码->测试->上线->交付的频繁迭代周期缩短,同时获得迅速反馈
    • 高质量的软件发布标准。整个交付过程标准化、可重复、可靠
    • 整个交付过程进度可视化,方便团队人员了解项目成熟度
    • 更先进的团队协作方式,从需求分析、产品的用户体验到交互设计、开发、测试、运维等角色密切协作,相比于传统的瀑布式软件团队,更少浪费

三、持续部署(Continuous Deployment)

  1. 定义:在持续交付的基础上,代码通过评审以后(或者是通过自动化测试以后),自动部署到生产环境。
    • 持续部署是持续交付的最高阶段
  2. 目标:代码在任何时刻都是可部署的,可以进入生产阶段。
  3. 好处:可以相对独立地部署新的功能,并能快速地收集真实用户的反馈。
  4. 工具:jenkins+fastlane