现代软件开发要求使用 CI/CD 作为 DevOps 的重要组成部分。使用正确的工具进行适当的自动化是高效交付管道的关键。以下是您需要了解的有关可扩展 CI/CD 管道的所有信息。
目录
- 什么是 CI/CD 管道?
- CI/CD 管道的 4 个基本阶段
- 良好 CI/CD 管道的属性
- CI/CD 管道示例
CI/CD 流水线已逐渐成为实现高速可持续交付无错误代码的成功支柱。毕竟,客户喜欢动力!长达一个月的软件发布周期永远属于过去的时代。难怪企业正在全力以赴构建可扩展的 CI/CD 管道,使开发人员、最终用户和整个业务受益。
然而,它的效率在很大程度上取决于自动化。这就是为什么必须选择最好的 CI/CD 工具,以便在整个软件交付周期中有意义且有效地实施持续集成和持续交付。
阅读本文以了解正确配置的 CI/CD 管道的基础知识、基本阶段、属性和示例,最终导致更快、更敏捷的开发生命周期。让我们首先了解 CI/CD 如何通过弥合开发和运营之间的差距以及在软件开发的各个阶段集成自动化来改进工作流程。
什么是CI/CD 管道?
CI/CD 管道是 DevOps 方法的基石,这是一系列精心安排的步骤,通过构建代码、运行测试以及将新软件版本部署到所有必要的环境中来推动软件开发。
CI/CD 流水线的最终目标是通过自动化重复过程来最大限度地减少人为错误并获得一致的软件版本。通过自动化 CI/CD 管道的各个阶段,开发团队可以更快地工作并提高软件质量和其他 DevOps 指标。以下是有关 CI/CD 管道的一些基本事实:
- 软件管道大多是定制的,以满足项目和业务的特定需求。
- 管道中可以包含用于二进制创建、代码编译、单元测试、代码分析和安全性的各种类型的工具。
- 容器化环境将代码自动打包到可以跨混合云部署的容器映像中。
- 根据组织和团队结构,通常需要多个管道将源代码投入生产。
- CI/CD 管道可以由事件触发,例如代码更改(拉取请求)、在工件存储库中有新工件或某些已定义的计划以匹配发布节奏。
CI/CD 管道的4 个基本阶段
CI/CD 管道通常有几个脚本,需要按特定顺序执行才能实现共同目标。代码——在管道开始时提交,经过管道内的一系列阶段,然后作为生产就绪代码发布。
通常,CI/CD 管道有四个重要阶段——源代码、构建、测试和部署。每个阶段都遵循适当的标准、详细的流程和特定的工具。让我们一一探索这些阶段。
源代码
在第一阶段,开发人员将需求转化为功能算法、特性和行为。代码存储库或程序中预配置标志的任何更改都会触发 CI/CD 管道。其他常见的触发器是——用户启动或自动安排的工作流程、其他管道的结果等。
此阶段使用的工具主要取决于开发语言和代码检查功能,例如漏洞扫描、基本错误检测和遵守既定编码标准。以下是常用工具——
- AWS CodeCommit
- Git(分布式版本控制系统)
- Subversion – SVN(集中式版本控制系统)
- Team Foundation 版本控制 – TFVC(集中式)
构建
CI/CD 管道的这个阶段从存储库中提取源代码,将其链接到相关的库、依赖项和模块,并构建一个可执行文件。除了构建代码之外,构建自动化还涉及使用工具来确保代码的安全性,以及它是否相应地遵循最佳CI/CD 实践。
同时,构建阶段使用的工具也会生成过程日志,分析代码的风格和程序错误,并通知开发人员代码完成。以下是构建阶段使用的一些标准工具:
- Jenkins
- Gradle
- Travis CI
- Azure Pipeline
测试
现在源代码已经通过静态测试,构建进入动态测试阶段,通常从基本单元或功能测试开始。然后对构建进行各种测试,如回归测试、冒烟测试、集成测试、合规性测试、端到端测试 (E2E) 等,以验证其操作。
根据项目的规模和复杂性,此阶段持续数秒到数小时。测试专家创建高度详细的测试用例和标准,但依赖于测试工具。以下是一些主流的测试工具:
- Selenium(流行的开源 Web UI 自动化测试套件)
- Appium(跨平台)
- Jest(JavaScript 测试框架)
- Playwright(复杂应用程序的跨浏览器测试)
部署
在持续交付管道中,构建首先发送给利益相关者进行批准,而构建在通过持续部署管道中的测试套件后自动部署。在此阶段,将批准的代码打包为工件并部署到相关环境,主要是先部署到暂存环境,然后是 QA,最后部署到生产环境。
这个阶段应该适应支持合适的部署策略,从蓝绿部署到金丝雀部署再到就地部署。部署自然会涉及额外的预防措施和实时测试期,包括 A/B 测试、beta 测试、蓝/绿测试等,以回滚意外错误并将业务影响降至最低。部署阶段可能涉及基础设施(Terraform)、配置(Puppet)和容器化(Docker、Kubernetes 等)。其他流行的工具包括:
- Chef
- Ansible
- AWS CodeDeploy
- AWS Elastic Beanstalk
- Azure Pipeline
良好 CI/CD 管道的属性
使用 CI/CD 管道的最终目的是为团队提供快速、可靠、准确和全面的开发周期反馈,让他们部署最优质的软件。因此,一个出色的 CI/CD 管道必须具备一些基本特征。让我们看看它们是什么:
准确性
对简单和复杂工作流建模的责任在于 CI/CD 工具。这反过来又消除了重复性任务中的手动错误,并使 CI/CD 管道能够完美运行并准确了解整个软件交付过程。
可靠性
可靠的管道每次运行都不会出错,从而消除了开发人员在软件质量受损的情况下对工作量增加的挫败感。自托管构建代理提供更高的灵活性,但由于维护问题,通常会导致管道不可靠。但是,经验丰富的开发人员团队可以成功解决挑战并保持可靠性。
速度
优化的管道可以快速运行,并向开发人员提供有关代码成功或失败的快速反馈,从而减少分心的可能性。更快的管道和更少的运行时间也允许更多的部署。但是,管道运行通常会导致排队状态。该解决方案提供多个代理,使不同的管道能够并行运行。无服务器模型或容器编排在需求高时动态扩展构建代理容量。
CI/CD 管道示例:针对特定用例实施 CI/CD
有多种方法,当然还有创建管道的工具。当有人提到 CI/CD 时,你可能会立即想到 Jenkins、Docker、Kubernetes 和 Git 等名称。幸运的是,您可以尝试不同的工具组合来满足您的目的。
扩展微服务管道
今天越来越多的组织正在采用微服务。但是,微服务管道与传统管道不同。随着微服务数量的增加,为每个服务管理单独的 CI/CD 管道可能很快就会失控。 挑战
- 如果一个组织为每个服务使用一个 CI/CD 管道,他们必须支持数百或数千个管道,每个管道都连接到一个单独的 Git 存储库。
- 一个微服务还可能有多个管道供内部使用、生产或测试环境使用,这会导致更多的重复。
- 微服务的扩展自然会导致对网络和存储的需求增加。此外,在数千个 CI/CD 管道上运行验证和集成测试可能会很昂贵。
- 将代码库与共享库和插件整合起来可能非常具有挑战性。共享库通常会产生特定于版本的冲突。
解决方案
- 将管道容器化,使其独立运行于不同的语言版本。
- 为每个集成和部署使用一个可延展的管道。触发器可以携带元数据或上下文等信息,从而使管道能够相应地运行。
- 采用金丝雀发布策略,允许新软件首先在选定的用户子组中发布和测试。
我们的第一个示例是使用微服务、容器和容器编排平台的应用程序。
带有自动化服务器的容器化 CI/CD 管道
凭借云原生世界中的各种优势和大量用例,Kubernetes 已成为许多组织运行其 CI/CD 管道的自然选择。这个容器编排工具通过直观的用户界面加速了编码过程。
您需要各种组件才能将标准 CI/CD 管道部署到 Kubernetes 集群。
- 像 Git 这样的版本控制系统通常是持续集成开始的第一个地方。多个开发人员将代码更改和更新推送到 VCS 的代码存储库中。
- 使用 Docker 等容器将软件容器化有助于实现无缝封装和集成。
- 合适的 CI/CD 工具,如 Jenkins、Travis 等,可以让您构建 docker 镜像,运行一系列测试,并将构建镜像推送到 Kubernetes 集群。
- Kubernetes 帮助编排和部署由 CI/CD 工具验证的软件构建的容器。
尽管 Kubernetes CI/CD 管道简化了微服务的部署、监控和管理,但您需要采用良好的 CI/CD 实践来确保安全性。
前端的无服务器 CI/CD 管道
无服务器计算抽象了基础设施、服务器和操作系统,使现代开发人员能够专注于应用程序开发。因此,为无服务器构建 CI/CD 管道与传统架构略有不同。此外,部署和管理此类应用程序提出了一系列独特的挑战。
以上是使用 Azure 服务为无服务器应用程序的 Web 前端构建 CI/CD 管道的示例。作为此应用程序的先决条件,您必须拥有一个 GitHub 帐户、一个 Azure 帐户和一个 Azure DevOps 组织。
- 将您的源代码保存在在线版本控制系统中,您可以轻松地与领先的 CI/CD 服务集成,并且比传统的本地 VCS 更易于维护。
- 项目文件保存在 GitHub 存储库中。
- Azure 管道可让您自动执行构建和部署过程。您可以在 Windows 或 Linux 容器中运行的管道中创建各种阶段。每个阶段都将根据前一个阶段的结果运行。
- 根据应用程序的编程语言、平台和其他功能要求集成现代构建工具。这些工具可以让您——
- 运行临时命令,
- 根据依赖关系命令执行命令,
- 并行化不同的命令,
- 监督文件更改并根据这些更改运行命令,
- 配置和重新配置
- 自动化构建过程以减少人为错误
- 软件内容部署到Blob 存储(用于静态网站托管),该存储充当 Azure CDN 的源服务器。原子部署确保用户始终获得相同版本对应的内容。
- 一组分布式服务器——Azure CDN加速了广阔地理区域的内容交付。
使用 AWS 的 CI/CD 管道
借助一整套 CI/CD 工具,Amazon Web Services 提供可扩展、可靠且具有成本效益的云计算服务。由于 CodePipeline 使用起来非常简单,如果您已经在 AWS 云上,使用它会更有意义。此外,它可以与 AWS 工具和 AWS 生态系统轻松相处,并提供额外的优势,包括 Amazon 的安全性和 IAM 控制。
下面是一个如何使用AWS 开发人员工具和服务构建完整 CI/CD 管道的示例。
- 本示例中使用了 Git 存储库,但您也可以使用 AWS CodeCommit 存储库或 Amazon S3。
- 随着每次代码更改,AWS CodePipeline 会根据定义的发布模型自动执行构建、测试和部署阶段。
- AWS CodeBuild – 一项完全托管的 CI 服务 – 编译源代码、运行测试并打包源代码以进行部署。CodeBuild 可连续扩展并可同时处理多个构建,因此构建不必排队等待。
- Amazon ECR 是一个提供高性能托管的托管容器注册表,因此您可以在任何地方可靠地部署工件和应用程序映像。
- AWS CloudFormation 作为一个基础设施自动化平台,以经常性、可测试和可审计的方式部署 AWS 资源。
- Amazon ECS 是一种完全托管的容器编排服务,与 AWS 平台的其余部分深度集成。因此,您可以轻松部署、管理和扩展容器化应用程序。