第5章 软件工程 / 5.5
5.5 部署交付
一句话讲明白
软件写好不等于能用,部署交付解决的是"怎么把软件安全、快速、可回退地送到用户手里,并且之后还能一天上线几十次"。
生活类比
开连锁餐厅:
- 传统交付 = 每开一家新店,厨师长带着一队人跑到现场重新调味道、装设备,运气不好味道还对不上总店(环境不一致),开业当天翻车只能全场停业。
- 持续交付/部署 = 中央厨房把"菜品 + 调料包 + 设备参数"打包成一份标准集装箱,任何门店收货后按同一套脚本一键还原,味道永远一致;上新菜时先给一家门店试卖(金丝雀),或者准备新旧两套餐桌布置随时整场切换(蓝绿)。
正经定义
软件部署是软件生命周期中的一个重要环节,属于软件开发的后期活动,即通过配置、安装和激活等活动来保障软件产品的后续运行。持续交付是一系列开发实践方法,用来确保代码能够快速、安全地部署到生产环境中,是一个完全自动化的过程,业务开发完成时可做到一键部署。
拆解与流程
一、软件部署要点
- 为什么有风险:应用越来越复杂(多构件、多版本、多变种)、版本间隔短、环境不确定、构件来源多样。
- 关注的问题:安装与系统运行的变更管理、构件之间的相依与协调、内容发放、异构平台管理、部署过程可变更性、与互联网的集成和安全性。
- 三种部署模式:
| 模式 | 适用场景 |
|---|---|
| 面向单机软件的部署 | 运行在操作系统之上的单机软件(安装、配置、卸载) |
| 集中式服务器应用部署 | 用户访问量500 人以下、硬件要求不高(中小组织、高校在线学习/实训平台) |
| 基于微服务的分布式部署 | 用户访问量大、并发要求高的云原生应用,通常借助容器和 DevOps 持续部署与集成 |
二、传统软件交付的困境
传统流程:业务人员提想法 → 开发人员做成产品 → 测试后交付用户 → 运维后期维护。问题:需求文档沟通效率低、变更频繁;测试工作量随进度递增而自动化程度低;运维排期被挤占、手工运维质量难保。
- 表现层:进度不可控、流程不可控、环境不稳定、协作不顺畅。
- 根源层:分支冗余导致合并困难、缺陷过多阻碍测试、开发/测试/部署环境不统一、版本混乱无法回溯、上线周期长、部署操作复杂经常失败、上线出问题需紧急回滚、架构不合理难定位。
三、持续交付的做法与优势
- 需求阶段:抛弃传统需求文档,改用便于开发人员理解的用户故事。
- 开发测试阶段:做到持续集成,让测试人员尽早进入项目。
- 运维阶段:打通开发和运维,保持环境统一。
- 五大优势:缩短从提交代码到正式部署上线的时间、降低部署风险;自动快速提供反馈、及时发现修复缺陷;软件在整个生命周期内都处于可部署状态;简化部署步骤、版本更清晰;交付过程可靠、可预期、可视化。
- 两个评价指标:①仅涉及一行代码的改动需要多久才能部署上线(核心指标);②开发团队是否以可重复、可靠的方式执行交付。主流互联网组织部署周期以分钟为单位,巨头单日部署频率 8000 次以上,部分组织达 20000 次以上。
四、持续部署
- 主流方案:容器技术(Kubernetes + Docker、Matrix 系统)。容器优点:上手简单、轻量级、体积小;集合性好,更容易对环境与软件打包复制和发布,能完整打包各种依赖。
- 部署原则(8 条):部署包全部来自统一存储库;所有环境使用相同的部署方式;所有环境使用相同的部署脚本;部署流程编排阶梯式晋级(设多个检查点,出问题有序回滚);整体部署由运维人员执行;仅通过流水线改变生产环境,防止配置漂移;不可变服务器;采用蓝绿部署或金丝雀部署。
- 部署层次 Build-Ship-Run:Build(编译成 RPM 包或 Jar 包)→ Ship(安装第三方依赖和插件到环境)→ Run(在不同地方启动整套环境)。要变更时不重新打包,直接更新部署包。
- 不可变服务器:物理机(环境难重构)→ 虚拟机(第三方依赖库重构不稳定)→ 容器(像集装箱,把所有内容打包复制部署)。
- 蓝绿部署 vs 金丝雀部署:
| 蓝绿部署 | 金丝雀部署 | |
|---|---|---|
| 做法 | 准备新旧两个版本,通过域名解析切换把用户切到新版本 | 先让少量用户使用新版本,观察是否有问题 |
| 出问题 | 快速切回旧版本,再修复调整新版本 | 及时处理并重新发布 |
| 正常 | — | 稳步适配给所有用户 |
五、新趋势(3 个方面)
① 工作职责和人员分工转变(运维从手工作业转为开发自动化部署脚本,逐步并入开发人员);② 大数据和云计算基础设施普及带来新飞跃(计算机可自动化创建和回收,部署脱离具体机器和机房,可远端进行);③ 研发运维融合。
考试怎么考
- 题型:选择题,近年第 3 版新增内容,出题率高。
- 必背数字:集中式部署适用于500 人以下;部署周期分钟级;巨头日部署 8000 次以上,部分 20000 次以上;部署三层 Build-Ship-Run。
- 教材原题:关于蓝绿部署描述正确的是 → A(准备新旧两个版本,通过域名解析切换)。B、D 描述的是金丝雀部署,是典型陷阱。
- 常见问法:"先让少量用户使用新版本并观察" → 金丝雀部署;"容器技术相对虚拟机的优点" → 轻量级、体积小、打包复制发布方便。
易混辨析
| 对比 | 持续集成 | 持续交付 | 持续部署 |
|---|---|---|---|
| 做到哪一步 | 频繁地将代码集成到主干并自动构建、自动测试 | 在持续集成基础上,保证代码随时可部署到生产环境(交付仍需人为触发) | 通过自动化直接部署到生产环境 |
| 关键词 | 集成 + 自动构建测试 | 一键可部署 | 自动上线 |
一秒记忆
"集 成 交 付 部 署 三 级 跳;部 署 三 步 Build-Ship-Run;蓝 绿 切 域 名,金 丝 雀 放 少 量。"