前言
在本节中,我们将探讨持续集成和持续部署,简称CI/CD。CI/CD有助于自动化从初始代码提交到部署的软件开发过程。它消除了传统上将代码交付到生产环境所需的大部分人工干预。
CI/CD过程构建、测试代码并将其部署到生产环境。其承诺是,它使软件团队能够更快地部署质量更好的软件。这一切听起来都很好,但它在现实生活中有效吗?让我们将CI/CD分解为各个部分,并分别进行讨论。
持续集成(CI)
持续集成(CI)是一种开发实践,许多人认为他们在工作中使用了这种实践,但他们并没有完全理解。
在CI出现之前,开发团队通常各自为政,单个开发人员在很长一段时间内独立开发不同的功能。他们的工作最终需要合并到一个共享的代码库中,这通常会导致数百个文件和贡献者之间的合并冲突和兼容性问题等复杂问题。这种困境,通常被称为“合并地狱”,代表了传统开发方法面临的困难。
避免“合并地狱”
让我们考虑一个有两个开发人员Alice和Bob的场景。Alice编写她的代码,并在她有一个不会引起任何问题的功能版本后立即分享,即使它没有完全完成。她将代码上传到中央存储库。Bob遵循同样的方法,在开始工作之前总是获取最新版本的代码。当Alice继续更新她的代码时,Bob也会这样做。如果Bob进行了更改,Alice会毫无问题地将其纳入她的工作中。他们合作顺利,相互干扰的可能性很低,因为他们总是使用最新的代码。如果他们遇到冲突,通常是因为他们最近都做了更改,所以他们可以坐下来解决问题,然后继续前进。
然而,由于有这么多人不断贡献代码,问题不可避免。事情可能并不总是顺利进行,可能会出现新的错误。那么,解决方案是什么呢?
自动化
解决方案是自动化。它就像一个警惕的看门狗,不断监控代码。每当发生更改时,它都会立即采取行动,获取代码,构建代码并运行测试。如果在此过程中出现任何故障,团队会收到警报,确保每个人都知道这个问题。有了这个安全网,持续整合就成为现实。
那么,什么是持续集成(CI)呢?
定义
持续集成涉及自动化构建、执行测试以及将单个开发人员的代码合并到共享存储库中。持续集成的主要目标是有效地将源代码集成到共享存储库中。一旦更改提交到版本控制系统,就会执行自动构建和测试用例,以确保代码的功能性和有效性。这些过程验证源代码的编译方式以及测试用例在执行过程中的执行方式。
工具
CI中常用的工具有哪些?一个强大的源代码管理系统是基础。GitHub就是一个很好的例子。它包含构建软件所需的一切,包括源代码、测试脚本和构建软件应用程序的脚本。
有许多工具可用于管理CI流程本身。GitHub Actions和Buildkite是现代的例子,而Jenkins、CircleCI和TravisCI也被广泛使用。这些工具管理CI中的构建和测试任务。
存在许多用于编写和运行测试的测试工具。这些工具通常是特定于语言和生态系统的。例如,在Javascript中,Jest是一个单元测试框架,而Playwright和Cypress是web应用程序的常见集成测试框架。
构建工具更加多样化,并且具有生态系统特定性。Gradle是一个强大的Java构建工具。Javascript构建生态系统是分散的,难以跟踪。Webpack是标准的,但许多新的构建工具声称要快得多,尽管它们还没有Webpack那么可扩展。
持续集成的好处
持续集成具有重要意义,原因有几个。下表显示了CI的一些主要优势。
持续部署(CD)
持续部署(CD)是CI/CD管道中CI之后的下一步。CD是自动部署通过自动化测试阶段到生产的每一个代码更改的做法。
虽然真正的持续部署具有挑战性,而且没有CI那样被广泛采用,但更常见的做法是持续交付,这与CI相似,但有细微的区别,如下所述。
持续交付
持续交付侧重于将代码更改快速部署到生产环境中。它的根源可以追溯到敏捷宣言,该宣言强调“尽早和持续交付有价值的软件”以满足客户的需求。
持续交付的目标是有效地将有价值的代码更改转换为生产。第一步是通过构建过程将代码转换为可部署的软件。一旦软件准备就绪,下一个合乎逻辑的步骤似乎是将其直接部署到生产中。然而,真正的实践涉及严格的测试,以确保只有稳定的软件才能进入生产环境。
通常,组织会维护多个测试环境,如“QA”、“Performance”或“Staging”。这些环境是在软件进入生产之前对其进行验证的检查点。该软件在每个环境中都经过测试,以确保其部署就绪。
本质上,持续交付的生产之旅涉及在部署到生产环境之前,通过各种测试环境转换软件。
持续交付的一个关键方面是确保代码始终保持可部署性。一旦交付过程完成,代码就可以部署到任何所需的环境中。这个端到端的过程包括构建源代码、执行测试用例、生成WAR或JAR文件等工件,并将其交付到特定环境。
自动部署
回到持续部署(CD),它涉及将代码更改自动部署到生产环境。从本质上讲,CD代表了开发管道的最后阶段。在此阶段,不仅准备工件并执行测试用例,而且该过程还进一步扩展到将工件部署到生产环境。持续部署确保对代码所做的任何更改都能在没有人为干预的情况下迅速部署到生产环境中。
持续部署与持续交付
持续部署和持续交付是相关的概念,但它们有明显的区别。在这里,我们列出了一些差异:
虽然持续部署可能适合某些组织,但持续交付是许多组织努力实现的方法,因为它提供了一种谨慎但自动化的软件交付方法。
工具
我们之前提到的工具,如GitHub Actions、Buildkite和Jenkins,通常用于处理CD任务。特定于基础架构的工具也使CD更易于维护。例如,ArgoCD在Kubernetes上很受欢迎。
CI/CD是一种强大的软件开发实践,可以帮助团队更快地交付质量更好的软件。然而,它不是一个一刀切的解决方案,其实现可能因系统的复杂性而异。
持续部署的好处
持续部署为组织带来了许多好处。在这里,我们列出其中的一些。
部署策略
没有什么比看到我们的代码向数百万用户上线更令人满意的了。看到它总是令人兴奋。但到达那里并不总是那么容易。让我们探讨一些常见的部署策略。
大爆炸式部署
将更改部署到生产中的最早方法之一是Big Bang Deployment。想象一下,就像撕下绷带一样。我们一次推送所有更改,导致一些停机时间,因为我们必须关闭旧系统才能打开新系统。停机时间通常很短,但要小心——如果事情没有按计划进行,可能会很痛苦。准备和测试是关键。如果出现问题,我们将回滚到以前的版本。然而,倒退并不总是无痛的。我们可能仍然会扰乱用户,并且可能会对数据产生影响。我们需要一个可靠的回滚计划。