|
10 | 10 | > - **Maven Central** → push a `java-v<maven-version>` tag (`publish-java.yml` signs and deploys |
11 | 11 | > from repo secrets), or locally `~/.m2/settings.xml` (server ids `central` + |
12 | 12 | > `gpg-credentials`) + the local GPG signing key and `mvn -Prelease deploy` from |
13 | | -> `server/java` (autoPublish — no manual staging promotion). One route per version, never both. |
| 13 | +> `server/java` (autoPublish, so no manual staging promotion; run the eject release gate |
| 14 | +> first, see the Java procedure). One route per version, never both. |
14 | 15 | > - **NuGet** → keyless OIDC via the `publish-csharp.yml` workflow: `gh workflow run |
15 | 16 | > publish-csharp.yml` (or push a `csharp-v<version>` tag). |
16 | 17 | > |
@@ -48,6 +49,26 @@ Decide explicitly for every branch the scan returns: merge it into this cut, or |
48 | 49 | Note that `no-mistakes/*` branches are usually gate replays of work already on `main` — confirm |
49 | 50 | rather than assume. Do not skip past the list. |
50 | 51 |
|
| 52 | +**The eject pending list (1.1.0).** 1.1.0 does not ship while |
| 53 | +`fixtures/generator-registry-conformance/registry.json` has an entry in `eject.pending` |
| 54 | +(ADR-0034 Amendment 8). The scripted paths enforce it: `scripts/release.mjs` (first check of |
| 55 | +its preflight), `scripts/finish-release.mjs` (gate 0, before the tag) and the four publish |
| 56 | +workflows (the step after checkout) refuse a version with no prerelease suffix while the list |
| 57 | +holds an entry. A release candidate (`1.1.0-rc.3`, or `1.1.0rc3` on PyPI) is allowed. |
| 58 | + |
| 59 | +A publish you type by hand passes through none of those, so run the gate yourself as the |
| 60 | +command before it. This document has it before each of the four: the npm promote in step 3, |
| 61 | +the isolated one-package `bun publish`, the PyPI fallback `uv publish`, and the local |
| 62 | +`mvn -Prelease deploy`. It exits non-zero on a refusal: |
| 63 | + |
| 64 | +``` |
| 65 | +node scripts/eject-release-gate.mjs <version> # the version that registry is about to receive |
| 66 | +``` |
| 67 | + |
| 68 | +To clear it for a final release: close the gaps and delete their entries. There is no other |
| 69 | +step. Each port's eject-contract test fails on a gap that is not listed, so an entry cannot be |
| 70 | +deleted before its gap is closed. |
| 71 | + |
51 | 72 | **Why this is step 0 and not a nicety:** `0.21.1` shipped *without* a `timestampMode` fix that was |
52 | 73 | already written and sitting on an unmerged branch. Because versions are immutable on all four |
53 | 74 | registries, the only correction was a full coordinated `0.21.2` within the hour — four publishes, an |
@@ -549,6 +570,7 @@ scripts/ci-local.sh --strict-toolchains # must end "LOCAL CI PASSED" |
549 | 570 | # bump the candidate set to the final <version> |
550 | 571 | rm bun.lock && bun install |
551 | 572 | # verify packed deps (rule 2); commit "chore(release): <version>" |
| 573 | +node scripts/eject-release-gate.mjs <version> # must exit 0; refuses while eject.pending has entries |
552 | 574 | ( cd <pkg-dir> && bun publish ) # default tag = latest, tier order |
553 | 575 | git push origin main # NO tag here — see golden rule 7 |
554 | 576 | ``` |
@@ -587,8 +609,8 @@ CDN-cached and lags right after publish. |
587 | 609 | ## Isolated patch (one package) |
588 | 610 |
|
589 | 611 | If only one package changed (e.g. a `cli` bugfix), bump just that package, `rm bun.lock && bun |
590 | | -install`, verify, and `bun publish` it — the others stay at their current version. Tag scoped |
591 | | -(e.g. `cli-v0.5.1`). |
| 612 | +install`, verify, run `node scripts/eject-release-gate.mjs <version>` (it must exit 0), and |
| 613 | +`bun publish` it. The others stay at their current version. Tag scoped (e.g. `cli-v0.5.1`). |
592 | 614 |
|
593 | 615 | # Releasing the C# packages to NuGet |
594 | 616 |
|
@@ -750,9 +772,10 @@ Project `metaobjects` → **Settings → Publishing → Add a new GitHub publish |
750 | 772 | python-v<version>`. **Do not ALSO publish by hand.** The `1.0.3` cut ran a local |
751 | 773 | `uv publish` and then pushed the tag, so the workflow went red with `400 File already |
752 | 774 | exists` on a release that had shipped — a red run that reads exactly like a failed publish. |
753 | | - The local route is the fallback only when the workflow cannot run: `UV_PUBLISH_TOKEN=<a PyPI |
754 | | - API token> uv publish dist/*` from `server/python`, and then do not push a `python-v*` tag |
755 | | - for that version. |
| 775 | + The local route is the fallback only when the workflow cannot run. Run |
| 776 | + `node scripts/eject-release-gate.mjs <version>` from the repository root first (it must exit |
| 777 | + 0; the workflow runs the same gate), then `UV_PUBLISH_TOKEN=<a PyPI API token> uv publish |
| 778 | + dist/*` from `server/python`, and then do not push a `python-v*` tag for that version. |
756 | 779 | 4. **Verify:** `curl -s https://pypi.org/pypi/metaobjects/json | python3 -c "import sys,json;print(json.load(sys.stdin)['info']['version'])"`. |
757 | 780 |
|
758 | 781 | # Releasing the Java/Kotlin modules to Maven Central |
@@ -789,7 +812,9 @@ versioned on its own major line — npm major + 7, so `7.x` while npm was `0.x` |
789 | 812 | with `Component … already exists`): push a `java-v<maven-version>` tag, and |
790 | 813 | `publish-java.yml` runs the deploy below in CI with the signing secrets (how `8.0.4` |
791 | 814 | shipped; it takes no version override, so it deploys the COMMITTED version — do not fire |
792 | | - it for an uncommitted pre-release); or run `mvn -Prelease deploy` from `server/java`. |
| 815 | + it for an uncommitted pre-release); or run |
| 816 | + `node scripts/eject-release-gate.mjs <maven-version>` from the repository root (it must exit |
| 817 | + 0; the workflow runs the same gate) and then `mvn -Prelease deploy` from `server/java`. |
793 | 818 | The `central-publishing-maven-plugin` |
794 | 819 | (`<publishingServerId>central</publishingServerId>`, `<autoPublish>true</autoPublish>`) uploads |
795 | 820 | the signed bundle and auto-releases — **no manual staging → release promotion**. Auth + the GPG |
|
0 commit comments