Ein Build wird langsam, wie ein Zimmer voll wird: Niemand entscheidet, es vollzustellen. Unserer ging in etwa einem Jahr von vier auf vierzehn Minuten, eine vernünftige Ergänzung nach der anderen, und jede hatte an dem Tag, an dem sie kam, ein gutes Argument hinter sich.
Im April haben wir aufgehört hinzuzufügen und angefangen zu lesen. Nicht zu profilen. Zu lesen. Jeden Schritt der Pipeline, laut, mit der Frage was geht kaputt, wenn das weg ist. Zwei Drittel der Antworten waren irgendeine Variante von «nichts, aber es fühlt sich sicherer an».
- vorher
- 14:20
- nachher
- 3:05
- Build-Werkzeuge
- 6 → 2
Median eines CI-Laufs auf main
gleiche Commits, gleicher Runner
gezählt: alles mit eigener Konfigurationsdatei
Was die Zeit wirklich gekostet hat#
Die ehrliche Antwort war nicht der Compiler. Es waren die Schichten drumherum: ein Wrapper, der nur existierte, um den Bundler zu konfigurieren, ein zweiter Test-Runner für eine einzige Alt-Suite, ein Lint-Durchlauf, der im Type-Check nochmals lief, weil niemand sicher war, ob der erste gelaufen war.
| Schritt | Vorher | Nachher |
|---|---|---|
| Installieren | 3:10 | 0:40 |
| Lint | 2:05 | 0:25 |
| Type-Check | 1:50 | 1:05 |
| Test | 4:35 | 0:55 |
| Build | 2:40 | entfällt |
Die Build-Zeile ist leer, weil der Build jetzt im Deploy stattfindet, einmal, statt zweimal in der CI und nochmals auf der Plattform. Das war der grösste Einzelgewinn, und er kam davon, einen Job zu löschen, nicht davon, einen zu optimieren.
Das Installieren war die leichte Hälfte#
Der Wechsel auf pnpm mit gesperrtem Store brachte die Installation von drei Minuten auf vierzig Sekunden, und zwar dadurch, dass nichts mehr kopiert wird: ein inhaltsadressierter Store plus Hardlinks heisst, die zweite Installation derselben Abhängigkeit ist ein Link und kein Download.
# was der Runner jetzt tut, vollständig
corepack enable
pnpm install --frozen-lockfile
pnpm lint && pnpm typecheck && pnpm testDie Regel, die geblieben ist#
Löschen ist einmal leicht. Gelöscht zu bleiben ist der schwere Teil, denn das nächste Werkzeug kommt immer mit einem echten Problem im Gepäck. Also haben wir aufgeschrieben, welchen Test es bestehen muss, und der ist mit Absicht mühsam:
- 01Den Fehler benennen
Welcher konkrete Bug hat es in die Produktion geschafft, oder hätte es getan? «Best Practice» ist kein Fehler. Wenn niemand auf den Vorfall zeigen kann, ist das Werkzeug eine Versicherung gegen ein ausgedachtes Risiko.
- 02Benennen, was es ersetzt
Zusätzliche Werkzeuge summieren sich. Was neu dazukommt, übernimmt entweder einen Schritt, oder es kommt nicht herein. Zwei Linter entscheidet niemand mit Absicht.
- 03Sein Budget benennen
Sekunden CI-Zeit, und eine Zahl, die wir einen Monat später nachprüfen. Ein Schritt, der über sein Budget hinauswächst, geht zurück in die Prüfung, statt still zur neuen Normalität zu werden.
Seither wurden drei Werkzeuge vorgeschlagen. Eines kam durch. Das Verhältnis fühlt sich richtig an: Das Ziel war nie null Werkzeuge, sondern Werkzeuge, die sich jedes für sich erklären können.