Zum Hauptinhalt Zur Navigation Zur Suche

Dynamische Pipelines

In Buildkite sind Pipeline-Schritte nichts als Daten. Man kann sie generieren.

Die Pipeline-YAML-Datei kann einen Schritt enthalten, der ein Skript ausführt, das weitere Pipeline-Schritte generiert, dynamisch, zur Laufzeit und basierend auf beliebiger Logik: welche Dateien sich geändert haben, welcher Wochentag gerade ist, wie der Mond steht, ob die Build-Götter gnädig gestimmt sind.

Das Skript überprüft das Monorepo, findet heraus, was sich geändert hat, und lädt genau die richtigen Schritte für das hoch, was gebaut und getestet werden muss. Ohne fest codierte Matrix. Es gibt keinen "f: contains(github.event.pull_request...)"-Spaghetti-Code. Nur ein Programm, das Schritte ausgibt.

Github Actions verfügt über Matrixstrategien und if-Bedingungen sowie wiederverwendbare Workflows und alle möglichen Mechanismen, die eine Annäherung daran versuchen. Alle sind aber schlechter und im schlimmsten Sinne deklarativ: Man deklariert Dinge in einer Sprache, die nicht leistungsfähig genug ist, um auszudrücken, was man meint, und so baut man am Ende aus YAML und Bedauern eine Rube-Goldberg-Maschine. Die Maschine wächst, man füttert sie, sie dankt es nicht.

Zum Thema Plug-ins

Das Plug-in-System von Buildkite ist dem Github Actions Marketplace strukturell ziemlich ähnlich. Man bezieht ebenfalls Code von Drittanbietern aus einem Repo und verlässt sich auf anderer Leute Arbeit. Buildkite macht dieses Vorgehen nicht durch irgendeinen magischen Unterschied in der Architektur plötzlich sicher.

Tatsächlich ist der Unterschied kleiner, als mir lieb ist: Buildkite-Plug-ins sind in der Regel eher schlanke Shell-Hooks als komplette Docker-Images mit eigener Laufzeitumgebung. Das minimiert die Angriffsflächen und man kann das gesamte Plug-in meist in wenigen Minuten durchlesen. Noch wichtiger: Die Plug-ins laufen auf der eigenen Infrastruktur, so dass man immerhin die Größe des möglichen Schadens regulieren kann. Das Problem ist nicht gelöst, nur kleiner.


Relevante Themen