现象
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.yml 的 workflow_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 那一次只会更大。
可选方向(未决,需要维护者拍板)
- 自建 Release 并截断:不用 action 自带的
createGithubReleases,改为发布后自己调 API 建 Release,body 超限时截断并附 CHANGELOG.md 的链接/锚点。彻底消除这类失败,且保住 ADR-0087 D4 —— spec-changes.json 仍有 Release 可挂。改动最大。
- 只对超限的包截断:保留 action,但在它之前把超长的 changelog 段落改写成「摘要 + 链接」。会污染仓库里的 CHANGELOG 内容,不推荐。
- 关掉
createGithubReleases:最省事,但 ADR-0087 D4 的 spec-changes.json 是附到 spec 的 GitHub Release 上的,没有 Release 就没有落点 —— 需要先给那个产物找新家。
#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 上且必须有对应镜像」这个不变量。
现象
Release run 30823919428(
89d2a4e)第 16 步Create Release Pull Request or Publish to npm跑了 7 分 44 秒后 failure:失败发生在 npm 发布完成之后。实测注册表:
即包全发出去了、tag 也推了,只有 GitHub Release 创建失败 —— 但它把整个 step 标红,于是
published输出没置为'true',dockerjob 按if: needs.release.outputs.published == 'true'被跳过。17.0.0-rc.2 的运行时镜像因此没发(已用docker-publish.yml的workflow_dispatch手动补发)。根因:changelog 段落早已超出 API 上限
createGithubReleases: true把对应版本的 changelog 段落原样塞进 Release body。spec 作为 fixed 组里条目最密集的包,rc 段已经远超上限。这不是一次性故障:段落只会随 RC 窗口推进继续变大,所以窗口内每一次发布都会在同一处失败,并且每次都以同样的方式连带丢掉 Docker 镜像。17.0.0 GA 那一次只会更大。
可选方向(未决,需要维护者拍板)
createGithubReleases,改为发布后自己调 API 建 Release,body 超限时截断并附CHANGELOG.md的链接/锚点。彻底消除这类失败,且保住 ADR-0087 D4 —— spec-changes.json 仍有 Release 可挂。改动最大。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 这个场景;published置真、救不回 Docker。应改为守「当前版本必须在 npm 上且必须有对应镜像」这个不变量。