|
| 1 | +--- |
| 2 | +--- |
| 3 | + |
| 4 | +ci(release): build GitHub Releases ourselves, with bodies that fit the 125k limit (#4900) |
| 5 | + |
| 6 | +**Deliberately empty frontmatter — this PR releases nothing.** It changes only |
| 7 | +`.github/workflows/release.yml`, `.github/workflows/lint.yml`, root `scripts/` |
| 8 | +and one `check:` script entry in the root `package.json`. Not a byte of it |
| 9 | +reaches any published package: the root manifest is private, and `scripts/` at |
| 10 | +the repo root is release tooling, never packaged (`check:published-files` is the |
| 11 | +gate that keeps `<pkg>/scripts/**` out of the npm artifacts, and this is one |
| 12 | +level above even that). A non-empty changeset here would bump all 69 packages of |
| 13 | +the Changesets `fixed` group in lockstep and burn an extra `rc` on a change that |
| 14 | +ships no product code. |
| 15 | + |
| 16 | +The empty-frontmatter form is the repo's sanctioned "this PR releases nothing" |
| 17 | +declaration, on par with the `skip-changeset` label, per `Check Changeset` in |
| 18 | +`.github/workflows/pr-automation.yml`. This PR carries the label as well; the |
| 19 | +file exists so the declaration is a durable record in the repo rather than a |
| 20 | +label anyone can remove later. |
| 21 | + |
| 22 | +One caveat worth stating where the next reader will find it, because this PR is |
| 23 | +about the release machinery: an empty changeset is the exact input #4898 showed |
| 24 | +can jam a release — `changesets/action` enters its publish branch only with ZERO |
| 25 | +pending changesets, and an empty one still counts as pending. That is now |
| 26 | +bounded rather than silent. The recovery step #4899 added, made reachable and |
| 27 | +given the right invariant by #4901, catches precisely that case (repo version |
| 28 | +absent from npm → publish; image absent → request the Docker job), and this PR |
| 29 | +extends the GitHub Releases and the ADR-0087 D4 `spec-changes.json` attachment to |
| 30 | +that same recovery path — which they never covered before. So if this changeset |
| 31 | +is ever the only pending one when a version bump lands, the release is repaired |
| 32 | +and reported, not lost. |
| 33 | + |
| 34 | +What the change itself does: `changesets/action`'s `createGithubReleases` posted |
| 35 | +each package's raw CHANGELOG section as the Release body, and |
| 36 | +`@objectstack/spec`'s section for one v17 RC is 342,893 characters against the |
| 37 | +API's 125,000 limit. The 422 fired inside `runPublish` — after `changeset |
| 38 | +publish` had fully succeeded but before the action set its `published` output — |
| 39 | +so the step went red, `published` stayed false, and the `docker` job gated on it |
| 40 | +was skipped: a published npm version with no runtime image. The action now has |
| 41 | +`createGithubReleases: false` and `scripts/release-github-releases.mjs` creates |
| 42 | +the Releases instead, truncating an over-limit body to fit and linking the |
| 43 | +complete entry in `CHANGELOG.md`, idempotently (PATCH when the release exists), |
| 44 | +and per package rather than under one `Promise.all`. |
0 commit comments