什么是持续整合?

高速公路交汇处

作者

Chrystal R. China

Staff Writer, Automation & ITOps

IBM Think

Michael Goodwin

Staff Editor, Automation & ITOps

IBM Think

什么是持续集成?

持续集成 (CI) 是一种软件开发实践,开发人员在整个开发周期中会定期将新的代码和代码变更集成到中央代码存储库中。它是 DevOps 和敏捷方法的关键组成部分。

持续集成是 CI/CD 管道的第一部分,是一种自动化的 DevOps 工作流,可简化软件交付流程。持续集成可支持 DevOps 团队不断改进其应用程序、获得一致的反馈、在影响性能之前发现并修复错误,并按更可预测的交付时间表交付更高质量的软件。

持续集成的工作原理:简要概述

当开发人员将代码更改提交到版本控制系统的主分支或共享分支时,该操作会触发 CI 工具以执行更新代码库的“构建”。CI 系统会抓取新代码,将其与现有代码进行编译,并与任何依赖项(如配置文件、库或其他资源)一起打包,由此构成“构建”。

在生成“构建产物”(即传递至后续测试或生产环境的最终文件)前,需运行自动化测试以验证本次构建。此管道中的下一阶段称为“持续交付”。

持续集成为什么很重要?

CI 为解决与传统软件开发(即集成和部署流程)相关的挑战而创建。在传统开发范式中,每个开发人员均负责手动将新代码集成到应用程序或服务的新迭代中,从而致使整合流程耗时且容易出错,对于大型开发团队而言更是如此。

不同的代码片段并不总能良好地协同工作,且开发人员会在不同的时间线集成其更改(有时甚至是在最后一刻),因此有关集成问题的反馈常会出现延迟。当问题出现时,反馈延迟使得团队更难弄清是哪个变化导致了问题,令调试过程更加艰巨。

此外,软件测试很少进行。团队通常会一次性实施大量的批量更新,这就导致漏掉错误并使其在代码库中累积。因此,开发团队遇到了更具挑战性的故障排除任务、更高的故障率和更慢的代码发布速度;企业因流程效率低下而损失了收入;用户发现了更多的软件错误和故障。

持续整合作为现代 DevOps 实践、持续整合/持续部署 (CI/CD) 管道微服务架构的基础,可通过提供有关整合性能的快速反馈来帮助简化构建流程。

对于 CI 系统,新代码会添加到中央存储库(通常每天会进行多次)中,并在此驻留以便进行构建和测试。如果系统检测到错误,便会发出通知、更正相关代码并确认更新后的代码正确无误,然后再将其与软件代码库完全合并。

辅以专家洞察分析的最新科技新闻

通过 Think 时事通讯,了解有关 AI、自动化、数据等方面最重要且最有趣的行业趋势。请参阅 IBM 隐私声明

谢谢!您已订阅。

您的订阅将以英语提供。您会在每份时事通讯中找到一个取消订阅链接。您可以在此管理您的订阅或取消订阅。更多相关信息,请参阅我们的《IBM 隐私声明》。

CI 关键组件和流程

虽然持续整合系统的确切配置会因团队和企业而异,但每个 CI 系统均会使用某些组件和流程来优化集成任务。

中央源代码库

CI 始于一个中央共享存储库,而所有开发人员均会在此处提交代码。中央存储库是 CI 实践的基石。Git 和 Bitbucket 等版本控制系统 (VCS) 通常管理这些存储库。当开发人员提交更改时,中央存储库会对其进行跟踪,以便创建完整的代码更改历史记录,而开发团队可使用该记录来更有效地开展协作。

存储库还使用分支技术,创建单独的开发线,将正在进行的代码更改与主代码库(主分支)隔离,并促进并行开发。分支可支持开发人员构建功能分支(用于隔离特定的应用程序功能)和短期分支,以在将工作合并回主代码分支之前将其分离。

例如,Gitflow 是一种基于 Git 的分支模型,它将角色(例如“主要”、“功能”、“开发”和“发布”)分配给不同的分支,以管理它们之间的交互方式。Gitflow 分支要求开发人员创建功能分支,并等到功能完成后再将代码更改合并到主分支中。

持续整合服务器

