Zum Inhalt springen

Konfiguration

Das gesamte Verhalten von semrel wird über eine einzige Konfigurationsdatei im Wurzelverzeichnis deines Repositorys gesteuert. Mit --config kannst du einen anderen Pfad angeben.

semrel findet die Konfigurationsdatei automatisch in dieser Reihenfolge:

DateiFormat
.semrel.yaml / .semrel.ymlYAML
.semrel.tomlTOML
.semrel.jsonJSON

YAML verwendet für einige Schlüssel camelCase (z. B. tagPrefix). TOML und JSON verwenden immer snake_case (z. B. tag_prefix).

tagPrefix: v
branches:
- name: main
- name: "*.x"
maintenance: true
- name: next
prerelease: beta
rules:
- type: feat
bump: minor
- type: fix
bump: patch
- type: perf
bump: patch
- type: revert
bump: patch
commit_changelog: true
tag_exists_strategy: update-changelog
version_ceiling: "1.0.0"
ceiling_strategy: clamp
plugins:
- uses: @semrel/condition-github-actions
phase: condition
- uses: @semrel/provider-github
phase: release
args:
token: ${{ env.GITHUB_TOKEN }}
owner: MyOrg
repo: my-repo
- uses: gobinary
phase: pre-tag
args:
file: internal/version/version.go
var_name: Version
- uses: @semrel/hook-slack
args:
webhook_url: ${{ env.SLACK_WEBHOOK }}

Das Präfix wird beim Erstellen von git-Tags vor die Versionsnummer gesetzt.

tagPrefix: v # creates tags like v1.2.3 (default)
tagPrefix: "" # creates tags like 1.2.3
WertStandardBeschreibung
beliebiger StringvWird jedem Tag vorangestellt, den semrel erstellt

Eine Liste von Branches, aus denen Releases erstellt werden dürfen. Commits auf nicht aufgeführten Branches werden ignoriert.

