【读书活动感悟分享】《SRE Google运维解密》跟着 Google 学发布工程:SRE 体系下的稳定发布秘籍_文章

【读书活动感悟分享】《SRE Google运维解密》跟着 Google 学发布工程:SRE 体系下的稳定发布秘籍

吴召旺
发表于 2025-11-12 10:34:47

【读书活动感悟分享】-云平台SRE特战队-跟着 Google 学发布工程:SRE 体系下的稳定发布秘籍

云平台SRE特战队,分享人:吴召旺




一、什么是发布工程

如果把 IT 项目里的 “软件上线” 比作 “给用户装一套能直接住的房子”,那发布工程就是从 “设计图纸” 到 “业主拎包入住” 的全流程装修管理 —— 既要保证装修质量(软件稳定),又要按进度完工(按时上线),还得避免装到一半出乱子(流程失控)。

发布工程的本质:装修全流程的 “总监理 + 包工头”
发布工程不是只干 “刷墙、铺地板” 某一件事,而是管 “从图纸到入住” 的所有关键步骤,就像装修的全链条管理:
先管 “材料准备与适配”:对应 “构建与依赖管理”。比如装修前要确认水泥、瓷砖、板材的型号(代码版本),还要确保瓷砖和水泥能粘牢、板材和五金件适配(依赖兼容),这就像用 Blaze 工具(类比特来电的Team Foundation Server)把代码做成可运行程序,同时理清依赖关系,避免 “材料不配套装不下去”;
再管 “施工分区隔离”:对应 “分支管理策略”。比如装修时 “主卧先刷漆” 和 “客厅装吊顶” 可以同步干(主分支开发新功能),但如果要给 “已完工的次卧补装插座”(给发布版本修 bug),不能随便动其他区域的施工(不合并回主分支),得单独安排工人处理(cherry picking),避免影响已确定的装修成果;
接着管 “阶段验收”:对应 “持续测试体系”。比如水电改造完要测水压(单元测试)、墙面刷完要查有没有空鼓(集成测试),整个房子装完还要做甲醛检测(系统级测试),就像发布前要通过多轮测试,避免 “入住后发现漏水、墙皮脱落”(软件出 bug);
最后管 “交付与收尾”:对应 “打包与部署管理”。比如装修完要把家具家电按规划摆好(部署软件到服务器 / 终端),还能根据业主需求选 “先试住一周再正式入住”(灰度发布),或者 “全家直接搬进去”(全量发布),这就像用 MPM 打包、Sisyphus 部署(OPA站点 TeldOPA PatchInstaller),灵活选择上线策略。


二、发布工程师角色

在 Google,发布工程师就像 “发布流程的总设计师兼工具开发师”。他们的核心工作围绕三方面展开:

数据驱动:不只是简单收集数据,而是开发专门工具,精准追踪从代码提交到最终部署的全流程关键数据。比如 “发布速度”,会细化到代码提交后多久进入构建、构建成功后多久开始测试、测试通过后多久完成部署等环节,这些数据能直观反映发布流程的效率瓶颈,为优化提供依据。

最佳实践:不是零散的建议,而是覆盖发布全流程的标准化规则。以编译器功能开关为例,会明确哪些开关在不同场景下必须启用或禁用,避免开发团队因开关设置不当导致构建失败;版本编号格式会统一为 “主版本号。次版本号。修订号。构建号”,确保所有产品版本标识一致,方便追溯和管理。通过这些标准化设置,让工具默认就能按正确规则运行,开发团队不用再花时间研究 “该怎么设置编译器”“该用什么格式编号”,减少重复劳动。

协作:与 SRE(站点可靠性工程师)的合作非常紧密,就像 “安全搭档”。比如制定变更测试策略时,发布工程师会提供工具支持,让测试能自动化执行,SRE 则从系统稳定性角度提出测试重点,确保测试能覆盖关键风险点;在无缝发布和回滚策略上,双方会共同设计 “灰度发布” 方案,先让小部分用户使用新版本,同时监控系统指标,一旦出现问题,SRE 能快速触发回滚,发布工程师开发的工具则保证回滚过程顺畅,避免服务中断。


阅读心得

发布工程师不是 “单打独斗” 的角色,而是连接开发、运维(SRE)的关键纽带。他们通过数据驱动找到流程问题,用最佳实践规范操作,再通过协作保障发布安全,最终让整个发布流程高效且可靠。这启示我们,在团队中,不能忽视 “流程设计与工具支持” 的角色,明确的分工和紧密的协作,才能让复杂的发布工作有序推进。


三、发布工程哲学