CI 服务器是集中和管理所有 CI 运营的工具。它们是 CI 流程的自动化中心。CI 服务器监控存储库中的代码更改,并在检测到更改时启动并驱动预定义的 CI 管道。CI 服务器运行自动构建、测试和软件发布;协调版本控制协议;处理状态报告;支持可以增强系统功能的插件

许多 CI 服务器均具有用户界面,可帮助团队建模和可视化工作流,并构建持续交付 (CD) 管道。

代码集成

CI 系统鼓励开发人员每天多次提交代码更改,从而优先考虑对特定任务或功能进行小规模、有针对性的更改。CI 工具使团队能够在合并新代码之前启动代码评论并讨论问题,以便在开发过程中尽早发现错误。

例如,基于 Git 的 CI 系统可以启动拉取请求,从本地分支(存储在单个开发人员计算机的本地)获取代码更改,并将其集成到当前远程分支(存储并由整个开发团队共享)。合并请求可支持开发人员将本地分支中提出的更改与另一个本地分支集成在一起,以供团队评论、讨论和批准,然后再将其与远程分支合并。

构建自动化

持续集成服务器和工具(包括流行的开源工具,例如 Jenkins、CircleCI、GitHub、AWS CodePipeline 和 GitLab CI)监控中央存储库中是否出现代码变更。检测到新更改时,CI 服务器会触发构建流程并执行预定义工作流和构建脚本,从而编译并打包此代码,以便为测试和最终部署进行准备。

自动化测试

CI 工具会运行一系列测试,以便在代码与代码库合并之前对其进行验证。单元测试可验证各个组件或功能,从而提供有关代码行为的即时反馈。集成测试可评估软件组件与模块之间的交互,以确保它们能正确协同工作,并发现单元测试可能会遗漏的所有问题。

在某些 CI 工作流程中,端到端测试会通过模拟用户交互来验证软件,以便从用户的角度验证该软件的行为是否正确。此外,团队还可运行代码质量测试和静态分析,以检查应用程序在负载情况下的响应度和稳定性,以及识别违反编码标准的行为和安全漏洞。

反馈机制和工件管理

如果构建或测试失败,CI 服务器则会立即通知开发人员。出现故障时,开发人员可以优先修复相关代码,以帮助确保主分支仍可部署。

如果软件构建成功,服务器将生成工件(在构建过程中创建的文件,例如编译的代码、Docker 镜像和库),这些文件将受到版本控制并存储在存储库中,以供将来进行测试和部署。无论结果如何,顶尖 CI 系统均会记录集成尝试、成功率和其他指标,以确保团队成员始终能访问全面的版本文档。

IBM DevOps

什么是 DevOps?

Andrea Crawford 阐述了什么是开发运维、开发运维的价值,以及开发运维实践和工具如何帮助您完成从应用程序构思到生产的整个软件交付管道。本课程由 IBM 资深思想领袖主导,旨在帮助企业领导者获得所需的知识,以优先考虑能够推动增长的 AI 投资。

在 CI 中测试代码的重要性

测试是持续集成流程的重要组成部分。测试至少会占 CI 活动的三分之一左右;但仅当团队运行单个测试阶段时,情况才是如此。通常,测试活动会构成 CI 工具的大部分工作量。

当开发人员将新代码提交到代码库时,CI 环境中的持续测试就开始了。此操作会触发构建和自动测试流程。在许多情况下,创建构建工件(在代码进入生产环境之前)后,就会执行额外的测试。开发人员必须在本地环境中运行所有测试(和测试子集),以确保他们仅在新代码更改通过测试后才将源代码提交到版本控制环节。

这种对各种功能、用例和集成的多方面测试统称为测试套件。这种方法可以最大限度地提高测试覆盖率、防止代码退化,为成功的持续交付打下基础。

测试驱动开发 (TDD) 是另一种软件开发方法。TDD 是一种开发人员“逆向工作”方法,即在编写任何代码之前编写测试。借助此方法,开发人员可编写失败的单元级测试用例,然后再编写最低数量的代码以确保通过测试。完成此操作后,即可重构并优化测试和生产代码。

这种方法可以帮助开发人员专注于明确定义的需求并避开无关的代码。它还强调持续反馈,是加快开发周期的成功技术。

DevOps 领域的持续集成

DevOps 管道可通过自动完成并整合过往存在于各自孤岛中的开发与 IT 运营团队的工作来加快高质量软件的交付。

