持续集成/持续交付 (CI/CD) 是一组自动化和简化软件开发、测试及交付流程的实践。
CI/CD 策略和工具使开发者能够摆脱伴随传统开发而来的繁琐且往往枯燥的手动流程。
传统开发遵循线性的顺序流程,每个阶段——需求收集、设计、编码、手动测试和部署——必须在前一阶段完成后才能开始,即便各阶段之间存在漫长的间隔。
每位开发者负责将代码手动集成到应用或服务的新迭代版本中。不同的代码片段并不总能很好地协同工作,且开发者按不同的时间线(有时是在最后一刻)集成他们的变更,因此集成成为了一个耗时且易出错的过程,尤其是对于大型开发团队而言。
软件测试也不频繁。团队通常一次性实施大批量更新(往往在代码实现之后),这使得漏洞可能被忽略并积累在代码库中。当问题出现时,开发者很难确定是哪个变更引入了问题。
其结果是,团队面临更具挑战性的调试和质量保证任务、更高的失败率和更慢的代码发布;用户遇到更多的软件错误和故障;企业则因流程效率低下而损失收入。
CI/CD 将构建、测试和发布软件的大部分环节自动化。 自动化管道在整个开发生命周期中实施持续集成、测试和部署,从而提高了管道的效率和可靠性。
代码变更被持续、增量地合并到共享仓库中,在每次提交后自动构建和测试,并快速部署(有时每天多次)。小的变更和频繁的代码提交使开发者能够更早地发现问题,并更容易执行回滚。
借助 CI/CD工具,团队能立即知道每次提交的结果,每个人都能看到每次构建、测试和部署的状态。这些功能有助于提高开发和运维团队的管道透明度,并简化团队间的协作。
| 功能 | 传统开发 | CI/CD |
| 流程 | 线性、分阶段 | 持续、集成 |
| 发布频率 | 季度、年度 | 每日、每周 |
| 构建、测试、部署 | 手动、迭代 | 自动化、可重复 |
| 测试 | 在完整开发后 | 自动化、持续 |
| 错误检测 | 后期、较困难 | 早期且持续、容易 |
| 反馈 | 缓慢、在里程碑节点 | 即时、持续 |
| 协作 | 孤立角色、交接 | 共享责任、状态公开 |
通过 Think 时事通讯,了解有关 AI、自动化、数据等方面最重要且最有趣的行业趋势。请参阅 IBM 隐私声明。
持续集成是 CI/CD 管道的首个环节。它使 DevOps 团队能够持续改进软件应用、获得持续反馈、在错误影响软件性能之前及时发现并修复,以及以更可预测的发布计划交付更高质量的软件。
开发者将代码变更提交到版本控制系统(如 Git)的共享分支或主分支,以跟踪代码随时间的变更,提交会触发 CI 工具对更新后的代码库执行“构建”。CI 系统获取新代码,将其与现有代码编译,并与配置文件、库或其他资源等依赖项打包在一起。这就构成了“构建”。
测试工具会运行一系列测试来验证构建结果,然后生成“构建产物”——即传递用于进一步测试或进入生产环境的最终文件。管道的下一部分称为持续交付。
持续交付 (CD) 承接持续集成的工作,自动化地将应用及经过验证的代码库变更(更新、错误修复甚至新功能)交付到所有必要的基础设施环境中,以供进一步测试。
通过集成测试和验证阶段的代码构建会被打包并交付到代码仓库,这些仓库将代码包以可部署状态集中存储。CD 工作流会测试软件及其所有依赖项(例如连接的应用程序编程接口 (API) ),识别和纠正任何错误。
代码经过验证,有助于确保软件在各种场景下都能正常运行。如果通过验证,系统会通知 DevOps 团队最新的构建版本已就绪。团队成员有机会对新构建版本提供反馈,并提出最终的修改建议。
尽管大多数 CD 流程是自动化的,但在将软件暴露于实时生产环境中的最终用户之前,CD 仍需团队手动批准构建版本。此功能使开发者能够进行风险可控的软件发布,保持构建版本随时可交付,并确保在生产之前捕获错误和测试失败。
持续部署将 CD 又推进了一步,它无需人工干预,自动将每个经批准的变更部署到生产环境。在此阶段,代码修改已通过所有必要的测试协议,因此已准备好进入发布流程。
当代码更新经过测试、验证和批准后,持续部署系统会将软件产物移至预生产暂存环境,或移至用户可访问的公共服务器和分发平台(如应用商店)。
对于寻求扩展应用和 IT 资产组合的企业而言,持续部署工具提供了多种优势。最重要的是,它通过最小化编码到产生客户价值之间的延迟时间,加快了产品上市速度。
DevOps 团队有时会使用其他部署控制工具(如功能开关)来辅助持续部署服务,功能开关使开发者无需修改或重新部署源代码即可启用或关闭功能。
CI/CD 管道是一个自动化工作流,通过持续集成、测试和部署代码来简化软件开发。它端到端地流转代码——从开发到生产——有助于确保软件更新能够快速、安全、可靠地交付。
典型的 CI/CD 管道包含软件发布生命周期中的多个自动化流程和阶段,包括:
开发者将变更提交到版本控制系统,使项目进入管道。源代码阶段还可能涉及制定分支策略和运行初步质量检查。
系统编译代码并将其构建为可部署的产物。同时运行检查(如静态分析,即在不运行程序的情况下分析和调试代码),验证代码编译正确并准备好进行后续测试。
对产物运行自动化测试,验证代码功能正确且无回归。例如,单元测试可以验证单个组件或函数,就能提供代码行为是否符合预期的即时反馈。
通过测试的构建版本被部署到模拟生产环境的预发布暂存环境中,进行最终验证。并非每个产物都会经过暂存环境,但暂存环境作为最终测试场地,应用在此处模拟真实条件下验证后,才会发布给最终用户。
例如,开发者可能运行蓝绿部署,即将应用部署在两个并行的生产环境中,每个环境运行应用的不同版本。
“蓝”环境运行当前线上应用,而“绿”环境则处理新应用版本的测试和验证。当新版本通过验证后,流量被路由到绿环境,该环境成为新的线上环境,蓝环境则保持空闲但可用状态,处理回滚或后续版本的测试。
成功通过验证的构建版本进入部署流程,被推送到生产环境,向最终用户交付更新和新功能。
部署之后,监控工具持续跟踪软件应用在实际使用中的表现,维护系统性能、稳定性和安全性。监控工具有助于发现代码问题,使 DevOps 团队能够及时处理问题并优化后续版本。
CI/CD 是 DevOps 的基本组成部分,但仅代表 DevOps 实践的一个子集。
DevOps 是一个框架,既概述了软件开发流程,也描绘了向软件开发团队与 IT 运维团队之间协调协作的文化转变。传统上,这两个团队彼此独立运作。在 DevOps 方法论中,他们作为一个协作团队,使用一套共享的工具和实践。
DevOps 方法倡导共享责任、持续协作和流程优化。除了软件交付管道,其范围还涵盖基础设施与平台工程、安全、合规、治理和风险管理。
相比之下,CI/CD 则专注于构建、测试、部署和改进软件应用。自动化这些流程有助于组织提高代码质量、测试覆盖率、依赖管理和可观测性指标,并最终更频繁地发布更强大的软件,从而增强 DevOps 实践。
CI/CD 安全需要能够将安全和合规措施贯穿整个管道的实践、流程和技术。
在传统开发模式中,安全通常是在开发周期结束时才附加到软件上。但云平台、微服务架构和容器化应用的进步改变(并加速)了软件开发生命周期,使得传统安全策略过时。
由此催生了 DevSecOps。
DevSecOps 是开发、安全与运维的缩写,它将 网络安全 架构师和工程师纳入 DevOps 策略,以确保技术栈中的每个应用组件和每个配置项都得到主动修补、保护和文档化。 这是一种将安全协议从开发管道的右侧(末端)“左移”至左侧(起始端)的开发实践。
通过“左移”,团队成员从一开始就实施安全协议(如数据加密、输入验证、基于角色的访问控制和多因素认证)。 左移 使 DevOps 团队能够在网络犯罪分子利用安全漏洞或破坏软件功能之前,快速识别并修复这些漏洞。
DevSecOps 还融入了“右移”活动,将安全实践扩展到部署后的生产环境中。右移实践优先在运行时、真实条件下对应用进行监控、测试和保护。它们通过建立一个持续的反馈循环,将在生产环境中发现的安全问题反馈到早期开发阶段,从而对左移安全形成补充。
左移与右移安全结合使用,使企业能够将安全控制集成到应用生命周期的每个阶段。这种双重的 “随处左移右移”安全策略,帮助 DevOps 团队同时实现早期预防与部署后的威胁检测和响应,从而增强整体安全态势并推动持续改进。
有几个关键趋势和技术正在塑造 CI/CD 管道中软件应用的构建、管理和安全防护方式:
人工智能驱动的 CI/CD 解决方案可以帮助开发者构建更动态、更安全、更具可扩展性的应用。
组织可以使用 AI 和 ML 工具持续实时监控软件代码,识别安全风险和质量问题。如果这些工具检测到异常,它们可以触发自动化工作流来解决问题。例如,这样的工具可以重启失败的服务,或调配更多资源以适应增加的用户需求。
与基于静态阈值的异常检测方法不同,AI 模型利用上下文和历史数据,在管道潜在故障发生前进行预测。预测功能使 DevOps 团队能够采取主动的应用管理方法,在宕机和中断发生前加以预防。
此外,ML 算法可以帮助团队优化持续测试流程。例如, 组织可以使用 ML 工具来识别和修复不稳定测试(即通过结果不可预测的测试),并通过分析代码变更、过往缺陷和用户行为来自动生成测试用例。 根据 IDC 的数据,超过 90% 的企业正在其软件测试实践中使用、试验或扩大使用 AI 和 ML 工具。
基础设施配置(涉及专业人员进行硬件设置、操作系统安装和网络配置)可能会造成瓶颈。开发者可以在几分钟内部署应用代码,但设置基础设施可能需要数小时或数天。
基础设施即代码 (IaC) 是“一种 DevOps 实践,通过使用配置文件而非手动流程来自动化 IT 基础架构的配置和管理”。由于 IaC 将基础设施视为软件,它使基础设施能够以软件开发的速度运行。
团队可以使用 IaC,通过应用与应用代码相同的模板和实践,对基础设施进行版本控制、测试和部署。实际上,基础设施和应用代码可以并行进行测试、验证和部署(而非使用互不相干的不同流程)。
开发者可以根据需要快速配置沙箱环境(安全、隔离的环境,团队可在其中测试和运行代码而不影响线上应用)和生产环境。QA 团队可以即时启动配置一致的测试环境。运维团队可以实现用户验收测试和安全测试的基础设施自动化。
当新代码通过测试时,应用及其基础设施可以一并部署,从而实现更快的功能交付和更频繁的部署。
GitOps 是一种现代化的运维框架,通过将面向开发者的编码实践(如拉取请求和代码审查)应用于基础设施运维和软件配置实践,帮助加速软件交付。
IaC 是 GitOps 的核心。IaC 通过代码定义和管理基础设施,并声明系统的期望状态。这些 IaC 配置通常存储在基于 Git 的平台(如 GitHub)上,由 Git 仓库作为存储和版本控制的单一可信信息源。在 CI/CD 管道中,自动化智能体持续检查仓库中的变更,并将配置应用到已部署的线上系统。
例如,如果 DevOps 团队想要部署一个新的微服务,他们会对 Git 配置文件进行必要的更改。部署工具将在更新合并到主代码分支之前进行审查和验证。然后,CI/CD 管道将更改应用到线上基础设施(例如 Kubernetes 集群或 Docker 容器),使部署的环境始终与仓库定义保持一致。
GitOps 使团队能够每天多次部署代码更新,并确信 Git 工具能快速检测和纠正任何偏差。因此,GitOps 可以帮助 DevOps 团队进一步减少人工干预,并最大限度地降低 CI/CD 管道的复杂性。
即使在 DevOps 环境中,许多软件开发人员仍然感到自己职责范围内的工作种类繁多、数量庞大,尤其是在需要他们完成手动、重复性任务时,更是应接不暇。超过四分之三的开发者至少花费 30% 的时间在这些繁琐的任务上。
无服务器计算是一种开发环境和执行模型,它将基础设施管理从开发者那里抽象出来。云服务提供商预置并管理所有服务器、后端基础设施组件和运行时环境,使开发者能够专注于应用代码。
无服务器平台支持事件驱动型工作流——代码提交或拉取请求可触发自动化构建、测试和部署步骤——从而进一步自动化 CI/CD 管道。
CI/CD 系统为组织提供了一系列优势,包括:
利用 AI 和自动化的强大功能,主动解决整个应用程序堆栈中的问题。
使用开发运维软件和工具,在多种设备和环境中构建、部署和管理云原生应用程序。
通过我们的云咨询服务持续实现应用现代化,加速业务敏捷性与增长——支持任意平台部署。