Automate your releases on GitHub.
So, what are releases?
Packaging/bundling software and making it available for a broader audience for download and use.
Why use them?
To distribute the software (Binary distribution).
To keep track of type and amount of changes.
To follow Semantic versioning practices.
To go back in time and use the previous version.
It looks professional.
Why automate releases?
Creating a release manually can be a little tricky and challenging at the same time. Using a GitHub workflow with a few lines of the YAML, we can automate that task and focus more on development. Alongside, it also generates a changelog file (CHANGELOG.md
) and tags.
Picture - EddieHubCommunity/LinkFree repo.
Using the workflow.
Create a .github
folder inside the root of the repo. Create a folder name workflows
inside the .github
folder. Then create a releases.yml
file by adding the YAML config provided below inside the workflows
folder.
- Complete path will be
.github/workflows/releases.yml
YAML Config:
name: Releases
on:
push:
branches:
- main
jobs:
changelog:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: conventional Changelog Action
id: changelog
uses: TriPSs/conventional-changelog-action@v3
with:
github-token: ${{ secrets.github_token }}
- name: create release
uses: actions/create-release@v1
if: ${{ steps.changelog.outputs.skipped == 'false' }}
env:
GITHUB_TOKEN: ${{ secrets.github_token }}
with:
tag_name: ${{ steps.changelog.outputs.tag }}
release_name: ${{ steps.changelog.outputs.tag }}
body: ${{ steps.changelog.outputs.clean_changelog }}
Understanding the config
- To automatically trigger a workflow on some events, we use the
on:
property. In this case, action will get triggered when the changes are pushed to themain
branch. We can also modify the branch according to our preferences
on:
push:
branches:
- main
- We will be running the workflow on Ubuntu OS. We can also change that
jobs:
changelog:
runs-on: ubuntu-latest
- Here we are using two Actions. The
checkout
action will be used to checkout and go inside the repo, and theconventional-changelog-action
will look for conventional commits. It will also create a changelog file.
By default, GitHub provides a default token github_token
. We can also use a Personal access token.
steps:
- uses: actions/checkout@v2
- name: conventional Changelog Action
id: changelog
uses: TriPSs/conventional-changelog-action@v3
with:
github-token: ${{ secrets.github_token }}
- Here, we are using the
create-release
action, which will create an auto release for us depending on the convention of the commit used
It will auto-set the body and the release commit naming.
- name: create release
uses: actions/create-release@v1
if: ${{ steps.changelog.outputs.skipped == 'false' }}
env:
GITHUB_TOKEN: ${{ secrets.github_token }}
with:
tag_name: ${{ steps.changelog.outputs.tag }}
release_name: ${{ steps.changelog.outputs.tag }}
body: ${{ steps.changelog.outputs.clean_changelog }}
Working
To make the workflow create the automated releases. We need to follow some commit conventions - Conventional Commits. Depending upon the convention used, it will version the new release.
fix:
Will bump the last digit - patch.feat
- Will bump the middle digit - minorBREAKING CHANGE:
- It will bump the first digit by - major
I have also written a blog on Conventional Commits. You can check out that - Getting started with Conventional Commits
We are now all set. Now, when we create a commit with the proper convention, it will do all the magic for us.
That's the end of the blog. Thank you for reading it.
Subscribe to my newsletter
Read articles from Pradumna Saraf directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
Pradumna Saraf
Pradumna Saraf
Pradumna is a Developer Advocate, Docker Captain, and a DevOps and Go Developer. He is passionate about Open Source and has mentored hundreds of people to break into the ecosystem. He also creates content on X (formerly Twitter) and LinkedIn, educating others about Open Source and DevOps tools. Pradumna enjoys engaging with people in person and delivering talks.