成功的 DevOps 流程和文化不仅限于开发和运营,还包括平台和基础设施工程、安全性、合规性、治理风险管理、业务线、最终用户和客户。换言之,优秀的 DevOps 应将所有应用程序利益相关者的意见全部纳入软件开发生命周期。

在 DevOps 框架中,持续集成处于软件开发流程和 CI/CD 管道的起始位置。CI 使开发人员能够经常检查代码,以防止本地副本偏离代码构建的主分支太远。此方法有助于团队避免出现合并冲突,而这些冲突可能会在交付与部署阶段“破坏”构建。

CI 还使开发人员能够提交小规模且频繁的更新,从而促进快速、持续的反馈循环以及基于客户需求的优先级的持续改进,这是 DevOps 理念的关键原则。

CI 与持续交付和持续部署

持续集成是 CI/CD 流程的第一站,且通常后接持续交付与持续部署流程。持续集成是指频繁的代码合并以及随后的构建和单元测试。

持续交付 (CD) 会从持续整合结束的位置开始,从而自动将经验证的代码库更改(包括更新、错误修复甚至新功能)交付到选定的环境与代码存储库。DevOps 团队会收到有关最新构建的通知,并将更新手动移入实时生产环境。持续交付管道阶段的目标是以最小的工作量部署新代码,但在代码上线之前仍然允许进行一定程度的人工监督。

持续部署在通过一系列预定义测试后自动将代码更改发布给最终用户,例如在模仿环境中测试代码的集成测试,以帮助确保代码完整性。持续交付和持续部署都会处理比 CI 更进一步的自动化,并且通常可以互换使用。

持续交付和持续部署之间的区别在于软件或应用程序发布所使用的自动化程度。在持续交付中,代码会自动移动到类似生产的环境中,以进行进一步的测试和质量保证,例如评估风险和识别源代码漏洞。测试成功后,需要人工干预才能移动到生产环境。

在持续部署中,自动化走得更远。一旦代码通过测试,就会自动部署到生产中,无需人工审批。1

持续集成和敏捷开发

敏捷开发是一种软件工程的迭代方法,优先考虑灵活性、协作性、持续改进和快速适应变化的能力。这种实践可将开发团队划分成更小的工作组(或“冲刺”),以简化开发人员和利益相关者之间的协作流程并加速软件交付。

同样,CI 要求执行频繁的增量代码更新和持续的代码验证。这种迭代开发方法可支持开发人员随着时间的推移快速升级和扩展软件解决方案,从而加速向用户提供高质量的产品。因此,持续整合在本质上属于敏捷实践。

持续集成策略

持续集成有助于开发团队更快地迭代并向用户提供更好的软件,但企业可以采取其他步骤来优化流程。常用的 CI 实践包括:

维护单个源代码库

合并后的集中代码库可简化分发和可见性。很多组织使用源代码控制管理来维护单个存储库,而该存储库可用于跟踪并控制与产品构建相关的所有文件。

使用每日主线提交

组织可通过要求开发人员每天至少一次将其更改提交到主开发流来营造一种一致性文,以验证其工作副本是否一致。

保持快速、高效的构建流程

优化构建脚本、并行执行任务和使用缓存机制可缩短构建时间。团队还可以配置 CI 管道,以便在迭代流程的早期审查新集成。这种主动方法可支持开发人员快速解决问题并缩短调试时间。

在克隆的生产环境中进行测试

创建与最终生产环境尽可能相似的测试环境,有助于确保测试结果准确呈现软件在现实环境下的执行情况。

依靠功能标志

通过实施功能标志来控制新功能的发布,CI 系统可将不完整或实验性的功能合并到主分支中,而不会影响整体生产。

频繁审查 CI 管道

经常审查和更新 CI 管道以纳入新的工具、技术和最佳实践有助于 DevOps 团队强化管道,并根据项目需求的变化更新开发实践。

实施测试驱动开发

使用 TDD,在实现任何功能代码之前编写测试。开发团队和产品团队合作制定产品规范大纲,将要求转化为代码断言检查清单,开发人员编写满足测试要求的代码。TTD 方法使团队能够主动将高质量的可靠代码变更集成到 CI 管道中。

持续集成的趋势

持续集成实践(以及更广泛的DevOps 框架)可帮助企业简化协作和集成并维护交付管道。此类实践可以提高软件质量,并加快软件发布进程。现代 CI 工具集成了一系列新兴技术,可强化这些实践并提高其价值。

