Files
qinglong/docs/adr/ADR-0452-atomic-flattened-backend-build-publication.md

3.5 KiB
Raw Permalink Blame History

ADR-0452:原子且扁平兼容的 Backend 构建发布

  • 状态:Accepted
  • 日期:2026-08-19
  • 关联 RFCQL-RFC-0001 D-359
  • 关联 ADRADR-0042、ADR-0106、ADR-0451

上下文

Backend TypeScript 开始引用 QL3 workspace source 后,TypeScript 的 common source root 扩展到仓库根。一次真正清空输出目录的构建会生成 static/build/back/app.jsstatic/build/packages/**,但 2.x 生产入口和现有镜像仍要求 static/build/app.jstoken.jsruntime/** 等稳定路径。 开发机长期残留的旧 static/build/* 会掩盖该错位,使增量构建和测试通过,而干净镜像不可启动。

直接把所有生产入口改到 static/build/back/** 会扩大 2.x 部署、CLI、Docker 与 Shell 兼容面;把 workspace package 编译副本发布进 backend 目录又会形成第二套 package authority。构建必须只发布 backend subtree,同时保持既有路径和可追踪 source map。

决策

  1. build:back 唯一进入 scripts/ql3-build-back.cjs,不再直接把 tsc 输出到公开的 static/build
  2. 每次构建在 static/.back-build-<pid>-<nonce>/output 隔离目录执行 tsc -p back/tsconfig.json --outDir ...。失败时保留当前公开构建,不允许半成品覆盖。
  3. 发布前必须验证 staged back/app.jsback/token.jsback/runtime/adapters/local-process/localProcessExecutor.js 等必要输出存在; output/packages/** 只作为编译闭包,不进入公开 backend。
  4. 只把 staged output/back 发布为扁平的 static/build,因此生产路径继续是 static/build/app.jsruntime/**,不要求修改 2.x 入口。
  5. 发布前重写 .js.map 的 relative sources,使其从最终扁平位置仍能解析到真实 back/** source;不得删除 map 或留下指向临时 staging 的路径。
  6. 发布采用同一父目录内 rename:现有 build 先改名为唯一 backupstaged backend 再 rename 到目标;只有新目录成功可见后才删除 backup。发布失败时恢复旧目录并清理精确 staging/backup,不使用 shell、glob 或仓库级删除。
  7. 构建结束后 static/build/backstatic/build/packages 必须不存在。测试和镜像门必须从干净输出执行,禁止依赖历史 artifact。

被拒绝的替代方案

修改所有生产入口指向 static/build/back

拒绝。它把 TypeScript 内部 common-root 变化泄露成部署契约变化,并扩大 2.x 回滚风险。

构建前清空 static/build 后直接运行 tsc

拒绝。它仍发布错误目录,并在编译失败时破坏最后一个可运行构建。

同时发布 output/backoutput/packages

拒绝。QL3 package 已有独立 dist/artifact gatebackend 不应携带另一份 workspace package 实现。

验证

  • 主机和干净 Linux arm64 镜像中的 pnpm build:back 均通过;最终目录只保留原有 root layout,不存在 static/build/backstatic/build/packages
  • source map 从最终 static/build/runtime/** 位置可解析回仓库 back/runtime/**,不引用临时 staging。
  • Edge benchmark、D359 compiled-backend 资源/回滚门和完整 backend 回归均只读取新的干净发布结果。
  • 完整 backend 回归与 18-package clean build/test 均退出 0;五个静态契约文件 126/126,四个可执行架构审计和 14 个 Local Profile artifact 预算全部通过,证明扁平 backend 发布没有改变 package closure 或 Profile 制品基线。
  • 本 ADR 不改变 package graph、生产依赖、schema、migration、数据库或部署 authority。