"Wir deployen per FTP, direkt auf Produktion." Dieser Satz ist selten geworden – aber er existiert noch. Manchmal folgt ein leises Lachen, als wäre es ein Witz. Meistens ist es keiner. Und meistens folgt direkt danach: "Aber das funktioniert bei uns seit Jahren problemlos." Was natürlich stimmt – bis zum ersten Mal, dass es das nicht tut, am Freitagabend um 17:45 Uhr.

Warum CI/CD gerade für Legacy-Systeme wichtig ist

Legacy-Systeme haben oft keine Tests, keine statische Analyse, keinen definierten Deploymentprozess. Das macht jede Änderung zum Risiko. Eine CI/CD-Pipeline schafft genau das, was fehlt: Sichtbarkeit und Reproduzierbarkeit. Sie macht den Zustand des Systems messbar – und damit endlich verbesserbar.

Wo ich anfange: Linting und statische Analyse

Der erste Schritt in einer CI-Pipeline kostet wenig und bringt sofort Wert: php -l prüft alle Dateien auf Syntaxfehler. phpcs prüft Coding Standards. phpstan auf Level 0 findet offensichtliche Typprobleme. Kein Test wird geschrieben, kein Refactoring vorgenommen – und trotzdem gibt es ab morgen einen roten Build, wenn jemand einen Syntaxfehler eincheckt. Das allein ist schon mehr als viele Teams haben.

Schritt 2: Smoke Tests

Bevor Unit Tests entstehen, können Smoke Tests viel Sicherheit geben. Ein einfacher HTTP-Request gegen die wichtigsten Seiten der Anwendung – Status 200 erwartet, kein PHP-Fatal-Error. Das ist kein Ersatz für echte Tests, aber es ist ein Netz, das die gröbsten Fehler abfängt. Und es ist deutlich beruhigender als ein FTP-Upload und ein Gebet.

Schritt 3: Deployment automatisieren

FTP-Deployment wird durch ein Skript ersetzt: rsync, deployer.php oder ein einfaches Shell-Skript, das einen definierten Stand aus dem Repository auf den Server bringt. Das Ziel ist Reproduzierbarkeit – dass jeder Deployment-Vorgang gleich abläuft, unabhängig davon, wer ihn ausführt und wie aufgeregt er dabei ist.

Schritt 4: Tests nachrüsten

Erst jetzt kommen Tests – schrittweise, beginnend mit den kritischsten Teilen der Anwendung. PHPUnit ist vorhanden, die Pipeline führt es aus. Jeder neue Code wird getestet. Alter Code erhält Tests, wenn er angefasst wird.

Eine Pipeline, die nur Linting ausführt, ist besser als keine Pipeline. Perfektion ist keine Voraussetzung für den ersten Commit.

Fazit

CI/CD für Legacy-Systeme einzuführen bedeutet nicht, alles auf einmal zu lösen. Es bedeutet, heute den ersten Schritt zu machen – und morgen den zweiten. Wer damit wartet, bis das System "bereit" ist, wartet für immer. Und deployed weiterhin per FTP.