Google 的发布工程哲学,就像指导发布工作的 “核心价值观”,具体体现在四个方面:

自服务模型:核心是 “让研发团队自己说了算”。虽然 Google 有几千名工程师、几百个产品,但通过强大的自动化工具,研发团队不用依赖发布工程师,就能自主完成从代码提交到发布的全流程。比如工具会自动检测代码是否符合规范、自动触发构建和测试,测试通过后,研发团队点击一个按钮就能启动发布,整个过程几乎不需要人工干预,就像 “自助餐厅”,想吃什么自己选、自己取,高效又灵活。

追求速度:不是盲目求快,而是通过 “频繁发布” 降低风险。比如部分团队每小时构建一次,每次发布的变更量很少,可能只是修复一个小 bug 或增加一个小功能。这样一来,测试时更容易定位问题 —— 如果发布后出现故障,因为变更少,很快就能找到是哪段代码导致的;调试时也更简单,不用在大量代码中排查。而且采用 “测试通过即发布” 模型,只要测试没问题,就立刻发布,减少等待时间,让新功能能更快触达用户。

密闭性:强调 “构建环境一致,结果可重复”。就像做蛋糕,必须用固定品牌、固定分量的食材,才能保证每次做出来的味道一样。Google 的构建工具会指定编译器的具体版本、依赖库的准确版本,不管在哪个工程师的电脑上、哪个服务器上构建,使用的环境都完全相同。这样就避免了 “在我电脑上能运行,到服务器上就报错” 的问题,确保每次构建出的产品都是一致的,不会因为环境差异出现意外。

强调策略和流程:通过 “多层安全锁” 保障发布安全。比如批准代码改动时,需要至少两名资深工程师审核通过;创建新版本时,只有指定的发布负责人有权操作;部署时,要经过 “测试环境验证→预发布环境验证→生产环境灰度发布” 三个阶段。每一层都有严格的权限控制和流程要求,防止未经授权的操作或不规范的流程导致发布事故。


阅读心得

Google 的发布工程哲学,本质是 “在安全与效率之间找平衡”。自服务模型和追求速度提升了效率,密闭性和严格策略保障了安全。这告诉我们,做发布工作不能只看一方面 —— 只追求效率可能导致故障频发,只注重安全可能让发布流程僵化。只有将两者结合,才能实现 “又快又稳” 的发布。

四、持续构建与部署

这部分就像发布工程的 “核心操作手册”,详细讲解了从构建到部署的全流程落地方法:

构建工具:Google 用 Blaze(开源版是 Bazel)作为 “全能构建工具”,它支持 Java、C++、Python 等多种编程语言,不管是哪种语言写的代码,都能通过 Blaze 统一构建。而 Rapid 系统是 Blaze 的 “好搭档”,它会根据 Blaze 定义的构建目标(比如要构建哪个产品、哪个模块),自动传递功能开关(比如是否启用新功能的开关),让构建过程更精准。

分支管理:采用 “主分支为主,发布分支为辅” 的模式。工程师平时开发都把代码提交到主分支,保证主分支是最新的代码;但发布时,会基于主分支的某个稳定版本创建专门的发布分支。比如发现主分支上有一个 bug 需要修复,工程师会先在主分支上修复并测试通过,然后通过 “cherry picking”(就像 “摘樱桃”,只把修复 bug 的代码片段)放到发布分支上,这样既保证主分支和发布分支都修复了 bug,又不会让发布分支混入主分支上其他未经过充分测试的代码。

测试:构建 “双重测试防线”。一方面,持续测试系统会盯着主分支,只要有新代码提交,就立刻自动运行单元测试(测试单个函数、单个模块的功能),及时发现代码改动引入的小问题,避免问题积累;另一方面,发布分支创建后,会重新运行所有测试 —— 不仅包括单元测试,还有集成测试(测试多个模块协同工作)、系统测试(测试整个系统的功能和性能),同时详细记录测试结果和审核意见,确保发布分支的代码完全没问题。

打包:MPM(Midas Package Manager)就像 “智能打包快递员”。它会给每个软件包分配固定的名称(比如 “产品名 - 版本号”),用哈希值给软件包签名(就像给快递贴防伪标签,防止软件包被篡改),还支持标签管理 —— 比如给新版本打上 “canary”(金丝雀)标签,系统就会自动把旧的 “canary” 版本移除,保证始终只有最新的 “canary” 版本可用。

Rapid 系统

配置方式:通过 Blueprint 文件(就像 “详细的任务清单”)定义所有规则,包括要构建哪些目标、要运行哪些测试、部署时要遵循什么规则,同时通过基于角色的访问控制列表(比如只有 “发布管理员” 能修改部署规则,只有 “测试工程师” 能查看测试日志),明确每个人的操作权限。

