Skip to content

Commit 5aa4156

Browse files
t3dotggclaude
andcommitted
ci(release): preview releases stay drafts so nightlies stay in the update feed
GitHub orders same-day releases by semver, so public `preview` tags outrank `nightly` ones. Ten previews in a day filled the 10-entry releases.atom, and nightly clients older than #35470 stopped finding new nightlies. Co-Authored-By: Claude Opus 5.5 <[email protected]>
1 parent d8f3fef commit 5aa4156

2 files changed

Lines changed: 7 additions & 7 deletions

File tree

‎.github/workflows/release.yml‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,9 @@ jobs:
168168
# Manual-only test train: exercises the whole release flow for a
169169
# commit end users must never receive. Never scheduled.
170170
# Same versioning as nightly under its own prerelease identifier.
171-
# A preview release is reachable only by asking for it: npm gets it
172-
# under the `preview` dist-tag, which nothing resolves by default,
173-
# its desktop builds carry no update feed, and no updater manifest
174-
# is attached to the release, so neither stable nor nightly
175-
# installs can ever be offered one.
171+
# A preview release stays a draft (see "Publish prerelease"), its
172+
# desktop builds carry no update feed, and no updater manifest is
173+
# attached, so neither stable nor nightly installs can be offered one.
176174
nightly_date="$(date -u -d "$NIGHTLY_DATE" +%Y%m%d)"
177175
178176
node scripts/resolve-nightly-release.ts \
@@ -1038,8 +1036,10 @@ jobs:
10381036
# The action keeps a stable release a draft until its assets finish uploading, but publishes a
10391037
# prerelease first. Desktop clients update connected servers from the CLI archives as soon as
10401038
# they see the release, so a prerelease also goes public only once every asset is attached.
1039+
# Previews stay drafts: GitHub orders same-day releases by semver, so public `preview` tags
1040+
# outrank `nightly` ones and push nightlies out of the 10-entry releases.atom older updaters read.
10411041
- name: Publish prerelease
1042-
if: needs.preflight.outputs.is_prerelease == 'true'
1042+
if: needs.preflight.outputs.is_prerelease == 'true' && needs.preflight.outputs.release_channel != 'preview'
10431043
env:
10441044
GH_TOKEN: ${{ github.token }}
10451045
GH_REPO: ${{ github.repository }}

‎docs/operations/release.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ the version.
1919
- push tag matching `v*.*.*` for a stable release of an explicit commit
2020
- scheduled nightly check every 30 minutes
2121
- manual `workflow_dispatch` with `channel=nightly`
22-
- manual `workflow_dispatch` with `channel=preview`, the maintainers' test train. It exercises the whole release flow (build, sign, notarize, smoke, publish) for a commit that end users must never receive, which is how an unmerged branch or a risky change gets a real release run before it lands. It builds the triggering commit with nightly's versioning under the `preview` prerelease identifier (`0.0.41-preview.<date>.<run>`) and publishes a GitHub prerelease plus the npm packages under the `preview` dist-tag. Preview is not on the schedule, no default npm dist-tag points at it, its desktop builds carry no update feed, and no updater manifest (`latest*.yml`, `nightly*.yml`, blockmaps) is attached, so a stable or nightly install cannot be offered one. The only ways onto it are downloading the release by hand, `npx t3@preview`, `T3CODE_CHANNEL=preview` for the install scripts, or `t3 update --channel preview` from a terminal; each prints a warning, and the CLI asks for confirmation when the running build is not itself a preview. The release itself is named as a maintainer test build and its body is a warning rather than generated notes: a changelog of unmerged branch history is not a changelog, and nightly and stable notes are unaffected because each series resolves its previous tag within its own channel. The hosted web app, AUR, and Discord announcements are skipped. Keep it; it costs nothing when idle.
22+
- manual `workflow_dispatch` with `channel=preview`, the maintainers' test train. It exercises the whole release flow (build, sign, notarize, smoke, publish) for a commit that end users must never receive, which is how an unmerged branch or a risky change gets a real release run before it lands. It builds the triggering commit with nightly's versioning under the `preview` prerelease identifier (`0.0.41-preview.<date>.<run>`) and leaves its GitHub prerelease as a draft, plus the npm packages under the `preview` dist-tag. It stays a draft because GitHub orders same-day releases by semver, so a public `preview` tag outranks `nightly` and a few previews push every nightly out of the 10-entry `releases.atom` that older nightly updaters read. Preview is not on the schedule, no default npm dist-tag points at it, its desktop builds carry no update feed, and no updater manifest (`latest*.yml`, `nightly*.yml`, blockmaps) is attached, so a stable or nightly install cannot be offered one. The only way onto it is downloading the draft by hand as a maintainer; `npx t3@preview`, `T3CODE_CHANNEL=preview`, and `t3 update --channel preview` cannot reach a draft's assets. Each of those paths prints a warning, and the CLI asks for confirmation when the running build is not itself a preview. The release itself is named as a maintainer test build and its body is a warning rather than generated notes: a changelog of unmerged branch history is not a changelog, and nightly and stable notes are unaffected because each series resolves its previous tag within its own channel. The hosted web app, AUR, and Discord announcements are skipped. Keep it; it costs nothing when idle.
2323
- A manual stable release builds the commit of the latest published nightly, not `main` HEAD.
2424
Nightly is the release candidate: verify the nightly, then promote it. Merges to `main` keep
2525
landing while you verify and never leak into the stable build.

0 commit comments

Comments
 (0)