Das Release-Management ist oft eine Herausforderung, insbesondere bei Projekten mit häufigen Updates und verschiedenen Beteiligten. Durch die Implementierung eines optimierten Workflows mit Semantic-Release kann der Freigabeprozess vereinfacht und eine konsistente Versionierung und Verteilung sicherstellt werden.

Semantic-Release ist ein beliebtes Open-Source-Tool, mit dem die Versionierung und Veröffentlichung von Softwarepaketen automatisiert werden kann. Es folgt den Prinzipien der semantischen Versionierung, bei der Versionsnummern Informationen zu den Codeänderungen abbilden. Dank Semantic-Release können sich Entwickler*innen mehr auf das Schreiben von Codes konzentrieren und müssen sich weniger um die Verwaltung von Versionen kümmern.

Der Workflow

Schauen wir uns das Ganze nun etwas genauer an. Wir beginnen mit einer Einführung ins Thema und zeigen auf, welche Probleme mit Semantic-Release gelöst werden können. Bei der Arbeit an einem Softwareprojekt mit mehreren Entwickler*innen und häufigen Updates ist ein standardisierter Release-Prozess unerlässlich. Das manuelle Verwalten von Versionsnummern, das Erstellen von Changelogs und das Veröffentlichen auf verschiedenen Verteilungskanälen kann zeitaufwändig sein und zu Fehlern führen. Semantic-Release löst dieses Problem, indem es diese Aufgaben mithilfe vorab definierter Regeln und Commit Message Conventions automatisiert.

Zur Veranschaulichung des Workflows nehmen wir als Beispiel ein Node-Package-Projekt. Dieses Projekt folgt den Git-Branching-Konventionen, wobei die verschiedenen Branches unterschiedliche Entwicklungsstadien darstellen. Wir haben «feature»- oder «fix»-Branches für die laufende Entwicklung, einen «next»-Branch für die Vorbereitung des nächsten Releases und einen «main»-Branch für die stabile Produktionsversion. Die Verwendung eines «develop»-Branches ist auch üblich, aber in unserem Anwendungsfall können wir einfach eine veröffentlichte Pre-Release-Version als Abhängigkeit in unseren anderen Anwendungen installieren.

Projekt einrichten

Um Semantic-Release für unser Node-Package-Projekt zu konfigurieren, müssen zunächst die erforderlichen Abhängigkeiten installiert werden. Mit «npm» führen wir folgenden Befehl aus:

npm install semantic-release @semantic-release/changelog @semantic-release/git

Als nächstes konfigurieren wir Semantic-Release, indem eine release.config.js-Datei im Stammverzeichnis des Projekts erstellt wird. In dieser Konfigurationsdatei werden die Release-Regeln, Plugins und andere projektspezifische Einstellungen definiert.

Für die Verwendung des Einrichtungsassistenten und die Konfiguration selbst folgenden Befehl verwenden:

semantic-release-cli setup

Hier eine Beispielkonfiguration von release.config.js:

module.exports = {
  branches: [
    'main’,
    { name: 'next', prerelease: true },
    { name: 'develop', prerelease: 'beta' },
  ],
  plugins: [
    '@semantic-release/commit-analyzer',
    '@semantic-release/release-notes-generator',
    '@semantic-release/changelog',
    ['@semantic-release/git', {
      assets: ['CHANGELOG.md'],
    }],
    '@semantic-release/npm',
  ],
};

Auch die Verwendung einer releaserc-Datei ist möglich. In diesem Fall würde die Konfiguration wie folgt aussehen:

{
  "branches": [
    "main",
    { "name": "next", "prerelease": true },
    { "name": "develop", "prerelease": "beta" },
  ],
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    "@semantic-release/npm",
    [
      "@semantic-release/git",
      {
        "assets": ["package.json"],
        "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
      }
    ]
  ]
}

