Skip to content

spec 的 #4650 删除闸门在「按 SHA 钉住的消费者构建」里无法锚定 origin/main,硬失败 —— cloud 的镜像构建与 pin bump 全线卡死 #5235

Description

@os-zhuang

这条挡住了 cloud 的所有 framework pin bump(实测:objectstack-ai/cloud#1091,把 pin 从 ad047d2e 挪到 586d6f70 后,verify-objectos-ee-image 立刻红)。

现象

cloud 的 EE 镜像构建里,framework 的 @objectstack/spec build 直接失败:

@objectstack/spec:build: ─── Summary ───
@objectstack/spec:build:   Generated: 1654 (135 as input shape)
@objectstack/spec:build:   Skipped:   23 (unsupported types: function, date, bigint, custom)

@objectstack/spec:build: ❌ Cannot resolve origin/main to anchor the authorable-surface deletion check (#4650).

@objectstack/spec:build:    Deleted baseline lines are validated against authorable-surface.json at the
@objectstack/spec:build:    merge base with origin/main — a baseline this commit cannot rewrite. Without
@objectstack/spec:build:    that anchor the tombstone gate can be bypassed by hand-editing the file, so
@objectstack/spec:build:    this build fails instead of silently skipping the check.

@objectstack/spec:build:    Fix: `git fetch origin main` (or point refs/remotes/origin/main at your
@objectstack/spec:build:    upstream main) and re-run.
@objectstack/spec:build:  ELIFECYCLE  Command failed with exit code 1.

@objectstack/spec#build:  ERROR  command (/repo/objectstack/packages/spec) pnpm run build exited (1)
 Tasks:    0 successful, 3 total
Failed:    @objectstack/spec#build

归因(已逐条核过,不是推断)

检查 结果
该报错字符串在 cloud 当前 pin ad047d2e 上存在吗 不存在git grep 零命中)
586d6f70 上呢 存在于 packages/spec/scripts/build-schemas.ts
同一个 CI job 在别的 cloud PR 上(仍是旧 pin)通过吗 全部通过(近 10 次运行只有改 pin 的这次红)
本地在有 origin/main 远程引用的 framework worktree 里构建 586d6f70 通过 —— 所以本地验证看不见它

也就是说:闸门是本区间新增的,且只在「没有 origin/main 远程引用」的构建环境里触发。

为什么消费者构建必然踩到

resolveSurfaceBase()git rev-parse origin/main^{commit},失败则自愈式 git fetch --depth=1 origin +refs/heads/main:refs/remotes/origin/main,再失败就 fatal。

cloud(以及任何按 SHA 消费 framework 的下游)拿到的 framework 树来自 actions/checkout@v4 + ref: <pinned SHA>(默认 fetch-depth: 1):只有那一个 commit,没有 refs/remotes/origin/main。cloud 三个 workflow 全是这个形状:

  • .github/workflows/verify-objectos-ee-image.yml(已实测红)
  • .github/workflows/pin-smoke.yml
  • .github/workflows/test.yml

镜像那条更硬:framework 是被 COPY objectstack/ /repo/objectstack/ 抄进 buildx 构建阶段再构建的,自愈 fetch 在那里也没成功。

为什么这不只是「cloud 自己加个 fetch」就完事

可以让 cloud 三处 checkout 都 fetch-depth: 0(或显式 fetch main)绕过去,但那给这个开源产物加了一条很难看的性质:

「构建一个按 SHA 钉死的 @objectstack/spec 发布树,必须能联网访问它自己 main 分支的当前状态。」

这会打断离线 / 气隙构建、fork 构建、以及任何按 tag 复现历史版本的构建——而在这些场景里闸门要防的事根本不存在:树是不可变的、已经合并过的,没有「我这个 PR 相对 main 删了什么」这个问题可问。闸门在消费者构建里既问不出答案,也没有要防的对象。

同时也不该简单加个 SKIP=1 环境变量——那正是 #4650 要堵的旁路。

建议方向(留给维护者定)

  1. 闸门只在「开发式检出」跑:判据不是环境变量,而是可验证的事实——例如 authorable-surface.json 相对已提交状态有改动、或存在多于一个 commit / 存在分支引用。消费者构建里没有可删的基线,就没有要证明的删除。
  2. 或者把基线锚点变成树内产物:把 merge-base 那份基线在发布时固化进包内(如 authorable-surface.base.json),让闸门比对树内文件而不是远程分支——保持「PR 改不动的基线」这个性质,同时不依赖网络。

两条都保留 #4650 的防旁路性质;第 2 条对下游最友好。

影响面

  • cloud 的 .objectstack-sha 今天无法往前挪到任何含该闸门的 SHA,pin 会一直停在 ad047d2e(现已落后 main 119+ commit),连带 staging 部署与所有等 pin 的 issue(如 cloud#1012)。
  • 同样的形状会打到 release-objectos-ee.ymldeploy-* 系列(都在 pin 住的 framework 检出上构建镜像)。

出处

cloud#1012 的 pin bump(PR objectstack-ai/cloud#1091,会话 session_015W6nhsDrz6zWQc8je12a1t)。失败 run:https://github.com/objectstack-ai/cloud/actions/runs/30905564626 。未指派,按 Prime Directive #10 归档。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions