yasrt — der Tag bestätigt, er kündigt nicht an.
Yet another semantic release tool: ein statisches Go-Binary, das deine Conventional Commits liest, entscheidet, ob und was released wird, und das Release nach dem Bau des Artefakts veröffentlicht. Ein Ersatz für die semantic-release-npm-Kette für alle, die dieselben Entscheidungen ohne Paketmanager im Release-Pfad wollen.
- Binary:
go install github.com/ohartwig/yasrt/cmd/yasrt@latestoder die signierten Releases - Forges: GitLab, GitHub, Forgejo – erkannt aus der Job-Umgebung
- Zugang: nur der Job-Token; ein Signierschlüssel ist optional
- Lizenz: Apache-2.0 · zwei Abhängigkeiten (YAML-Parser, Glob-Matcher) plus
git
Der Tag vor dem Build
Bisher
- Der Tag wird gesetzt, bevor irgendetwas gebaut ist; wird der Build rot, steht ein Tag ohne Artefakt
- Hunderte ungepinnte npm-Pakete werden im Release-Job zur Laufzeit aufgelöst
- Beurteilt wird gegen die Push-Range: ein echter Fix, der mit einer CI-Änderung gebündelt ankommt, shippt nie
- Eine
.releasercpro Repository, jede ein bisschen anders
Mit yasrt
yasrt nextentscheidet, der Build läuft,yasrt releasetaggt: ein gescheiterter Build hinterlässt keinen Tag- Ein statisches Binary, zwei Abhängigkeiten, nichts wird zur Laufzeit aufgelöst
- Beurteilt gegen das letzte Release: der Fix shippt, egal womit er ankam
- Eine Datei pro Repository, oder keine, weil Organisationsdefaults darunterliegen
Passt das zu meinem Setup?
Nutze es wenn …
- du semantic-release nutzt und schon einmal einen Tag ohne Artefakt hattest
- dein Release-Job hunderte ungepinnte npm-Pakete zur Laufzeit auflöst und du das nicht mehr willst
- ein echter Fix zusammen mit einer CI-Änderung gepusht wurde und trotzdem nie shippte
- du eine Datei pro Repository willst, und für die meisten keine
Nutze es nicht wenn …
- du Windows-Runner brauchst: Linux und macOS werden unterstützt
- du Bitbucket oder Azure DevOps releast
- dein Release-Prozess von semantic-release-Plugins abhängt, die es nur als npm gibt; yasrt hat Hooks, die jedes Executable rufen, aber keine Plugin-Ladung
Warum
semantic-release trifft die Entscheidungen richtig und die Mechanik falsch für CI: Es taggt, bevor irgendetwas gebaut ist. Es löst zur Laufzeit hunderte ungepinnte Pakete auf. Und es beurteilt „hat sich etwas Shippbares geändert?“ gegen die Push-Range statt gegen das letzte Release, so dass ein echter Fix, der mit einer CI-Änderung gebündelt ankommt, nie shippt.
yasrt behält die Entscheidungen (dieselben Commit-Konventionen, dieselbe Versionsarithmetik, dieselbe Changelog-Form) und repariert die Mechanik. Der Tag bestätigt ein Artefakt, das schon existiert, statt eines anzukündigen, das es vielleicht geben wird. In meinem Estate hat genau das ~30 Repositories mit Tags ohne Image hinterlassen, an einem einzigen Abend; seitdem taggt hier nichts mehr vor dem Build.
Drei Kommandos
yasrt next --output .release.env # entscheiden; schreibt nichts ins Repository
yasrt check # Konfiguration prüfen, Umgebung sondieren
yasrt release # veröffentlichen; idempotent, gefahrlos wiederholbar
next legt seine Entscheidung in einer dotenv-Datei ab: RELEASE_STATUS ist release, no-bump, not-deliverable oder already-released, daneben RELEASE_VERSION, RELEASE_TAG, RELEASE_PREVIOUS, RELEASE_BUMP, RELEASE_REASON und RELEASE_COMMIT. Dein Build liest sie; release liest sie zurück und weigert sich, etwas anderes zu taggen als den analysierten Commit. Die Schlüssel und die Exit-Codes sind eine öffentliche Schnittstelle.
| Exit | Bedeutung |
|---|---|
| 0 | Analyse oder Release abgeschlossen |
| 1 | Konfigurations- oder git-Fehler |
| 2 | ungültige Argumente |
| 3 | no-bump, mit --fail-on-skip |
| 4 | not-deliverable, mit --fail-on-skip |
| 5 | das Repository hat sich bewegt: HEAD geändert, oder der Tag existiert auf einem anderen Commit |
Die Dokumentation
CI-Pipelines
Installation, die dreistufige GitLab-Pipeline, das Gaten im Script, Trigger nach dem Release, und dasselbe für GitHub Actions und Forgejo Actions.
Konfiguration und Hooks
Eine Zeile pro Repository, Organisationsdefaults darunter, und Hooks, die an fünf Punkten des Releases jedes Executable rufen.
Forges und Signierung
Was sich zwischen GitLab, GitHub und Forgejo unterscheidet, wie yasrt sie erkennt, und wie Release-Commit und Tag mit OpenPGP oder SSH signiert werden.
Vergleich mit semantic-release
docs/semantic-release-comparison.md
Was gleich ist, was anders ist, und warum: Option für Option.
Container-Image
Bau dein eigenes daraus, wenn du unseres nicht ziehen willst
registry.ole-hartwig.eu/devops/images/yasrt:1: 30 MB Wolfi mit git, gpg und ssh-keygen. Rezept und Pipeline sind öffentlich.
GitHub
Linux und macOS, amd64 und arm64
Quellcode, Releases mit Binaries, SHA256SUMS und cosign-Signatur, Issues. Apache-2.0.
Release-Pipeline, die taggt, bevor gebaut ist?
Ich helfe beim Umbau auf yasrt, mit Komponente und Rückfallnetz: erst neben der alten Kette, dann statt ihrer.