例如,在持续整合过程中使用人工智能 (AI)机器学习 (ML) 正成为标准开发实践。AI 驱动的工具可以帮助开发人员创建自我修复系统,在其影响主开发流之前自动自主识别并纠正存在问题的代码。ML 驱动的 CI 系统还可以根据代码提交和修改自动生成定制化测试用例,从而减少开发人员手动创建代码测试的时间。

随着网络威胁日益复杂2,开发人员逐步将安全实践直接融入软件开发流程。这些“左移”安全战略将安全检查引入开发的早期阶段(包括 CI 流程),以确保人员能够在编码期间而非部署之后及时发现漏洞。

现在,Kubernetes 以及更广泛的容器相关技术生态系统,构成了现代 IT 环境的构建块。DevSecOps 将安全性集成到 DevOps 的每个阶段,以应对此类动态生态系统所带来的安全挑战。

容器是软件的可执行单元,它将应用程序代码与其库和依赖项打包在一起,以便代码可以在任何计算环境中运行。Kubernetes 也称为 k8s 或 kube,是一个开源容器编排平台,用于调度和自动执行容器化应用程序的部署、管理和扩展。

传统上,DevOps 团队依靠单独的安全团队来识别漏洞,然后利用反馈在下一轮应用程序更新中实施代码更改。现在,开发人员应保护容器和 Kubernetes 集群,并在其整个软件应用程序和开发过程中应用零信任原则,这反映出新的操作范式。3采用 DevSecOps 实践意味着编码和软件开发不再只是构建功能,还要预测风险。

无服务器架构计算和云原生架构也是当今 DevOps 团队的优先事项。

无服务器计算是一种应用程序开发和执行模型,支持开发人员构建和运行应用程序代码,而无需配置或管理服务器或后端基础设施。无服务器架构中的服务器确实存在,但其完全由云服务提供商 (CSP) 管理。在 CI 管道中,无服务器平台将开发人员从后端基础设施工作中解放出来,使其能够专注于前端编码和业务逻辑。

随着无服务器架构计算和 AI 应用程序的激增,事件驱动架构 (EDA) 在帮助团队应对日益复杂的云计算方面发挥着核心作用。EDA 支持松散耦合的前端系统和后端系统之间的实时通信,使各系统能够独立工作并异步处理事件(系统内发生的任何更改或操作)。

在 CI 管道中,这意味着开发人员可以在不影响整个应用程序的情况下扩展单个组件,有助于团队创建更敏捷、响应更快、可扩展的代码库和集成流程。

持续整合的优点

设置强大的 CI 管道需要进行仔细规划和配置,包括选择适当的工具、定义构建和测试工作流以及配置基础设施。CI 管道还需进行定期维护,以适应代码库、依赖项(例如 API)和基础设施的变化。

但是,实施 CI 可为软件开发团队提供一系列好处,其中包括:

更早、更有效地检测错误

CI 流程有助于团队及早解决错误 — 有时是在代码提交后的几分钟内。

改善团队协作

团队中的每个成员均可更改代码、整合代码更改并识别代码不兼容问题和集成错误,从而简化知识共享并通过同行反馈来提高代码和软件的质量。

加快软件开发

由于新代码会持续进行整合,因此团队在整合和测试大批量代码上所花费的时间更少。CI 工具提供的加速反馈回路可帮助开发人员更快地进行迭代,并向最终用户加速交付软件更新和新产品。

降低开发流程中的风险

频繁提交代码意味着规模更小、更具增量性质的更改,而这些更改也更容易理解、审查和测试。此举可降低在开发过程中将重大问题引入代码库的风险。

相关解决方案
IBM DevOps Accelerate

实现本地、云端或大型机上任何应用程序的自动化软件交付

深入了解 DevOps Accelerate
DevOps 解决方案

使用开发运维软件和工具,在多种设备和环境中构建、部署和管理云原生应用程序。

深入了解开发运维解决方案
云咨询服务

利用 IBM 的云咨询服务发掘新功能并提升业务敏捷性。了解如何通过混合云战略和专家合作共同制定解决方案、加快数字化转型并优化性能。

云服务
采取后续步骤

通过持续集成和交付,释放 DevOps 的潜力,来构建、测试和部署安全的云原生应用程序。

探索 DevOps 解决方案 探索 DevOps 的实际应用