Automatic Application Versioning

RMAG news

Benefits

Easy rollback to last working release
Automatic release workflow

Setup

npm install @changesets/cli && npx changeset init

Make sure your package.json includes the version field i.e version: “0.0.0” and private: true.

Then set privatePackages to { version: true, tag: true } in your .changesets/config.json

To create a version bump

npx changeset

which should prompt you to specify the type of change

patch – when you fix issues with an exiting release
minor – when you modify features that do not impact application function
major – when you’ve made changes that add new features or change exiting application functionality

See here for more information on semantic versioning

You’ll then be prompted to provide a message for the change.

To create a new version

npx changeset version

To publish the new version

npx changeset publish

Release setup

We’ll use the changeset github action. I’ll be using firebase for hosting in this example.

Github action

name: Release to Firebase
“on”:
push:
branches:
– master
jobs:
build_and_deploy:
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v3

– name: Install dependencies
uses: ./.github/actions/setup

# run tests before release
– run: pnpm test

– name: create release pull request
id: changesets
uses: changesets/action@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

# This step can be replace with your build script i.e `npm run build`, then push to your hosting provider
– uses: FirebaseExtended/action-hosting-deploy@v0
# only create a release to firebase if we have changes
if: steps.changesets.outputs.hasChangesets == ‘true’
env:
FIREBASE_CLI_EXPERIMENTS: webframeworks
with:
repoToken: “${{ secrets.GITHUB_TOKEN }}”
firebaseServiceAccount: “${{ secrets.FIREBASE_SERVICE_ACCOUNT }}”
channelId: live
projectId: <project-id>

This step does the following:

triggers your github action when you merge to master
creates a release PR based on your changesets, which when merged pushes to your desired hosting provider
then creates a tag that’s pushed to github.

cover image by Roman Synkevych on Unsplash

Leave a Reply

Your email address will not be published. Required fields are marked *