将手动元素融入 CI/CD 工作流
我们已经看到,手动过程不仅在我们的整体工作流程中很重要,而且对于某些事情来说,它们是不可替代的。但手动步骤如何适应高度自动化的工作流程呢?这是我们在这一部分要解决的挑战。
将手动过程集成到自动化的 CI/CD 流水线中可能会很困难。这两种方法在活动的线性、可重复序列方面并不是天然的合作伙伴。我们采取的方法取决于我们的最终目标。我们是想要一个完全自动化的持续部署系统,还是可以接受一些手动中断?
将手动过程纳入的最简单方法是在适当的时候停止自动化,开始手动过程,然后在手动过程完成后恢复自动化。我们可以将其视为阻塞工作流,因为流水线中的所有后续自动化步骤都必须停止,直到手动工作完成。如下图所示:

通过将我们的开发过程组织为一系列阶段,其中一些是自动化的,一些是手动的,我们创建了一个简单的阻塞工作流。这里的阻塞意味着价值流被每个阶段阻塞。自动化阶段通常比手动阶段运行得更快。
这种工作流有一些优势,因为它简单易懂且易于操作。我们交付的每个软件迭代都将运行所有自动化测试以及所有当前的手动过程。从某种意义上说,这个版本是我们当时知道如何制作的最高质量的版本。缺点是每个迭代必须等待所有手动过程完成:

实现非常顺畅的双轨工作流的一个推动因素是使用单一的主干作为整个代码库。所有开发者都提交到这个主干。没有其他分支。任何正在开发的功能都通过功能标志进行隔离。这些是可以在运行时设置为 true
或 false
的布尔值。代码检查这些标志并决定是否运行某个功能。手动测试可以在不暂停部署的情况下进行。在测试期间,正在开发的功能通过相关的功能标志启用。对于一般最终用户,正在开发的功能被禁用。
我们可以选择最适合我们交付目标的方法。阻塞工作流以减少返工为代价,换取更长的交付周期。双轨方法允许更频繁的功能交付,但存在在手动过程发现之前在生产环境中出现缺陷的风险,随后进行修复。
选择正确的过程涉及功能发布节奏和容忍缺陷之间的权衡。无论我们选择什么,目标都是集中整个团队的专业知识,以创建缺陷率低的软件。
平衡自动化工作流与手动、人类工作流并不容易,但它确实能将最多的人类直觉和经验融入产品中。这对我们的开发团队有好处,对我们的用户也有好处。他们受益于应用程序的易用性和鲁棒性的提高。
希望本章向您展示了我们如何将这两个世界结合起来,跨越传统的开发者-测试者之间的鸿沟。我们可以组成一个伟大的团队,朝着一个优秀的结果努力。