Migration in ~15 Minuten
- semantic-release-Konfiguration aus
package.jsonentfernen - semrel installieren
semrel release --dry-runausführen — die Ausgabe sollte deinen bisherigen Releases entsprechen
Der Markt für Release-Automatisierung bietet mehrere etablierte Tools. Diese Seite gibt dir die Informationen, um das richtige zu wählen — oder von deinem bisherigen Tool zu migrieren.
| semrel | semantic-release | goreleaser | release-please | release-it | changesets | |
|---|---|---|---|---|---|---|
| Runtime | Keine | Node.js + npm | Keine | Node.js + npm | Node.js + npm | Node.js + npm |
| Installationsgröße | ~12 MB | ~350 MB | ~45 MB | ~300 MB | ~200 MB | ~150 MB |
| Air-gap-fähig | ✅ Nativ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Kaltstart-Overhead | ~0 ms | 30–60 s (Node-Setup) | ~0 ms | 30–60 s | 30–60 s | 30–60 s |
| semrel | semantic-release | goreleaser | release-please | release-it | changesets | |
|---|---|---|---|---|---|---|
| Auto-SemVer aus Commits | ✅ | ✅ | ❌ tag-basiert | ✅ | ✅ | ❌ manuell |
| Conventional Commits | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
| Scope-basierte Bump-Regeln | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Monorepo-Unterstützung | ✅ Kostenlos | ✅ | ✅ | ✅ | ✅ | ✅ |
| Plugin-Sprache | Beliebige Binärdatei | Nur JS | Go (eingebaut) | Fest vorgegeben | Nur JS | Nur JS |
| semrel | semantic-release | goreleaser | release-please | release-it | changesets | |
|---|---|---|---|---|---|---|
| Signierte Releases (Cosign) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| SBOM (CycloneDX/SPDX) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| SLSA-Provenienz | ✅ Level 1 | ❌ | ✅ | ❌ | ❌ | ❌ |
| npm-Supply-Chain-Risiko | Keines | Hoch (400+ Deps) | Keines | Mittel | Mittel | Mittel |
| Air-gapped Pipelines | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| semrel | semantic-release | goreleaser | release-please | release-it | changesets | |
|---|---|---|---|---|---|---|
| Lizenz | Apache 2.0 | MIT | MIT / Pro kostenpflichtig | Apache 2.0 | MIT | MIT |
| Kostenloser Monorepo | ✅ | ✅ | ✅ OSS | ✅ | ✅ | ✅ |
| Enterprise-Features | Kostenlos | Kostenlos | 3.300 $/Jahr | Kostenlos | Kostenlos | Kostenlos |
| GitHub Stars | — | ~23,7k | ~15,6k | ~7,1k | ~12,2k | ~8,4k |
semantic-release ist der Pionier der commit-getriebenen semantischen Versionierung und wird in tausenden Enterprise-Pipelines weltweit eingesetzt. semrel wurde entwickelt, um dieses Verhalten ohne den Runtime-Overhead zu replizieren.
Die Integration von semantic-release in eine Go-, Rust- oder C++-Pipeline erfordert:
# Jeder Pipeline-Job braucht das:actions/setup-node@v4 # 30–60 Sekunden auf kalten Runnernnpm install -g semantic-release # 28+ direkte Deps, 400+ transitiveIn einer minimalen Alpine-Linux- oder Docker-in-Docker-Umgebung bedeutet das eine vollständige Node.js-Runtime in einen Container zu ziehen, der sonst nur ein Go-Toolchain enthält.
semrel ersetzt den gesamten Block durch:
curl -L https://github.com/SemRels/semrel/releases/latest/download/semrel_linux_amd64.tar.gz | tar -xz./semrel releasesemantic-release ist bekannt dafür, in Repositories mit vielen Tags und Branches zu zeitüberschreiten. Bei 460 Tags und 65 Branches wurden Ausführungszeiten von über 35 Minuten gemeldet — wegen sequenzieller Git-History-Traversierung und API-Aufrufe.
semrel ist kompiliertes Go — es traversiert git log und fragt Forge-APIs nebenläufig ab. Typische Ausführungszeit bei demselben Repository-Profil: unter 90 Sekunden.
semantic-release installiert bei jedem Pipeline-Lauf 28 direkte npm-Abhängigkeiten und hunderte transitiver Pakete. Das npm-Ökosystem war wiederholt Ziel von Supply-Chain-Angriffen.
semrel ist eine einzige statisch kompilierte Binärdatei. Es gibt keine node_modules, keine Laufzeit-Paketauflösung und keine transitive Abhängigkeits-Angriffsfläche.
Sowohl semrel als auch semantic-release unterstützen die Zuweisung von Commits zu Bump-Leveln anhand des Scopes. Das Feld scope in semrel ist optional — und unterstützt auch scope: false, um nur Commits ohne Scope zu matchen:
# semrel (.semrel.yaml)rules: - type: deps scope: major bump: major - type: deps scope: minor bump: minor - type: deps scope: patch bump: patch - type: feat bump: minor// semantic-release (package.json){ "releaseRules": [ { "type": "deps", "scope": "major", "release": "major" }, { "type": "deps", "scope": "minor", "release": "minor" } ]}Migration in ~15 Minuten
package.json entfernensemrel release --dry-run ausführen — die Ausgabe sollte deinen bisherigen Releases entsprechenÄquivalente Konfigurationszuordnung:
| semantic-release | semrel-Äquivalent |
|---|---|
@semantic-release/github | Plugin provider-github |
@semantic-release/gitlab | Plugin provider-gitlab |
@semantic-release/changelog | Plugin generator-changelog-md |
@semantic-release/git | Eingebauter Git-Commit-Schritt |
@semantic-release/npm | Plugin updater-npm |
@semantic-release/exec | Beliebiges Shell-Skript via hook-* |
releaseRules[].scope | rules[].scope (String oder false) |
Die ausführliche Schritt-für-Schritt-Migrationsanleitung findest du unter Von semantic-release zu semrel.
goreleaser und semrel lösen unterschiedliche Probleme und werden häufig zusammen eingesetzt.
| Frage | semrel | goreleaser |
|---|---|---|
| Welche Version soll released werden? | ✅ Berechnet aus Commits | ❌ Du gibst den Tag vor |
| Cross-Kompilierung (linux/arm64, darwin/amd64 …) | ❌ Nicht zuständig | ✅ Kernfunktion |
| GitHub/GitLab-Release mit Artefakten | ✅ Via Provider-Plugins | ✅ Kernfunktion |
| Changelog generieren | ✅ Via Generator-Plugins | Teilweise (via Templates) |
| Docker, Homebrew, npm, PyPI veröffentlichen | ✅ Via Updater + Packager + Publisher Plugins | ✅ Kernfunktion |
| Monorepo-Versionierung | ✅ Kostenlos | ✅ Kostenlos (OSS) |
Empfohlener kombinierter Workflow:
# GitHub Actions- name: Nächste Version berechnen run: semrel release --dry-run --output json > semrel-output.json
- name: Artefakte bauen & verteilen uses: goreleaser/goreleaser-action@v6 with: args: release env: GORELEASER_CURRENT_TAG: ${{ fromJson(steps.prev.outputs.json).nextVersion }}Die ausführliche Schritt-für-Schritt-Migrationsanleitung findest du unter Von goreleaser zu semrel.
release-please (von Google) verwendet ein Pull-Request-First-Modell. Statt bei jedem Push zu releasen:
| Frage | semrel | release-please |
|---|---|---|
| Vollautomatisch (kein PR-Gate) | ✅ | ❌ PR erforderlich |
| Conventional Commits | ✅ | ✅ |
| GitLab / Gitea-Unterstützung | ✅ | ❌ Nur GitHub |
| Plugin-Erweiterbarkeit | ✅ Beliebige Binärdatei | ❌ Fest vorgegeben |
| Node.js-Abhängigkeit | ❌ Keine | ✅ Erforderlich |
Wähle release-please, wenn dein Team eine menschliche Freigabe vor jedem Release benötigt. Wähle semrel für vollständig automatisierte CI-Releases oder Nicht-GitHub-Forges.
Die ausführliche Schritt-für-Schritt-Migrationsanleitung findest du unter Von release-please zu semrel.
release-it ist ein beliebtes JavaScript-basiertes Release-Tool mit interaktivem CLI-Modus. Es unterstützt Conventional Commits, Changelogs, npm-Publishing und GitHub Releases.
| Frage | semrel | release-it |
|---|---|---|
| Runtime | Keine | Node.js + npm |
| Auto-Bump aus Conventional Commits | ✅ | ✅ |
| Scope-basierte Bump-Regeln | ✅ | ❌ |
| Interaktiver Release-Wizard | ❌ | ✅ |
| Air-gap / Offline-Pipelines | ✅ | ❌ |
| Supply-Chain-Risiko | Keines | Mittel (npm-Deps) |
| GitLab / Gitea / Bitbucket | ✅ | Teilweise (GitLab-Plugin) |
| Plugin-Sprache | Beliebige Binärdatei | Nur JS |
release-it eignet sich gut für JavaScript/TypeScript-Projekte, die Node.js bereits in CI nutzen und eine interaktive Erfahrung wünschen. Wähle semrel für jeden Nicht-JS-Tech-Stack, air-gapped Umgebungen oder wenn Supply-Chain-Härtung wichtig ist.
changesets ist auf JavaScript/TypeScript ausgerichtet und erfordert, dass Entwickler manuell Changeset-Dateien erstellen, die ihre Änderungen beschreiben. Es liest Conventional Commits nicht automatisch.
| Frage | semrel | changesets |
|---|---|---|
| Auto-Bump aus Commits | ✅ | ❌ Manuelle Changeset-Dateien |
| Conventional Commits | ✅ | ❌ |
| Entwickler-Overhead | Keiner | Hoch (Changeset pro PR) |
| Monorepo-Unterstützung | ✅ | ✅ |
| Nicht-JS-Projekte | ✅ | ❌ Für JS/TS konzipiert |
| Runtime | Keine | Node.js + npm |
Wähle semrel, wenn du keinen Entwickler-Overhead möchtest — einfach Conventional Commits schreiben und CI erledigt den Rest. changesets eignet sich für große JS-Monorepos, in denen eine feingranulare menschliche Kontrolle über den Versionssprung jedes Pakets bevorzugt wird.
Brauchst du kein Node.js in deiner Pipeline? → Ja → semrel ✅ → Nein → jedes Tool geeignet
Brauchst du Air-gap / vollständig Offline-CI? → Ja → semrel ✅ → Nein → jedes Tool geeignet
Brauchst du automatische Versionierung aus Commit-Nachrichten? → Ja → semrel, semantic-release oder release-it → Nein → goreleaser (tag-basiert)
Brauchst du Scope-basierte Bump-Regeln (z. B. deps(major))? → Ja → semrel oder semantic-release ✅ → Nein → jedes Tool geeignet
Brauchst du Cross-Plattform Go-Binärkompilierung? → Ja → goreleaser (kann mit semrel kombiniert werden) → Nein → semrel reicht
Möchtest du PR-Genehmigung vor dem Release? → Ja → release-please → Nein → semrel ✅
Ist dein Projekt ausschließlich JavaScript/TypeScript? → Ja, mit interaktiven Releases → release-it → Ja, mit manueller Versionskontrolle → changesets → Nein → semrel ✅
Brauchst du GitLab-, Gitea- oder Bitbucket-Unterstützung? → Ja → semrel ✅ → Nein → jedes Tool geeignet