跳到主要内容

环境分支的发布与灰度

本文介绍环境分支开发完成后,如何将改动发布到生产环境,以及如何在线上进行灰度发布,使新版本出现问题时只影响少量用户并能快速回滚。

发布流程​

阶段做什么使用的能力
在分支上开发与验证使用分支中的数据验证改动环境分支
发布到生产环境将验证过的改动按顺序应用到生产环境迁移 SQL、函数部署与版本发布
线上灰度新版本先承接部分流量,确认无误后全量云函数版本流量;需要时自建路由层

在分支上开发与验证​

分支是从生产环境复制出的另一个环境,拥有独立的环境 ID、数据库副本、HTTP 网关和访问域名。在分支上验证改动,并使用分支中的数据完成测试。Private Alpha 阶段的能力范围见Private Alpha 阶段的建议。

分支不承接线上流量

通过自有入口层,可以将部分用户的请求转发到分支地址,但分支与生产环境存在以下差异:

  • 数据:分支数据库是创建时的副本,分支上写入的数据不会回到生产环境。
  • 登录态:生产环境签发的用户 Token 在分支上无效,反之亦然,用户需要在分支上重新登录。
  • 配置:HTTP 网关路由、登录方式等配置需要在分支上单独确认。

此方式仅适用于内部人员或 Beta 用户等可以接受数据和账号独立的场景,不建议用于线上灰度。线上灰度请在生产环境内进行,见线上灰度;转发方式见自建路由层。

发布到生产环境​

  1. 改动以文件管理:数据库变更写成迁移 SQL,函数代码和配置纳入版本控制。避免只在控制台或 SQL 窗口中手动修改,否则在生产环境上无法准确重放。
  2. 在分支上验证:使用分支中的数据完成测试。Private Alpha 阶段可在分支上验证的范围见下文。
  3. 评审:通过代码评审(如 Pull Request)确认变更内容。
  4. 按顺序发布到生产环境:先执行数据库迁移,再部署函数并发布新版本,最后通过版本流量逐步放量。

规划中:差异对比与合并​

后续计划提供分支合并能力:先对比分支与生产环境的差异(数据库结构差异的对比方式参考 Supabase pg-delta),确认后合并到生产环境。分支中的数据不参与合并。

Private Alpha 阶段的建议​

环境分支目前处于 Private Alpha 阶段,提供通过 API 创建、查看和删除分支,以及使用分支临时密钥访问分支的数据接口。结合当前能力,建议:

  1. 表结构在生产环境变更:当前不支持在分支上修改表结构。表结构变更写成迁移 SQL,按先兼容、后清理的方式在生产环境执行;分支中需要用到的表,先在生产环境创建,再创建分支。
  2. 用分支验证数据读写:使用分支临时密钥在分支中读写数据,验证查询和数据处理逻辑,或交给 AI Agent 操作,生产环境的数据不受影响。

线上灰度​

灰度期间,新旧版本需要读写同一份生产数据,因此灰度在生产环境内进行。

云函数:使用版本流量​

  1. 发布一个函数版本,并将线上流量 100% 指向该版本。此后部署新代码只会更新 $LATEST,不影响线上流量。
  2. 部署新代码并发布新版本。
  3. 为新版本分配少量流量,观察无误后逐步提高比例,直至 100%。
  4. 出现问题时,将旧版本流量调回 100%。

版本流量的分配行为如下:

场景行为
路由开启“身份认证”同一用户的请求固定落在同一版本
路由未开启“身份认证”每个请求按比例随机分配版本
逐步提高新版本比例已在新版本的用户不会被切回旧版本
多个函数同时灰度比例相同时,同一用户在各函数落在相同版本
回滚调整比例后,通常在数十秒内生效

如需按用户保持版本一致,请为对应路由开启身份认证。配置方法见云函数灰度发布。

数据库:先兼容,后清理​

新旧版本共用同一个数据库,数据库变更对两个版本同时生效,无法灰度,也无法通过切换流量回滚。建议分两次发布:

  1. 先兼容:只新增表、列、索引,确保新旧版本的函数均可正常运行。
  2. 后清理:新版本全量稳定、旧版本不再承接流量后,再删除旧列或旧表。

出现问题时只回切函数版本,数据库不回退;需要修正时,通过新的迁移向前修复。

前端​

静态网站托管不提供按版本或按用户分发前端资源的能力。前端出现问题时,重新部署上一个构建即可恢复。如需前端灰度,可将新旧构建部署在不同路径,由自建路由层按规则返回。

自建路由层​

以下需求超出云函数版本流量的范围,可在 CloudBase 之前增加一层由您自行维护的路由层(如 CDN 规则、边缘函数、BFF、Nginx)。

每个环境的 HTTP 网关只能将请求路由到本环境的资源,生产环境的网关无法转发到分支环境。需要同时访问两个环境时,路由层应位于两个环境的 HTTP 网关之前,按规则将请求转发到对应环境的域名。

┌─ 生产环境域名 → 生产环境 HTTP 网关 ─┬─ /api-stable → 函数版本 N
客户端 → 自建路由层 ─┤ └─ /api-canary → 函数版本 N+1
│ (共用生产数据库)
└─ 分支环境域名 → 分支环境 HTTP 网关 → 分支中的函数
(仅内部或 Beta 用户)
需求做法
前端灰度新旧前端构建部署在不同路径或站点,路由层按规则返回
按租户或名单灰度在生产环境的 HTTP 网关为新旧版本各建一条路由,分别绑定固定的函数版本,路由层按租户或名单转发
内部或 Beta 用户访问分支路由层将指定用户的请求转发到分支环境的域名,限制见分支不承接线上流量

按租户或名单灰度时,CloudBase 侧只需在生产环境的 HTTP 网关中为灰度版本新建一条路由,并绑定指定的函数版本:

设计路由层时注意:

  • 只设一个分流点:路由层下游的路由绑定固定版本,不要再叠加函数版本流量。
  • 使用可信标识:按经过验证的用户 ID 或租户 ID 分流,不信任客户端自行上报的标识。
  • 回滚开关优先:切回旧版本的开关优先级高于名单、强制指定等其他规则。
  • 不跨版本重试:新版本请求失败时直接返回错误,不自动改发到旧版本。