根据定义,DevOps 旨在转变软件开发 流程和组织文化,通过自动执行并 集成传统上各自为政的 开发和 IT 运营团队的工作,以更快速度交付更高质量的软件。
实际上,最出色的 DevOps 流程和文化超出了开发和运营的范畴,在软件开发生命周期中融入了所有应用程序利益相关方的建议 - 包括平台和基础架构工程、安全、合规、治理、风险管理、业务部门、最终用户和客户。
在
DevOps
框架中,持续集成位于软件开发过程的开始,每天至少检入代码一次,以确保本地副本不会游离于代码构建的主分支太远。 这可帮助您避免灾难性的合并冲突,从而破坏构建,使得团队需要花费数小时甚至数天才能解决问题。
持续集成是持续交付的测试、部署和发布阶段的先决条件。 整个开发团队可在几分钟内知道您是否创建了错误代码,因为持续集成服务会自动构建并测试代码变更以发现任何错误。
在 DevOps 周期中,持续交付和持续部署都紧跟在持续集成之后。
持续交付
(CD) 会在持续集成结束时接上,自动将应用交付给所选的基础架构环境。 CD 的重点是 将任何已验证的变更交付至代码库 - 包括更新、错误修订包甚至新的功能,以便尽可能快速安全地提供给用户。 它确保将代码变更自动推送到各种不同的环境(如开发、测试和生产)。
在
持续部署
中,应用的代码变更会自动进行测试并自动发布到生产环境中。 这种自动化由一系列预定义的测试驱动。 一旦新更新通过这些测试,系统会将更新直接推送到软件的用户。
敏捷方法是一种软件开发实践,旨在改进软件开发团队组织自身、适应需求中的变化以及发布软件的方式。 因为
持续集成(链接位于 IBM 外部
) 和
敏捷开发
有着许多相同的功能(例如测试自动化),因此同时讨论持续集成和敏捷方法非常有用。 敏捷方法将开发组织为较小的工作组,也称冲刺组。 当应用于 DevOps 时,这些组合实践有助于确保软件质量和项目灵活性。
持续集成需要频繁集成工作,通常每天多次。 可通过自动构建来验证集成,尽早检测集成错误。 构建过程中应运行多次测试,以此作为验证的一部分。 在自动化测试环境中将快速测试扩展到运行时测试,这样就自然形成持续交付。
敏捷方法(链接位于 IBM 外部)
也是迭代式的,能够灵活适应变更,因此它可以逐步扩展和发展解决方案。 在持续集成的背景下,敏捷软件开发基于您在持续集成时对功能价值划分的优先级,实施软件迭代。
流行的开源持续集成工具包括:
Jenkins:
Jenkins 是一种广泛使用的开源持续集成工具,支持开发人员在将代码落实到源存储库后立即自动构建、集成和测试代码,从而能够更轻松地捕获漏洞,更快地部署软件。 Jenkins 中包含 Docker 插件。
Buildbot:
Buildbot 可以自动执行软件开发周期的所有方面。 作为作业调度系统,它对作业进行排队,然后执行作业,并报告结果。
Go:
Go 之所以能够脱颖而出,是因为管道概念,这使得复杂的构建工作流程的建模变得容易。
Travis CI:
最"古老"和最值得信任的托管解决方案之一,也提供企业本地版本。
GitLab CI:
GitLab CI 是开源 Rails 项目的组成部分,它是免费的托管服务,提供详细的 git 存储库管理,具有访问控制、问题跟踪、代码评审等功能。
与开源工具进行持续集成可带来诸多好处,包括:
可获得数以百计的插件以支持项目
广泛支持开源语言,如 Python、
Java
和 JavaScript
免费提供,使学生、初创企业和开发人员能够获得功能强大的工具而不会带来财务负担
可定制,支持开发人员在 CI 工具的基础上进行构建以满足需求
能够修改和重新分发工具
可用于软件开发工作流程的开源持续集成工具包括 Jenkins、Go、Buildbot 和 Travis CI,可在下一部分阅读有关这些工具的信息。
持续集成服务器是一种软件工具,用于集中所有的持续集成操作,并为构建项目提供可靠、稳定的平台。 您可以配置和调整 CI 服务器,以便为不同平台构建不同的项目。 持续集成服务器可轻松建模和直观呈现复杂的工作流程(支持持续交付),并为构建持续交付管道提供直观界面。 持续集成服务器提供了以下功能:
一站式完成自动构建、测试和发布
随时部署任何版本
依序保留配置
支持插件以增强功能
监控项目的存储库
抽取变更,执行用户定义的任务,以成功落实变更
使用构建详细信息,向相关项目成员发送反馈
以下假设用例说明了两个软件开发人员如何使用持续集成来改进其 DevOps 流程。
两个开发人员必须相互通信,说明哪些功能有效以及这些功能如何工作。 这个小团队需要定期更新,并且必须能够整体集成并测试代码。 安排代码检入和测试花费了大量开发时间。 因此需要自动化的系统来执行持续集成。
协商何时进行组合与测试会耗费开发人员的大量时间。
他们须就以下问题达成共识:
何时开始测试代码集成
如何测试集成是否已成功
如何将结果传达给团队
持续集成平台对这些问题都有默认答案,并且大多数都支持配置和设置。
通常,类似 Jenkins 的 CI 平台在检入时开始集成测试。 检入新代码时,CI 系统运行一组测试,可包含单元测试和回归测试,然后确定是否成功集成了代码。
或者,如果使用的是编译语言,那么默认测试将确定代码是否编译成功。 如果失败,那么新代码将中断构建。 对于 Python 或 JavaScript 等语言,必须创建您自己的集成测试。
无论哪种方式,大多数 CI 系统都会记录集成尝试次数、成功率和其他指标。
测试的重要性
持续测试
在生成持续集成构建和包(也称为可安装实体或打包实体)时开始。 当打包实体投入生产环境后,持续测试停止。 每个步骤都端到端地涉及测试套件。
如果只有一个测试阶段,那么至少 30% 的持续集成工作涉及到测试。 实际上,持续集成活动中测试占到 50% 到 70%。 以前您必须手动完成测试。 而现在,您可以使用自动化测试 - 这是成功持续集成的关键。
作为自动测试持续集成的一部分,测试驱动的开发以迭代方式构建代码并一次测试一个用例,以确保测试覆盖率,提高代码质量并为持续交付奠定基础。 自动化测试会表明,新代码是否未能通过为应用的所有功能领域开发的一项或多项测试。 最佳实践要求开发人员在本地环境中运行全部或部分测试,这确保开发人员在新代码变更通过测试后才将源代码落实到版本控制中。 经验表明,有效的回归测试有助于避免以后发生令人不快的意外情况。
持续集成管道
持续集成管道以可重复的方式自动执行项目管道的各个阶段 - 例如,构建、测试和
部署
,可最大程度减少人工干预。 自动持续集成管道对于通过实施控制、建立检查点和提高速度以简化应用的开发、测试和部署至关重要。
持续集成最佳实践
持续集成过程是 DevOps 的关键组成部分,可帮助您将开发和运营团队统一到共享存储库中,以编码、测试、部署和支持软件。 以下是一些 CI 最佳实践,可帮助您取得成功:
维护单一源代码存储库: 使用源代码控制管理,以跟踪和控制用于构建产品的所有文件。 这个整合的代码库有助于简化分发,提高可视性。
自动执行构建: 涉及编译、链接以及用于生成构建工件的其他过程。 自我测试也应实现自动化。
使用每日主线落实: 强制要求开发人员落实他们对主开发流的变更,至少每天一次。 每个开发人员都必须验证其工作副本是否与主开发流一致。
在生产环境的克隆中测试: 使测试环境尽可能与最终的生产环境相似。
自动执行部署: 实施多个环境(开发、集成和生产),以运行构建和测试。