发布流程:是一套标准化的 “流水线作业”—— 先创建发布分支,然后同时进行二进制文件编译和单元测试(提高效率),接着运行系统级集成测试并在测试环境部署验证,最后记录整个过程的日志(方便后续追溯),生成改动报告(告诉大家这个版本改了什么)。

灵活性:能根据需求选择 “线性执行”(做完一步再做下一步,适合简单发布)或 “并发执行”(多步同时进行,适合复杂发布),还能高效管理发布分支和 cherry picking 请求,比如自动判断 cherry picking 的代码是否有冲突,有冲突就提醒工程师处理。

部署策略

简单部署:适合功能简单、影响范围小的服务,Rapid 会直接按照 Blueprint 文件的规则,自动更新任务,比如把新版本的代码直接部署到所有服务器上。

复杂部署:针对大型服务(比如用户量上亿的应用),会用 Sisyphus 框架分步部署。比如先部署到 1% 的集群,监控 1 小时没问题,再部署到 10% 的集群,再监控 1 小时,最后逐步扩展到 100% 的集群,用 “指数速度” 慢慢覆盖,降低故障影响范围。

风险适应:部署速度会根据服务的 “风险承受能力” 调整。开发环境的服务即使出问题,影响也很小,所以可能每小时自动发布一次;但敏感基础设施服务(比如支付系统、数据库)一旦出问题,后果严重,所以可能需要几天时间,分多个阶段完成部署,每个阶段都要经过严格验证。


阅读心得

持续构建与部署的核心是 “自动化 + 标准化 + 灵活调整”。自动化工具(Blaze、Rapid、MPM)减少了人工操作,标准化流程(分支管理、发布流程)保证了一致性,而根据服务风险调整部署策略,又体现了 “因地制宜” 的智慧。这提醒我们,做构建和部署工作,不能用 “一刀切” 的方法,要结合工具、流程和服务特性,设计最适合的方案。

五、配置管理


配置管理就像 “给软件找合适的‘配置管家’”,Google 提供了四种常见模型,各有特点:

多种模型:

主分支版本配置文件:开发者和 SRE 一起在主分支上修改配置文件(比如服务的端口号、数据库地址),但问题是,主分支的配置文件可能会频繁改动,而实际运行的服务可能还在使用旧版本的配置,导致 “配置文件版本” 和 “实际运行配置” 不一致,就像 “食谱改了,但厨师还在用旧食谱做饭”。

二进制与配置文件打包:把配置文件和软件的二进制文件(可执行文件)打包在一起,部署时一起安装。这种方式简化了部署流程 —— 不用单独部署配置文件,但缺点是灵活性差,如果想修改配置,必须重新打包、重新部署整个软件,不能单独改配置。

独立配置文件包:给配置文件单独打包,并且用 “构建 ID” 标记。比如某个时刻的配置文件打包后,会生成一个唯一的构建 ID,后续如果想恢复到这个时刻的配置,只要用这个构建 ID 就能重新构建出当时的配置文件。而且支持单独修改配置文件,改完后重新打包部署即可,不用动软件的二进制文件。

外部存储服务:把配置文件存在专门的外部服务(比如配置中心)里,软件运行时会动态从这个服务读取配置。比如电商平台的促销活动规则,需要频繁修改,就可以把规则存在外部存储服务里,改完后不用重启软件,软件会自动读取新配置,非常灵活。

选择依据:没有 “最好的模型”,只有 “最适合的模型”。项目负责人会根据需求选择 —— 如果配置改动少,追求部署简单,可能选 “二进制与配置文件打包”;如果配置改动频繁,需要灵活调整,可能选 “外部存储服务”;如果需要追溯配置版本,可能选 “独立配置文件包”。


阅读心得

配置管理的关键是 “匹配需求”。不同的配置模型有不同的优缺点,不能盲目跟风选择。在实际工作中,要先明确项目的配置改动频率、是否需要追溯版本、部署复杂度要求等需求,再选择对应的模型,这样才能让配置管理既高效又可靠。

小结与普适性


虽然这些实践来自 Google,但并不是 “大厂专属”,对各种规模的组织都有参考价值:

适用范围:不管是几十人的小团队,还是上万人的大企业,只要涉及软件发布,都能借鉴这些方法。比如小团队可以先用开源的 Bazel 替代 Blaze 做构建,用简单的脚本实现自动化测试,逐步优化发布流程;大企业可以参考 Google 的分支管理和部署策略,解决大规模团队协作下的发布问题。




108 0

评论


意见反馈