Skip to content

fix(deploy): 未选模块重部署后删除其 zone 路由 /m/<id>/*(#77) - #78

Merged
HandyWote merged 1 commit into
m0/devfrom
m0/issue-77
Sep 9, 2026
Merged

fix(deploy): 未选模块重部署后删除其 zone 路由 /m/<id>/*(#77)#78
HandyWote merged 1 commit into
m0/devfrom
m0/issue-77

Conversation

@HandyWote

Copy link
Copy Markdown
Contributor

背景

Closes #77

#16 七步剧本第 7 步验收条款(docs/requirements.md L207 / docs/PRODUCT_SPEC.md §M0 L472):「移除模块重部署后路由消失」。真机实测当前部署器只把未选中模块翻转注册表 enabled=0(not_deployed),zone 路由 /m/<id>/* 原样保留/m/hello/ 仍 200 命中模块 Worker)——验收条款未达标。

主会话与用户 2026-09-09 拍板:补实现(不改验收条款;§5.4 卸载三选一属 M1,本 PR 只做 M0 要求的「路由消失」,数据保留不动 D1)。

改动

文件 改动
deploy/cloudflare/src/dns.ts 新增 removeModuleRoutes:CF API GET /zones/<zoneId>/workers/routes → 对未选模块精确匹配 pattern === "<domain>/m/<id>/*"DELETE /zones/<zoneId>/workers/routes/<routeId>。幂等:路由不存在不报错、零 DELETE 只记日志;查询/删除失败只记日志不中断(风格同 removeLegacyCustomDomains
deploy/cloudflare/src/steps.ts 步骤④′(模块部署后、registry 前):对 config.modules 未列出的已存在模块调用删除;未配置 domain(无 zone 路由)时记日志跳过;删除动作经 reporter 记入步骤日志;测试注入口 cleanupModuleRoutes(默认真实实现)
deploy/cloudflare/src/config.ts modules 去掉 .min(1)——允许 [](移除唯一模块可表达;§6.5 App.vue 已有全停用空态)
deploy/cloudflare/test/dns.test.ts 新增 5 用例:命中删除(只删目标)、不存在零 DELETE、空数组零 fetch、查询失败不抛错、精确匹配不误删(近似 id / 他域 / 无通配)
deploy/cloudflare/test/steps.test.ts 新增 2 用例:未选模块删除动作参数正确 + 注册表 enabled = 0 照旧 + 删除先于步骤⑤ + 未选模块不重新部署;无 domain 时跳过删除
deploy/cloudflare/test/config.test.ts 新增「空 modules 通过校验」;原「拒绝空 modules」断言移除(坏 id / 坏 provider 拒绝保留)

边界(按 issue 明确):只删 zone 路由。不删模块 Worker、不动模块 D1(数据保留;完整卸载剧本属 M1)。注册表 enabled=0(not_deployed)行为保持现状。

破坏性回验(红 → 绿)

操作 结果
steps 接线处临时改为不调用(if (false) await cleanupRoutes(...) ✅ 红:steps.test.ts > 未选模块(modules: [])…AssertionError: expected [] to have a length of 1 but got +0
dns 删除循环临时改为空遍历(for (const id of [] as string[]) ✅ 红:dns.test.ts removeModuleRoutes 3 用例失败(expected [] to have a length of 1 / expected false to be true
两处还原后 ✅ 绿:deploy/cloudflare 77/77

两处独立守卫(编排接线 / CF API 删除)分别回验,均已还原,git diff 无破坏性残留。

验收对照表(issue #77

# 验收标准 结果
1 单元测试:未选模块 → 删除动作断言(路由删、注册表 disable 照旧);空列表 config 通过校验;破坏性回验红→绿 ✅ dns 5 用例 + steps 2 用例 + config 1 用例;破坏性回验两处独立红→绿(见上表)
2 三件套绿;PR base m0/dev;不合并 ✅ 见下「三件套验证」;base m0/dev;本 PR 不合并(rebase 合并,线性)
3 真机验收由主会话执行:移除 hello 重部署 → CF API 证明 /m/hello/* 路由已消失 → 恢复 hello 重部署 → 路由回来 ⏳ 待主会话在 PR 合并前执行(本 PR 提供实现与单测证据)
4 中文描述 + 验收对照表 ✅ 本 PR 描述

三件套验证(issue #77 · m0/issue-77)

typecheckpnpm -r typecheck EXIT=0 —— 7 个项目全过(contracts / ui / shell / cloudflare / module-sdk / core-api / hello)。

testpnpm -r test EXIT=0 —— 7 包 32 文件 275 用例全绿:

packages/contracts  23 · packages/ui 7 · packages/module-sdk 39
services/core-api   74 · apps/shell 43 · deploy/cloudflare 77 · modules/hello 12

deploy/cloudflare 69 → 77(#77 新增 8 用例)。

buildpnpm -r build EXIT=0 —— 7 包全过(shell dist:index.html + index-HAX6bGJC.css + index-D_KFHRjM.js)。

工作区卫生git status --short#77 的 6 个文件;.deploy/dist/ 均在 gitignore 内。

既有噪音(非本次改动引起):zod v4 源码注释 @__PURE__ 注解被 Rollup 忽略;shell session-api.ts 动态/静态混用 chunk 拆分提示。

- steps:步骤④′ 对 config.modules 未列出的已存在模块删除 zone 路由 /m/<id>/*,
  幂等(不存在不报错)、只删路由(不删 Worker、不动 D1,数据保留);步骤日志记录删除动作
- dns:新增 removeModuleRoutes(CF API GET/DELETE /zones/<id>/workers/routes,
  精确匹配 pattern,查询/删除失败只记日志不中断,风格同 removeLegacyCustomDomains)
- config:modules 允许空数组(移除唯一模块可表达;§6.5 全停用空态)
- test:dns 5 用例 + steps 2 用例(未选模块删除动作 + 注册表 disable 并存、无 domain 跳过)+ config 空列表

Signed-off-by: HandyWote <huangyinghui01@corp.netease.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant