运维眼中的CD流程

CD(Continues  Deployment)指的就是可持续性部署软件,由于一直从事的是互联网企业,所以涉及的软件部署都是Web应用,在敏捷开发中,应用总是在不停地迭代,在迭代的过程中也是不停地在各个环境中更新部署迭代的版本,在持续部署中,我们同样也应该遵循一套部署流程来保证我们应用的可用性。

CD流程涉及的环境

对于大多数公司来说,软件开发和部署过程中会涉及多个环境,其中包括以下几个:

  • 开发环境(Development Environment)
  • 集成测试环境(Integration Testing Environment)
  • UAT环境(User Acceptance Testing Environment)
  • 产线环境(Production Environment)

开发环境

开发环境通常可以是本地环境或远程环境。特别是在微服务流行的背景下,随着微服务数量的增多,本地开发环境对计算机性能的要求也越来越高。然而,如果使用远程环境,则对网络的要求较高。因此,我们常常面临一个选择的问题。下面是几种常见的开发方式:

  1. 全本地开发:所有服务在本地启动,开发人员只需在本地进行编译和调试。
  2. 部分本地开发:开发人员本地开发部分服务,其他服务在远程环境中运行,需要保证本地服务和远程服务之间的协同工作。
  3. 全远程开发:所有服务都在远程环境中运行,远程环境提供代码编写和编译的功能,类似于GitHub的code space。

对于DevOps团队来说,他们需要为开发人员提供一套工具,以便他们可以快速部署和调试自己的程序,这样开发人员只需专注于业务逻辑即可。

集成测试环境

集成测试环境主要用于进行系统的集成测试。由于敏捷开发的特点是不断地进行迭代开发和部署,因此对集成测试环境的可用性也有一定要求。

QA环境(可选)

对于拥有专门测试团队的公司,QA环境仅由测试团队使用。测试团队会将发现的问题提交给相应服务的团队。对于开发即测试的公司,开发环境和集成测试环境充当了QA环境的角色。

UAT环境

UAT环境与产线环境非常相似,只是版本更新更快,并且该环境交给真实客户使用。客户将使用其中的新功能,并向产品团队提供反馈。产品团队将客户的反馈提交给负责相应服务的团队。

产线环境

对于产线环境,高可用性和高稳定性是最重要的。一旦出现问题,必须立即解决。对于敏捷开发来说,部署周期因公司而异。有些公司迭代速度快,可能每周部署一个版本,而有些公司可能每月部署一个版本。当出现问题时,还涉及回滚操作和快速修复操作。

环境部署的流程

集成测试环境的部署

在集成测试环境的部署中,存在两种情况:

  1. 每个 Pull Request(PR)都运行一次集成测试。
    这种方式可以尽可能确保开发的功能在部署到QA或UAT环境时是可靠的。然而,随着开发规模的增大,集成测试的时间也会变长。因此,对集成测试的优化要求也更高,否则PR合并的时间可能会很长,从而影响开发效率。
  2. 仅在合并到开发分支时进行集成测试。 如果测试未通过,则自动还原该PR。这种方式存在一个问题,即合并到开发分支的更新可能会导致其他功能受到影响,因此需要在合并之前进行仔细的代码审查和测试。

集成测试环境的部署流程通常包括以下步骤:

  1. 在集成测试环境中创建一个独立的测试环境,可以是虚拟机、容器等。(可选)
  2. 部署所需的基础设施,包括数据库、消息队列、缓存等。(可选)
  3. 将开发人员提交的代码部署到集成测试环境中。
  4. 执行集成测试,包括测试各个服务之间的协作和整体系统的功能。
  5. 如果测试失败,通知相关的开发人员修复问题。
  6. 如果测试成功,将测试环境重置为干净的状态,准备进行下一次测试。

UAT环境的部署

UAT环境的部署流程与集成测试环境类似,但通常会更加严格和正式。在部署到UAT环境之前,通常需要经过以下一系列步骤:

  1. 通过集成测试环境的测试。
  2. 进行额外的功能测试,以确保新功能符合客户的需求。
  3. 进行性能测试,以评估系统在负载下的性能表现。
  4. 进行安全测试,以确保系统没有安全漏洞。
  5. 如果有必要,进行用户界面(UI)和用户体验(UX)测试,以确保系统易于使用和友好。

UAT环境的部署过程需要严格控制,确保部署的版本是与客户需求一致的,并经过了充分的测试。

产线环境的部署

产线环境的部署有三种情况:

  1. 按发布周期部署产品环境:
  • 每个服务有自己的发布周期。这样的产品环境通常能够快速响应客户需求,并且具有较快的迭代速度。但是,它也可能增加了部署和管理的复杂性,因为需要确保各个服务之间的版本兼容性和稳定性。
  • 发布周期可以是每周、每两周或每月一次,具体取决于公司的需求和开发团队的能力。
  1. 持续部署:
  • 采用持续部署的方式,将代码的更新自动部署到产线环境。
  • 当有新的代码合并到主分支时,自动触发构建和部署流程,将更新的版本部署到产线环境。
  • 这种方式可以实现快速的迭代和响应客户需求,但也需要对自动化流程进行严格的测试和监控,以确保部署的稳定性和质量。
  1. 基于特性开关的部署:
  • 使用特性开关来控制新功能的部署和启用。
  • 将新功能的代码合并到主分支,但通过特性开关禁用该功能,以便在需要时可以灵活地启用或禁用该功能。
  • 这种方式可以将新功能的部署和启用与产品的发布周期分离开来,从而降低部署和发布的风险。

服务部署的工具

对于每个环境的部署流程,可以使用自动化工具(如持续集成/持续部署工具)来实现自动化的构建、测试和部署流程。这些工具可以帮助减少人为错误,加快部署速度,并提供更好的可重复性和可靠性。同时,还可以结合监控工具来实时监控环境的健康状态,以便及时发现和解决问题。

常用的部署工具有以下这些:

配置管理类

  • puppet
  • ansible
  • chief
  • helm

基础设施类

  • terraform
  • pulumi
  • aws cdk

部署类

  • Jenkins
  • ArgoCD
  • Rundeck
  • GitHub Action
  • Buildkite