Mars Agent · 真实发布测试报告Atlas · 2026-08-14
前端构建优化 · 真实环境测试

缓存写回已移除。
发布阻塞如实记录。

六次成功的 Cloud Build 验证了 dependency-keyed cache 策略。完整 Canary 发布尝试在 instance template 权限边界停止,线上环境没有发生变更且保持健康。

8m25s旧 Cloud Build 真实基线
7m46s新缓存迁移轮,包含首次 export
1m42s五轮暖缓存中位数,Cloud Build API 口径
0%Canary rollout 完成度;变更前即被阻断
01 · 结论

哪些通过,哪些没有

本次实验严格区分“镜像构建正确”和“发布正确”。镜像成功推送不等于部署成功,不会混为同一结论。

构建策略已验证

  • 构建结果6 / 6 成功
  • Dependency key78838a714c8d…c3882
  • 迁移轮cache miss → export enabled
  • 暖缓存轮5 / 5 hit → export skipped
  • 暖缓存 export0.0 秒
  • 候选 digestsha256:ddef1b8d318f…f9ae61

Canary 发布被阻断

  • 失败动作创建 instance template v319
  • 当前身份mars-devops-ops@…iam.gserviceaccount.com
  • 缺少权限compute.instanceTemplates.create
  • 线上 templatev318,保持不变
  • 线上 frontendsha256:af0ee20d4b0c…18d5f
  • 失败后健康状态HTTP 成功 · status ok
02 · 时间

同口径真实时间对比

所有 Cloud Build API 时间统一使用 finishTime − createTime。本地打包与上传发生在 createTime 之前,每次约 50–52 秒,因此单独列示。

旧基线 · 每次 export505.4s
新策略迁移轮 · export 一次465.9s
暖缓存中位数 · 不 export102.3s
暖缓存执行时间中位数44.5s
解读边界:五次暖缓存构建使用完全相同源码,因此 Next.js 层全部命中缓存。79.8% 的降幅是重复构建的最佳场景,不能证明日常源码变更也能在 102 秒内完成。P0 可直接归因且已经成立的结论是:暖构建 cache export 从 116.2 秒降至 0.0 秒。
轮次Build ID排队执行API 总耗时Next buildCache export策略状态
旧基线ffd4e573…f6dd51.7s453.7s505.4s238.6s116.2s每次 export
迁移轮253fc360…895a49.7s416.2s465.9s213.0s110.5smiss · export
暖缓存 162276717…a04c43.9s42.8s86.7sCACHED0.0shit · skip
暖缓存 2282d0529…d38b51.8s47.2s99.0sCACHED0.0shit · skip
暖缓存 3ea63484e…8b6b65.1s42.0s107.1sCACHED0.0shit · skip
暖缓存 495bd83c1…9e4b58.4s45.9s104.3sCACHED0.0shit · skip
暖缓存 521ad457d…07a457.8s44.5s102.3sCACHED0.0shit · skip
03 · 发布

真实 Canary 发布链路

frontend-only driver 实际运行于 test-e2.marsdata.ai。流程依次验证 runtime configuration、同步 Turnstile secret、提交 Cloud Build、等待镜像完成、解析 immutable digest,最终在创建或滚动新 MIG template 之前失败。

PASS4s

验证 runtime configuration 与发布前置条件。

PASS52s

本地打包、上传 214.5 MiB、异步提交构建。

PASS1s

rollout 前验证现有 Canary 健康状态。

PASS466s

轮询 Cloud Build,直到镜像成功推送。

PASS6s

通过 commit tag 解析候选 frontend digest。

BLOCKED总计 558s

Template v319 创建被拒绝;MIG 未发生变更。

源码身份

  • Branchatlas
  • Commit tag0c256b6b58056ac48e2cfec4d1ca296cf86a250f
  • 配置 diff SHA-2566a52e07e4a3cab6c…1cc7335d
  • Working treeCloud Build 配置尚未提交
  • 构建机器E2_HIGHCPU_8
  • 是否触碰生产

失败后的真实状态

  • 目标 templatemars-fullstack-canary-tpl-v319
  • 目标 template 是否存在
  • 当前 templatemars-fullstack-canary-tpl-v318
  • MIG stableTrue
  • Health endpointhttps://test-e2.marsdata.ai/api/health
  • Health responsestatus=ok · backend=ok
04 · 证据

原始观测记录

旧基线
build_id=ffd4e573-7590-426b-9cc5-db887d36f6dd
status=SUCCESS
queue=51.7s
execution=453.7s
api_total=505.4s
next_build=238.6s
cache_export=116.2s
新暖缓存策略
dependency_hash=78838a714c8d...c3882
cache_state=hit
cache_export=skipped
refresh=false
next_build=CACHED
cache_export=0.0s
build_and_push_median=21s
发布失败
ERROR: Required
'compute.instanceTemplates.create'
permission for
mars-fullstack-canary-tpl-v319

driver_exit=2
失败后的线上状态
template=mars-fullstack-canary-tpl-v318
stable=True
frontend=sha256:af0ee20d...18d5f
health.status=ok
health.backend=ok
production_mutation=false
05 · 后续

由证据决定的下一步

1. 恢复 Canary 发布权限更新现有运维 IAM policy,使当前部署身份可以创建 instance template。随后重跑相同的 frontend-only pipeline;不要在进行中的发布里临时扩大权限。
2. 清理上传噪音根目录提交包含 6,955 个文件、214.5 MiB。通过 .gcloudignore 排除报告、artifacts 和其他不参与构建的输入,预计可减少约 50 秒本地提交耗时。
3. 执行源码变更 A/B使用相同 dependency hash 的两次等价源码变更构建,测量 Next.js 必须重新编译时的因果收益;Webpack、CPU 规格、Sentry 和依赖保持固定。
发布状态仍为 NOT VERIFIED。完成验证需要成功滚动 Canary template,并提供旧/新 digest 原始证据、新 health response 与 detached validation 状态。本报告不授权任何生产发布。