Automating Semantic Versioning with GitHub Actions

In the fast-paced world of software development, maintaining a clear and consistent versioning strategy is crucial. Semantic Versioning (SemVer) provides a standardized way to communicate changes in your software, but manually managing version numbers can be tedious and error-prone. In this article, we will explore how to automate semantic versioning using GitHub Actions, allowing you to focus more on coding and less on version management.

What is Semantic Versioning?

Semantic Versioning is a versioning scheme that uses a three-part number format: MAJOR.MINOR.PATCH. Each component has specific rules for incrementing:

  • MAJOR: Incremented for incompatible API changes.

  • MINOR: Incremented for adding functionality in a backwards-compatible manner.

  • PATCH: Incremented for backwards-compatible bug fixes.

By following these conventions, developers can quickly understand the nature of changes in new releases.

Why Automate Semantic Versioning?

Automating semantic versioning helps to:

  • Reduce Errors: Minimize human mistakes in version increments.

  • Enhance Consistency: Ensure that all team members follow the same versioning strategy.

  • Streamline CI/CD Pipelines: Integrate version management into your continuous integration and deployment processes seamlessly.

Setting Up GitHub Actions for Automated Versioning

Step 1: Create Your Workflow File

To automate semantic versioning, you need to create a GitHub Actions workflow. Here's an example of what your workflow file (.github/workflows/versioning.yml) might look like:

textname: Automate Semantic Versioning

on:
  push:
    branches:
      - main

jobs:
  semantic-versioning:
    runs-on: ubuntu-latest

    steps:
      # Checkout the repository
      - name: Checkout Code
        uses: actions/checkout@v3

      # Automate version bumping
      - name: Bump Semantic Version
        id: version
        uses: anothrNick/github-tag-action@v1.37.0
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      # Use the calculated version
      - name: Display New Version
        run: echo "New version created: ${{ steps.version.outputs.version }}"

Step 2: Commit Message Conventions

For this automation to work effectively, you must follow Conventional Commits in your commit messages. Here are some examples:

  • feat: add new feature (increments MINOR)

  • fix: correct a bug (increments PATCH)

  • BREAKING CHANGE: change API endpoint (increments MAJOR)

Step 3: Trigger the Workflow

Whenever you push changes to the main branch, this workflow will trigger automatically. The action will read your commit messages, determine the appropriate version bump, and create a new tag in your repository.

Example Scenario

Let’s say you have the following commit history:

  1. feat: implement user login

  2. fix: resolve session timeout issue

  3. BREAKING CHANGE: update authentication method

After pushing these commits, the workflow will analyze them and determine that:

  • The first commit increments the MINOR version from 1.0.0 to 1.1.0.

  • The second commit increments the PATCH version from 1.1.0 to 1.1.1.

  • The third commit increments the MAJOR version from 1.1.1 to 2.0.0.

The final output will show that the new version is v2.0.0, and it will be tagged in your repository.