Release with changesets and the shared toolchain, not np - #122
Conversation
✅ Deploy Preview for react-datocms-example canceled.
|
RELEASE.md for this family of repos prescribed a bare `np patch` - literally always patch, decided on release day. The changelog here shows what that costs: the last entry is 7.2.0, and the package is at 8.1.1. Changesets moves the bump level into the PR that makes the change, and writes the changelog from it. The release script is @datocms/release-toolchain, the same one the four monorepos run, installed by git tag and never published to npm. It reads the release branch from .changeset/config.json, so 'master' here needs no special case, and in a repo that is one package it tags vX.Y.Z, which is what np tagged too. CHANGELOG.md loses its keep-a-changelog preamble first: changesets inserts new entries after line 1, so the boilerplate would have ended up below the newest entry and sunk further with every release. Claude-Session: https://claude.ai/code/session_01XaYAhzmiJwysZeq1XC5xrQ
fdd4d46 to
071e5a5
Compare
commit: |
Rehearsing the resume against a real registry and a real GitHub repo turned up a bug that every copy of the old script had: killed between 'changeset publish' and 'git push', the next run reads an empty plan - the packages are on the registry and their tags are local, which is all changesets looks at - and aborts with 'there is nothing to release', leaving the commit unpushed and no GitHub release. v1.1.0 finishes that release. Claude-Session: https://claude.ai/code/session_01XaYAhzmiJwysZeq1XC5xrQ
This repo's root is the published package, so 'npm publish' typed at the repo root reaches the registry: it skips the tests, the changelog, the tag and the GitHub release, and npm takes it whenever the working tree carries a version the registry has not seen. Today a clean checkout carries the version already published, so the registry answers 403 - a side effect, not a decision, and it stops holding the moment somebody bumps by hand. prepublishOnly now runs 'release-toolchain --assert-release', which passes only while the release script is the one publishing. 'npm pack' runs prepack instead, so reading a tarball still works and the pkg-pr-new previews, which pack rather than publish, are untouched. Also moves the toolchain pin to v1.2.0. The lockfile is the substantive half of that: changing the spec alone left the previous SHA resolved, so 'npm ci' kept installing v1.0.0 while package.json claimed otherwise. Claude-Session: https://claude.ai/code/session_01XaYAhzmiJwysZeq1XC5xrQ
One more commit:
|
This repo released with
np, via a two-lineSDKs/RELEASE.mdthatprescribed a bare
np patch— literally alwayspatch, decided on release day.The changelog shows what that costs: its last entry is
7.2.0, and the packageis at
8.1.1.Changesets moves the bump level into the PR that makes the change, and writes
the changelog from it. The release script is
@datocms/release-toolchain—the same one the four DatoCMS monorepos now run, installed from its repository
by git tag and never published to npm.
The tags do not change. In a repo that is one package, changesets tags
vX.Y.Z, which is exactly whatnptagged, sogit describeand the existingtag history carry on unbroken. The release branch, which this repo spells
master, is read from.changeset/config.json→baseBranchrather thanhard-coded — verified against this branch:
This is the last of the eleven repos to move, and deliberately so: it is the
highest-traffic one, and by the time it lands the toolchain will have cut real
prereleases in six others.
What changed
.changeset/added:config.json(baseBranch: master,access: public) andthe standard
README.mdexplaining the bump levels.@changesets/cliand@datocms/release-toolchainadded;npremoved — itwas pinned at five different versions across these seven repos, with zero
configuration anywhere, so nothing is lost.
changeset,releaseandrelease:nextscripts. The release script must notbe called
publish: this repo's root is the published package, sochangeset publish→npm publishwould run apublishscript and therelease would re-enter itself.
CHANGELOG.mdadded tofiles, so the changelog ships with the package.CHANGELOG.mdloses its keep-a-changelog preamble. Changesets inserts newentries after line 1, so the boilerplate would have ended up below the newest
entry and sunk further with every release. Line 1 is now the package name.
How to try it
The first release should be a prerelease, which is real in every way except the
dist-tag:
latestis untouched and the GitHub release is marked as a prerelease.One thing worth knowing
preparehere runsnpm run test && npm run build, and npm firesprepareagain inside
npm publish, so the tests run twice during a release (and on everyordinary
npm install). Not a blocker and not changed here — moving them toprepackis a reasonable follow-up.https://claude.ai/code/session_01XaYAhzmiJwysZeq1XC5xrQ