In dieser Konfiguration werden drei Branches definiert: «main» für stabile Releases, «next» für Pre-Releases und «develop» für die laufende Entwicklung. Ausserdem werden die Plugins festgelegt, die für die Commit-Analyse, die Erstellung von Release-Notes und Changelogs, die Veröffentlichung auf GitLab und die Veröffentlichung auf «npm» erforderlich sind.

Nach der Einrichtung von Semantic-Release können nun die Befehle verwendet werden, um den Release-Workflow zu automatisieren. Die folgenden Semantic-Release-Befehle werden am häufigsten verwendet:

semantic-release

Dieser Befehl leitet den Release-Prozess ein. Er analysiert die Commit-Historie, bestimmt die passende Version auf der Grundlage der semantischen Versionierungsregeln, erzeugt Release-Notes und Changelogs, aktualisiert die Package-Version und veröffentlicht den Release auf dem angegebenen Verteilungskanal.
In der Regel wird vor der Veröffentlichung ein Testlauf durchgeführt. Zu diesem Zweck wird nach dem Befehl die Option «--dry-run» verwendet oder in der obigen Konfiguration eine dryRun-Eigenschaft auf «true» gesetzt.

semantic-release-cli setup 

Dieser Befehl führt durch einen Einrichtungsassistenten, der beim Erstellen der «release.config.js»-Datei und der Konfiguration von Semantic-Release für das Projekt behilflich ist.

CI-Service einrichten

Zusätzlich zu den Befehlen verbessert die Integration von Semantic-Release mit Continuous-Integration (CI) den Release-Automatisierungsprozess weiter. Durch das Auslösen von Semantic-Release bei bestimmten Ereignissen – beispielsweise beim Verschieben von Änderungen in bestimmte Branches oder beim Mergen von Pull-Requests – kann man sicherstellen, dass Releases automatisch ausgelöst und bereitgestellt werden.

Wenn man beispielsweise gängige CI-Services wie Travis CI oder GitHub Actions verwendet, kann man seine CI-Pipeline so konfigurieren, dass der Semantic-Release-Befehl nach erfolgreichen Builds auf den entsprechenden Branches ausgeführt wird. Auf diese Weise wird Semantic-Release immer dann ausgelöst, wenn neue Änderungen gemergt werden, wodurch der Release-Prozess automatisiert wird.

Weitere Informationen zur Konfiguration mit verschiedenen CI-Services sind in der Semantic-Release-Dokumentation zu finden.

Nach Abschluss der Konfiguration analysiert Semantic-Release automatisch die Commits, bestimmt die nächste geeignete Version anhand der semantischen Versionierungsregeln, erstellt Release-Notes und Changelogs, aktualisiert die Package-Version und veröffentlicht den Release über die angegebenen Verteilungskanäle.

Fazit

Zusammenfassend lässt sich sagen, dass sich komplexe Release-Prozesse im Rahmen von Softwareprojekten durch die Einführung eines Entwicklungsworkflows mit Semantic-Release automatisieren und vereinfachen lassen. Bei entsprechender Konfiguration übernimmt Semantic-Release die Versionierung, die Erstellung von Changelogs sowie die Veröffentlichung. So können sich die Entwickler*innen auf das Schreiben von Codes konzentrieren und einen reibungslosen Release-Zyklus gewährleisten.

Anhand dieses Beispiels wird ersichtlich, wie Semantic-Release für ein Beispielprojekt konfiguriert wird und welche Vorteile es bei der Verwaltung komplexer Release-Workflows bietet. Indem man die Konventionen und Best Practices von Semantic-Release befolgt, kann man seinen Entwicklungsprozess erheblich verbessern und problemlos hochwertige Software bereitstellen.

Nicht vergessen: Die Konfiguration muss an die spezifischen Projektanforderungen und Verteilungskanäle angepasst werden. Mit Semantic-Release als Teil des Entwicklungs-Toolkits lassen sich Release-Prozesse effizienter, einheitlicher und reibungsloser gestalten.

In der Semantic-Release-Dokumentation sind weitere Informationen und Anleitungen für verschiedene Setups und Verwendungszwecke zu finden.