Kai Ole Hartwig
Go · Apache-2.0 · GitLab, GitHub, Forgejo

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@latest oder 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 .releaserc pro Repository, jede ein bisschen anders

Mit yasrt

  • yasrt next entscheidet, der Build läuft, yasrt release taggt: 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.

ExitBedeutung
0Analyse oder Release abgeschlossen
1Konfigurations- oder git-Fehler
2ungültige Argumente
3no-bump, mit --fail-on-skip
4not-deliverable, mit --fail-on-skip
5das 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.

Lesen →
CI-Pipelines

Konfiguration und Hooks

Eine Zeile pro Repository, Organisationsdefaults darunter, und Hooks, die an fünf Punkten des Releases jedes Executable rufen.

Lesen →
Konfiguration und Hooks

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.

Lesen →
Forges und Signierung

Vergleich mit semantic-release

docs/semantic-release-comparison.md

Was gleich ist, was anders ist, und warum: Option für Option.

Vergleich lesen →
Vergleich mit semantic-release

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.

yasrt-image auf GitHub →
Container-Image

GitHub

Linux und macOS, amd64 und arm64

Quellcode, Releases mit Binaries, SHA256SUMS und cosign-Signatur, Issues. Apache-2.0.

Auf GitHub ansehen →
GitHub

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.

Anfragen →