branches:
- name: main
- name: "*.x"
maintenance: true
- name: next
prerelease: beta
FeldTypStandardBeschreibung
namestringBranch-Name oder Glob-Muster (z. B. main, "*.x", release/*)
prereleasestringPre-Release-Bezeichner, der an die Version angehängt wird (z. B. beta1.0.0-beta.1)
maintenanceboolfalseBeschränkt diesen Branch auf reine Patch-Bumps. Wird auch automatisch aus Mustern wie N.x / N.M.x erkannt

Ordnet Conventional-Commit-Typen (und optional Scopes) SemVer-Bump-Stufen zu. Wenn du rules: weglässt, verwendet semrel die eingebauten Standardwerte.

rules:
- type: feat
bump: minor
- type: fix
bump: patch
- type: perf
bump: patch
- type: revert
bump: patch
FeldTypErforderlichBeschreibung
typestringjaConventional-Commit-Typ (z. B. feat, fix, deps)
scopestring | falseneinScope-Filter. Ein String matcht nur Commits mit exakt diesem Scope. false matcht nur Commits ohne Scope. Weglassen matcht jeden Scope.
bumpstringjaEiner von major, minor, patch

Das optionale Feld scope ermöglicht es, Commits anhand ihres Scopes einem bestimmten Bump-Level zuzuordnen. Das ist nützlich, wenn Tools wie Renovate oder eigene Workflows den gewünschten Bump im Scope kodieren.

Beispiel: deps(major): …, deps(minor): … und deps(patch): … als unterschiedliche Release-Level behandeln:

rules:
- type: deps
scope: major
bump: major
- type: deps
scope: minor
bump: minor
- type: deps
scope: patch
bump: patch
- type: feat
bump: minor
- type: fix
bump: patch

Matching-Verhalten:

  • Eine Regel mit String-Scope greift nur bei Commits, bei denen Typ und Scope exakt übereinstimmen.
  • Eine Regel mit scope: false greift nur bei Commits dieses Typs, die keinen Scope tragen.
  • Eine Regel ohne scope greift bei Commits dieses Typs unabhängig von deren Scope.
  • Der höchste Bump-Level aller passenden Regeln gewinnt.
  • (type, scope)-Kombinationen müssen eindeutig sein — zwei Regeln für die gleiche Kombination sind ein Konfigurationsfehler.

Wenn rules: fehlt, verwendet semrel:

TypBump
featminor
fixpatch
perfpatch
revertpatch

Commit-Typen, die nicht in rules aufgeführt sind, erzeugen kein Release.

Steuert, ob semrel CHANGELOG.md vor dem Erstellen des Release-Tags zurück ins Repository committet.

commit_changelog: true # default
WertVerhalten
true (Standard)semrel schreibt CHANGELOG.md, committet die Datei als chore(changelog): update for vX.Y.Z [skip ci] und erstellt dann den Tag auf diesem Commit
falsesemrel schreibt CHANGELOG.md lokal, committet sie aber nicht (praktisch, wenn du den Changelog extern verwaltest)

Steuert, was semrel macht, wenn der berechnete Tag der nächsten Version lokal bereits existiert.

tag_exists_strategy: update-changelog # default
StrategieVerhalten
update-changelog (Standard)Aktualisiert und committet CHANGELOG.md für die vorhandene Version und beendet sich dann ohne Fehler. Idempotent — praktisch für Reparaturläufe.
skipBeendet sich stillschweigend ohne Änderungen.
errorBeendet sich mit einem Exit-Code ungleich null. Verwende das, wenn du strikte One-Shot-Pipelines willst.

Beispielszenario: Du hast v0.1.0 manuell erstellt, um das Projekt zu bootstrappen. Der nächste Pipeline-Lauf erkennt, dass der Tag bereits existiert, und erzeugt mit der Standardstrategie den Changelog für diese Version neu und committet ihn — es wird kein doppeltes Release erstellt.

Verhindert, dass semrel auf oder oberhalb dieser Version releast. Praktisch, wenn du ein Projekt unter 1.0.0 halten willst, bis du es bewusst auf stabil hebst.

version_ceiling: "1.0.0"
ceiling_strategy: clamp
WertEffekt
Nicht gesetztKeine Obergrenze — semrel erhöht frei
"1.0.0"Releases sind niemals >= 1.0.0

Steuert, was passiert, wenn die berechnete nächste Version version_ceiling erreichen oder überschreiten würde.

StrategieVerhalten
clampStuft den Bump herunter (majorminorpatch), bis die Version unter der Obergrenze bleibt. Schreibt eine Warnung ins Log.
skipTut nichts — gibt einen Hinweis aus und beendet sich ohne Release.
errorBeendet sich mit einem Exit-Code ungleich null, sodass die Pipeline explizit fehlschlägt.

Beispiel: aktuell 0.9.5, Breaking-Change-Commit, Obergrenze 1.0.0

  • clamp → releast 0.9.6 (auf patch heruntergestuft)
  • skip → kein Release, Exit 0
  • error → kein Release, Exit 1

Um die Obergrenze zu überschreiten, entferne version_ceiling aus deiner Konfigurationsdatei oder setze sie höher und committe die Änderung.

Eine geordnete Liste von Plugins, die für die Release Pipeline geladen werden.

FeldTypErforderlichBeschreibung
usesstringja*Plugin-Typ oder Installationsname. semrel löst ihn zu semrel-plugin-<uses> auf
namestringneinOptionaler Instanzbezeichner (praktisch, wenn dasselbe Plugin mehrfach vorkommt)
pathstringneinExpliziter Pfad zu einer Plugin-Binärdatei (überschreibt die Auflösung über uses)
argsmapneinBeliebige Schlüssel-Wert-Paare, die als SEMREL_PLUGIN_*-Umgebungsvariablen an das Plugin übergeben werden
phasestringneinWann es ausgeführt wird: condition, pre-tag oder release (Standard)

*Entweder uses oder path muss gesetzt sein.

PhaseWann sie läuftTypische Verwendung
conditionNach dem Laden der Konfiguration, vor jeder Commit-Analyse oder Tag-Erstellunggithub-actions, gitlab-ci — abbrechen, wenn die Umgebung nicht passt
pre-tagNach Versionsberechnung und Changelog-Schreiben, bevor der git-Tag erstellt wirdgobinary — Versionsdatei aktualisieren und committen, damit der getaggte Quellcode die echte Version enthält
releaseNachdem der Tag erstellt wurde (Standard)github, hook-slack, updater-npm — veröffentlichen und benachrichtigen
plugins:
# Gate: abort if not running in GitHub Actions
- uses: @semrel/condition-github-actions
phase: condition
# Pre-tag: update Go version variable before tagging
- uses: gobinary
phase: pre-tag
args:
file: internal/version/version.go
var_name: Version
# Release: create GitHub release with changelog
- uses: @semrel/provider-github
phase: release # default, can be omitted
args:
token: ${{ env.GITHUB_TOKEN }}
owner: MyOrg
repo: my-repo
# Hook: notify Slack after release
- uses: @semrel/hook-slack
args:
webhook_url: ${{ env.SLACK_WEBHOOK }}

Wenn path: fehlt, löst semrel Plugins in dieser Reihenfolge auf:

  1. ~/.semrel/plugins/semrel-plugin-<uses>
  2. semrel-plugin-<uses> aus $PATH

Verwende path:, wenn du eine bestimmte lokale Binärdatei statt des Standard-Discovery-Flows pinnen willst.

Jeder Schlüssel in args: wird dem Plugin-Prozess als Umgebungsvariable mit dem Präfix SEMREL_PLUGIN_ bereitgestellt.

plugins:
- uses: @semrel/provider-github
args:
token: ${{ env.GITHUB_TOKEN }}
owner: MyOrg
repo: my-repo

Das Plugin erhält:

KonfigurationsschlüsselUmgebungsvariable
tokenSEMREL_PLUGIN_TOKEN
ownerSEMREL_PLUGIN_OWNER
repoSEMREL_PLUGIN_REPO

Plugins erhalten den Release-Kontext außerdem über Standard-Umgebungsvariablen:

VariableBeschreibung
SEMREL_CURRENT_VERSIONDie Version vor diesem Release
SEMREL_NEXT_VERSIONDie neue Version, die releast wird
SEMREL_TAG_NAMEDer vollständige Tag-Name inklusive Präfix (z. B. v1.2.3)
SEMREL_CHANGELOGGenerierter Changelog-/Release-Notes-Text
SEMREL_DRY_RUNtrue, wenn semrel mit --dry-run aufgerufen wurde
SEMREL_COMMITSJSON-Array der rohen Commit-Messages im aktuellen Release-Fenster
SEMREL_CONTRIBUTORSJSON-Array der Contributor-Metadaten für das aktuelle Release-Fenster, nach Commit-Anzahl absteigend sortiert

semrel-Plugins sind einfache ausführbare Dateien, die als Unterprozesse gestartet werden. Sie verwenden kein gRPC.


Die semrel Registry stellt JSON Schema-Dokumente für .semrel.yaml und jedes Plugin bereit. Wenn du einen $schema-Kommentar hinzufügst, bekommst du Inline-Validierung und Autovervollständigung in VS Code, JetBrains IDEs, Neovim (mit LSP) und jedem anderen Editor, der yaml-language-server unterstützt.

Füge den $schema-Kommentar als erste Zeile deiner .semrel.yaml hinzu:

# yaml-language-server: $schema=https://registry.semrel.io/schemas/core/v1.json
schemaVersion: 1
tagPrefix: "v"
plugins:
- uses: @semrel/analyzer-conventional
- uses: @semrel/generator-changelog-md
- uses: @semrel/provider-github

Dein Editor markiert jetzt unbekannte Schlüssel, warnt vor fehlenden Pflichtfeldern und bietet Autovervollständigung für alle bekannten Optionen.

Jeder args:-Block eines Plugins kann unabhängig validiert werden. Platziere den Schema-Kommentar direkt über dem args:-Schlüssel:

# yaml-language-server: $schema=https://registry.semrel.io/schemas/core/v1.json
plugins:
- uses: @semrel/provider-github
# yaml-language-server: $schema=https://registry.semrel.io/schemas/plugins/provider-github/latest.json
args:
token: ${{ env.GITHUB_TOKEN }}
owner: MyOrg
repo: my-repo
RessourceURL
Core-Konfigurationhttps://registry.semrel.io/schemas/core/v1.json
Plugin (nach Name)https://registry.semrel.io/schemas/plugins/{name}/v1.json
Plugin (neueste Version)https://registry.semrel.io/schemas/plugins/{name}/latest.json
Plugin mit Namespacehttps://registry.semrel.io/schemas/plugins/@semrel/{name}/v1.json

latest.json leitet immer (HTTP 301) auf die neueste stabile Schema-Version weiter.

Wenn du eine private semrel-registry-Instanz betreibst, ersetze registry.semrel.io durch deine eigene Basis-URL:

# yaml-language-server: $schema=https://my-registry.example.com/schemas/core/v1.json

Du kannst deine Konfiguration mit semrel config validate auch gegen das veröffentlichte Schema validieren:

Terminal-Fenster
semrel config validate
# ✓ Config is valid (schema version 1)

Die vollständige Befehlsreferenz findest du unter semrel config.