Skip to content
Latchkey

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-release and semantic-release at the root.
  • Add a shared release.config.js with the plugin chain.
  • Run multi-semantic-release in CI on the release branch.
  • Provide GITHUB_TOKEN and NPM_TOKEN for 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-wide vX.Y.Z tag convention.
  • A dependency bump can cascade a patch to its dependents; multi-semantic-release orders these for you.

Related guides

Run this faster and cheaper on Latchkey managed runners. Start free →