Semantic Releases mit GitHub Actions

Durch den Einsatz von Conventional Commits und Semantic Versioning lässt sich einfach ein automatischer Releaseprozess für Software Projekte umsetzen. Mit GitHub Actions kann der gesamte Prozess zur Versionsermittlung und Veröffentlichung serverless abgebildet werden und möglichst nah am Quellcode verwalten.

Was ist Semantic Versioning?

Die Diskussionen zu Versionierung und Release sind vermutlich so alt wie die Entwicklung von Software. Viele Projekte nutzen ein eigenes Schema zur Versionsgebung und so werden die üblichen Diskussionen in Entwicklerteams dazu nicht abnehmen. Nutzt man Semantic Versioning als einheitliches Schema, lassen sich dies meist vermeiden.

Das Semantic Versioning basiert auf dem Format MAJOR.MINOR.PATCH und definiert die Elemente wie folgt:

  • MAJOR wird erhöht, wann immer breaking changes einführt werden;
  • MINOR wird erhöht, wenn abwärtskompatibel neue Funktionalitäten hinzugefügt wurden;
  • PATCH wird erhöht, wenn abwärtskompatibel Fehler beseitigt werden.

Was sind Conventional Commits?

Neben der Diskussion zur Versionierung, sehen wir bei Projekten regelmäßig Unterhaltungen zu Format und Inhalt von Commit Messages bei der Entwicklung. Auch hier gibt es seit einiger Zeit ein einheitliches Schema was viele Projekte und Teams verwenden: Convential Commits.

Eine Commit Message nach Convential Commits basiert auf dem Schema <type>[optional scope]: <description>; durch den Einsatz von einheitlichen Werten für type lässt sich ein Rückschluss auf die Art der Änderung bilden:

  • fix kennzeichnet eine Fehlerbeseitigung;
  • feat beschreibt eine neue Funktionalität;
  • Angaben wie build:, chore:, ci:, docs:, style:, refactor:, perf: oder test: kennzeichnen sonstige Änderungen am Quellcode.

Diese Unterteilung ist wichtig um Conventional Commits mit Semantic Versioning zu verknüpfen. Durch eine Automatisierung am Quellcode lässt sich so auf Basis der Commit Messages ermitteln, ob und wie die Version des Projekts erhöht werden muss:

Durch fix: wird eine neue PATCH Version notwendig; ein feat: erfordert eine neue MINOR Version und mit dem Hinweis BREAKING CHANGE wird eine neue MAJOR Version notwendig.

Automatisierung mit GitHub Actions

Werden Conventional Commits für ein Projekt genutzt, lässt sich durch eine Automatisierung am Quellcode ein automatischer Releaseprozess abbilden. Liegt der Quellcode bei GitHub, sind GitHub Actions eine gute Wahl für nahtlose Integrationen.

Durch die folgende Konfigurationsdatei (z.B. version.yml) im Ordner .github/workflows lässt sich bei jedem push in den Branch main die Aktion zum Ermitteln der neuen Version integrieren:

name: Version

on:
  push:
    branches: ["main"]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Semantic Release
        uses: cycjimmy/semantic-release-action@v2
        id: semantic
        with:
          extra_plugins: |
            @semantic-release/git
            @semantic-release/changelog            
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

Die GitHub Action cycjimmy/semantic-release-action analysiert nach dem Checkout die vorhanden Commits und berechnet danach die neue Version. Durch die Angabe eines GitHub Tokens kann der Quellcode mit einem entsprechenden git tag versehen werden und ein Release in GitHub erstellt werden. Der NPM_TOKEN kann optional genutzt werden, um ein Paket bei NPM zu veröffentlichen.

Sebastian ist Senior Cloud Consultant bei superluminar GmbH, AWS Serverless Hero und AWS Certified Solutions Architect. Er schreibt hier auf Deutsch über AWS, Serverless, Software Entwicklung, Go, TypeScript und React. Englische Artikel sind auf seiner Webseite sbstjn.com oder auf Twitter unter @sbstjn zu finden.