How to Release Each Package With multi-semantic-release
multi-semantic-release runs semantic-release across every workspace package, so each gets its own commit-driven version, tag, and changelog in one pass.
Plain semantic-release assumes one package per repo. multi-semantic-release discovers workspace packages, runs a semantic-release cycle for each, and coordinates interdependent bumps so dependents pick up their dependency updates.
Steps
- Install
multi-semantic-releaseandsemantic-releaseat the root. - Add a shared
release.config.jswith the plugin chain. - Run
multi-semantic-releasein CI on the release branch. - Provide
GITHUB_TOKENandNPM_TOKENfor tagging and publishing.
release.config.js
release.config.js
module.exports = {
branches: ['main'],
plugins: [
'@semantic-release/commit-analyzer',
'@semantic-release/release-notes-generator',
'@semantic-release/changelog',
'@semantic-release/npm',
'@semantic-release/github'
]
};Workflow
.github/workflows/release.yml
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npx multi-semantic-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}Gotchas
- Tags are per package (for example
@acme/ui@2.3.0), so avoid a repo-widevX.Y.Ztag convention. - A dependency bump can cascade a patch to its dependents; multi-semantic-release orders these for you.
Related guides
How to Drive nx release Versions From Conventional CommitsLet nx release compute each package version bump from conventional commit types by enabling conventionalCommi…
How to Bump Dependent Packages When a Dependency ChangesKeep internal package interdependencies correct by bumping dependents when a dependency releases, using the u…