Publish canary versions of packages on CI/CD

This is a super-quick synopsis of how to automate the publishing of packages in a lerna monorepo.

The Problem

So you chose Lerna to solve some problem, and now you’re using a monorepo architecture and publishing packages to NPM as your model for sharing code. Congrats. Now you have a new problem: how to get dev versions of that latest code ASAP.

It’s super fucking annoying to publish packages from your local setup everytime you make a change that you need in a downstream repo or application.

The problem: how to automate the publishing of packages.

The Solution

Run this command from the root of your lerna monorepo on your CI/CD environment. There are two variables you need to add. In this example, I’m using environment variables, but you could use anything to ferry these valuables around.

  • $NPM_TOKEN - your personal NPM access token
  • $BRANCH - the name of the branch being pushed (could be $TRAVIS_BRANCH for example, if using travis)
$ echo "//$NPM_TOKEN" > ~/.npmrc # put NPM token into HOME
$ lerna publish prerelease --canary --exact --yes --dist-tag=$BRANCH --preid=$BRANCH

This will push a canary/prelease version of any of your packages which have changes.

The package is then available under a dist tag of the $BRANCH name. aka, if the $BRANCH is v3-feat-120, you will publish the package with version v1.1.0-v3-feat-120.1.

It’s super fucking annoying to have to always update the downstream package.json everytime that CI/CD runs, so that’s what the dist tag is for. With the dist-tag as v3-feat-120, you can use that in your package.json like so:

 "dependencies": {
   "@my-monorepo/cool-package": "v3-feat-120"

Therefore, if you push on this branch again, CI/CD will publish v1.1.0-v3-feat-120.2, but and dist tag v3-feat-120 will then change its resolution from v1.1.0-v3-feat-120.1 to v1.1.0-v3-feat-120.2.

Get it? Got it? Good.

© 2021