Skip to content

fix(artifact): 修通 linux-x64 首装 → 自举 → 首页可用 - #42

Merged
worable233 merged 6 commits into
mainfrom
fix/artifact-install-chain
Oct 25, 2026
Merged

worable233 merged 6 commits into
mainfrom
fix/artifact-install-chain

Conversation

@worable233

Copy link
Copy Markdown
Owner

背景

在真实 linux-x64(QEMU 容器 + systemd)里跑 install-artifact.sh 全段,验证「首装 → 自举 → 首页可用」。链路一开始跑不通,逐个暴露出 5 个真实缺陷——每一个都只在目标机暴露,构建机和单测都看不出来。

修的 5 个 bug

  1. 平台名比较写死 linux-x64 — RELEASE.json 写的是契约名 linux/amd64,导致每一份合法产物都装不上。改成 case 同时接受两种写法。
  2. PM2 从 /root 启动 — 守护进程继承安装者的 cwd,之后 spawn 子进程全是 spawn /usr/local/bin/node EACCES;进程表看起来建好了,实际一个都没起来。现在先 cd "${RELEASE_DIR}" 再 pm2 start。
  3. targetVersion 恒为 unknown — resolveTargetVersion 只向上找 1/2 层,RELEASE.json 实际在 dist/server.js 上三层,runner 因此找不到迁移包。抽成 apps/api/src/bootstrap/release-version.ts 并加 5 例测试钉住层级。
  4. 产物不含 packages/{plugins,themes} — 内核把这两棵目录当「随内核发布的本地来源」。缺主题 → 首页 404;缺插件 → 市场 plugins: []。构建脚本现在把它们打进产物(只带 dist/、frontend/、assets/、package.json、theme.css|json),并把插件/主题的裸导入并入依赖闭包;一个内置插件都没找到时直接构建失败。
  5. 插件解析不到内核依赖 — 插件装在 <data>/plugins/,ESM 向上查找到不了版本目录的 node_modules,全部 Skipping invalid plugin: Cannot find package 'zod'。新增 ensurePluginModuleResolution():在数据目录建 <data>/node_modules -> <root>/current/node_modules 符号链接(不复制,避免第二份 zod;指向 current 所以升级自动跟随)。

附带修 collect-runtime-deps.mjs 的 copyPackage:跳过包内 node_modules/.bin,否则 pnpm 的绝对路径链接解包后全部失效,还会把 typescript/vitest 拖进产物。

复验证据(容器内,真实 systemd)

  • systemctl is-system-running = degraded(systemd 是 PID 1,可正常 enable --now)
  • 产物:kernel 35.9MB / 解包 243.8MB,sha256 47f23581…
  • install-artifact.sh 全段通过(含 systemd 单元 enable --now + pm2 startup)
  • POST /setup/provision 真实预检(PG 版本/DDL、Redis 读写、S3 私有前缀读写删)→ 202
  • path unit 自动触发 bootstrap:queued → migrating → starting → needs_admin,migrationSucceeded=true、runtimeReady=true
  • 9 个内置插件全部 activated,default 主题已播种,GET / = 200

测试

  • 新增 apps/api/tests/unit/bootstrap-release-version.test.ts(5 例)
  • 新增 apps/api/tests/unit/plugin-module-resolution.test.ts(3 例)
  • tests/unit 全量:887 passed。另有 3 个文件因并发跑 vitest 抢建同名测试库报 pg_database_datname_index 冲突,单独重跑 17/17 全过。

已知边界(未在本 PR 处理)

  • catalog/cms/invoice 三个包仍带 finder,需要先设计「声明式数据整形」层。
  • scripts/build-frontend.mjs:276 的 eslint no-useless-assignment 是既有问题。
  • QEMU 模拟下 max_memory_restart(512M)会因内存峰值反复重启 API,是模拟环境性能特征,已在文档标注。

@worable233
worable233 merged commit 75c791f into main Oct 25, 2026
1 check passed
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