持续集成、交付和部署 (CI/CD) 均为 DevOps 做法。 换句话说,它们就是将 DevOps 理念付诸实践的技术。 如果您对这个词并不熟悉,您可能会想:DevOps 到底是什么? 它与敏捷软件开发有什么关系? 了解软件开发做法演变的大背景以及敏捷和 DevOps 试图解决的问题,可以帮助您从 CI/CD 流程获得更多收益。
经历过数字革命,软件和 IT 已经从许多组织(软件发行商除外)的单纯支持部门转变为业务领域不可或缺的一部分。
从银行金融到零售,从政府到旅游娱乐,软件开发正在成为许多组织的工作核心。 应用和在线服务为产品和服务提供访问和支持,内部计算机系统则是业务顺利运行的基石。
2001 年,随着这一趋势开始加速,一群软件开发者起草了敏捷宣言。 这些开发者以此对当时软件开发中的一些问题做出回应。 该宣言为开发软件提供了一套价值观和原则,并催生了各种框架(Scrum 是最著名的框架之一)将之付诸实践。
在敏捷的认识中,重点应该是交付可运行的软件,而有效的沟通和协作是实现这一目标的核心。 敏捷方法欢迎不断变化的需求,针对当时瀑布式项目的冗长时间尺度而开发。在过去的情况中,软件通常在需求被锁定数年后才会交付,而此时用户的需求和上下文可能已经发生了重大变化。
敏捷框架和方法以迭代工作为中心,定期交付小块有效软件,收集反馈并进行调整。 这与设计、开发、测试和发布等不同线性阶段的瀑布式工作方法有很大不同。
开发团队虽然采用敏捷原则改变软件开发,但在此过程中往往很少与下游团队合作。
负责管理基础架构和处理软件部署的运营团队常以完全不同的方式工作,并有效地使用与编写代码者不同的语言。
尽管开发者在自己的团队中可能工作效率更高,但一旦构建被移交给运营部门部署到暂存,过程中往往就会遇到瓶颈。 缺少依赖项、环境配置问题以及无法在开发者本地机器上复制的错误会导致团队之间无休止的无效交流,并在哪一方负责修正问题上产生分歧。
这往往与瀑布式发布策略相结合。尽管更改通过开发增量交付,但后续步骤将更改批量化为大型、不频繁的发布,从而消除从用户获得快速反馈的机会。
结合“开发”和“运营”,“DevOps”一词强调整合两个团队的活动以交付有效软件。 也就是说,范围不仅限于这些部门。所有参与软件开发和交付的人员都需要一致推进向用户交付有效软件的共同目标。
DevOps 的核心是创造一种共担责任、相互信任和开放沟通的文化。 对于开发团队来说,在本地构建能够运行不足以表明工作已经完成。 为了交付可用于生产的代码,开发者需要代码和发布间步骤的可见性。 这意味着打破孤岛并与质量保证、安全和基础架构团队合作,以了解其在流程中的作用。
虽然手动流程可以让团队间的合作更加紧密,但使用工具将尽可能多的工作自动化可以带来更高效率。 构建、测试和部署步骤自动化可使工作得以更快完成,这也意味着可以更快得出这些阶段的结果。 自动化是 DevOps 方法的核心,能够实现紧密的反馈循环,这对于提高质量和消除浪费至关重要。
DevOps 出现在精益制造原则开始应用于软件开发的时候。 精益的重点是通过优化流程中的每个阶段、提高质量并营造尊重的氛围来消除浪费。
DevOps 融合了大部分这种思想,并优化端到端流程,通过紧密反馈循环对正在构建的内容尽早提供反馈,提高软件开发效率。
这涉及更早地进行下游开发活动,并在发现问题后立即解决。无论是失败的测试、安全漏洞还是构建问题。
由于每个人都要分担向用户交付软件的责任,“在我的机器上能用”的陈旧回应已经不再适用。 使用 DevOps 方法,开发者可以更清楚地了解软件的使用方式和出现的挑战,从而更好地修正这些问题。
采用 DevOps 将敏捷的好处扩展到开发团队之外。 适应开发者的节奏并以较小的规模工作,可以更容易地发现和隔离问题,因为只有较少的变量在发挥作用。 同样,及时生成反馈可以避免在后续将弃置的测试和暂存构建上浪费精力。 反过来,这也将确保整个组织获得以较小增量工作的全部效益。
构建自动化 CI/CD 管道将这些 DevOps 理念付诸实践。
频繁提交的持续集成做法鼓励可以快速通过管道的小批量。 自动化的构建和测试系统可以比手动过程更快验证更改并提供反馈。
作为开发者,获得刚编写内容的快速反馈也非常有效,因为您不太可能失去更改的背景,您能够以“流程”形式保持精益。 频繁的自动化测试还有助于提高质量,因为尽早捕获和修正错误可以避免在其上构建其他代码。
自动部署到预生产服务器可使流程一致而可靠,提供机会进一步利用暂存环境进行测试和反馈。 频繁将小的更改部署到生产中,而不是批量化为不频繁的大型发布,可以降低在实际环境中出现问题的风险,因为能够组合为意外后果的变量较少。
如果出现错误,由于批量较小,隔离和修正也可更快完成。 增量发布更新意味着经常为用户提供价值,并且,您可以使用更改反馈调整待构建内容,进一步改进产品。
CI/CD 和 DevOps 更普遍的目标是在不影响质量的情况下加快向用户交付有价值软件的过程。 DevOps 原则与敏捷和精益理念有所重叠且互相补充。 着眼于整个软件开发历程并优化每个阶段,您可以更快地交付并更快地获得反馈,实现持续开发和改进的良性循环。