Integriere früh, integriere oft. Baue eine gemeinsame Codebasis mit Vertrauen auf.
Continuous Integration wird weithin missverstanden. Es ist nicht nur ein Build-Server. Es ist nicht nur das Ausführen von Tests bei jedem Commit. Das sind Werkzeuge, die CI unterstützen – aber CI selbst ist eine Praxis.
Echtes CI bedeutet:
Der „kontinuierliche" Teil ist entscheidend. Wenn du wöchentlich integrierst, ist das nicht kontinuierlich. Wenn du langlebige Feature-Branches hast, ist das nicht kontinuierlich. CI bedeutet, deine Arbeit jeden Tag mit der Arbeit aller anderen zu integrieren, normalerweise mehrmals täglich.
CI ist eine soziale Praxis
Bei CI geht es darum, wie das Team zusammenarbeitet, nicht nur um Tooling. Ein Jenkins-Server, der Tests auf monatsalten Branches ausführt, ist kein CI.
Echtes CI erfordert Trunk-Based Development: Jeder committet in den Hauptbranch (oft „Trunk" oder „Main" genannt).
Das klingt beängstigend. Werden die Leute nicht Dinge kaputt machen? Hier kommt die Disziplin ins Spiel:
Langlebige Branches sind der Feind von CI. Wenn du wochenlang auf einem Branch entwickelst, integrierst du nicht. Du schiebst die Integration nur auf – und je länger du wartest, desto schwieriger wird es.
Branch für Stunden, nicht Tage. Integriere täglich, nicht wöchentlich.
Ein Entwickler erstellt einen Branch, arbeitet 2-3 Stunden, führt alle Tests lokal aus und mergt dann in Main. Das passiert 3-4 Mal pro Tag pro Entwickler. Integration ist langweilig, weil Konflikte selten und klein sind.
Entwickler erstellen Feature-Branches, die 2-3 Wochen leben. Sie mergen in Main, wenn das Feature „fertig" ist. Merge-Konflikte sind schmerzhaft. Integrationsfehler sind häufig. Der „CI-Server" testet nur den veralteten Main-Branch.
Damit CI funktioniert, muss der Build- und Testzyklus schnell sein. Martin Fowler schlägt die 10-Minuten-Regel vor: Der gesamte Build, einschließlich aller Tests, sollte in unter 10 Minuten abgeschlossen sein.
Warum 10 Minuten? Weil:
Wenn dein Build zu lange dauert:
Manche Teams führen lokal eine schnelle Teilmenge aus (Unit-Tests) und die vollständige Suite auf dem CI-Server. Das ist in Ordnung, solange die vollständige Suite schnell genug läuft, um zeitnahes Feedback zu geben.
Der Build wird fehlschlagen. Was zählt, ist, was als Nächstes passiert.
Die Regel: Wenn der Build fehlschlägt, wird das Beheben zur obersten Priorität. Alles andere stoppt.
Das mag extrem erscheinen, aber bedenke: Ein fehlerhafter Build bedeutet, dass das Team dem Hauptbranch nicht vertrauen kann. Die Arbeit aller ist blockiert, weil sie nicht sicher integrieren können. Jede Minute, die der Build fehlerhaft ist, ist eine Minute akkumuliertes Risiko.
Wer behebt es? Normalerweise die Person, die es kaputt gemacht hat. Aber wenn sie feststeckt, helfen andere. Ein fehlerhafter Build ist ein Teamproblem, kein individuelles Problem.
Wie man Fehler verhindert:
Manche Teams verwenden eine „CI-Sheriff"-Rotation – jemand, der dafür verantwortlich ist, den Build zu beobachten und Behebungen zu koordinieren. Das verhindert den Zuschauereffekt, bei dem jeder annimmt, dass jemand anderes es beheben wird.
Fehlerhafte Builds sind Notfälle
Ein fehlerhafter Build, der stundenlang fehlerhaft bleibt, ist ein Teamversagen. Behandle ihn mit der gleichen Dringlichkeit wie einen Produktionsvorfall.
CI ist die Grundlage für fortgeschrittenere Praktiken:
Continuous Delivery (CD): Jeder Commit kann in Produktion ausgeliefert werden. Deployment ist eine geschäftliche Entscheidung, keine technische.
Continuous Deployment: Jeder Commit, der Tests besteht, wird automatisch in Produktion ausgeliefert. Keine menschliche Genehmigung erforderlich.
Nicht jedes Team braucht Continuous Deployment. Aber jedes Team profitiert von CI. Fang dort an.
CI-Metriken, die man beobachten sollte:
Bei CI geht es nicht nur darum, Fehler zu finden. Es geht darum, einen Rhythmus zu schaffen, in dem Integration langweilig, routinemäßig und sicher ist. Wenn Integration sicher ist, wird alles andere einfacher.