Skip to content

GitHub Release body 超 125k 上限:spec 的 rc 段已达 343k,RC 窗口内每次发布都会在 createGithubReleases 处失败(npm 已发出、Docker 被连带跳过) #4900

Description

@os-zhuang

现象

Release run 30823919428(89d2a4e)第 16 步 Create Release Pull Request or Publish to npm 跑了 7 分 44 秒后 failure:

Everything up-to-date        ← 原子 tag 推送已完成,action 的逐个 tag push 全是 no-op(#2191 设计生效)
##[error]HttpError: Validation Failed:
  {"resource":"Release","code":"custom","field":"body",
   "message":"body is too long (maximum is 125000 characters)"}
  - https://docs.github.com/rest/releases/releases#create-a-release

失败发生在 npm 发布完成之后。实测注册表:

@objectstack/cli   dist-tags: {"latest":"16.1.0","rc":"17.0.0-rc.2"}
@objectstack/spec / runtime / console / create-objectstack  17.0.0-rc.2  均已发布

即包全发出去了、tag 也推了,只有 GitHub Release 创建失败 —— 但它把整个 step 标红,于是 published 输出没置为 'true',docker job 按 if: needs.release.outputs.published == 'true' 被跳过。17.0.0-rc.2 的运行时镜像因此没发(已用 docker-publish.ymlworkflow_dispatch 手动补发)。

根因:changelog 段落早已超出 API 上限

packages/spec/CHANGELOG.md            1,517,277 字符(全文)
  └─ ## 17.0.0-rc.2 这一节           342,911 字符   ← 上限 125,000,超 2.7 倍

packages/cli/CHANGELOG.md               654,433
packages/runtime/CHANGELOG.md           591,339
packages/objectql/CHANGELOG.md          467,642

createGithubReleases: true 把对应版本的 changelog 段落原样塞进 Release body。spec 作为 fixed 组里条目最密集的包,rc 段已经远超上限。

这不是一次性故障:段落只会随 RC 窗口推进继续变大,所以窗口内每一次发布都会在同一处失败,并且每次都以同样的方式连带丢掉 Docker 镜像。17.0.0 GA 那一次只会更大。

可选方向(未决,需要维护者拍板)

  1. 自建 Release 并截断:不用 action 自带的 createGithubReleases,改为发布后自己调 API 建 Release,body 超限时截断并附 CHANGELOG.md 的链接/锚点。彻底消除这类失败,且保住 ADR-0087 D4 —— spec-changes.json 仍有 Release 可挂。改动最大。
  2. 只对超限的包截断:保留 action,但在它之前把超长的 changelog 段落改写成「摘要 + 链接」。会污染仓库里的 CHANGELOG 内容,不推荐。
  3. 关掉 createGithubReleases:最省事,但 ADR-0087 D4 的 spec-changes.json 是附到 spec 的 GitHub Release 上的,没有 Release 就没有落点 —— 需要先给那个产物找新家。

#4898 的关系

#4898/#4899 修的是「空 changeset 导致 action 根本不进 publish 分支」,与本 issue 是不同的失败:那次是压根没发,这次是发了但 Release 创建失败。两者的共同后果都是 published != 'true' → Docker 丢失,这一点由 #4899 引入的 recovery 步骤负责兜底 —— 但该步骤当前有两个缺陷,会另行修复:

  • 不带状态函数的 if: 被 GitHub 隐式包了一层 success(),所以 changesets 步骤失败后它被 skipped,恰恰漏掉了本 issue 这个场景;
  • 它的契约是「缺失就补发」,而今天 npm 上已有 rc.2,即使执行也是 no-op,不会把 published 置真、救不回 Docker。应改为守「当前版本必须在 npm 上必须有对应镜像」这个不变量。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions