Zum Inhalt

ADR-003: Workflow-Gültigkeit über einen Required Check absichern

Status: Angenommen (2026-08-01) · Issue: #398

Kontext

reusable-hacs-validate.yaml scheiterte fünf Wochen lang an GitHubs Workflow-Validierung. Die Datei nutzte eine Expression im uses: eines Steps, was GitHub Actions nicht unterstützt. Sie ließ sich also nie parsen, der Workflow lief nie, und kein Consumer konnte ihn aufrufen.

GitHub meldet das durchaus. Es erzeugt einen Run, benannt nach dem Dateipfad, mit null Jobs. Dieser Run stand ab dem 2026-06-26 rot auf develop. Übersehen wurde er, weil er nichts blockiert, weil er nach einem Pfad statt nach einem Workflow heißt, und weil er nur wieder auftaucht, wenn die Datei selbst sich ändert.

Das Signal existierte. Niemand handelte darauf.

Entscheidung

reusable-actionlint.yaml hinzufügen, in build-static-tests.yaml einhängen und den Job-Namen in die Required Status Checks für develop aufnehmen.

Separat die defekte Datei reparieren: den Action-Digest direkt eintragen und den Input entfernen, der die nicht unterstützte Expression speiste. Dieser Input existierte ausschließlich dafür, es gibt also keine Variante, die beides behält.

Erwogene Alternativen

Den Check hinzufügen, ohne ihn verpflichtend zu machen. Verworfen, anhand der Evidenz dieses Issues. Ein nicht blockierendes Signal existierte bereits und wurde fünf Wochen ignoriert. Ein zweites würde denselben Fehler mit besserem Werkzeug wiederholen.

Stattdessen die vorhandenen Validierungs-Runs beobachten. Verworfen. Das verlässt sich darauf, dass jemand hinschaut, und genau das hat hier versagt. actionlint findet zudem mehr: ungültige Expression-Kontexte, falsche uses:-Formen, Shell-Probleme in run:-Blöcken und Typfehler in Inputs.

Den defekten Input als deprecated No-Op behalten. Verworfen. Ein Deprecation-Shim schützt funktionierende Aufrufer, und es gab keine.

Folgen

Der Check kommt als wiederverwendbarer Workflow statt als Inline-Schritte, damit Consumer ihn erben. Eine Bibliothek geteilter Workflows, die nur die eigenen Workflows lintet, würde denselben Fehler eine Ebene höher wiederholen.

Der erste Lauf wird mehr als eine defekte Datei finden. Dreißig Workflow-Dateien wurden nie gelintet. Deshalb landet zuerst das Reusable, dann wird der Baum sauber, und erst zuletzt kommt der Required Context dazu. Umgekehrt würde jeder Pull Request an unbeteiligten Altbefunden hängen.

Consumer erhalten einen Check, der einen Pull Request rot macht, dessen Workflow-Dateien sich nicht parsen lassen. Repositories mit bereits ungültigen Workflow-Dateien bekommen diese zu sehen.