部署到生产中不一定是一个痛苦的事件。通过现代 CI/CD(持续集成和持续交付)实践,团队每天可以充满信心地进行数十次部署。但达到这种成熟度需要的不仅仅是配置工具,还需要深刻的文化变革和完善的流程。
CI/CD 的真正含义是什么
当我们谈论 CI/CD 时,我们实际上谈论的是构成现代软件开发支柱的三个相互关联的概念。
持续集成是每天多次将代码合并到主存储库中的做法。每次合并都会触发一系列自动检查,以确保没有任何问题。这解决了经典的“它可以在我的机器上运行”问题 - 如果它可以在标准化环境中运行的[自动化测试0]上运行,我们就更有信心它可以在生产中运行。
持续交付更进一步,确保您的代码始终处于可部署状态。这意味着您可以随时按下按钮并将当前版本投入生产。这并不意味着你一定会这么做,但能力是有的。这就像拥有一辆始终加满油并随时准备出发的汽车 - 您今天可能不会出行,但如果您需要的话,您已经准备好了。
持续部署是最后一步,每个批准的更改都会自动投入生产,无需人工干预。这是最先进的水平,并非所有组织都需要或想要达到这一水平,特别是在高度监管的行业中。
为什么投资 CI/CD
实施良好的 CI/CD 管道给团队带来的转变是深刻且多方面的。我们谈论的不仅仅是速度,尽管速度很重要。我们谈论的是团队工作方式和软件思维方式的根本转变。
首先,存在信任问题。当您对每次更改运行强大的自动化测试时,当您自动进行安全和质量检查时,当您在有问题的代码接近生产之前看到构建失败时 - 您晚上会睡得更好。部署不再是周五晚上的压力事件,而是成为例行公事,这是您工作流程中自然而然要做的事情。
速度是另一个明显的好处,但并不像许多人想象的那样。这不仅仅是为了更快地部署,而是为了缩短产生想法和在生产中看到它之间的时间,并收集用户的真实反馈。这个简短的反馈循环对于产品开发来说是纯金。与陷入每月发布周期的团队相比,您可以更快地进行实验、学习和迭代。
质量得到改善,因为问题可以在修复成本低廉的情况下及早发现。在代码审查或[自动化测试2]中发现的错误只需几分钱。用户在生产中发现的相同错误可能会在工程时间、客户支持和声誉方面造成数千美元的损失。 CI/CD 将问题检测移至开发周期的左侧,这样解决起来更容易且成本更低。
动态文档还有一个不太明显的好处。 CI/CD 管道本质上是关于如何构建、测试和部署应用程序的可执行文档。新的团队成员可以查看管道并准确了解发生了什么。被遗忘的维基上没有过时的文档 - 管道就是事实。
有效管道的支柱
构建真正提供价值的 CI/CD 管道需要仔细考虑每个阶段。这不仅仅是将随机工具放在一起并希望得到最好的结果。让我们分解每个基本组成部分。
构建和编译
管道的第一阶段是将源代码转换为可部署的工件。这听起来很简单,但有一些重要的细微差别。您的构建必须是确定性的 - 使用相同的输入运行,它必须产生完全相同的输出。这意味着仔细管理依赖项、固定版本、使用锁定文件。
构建还必须快。如果需要 30 分钟,开发人员不会在本地运行构建。投资于积极的依赖项缓存、尽可能的增量构建以及独立任务的并行化。需要 2-3 分钟的构建是可以接受的。需要 15 分钟的时间将被绕过。
再现性至关重要。您应该能够构建任何旧的提交并获得相同的结果。这意味着您的管道不能依赖于可以更改的外部状态 - 它需要的所有内容都必须进行版本控制或显式指定。
自动化测试
测试是 CI/CD 的核心。如果没有可靠的测试,您基本上就是在盲目部署并希望它能成功。但并非所有测试都是一样的,组织测试套件的方式会产生巨大的差异。
单元测试是您的第一道防线。它们必须快速(毫秒)、隔离(一次测试一个代码单元)并且
许多(数千个)。理想情况下,在提交之前在本地运行。它们的编写和维护成本都很低,并且可以捕获最基本的逻辑错误。
集成测试验证系统的不同部分是否可以很好地协同工作。它们比单一的慢,但它们仍然应该在几秒钟或几分钟内运行。他们测试诸如“当我将用户保存到[数据库3]时,我可以正确检索它吗?”之类的事情。或“当我向 API 发出请求时,我是否收到预期的响应?”。
端到端测试模拟真实用户与您的系统交互。它们是最慢、最脆弱的,但也是最接近用户实际使用应用程序的方式。谨慎使用它们 - 专注于关键业务流程,例如购买结帐、帐户创建、核心功能。
关键是测试金字塔:底部有大量的单元测试,中间的集成测试较少,顶部的E2E测试很少。扭转这一局面的团队(许多是 E2E,少数是单一团队)会遭遇缓慢且脆弱的构建。
代码分析
静态代码分析工具是寻找人类容易错过的问题的额外眼睛。 Linters 检查代码风格和标准。安全分析器寻找依赖项中的已知漏洞。当功能变得难以维护时,复杂性分析器会向您发出警报。
重要的是不要把它变成噪音。仔细配置您的工具 - 太多误报警告,团队将开始忽略它们。将警告视为 CI 中的错误 - 如果管道通过,则代码应该是干净的。不,“让我们稍后修复这 50 个警告”。
安全分析
安全不能是事后才想到的。您的管道应包括扫描依赖项中的漏洞、分析意外提交的机密、检查不安全的配置。 Snyk、WhiteSource 或 Dependabot 等工具可以自动完成很多工作。
关键是要有一个处理发现的漏洞的流程。如果结果被忽略,那么进行安全扫描就没有意义。定义严重性级别和策略 - 严重漏洞会阻塞管道,高漏洞会生成立即纠正的通知单,中等漏洞会积压。
容器构建
如果您正在使用 [Docker®4® 或其他容器技术(您可能应该这样做),镜像构建是一个关键阶段。图像应该轻量级 - 图像越小,传输和启动越快。尽可能使用特定的基础图像,例如 alpine。
图像安全很重要。对您的图像运行漏洞扫描。使用官方基础镜像并保持最新。不要以 root 身份运行容器。使用多阶段构建来确保只有必要的工件才会进入最终图像。
一致的版本控制至关重要。使用提交哈希标记图像,而不仅仅是“最新”。这为您提供了完美的可追溯性 - 您始终确切地知道哪个代码在哪个环境中运行。
部署策略
如何将代码实际投入生产非常重要。幼稚的部署(关闭所有内容、更新、再次打开)会导致不可接受的停机时间。现代策略消除或最大限度地减少停机时间。
蓝绿部署维护两个相同的环境。生产(蓝色)正在为流量服务。您将其部署到空闲(绿色)环境,对其进行测试,然后更改路由。如果出现问题,可以立即换回。成本是维护两个完整的环境。
滚动部署逐渐更新实例。如果您有 10 台服务器,则更新 2 台服务器,检查运行状况,再更新 2 台,依此类推。最大限度地降低风险,但回滚速度较慢。这对于无状态应用程序很有用。
金丝雀部署特别强大。您将一小部分流量(例如 5%)路由到新版本。监控错误、延迟、转换指标。如果一切看起来都不错,则逐渐增加到 10%、25%、50%、100%。如果指标恶化,自动回滚。这让您确信更改不会对 100% 的用户造成爆炸性影响。
功能标志补充任何部署策略。您可以部署禁用的代码,首先为内部用户启用它,然后是 Beta 测试人员,然后是所有人。代码和部署是解耦的,提供了巨大的灵活性。
监控和可观察性
部署完成后,CI/CD 管道不会结束。您需要知道您部署的内容在生产中是否运行良好。这需要从一开始就仔细地使用仪器。
指标告诉您发生了什么。请求率、延迟、错误、资源使用情况。仪表板必须清楚地显示这些指标。当指标离开可接受的范围时,应触发警报。但太多的警报(警报疲劳)与太少的警报一样糟糕。
日志告诉您为什么会发生某些事情。以 JSON 而非自由文本结构化的日志。包含关联 ID 以跟踪跨服务的请求。将日志集中到 ELK stack 或 CloudWatch 等工具中。但是,当您拥有数十个微服务时,仅靠日志是不够的。
分布式跟踪显示请求通过系统的路径。当请求花费 2 秒时,跟踪会准确地显示这 2 秒的花费时间 - 负载均衡器上花费了 300 毫秒,[身份验证 5 服务上花费了 50 毫秒,缓慢的数据库查询花费了 1.5 秒,等等。Jaeger 或 DataDog APM 之类的工具非常宝贵。
文化和流程
工具固然重要,但文化更重要。当 CI/CD 在没有团队支持的情况下自上而下强加时,它就会失败。开发人员需要了解管道的价值并感受到所有权。
代码审查是该过程的一个组成部分。在合并之前,每项更改都必须由至少一名其他团队成员进行审核。这可以捕获错误、共享知识并维护代码标准。但审核必须要快——公关等待审核几天会扼杀动力。
基于主干的开发与 CI/CD 配合使用比复杂的 git 流程更好。每个人都在寿命数小时或最多几天的短树枝上工作。频繁合并到 main/master。功能标志允许您禁用不完整的功能。更少的长分支意味着更少的可怕的合并冲突。
回滚必须简单且快速。如果生产中出现问题,您应该能够在几分钟而不是几小时内回滚到以前的版本。这需要保持旧版本的可部署性并了解如何在它们之间快速切换。
结论
CI/CD 不是一个项目——它是一个持续改进的过程。从简单开始:自动化构建、基本测试、一致的部署过程。然后迭代:添加更多测试、改进监控、尝试金丝雀部署。
投资回报率很快就会出现。拥有成熟 CI/CD 的团队部署更频繁,错误更少,更有信心。开发人员花费更少的时间来应对发布流程,而将更多的时间用于构建功能。用户更快地获得价值,更快地修复错误。
问题不在于您是否应该投资 CI/CD,而在于如何针对您的团队和环境进行正确的投资。从小事做起,学习并扩展。未来的你会感谢你。
您的团队如何部署?您在 CI/CD 方面面临哪些挑战?在评论中分享!
另请阅读
- [用于生产的 Docker:构建轻量且安全的镜像6
- [功能标志:安全发布完整指南7
- [日常生活中的应用程序备份:将复制变为安全的最佳实践8
- [功能标志:工具以及在公司采用之前要考虑的事项9
- [GitOps 与 ArgoCD:声明式部署自动化10
- [2025年现代Web开发:趋势、工具和创新策略11
