Zum Inhalt springen

Konfigurationsreferenz (.semrel.yaml) — Regeln, Scopes & Plugins

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).

Konfigurationswerte können Go-Templates mit Sprouts eingeschränkter env-Funktion verwenden:

tagPrefix: '{{ env "RELEASE_TAG_PREFIX" }}'

Es ist ausschließlich der Zugriff auf Umgebungsvariablen verfügbar. Shell-, Dateisystem-, Netzwerk- und andere Funktionen mit Seiteneffekten werden nicht registriert. Die ältere Syntax ${env.VAR_NAME} wird weiterhin unterstützt:

token: '${env.GITHUB_TOKEN}'

Beide Formen werden beim Laden der Konfiguration durch semrel ausgewertet, nicht durch GitHub Actions. Eine nicht definierte Umgebungsvariable führt zu einem Fehler beim Laden der Konfiguration.

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 # erzeugt Tags wie v1.2.3
tagPrefix: "" # erzeugt ausdrücklich Tags wie 1.2.3
WertStandardBeschreibung
nicht angegeben (null)vVerwendet v, wenn kein Präfix konfiguriert ist
beliebiger String einschließlich ""—Verwendet den konfigurierten Wert; "" deaktiviert das Präfix ausdrücklich

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
namestring—Branch-Name oder Glob-Muster (z. B. main, "*.x", release/*)
prereleasestring—Pre-Release-Bezeichner, der an die Version angehängt wird (z. B. beta → 1.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
hiddenbooleanneinHält passende Commits aus generierten Changelogs heraus, wendet ihren Version-Bump aber weiterhin an.

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 mit dem eingebauten Generator schreibt. Alle getrackten Änderungen des eingebauten Generators und der pre-tag-Plugins werden unmittelbar vor dem Release-Tag einmal gemeinsam committet.

commit_changelog: true # default
WertVerhalten
true (Standard)semrel schreibt CHANGELOG.md und nimmt sie in den einmaligen Release-Commit auf
falsesemrel überspringt das eingebaute Schreiben; ein pre-tag-Changelog-Plugin kann die Datei übernehmen, deren Änderungen im selben Release-Commit landen

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 (major → minor → patch), 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, generator, 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
generatorNach der Versionsberechnung und dem eingebauten Changelog, bevor Dateien aktualisiert oder committet werdengenerator-release-notes — SEMREL_CHANGELOG durch erzeugten Inhalt ersetzen
pre-tagNach der Changelog-Erzeugung, bevor Release-Änderungen committet und der git-Tag erstellt werdenupdater-go, updater-npm — versionierte Dateien aktualisieren, damit der getaggte Quellcode die Release-Version enthält
releaseNachdem der Tag erstellt wurde (Standard)Provider, Packager, Publisher und Hooks — Artefakte 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_COMMIT_HASHESJSON-Array vollständiger Commit-Hashes in derselben Reihenfolge wie SEMREL_COMMITS
SEMREL_CONTRIBUTORSJSON-Array der Contributor-Metadaten für das aktuelle Release-Fenster, nach Commit-Anzahl absteigend sortiert

Die Provider für GitHub, Gitea und Bitbucket kommentieren standardmäßig Pull Requests, die in einem Release enthalten sind. Der GitLab-Provider fügt entsprechend Notizen zu Merge Requests hinzu. Setze den Wert in args: auf false, um Kommentare zu deaktivieren:

ProviderArgument
@semrel/provider-githubcomment-on-prs: false
@semrel/provider-giteacomment-on-prs: false
@semrel/provider-bitbucketcomment-on-prs: false
@semrel/provider-gitlabcomment-on-mrs: false

Beispiel:

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

Der Provider nutzt SEMREL_COMMIT_HASHES, um zugehörige Pull Requests oder Merge Requests zu finden, und veröffentlicht anschließend einen Link zum Release. Ein versteckter Marker verhindert doppelte Kommentare zum selben Tag. Das konfigurierte Token muss Pull/Merge Requests lesen und Kommentare oder Notizen erstellen dürfen; plattformspezifische Berechtigungen stehen in der README des jeweiligen Providers.

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.