Continuous Integration verstehen

Continuous Integration (CI) bedeutet, dass Ihr Codebestand nach jedem Merge automatisch kompiliert und getestet wird.

Was ist Continuous Integration?

Continuous Integration (CI) ist eine DevOps-Methode, die Entwicklungsteams dabei helfen soll, effizienter zu arbeiten und Softwareanwendungen zuverlässiger auszuliefern. Mit CI wird Ihr Code nach jedem Merge automatisch von einem CI-Server kompiliert und getestet, sodass Sie schnelles Feedback zu Ihrer Arbeit erhalten. Dieser schnelle und zuverlässige Feedbackzyklus hilft Ihnen, Änderungen häufiger zu veröffentlichen und gleichzeitig die Anzahl der Bugs zu reduzieren, die es in die Produktion schaffen.

Entwicklung ohne CI

Um zu verstehen, warum Continuous Integration sinnvoll ist, ist es hilfreich, sich vor Augen zu führen, wie die Softwareentwicklung ohne sie aussieht. Nehmen wir an, Sie arbeiten mit einem Versionsverwaltungssystem wie Git. Sie und Ihre Kolleg*innen verfügen jeweils über eine eigene Kopie des Repositorys, die Sie für die lokale Entwicklung verwenden, bevor Sie Ihre Arbeit in ein gemeinsames Repository hochladen.

Wenn Sie eine neue Funktion entwickeln, arbeiten Sie vielleicht mehrere Tage daran, bevor Sie Ihre Änderungen mit anderen teilen. In dieser Zeit haben auch Ihre Kolleg*innen an Features in ihren lokalen Repository-Kopien gearbeitet. Sobald Sie fertig sind, schieben Sie Ihre Änderungen in das gemeinsame Repository und beginnen mit dem Merge-Vorgang in einen bestimmten Branch, um zu testen, ob jedes Feature wie vorgesehen funktioniert, wenn es mit allem anderen kombiniert wird.

Da umfangreiche Änderungen von mehreren Entwickler*innen kombiniert werden, besteht leider ein hohes Risiko, dass der Code nicht mehr kompiliert werden kann. Sie und Ihre Kolleg*innen verbringen Zeit damit, herauszufinden, welche Änderungen das Problem verursacht haben, bevor Sie entweder die betreffenden Commits zurücknehmen, um mit der Veröffentlichung anderer, dringenderer Änderungen fortzufahren, oder weitere Codeänderungen vornehmen, um das Problem zu beheben.

Nachdem Sie es geschafft haben, den Code zu kompilieren, stellen Sie vielleicht fest, dass die Kombination der Änderungen zu verschiedenen Bugs geführt hat. Sie gehen also ein weiteres Mal die Codeänderungen aller Mitwirkenden durch, um die Ursache des Problems zu finden, korrigieren das Problem und beginnen dann den Buildprozess von vorn.

Der Sinn von CI

Durch Continuous Integration wird dieser Prozess beschleunigt, indem die Build-Schritte und Tests jedes Mal automatisch durchgeführt werden, wenn Sie Ihre Änderungen in einen bestimmten Branch mergen. Wenn Sie diese Schritte automatisiert haben, können sie häufiger ausgeführt werden – anstatt Ihren Code alle paar Wochen zu kompilieren und zu testen, können Sie dies alle paar Stunden tun.

Dadurch arbeiten Sie in kleineren Schritten und können Probleme, die durch Ihre Änderungen entstehen, schneller erkennen und beheben. Anstatt Hunderte oder Tausende Zeilen geänderten Code zu untersuchen, um die Ursache eines Problems zu finden, können Sie Ihre Suche auf einige wenige Änderungen beschränken. Außerdem sind diese Änderungen noch frisch in Ihrem Gedächtnis, sodass Sie sich den Kontextwechsel ersparen.

Durch die Bestätigung, dass sich Ihre Software nach jeder Änderung immer noch kompilieren lässt und wie vorgesehen verhält, trägt CI dazu bei, dass Ihr Code stets releasebereit ist. Die Freigabe von Änderungen für die Produktion wird dadurch einfacher, und Sie können Features und Fixes häufiger veröffentlichen.

Zwar wurde Continuous Integration für große Entwicklungsprojekte mit zahlreichen Beteiligten konzipiert – aber es ist nie zu früh, CI in Ihren Entwicklungsprozess zu integrieren. Selbst wenn Sie allein arbeiten, können Sie durch die Aufteilung Ihrer Arbeit in kleine Schritte und die Validierung Ihrer Änderungen durch automatisierte Tests effizienter entwickeln und Ihre Codequalität verbessern.

Continuous Integration

CI-Methoden

Ein effektiver CI-Workflow erfordert eine Kombination von Tools, Prozessen und Teamarbeit. Schauen wir uns diese Aspekte nacheinander an.

Versionsverwaltungssystem verwenden

Continuous Integration setzt voraus, dass Ihr gesamter Codebestand in einem Quellcode- bzw. Versionsverwaltungssystem gespeichert ist. Dies gilt für alle Quellcode-Dateien, Bibliotheken, Konfigurationsdateien und Skripte. Die Versionsverwaltung erleichtert es mehreren Entwickler*innen, parallel zu arbeiten und ihre Änderungen zusammenzuführen. CI-Server integrieren sich in Versionsverwaltungssysteme, um Ihre Codeänderungen zu kompilieren und zu testen.

Regelmäßige Commits

Damit alle Mitwirkenden auf derselben Basis aufbauen können, müssen alle dasselbe Repository nutzen und ihre Änderungen häufig miteinander teilen. Eine gute Faustregel ist, dass jeder seine Commits täglich in den CI-Branch des gemeinsamen Repositorys einbringt – aber Sie können die Häufigkeit auch erhöhen. Gleichzeitig sollten Sie Ihre lokale Kopie mit dem gemeinsamen Repository synchronisieren, um das Risiko von Merge-Konflikten bei jedem Push zu verringern.

Automatisierte Builds und Tests

Nach dem Mergen Ihrer Codeänderungen besteht der nächste Schritt darin, die Software zu kompilieren und einer Reihe von Prüfungen zu unterziehen – z. B. Linting, Unit-Tests und statische Analysen. Manuelles Kompilieren und/oder Testen ist so zeitaufwändig und fehleranfällig, dass eine tägliche Integration von Änderungen nicht realisierbar ist. Daher ist eine Automatisierung unerlässlich. Build-Tools und Frameworks für automatisierte Tests sind für alle wichtigen Programmiersprachen verfügbar, und Sie können einen CI-Server verwenden, um den Prozess automatisch auszulösen und die verschiedenen Schritte zu koordinieren.

Fehler sofort angehen

Um Vorteile von Continuous Integration realisieren zu können, müssen alle Mitwirkenden schnell reagieren, wenn ein automatisierter Build oder Test fehlschlägt. So wird sichergestellt, dass alle auf einer soliden Grundlage aufbauen, statt neue Features auf Code zu basieren, der nicht funktioniert. Es mag zwar auf den ersten Blick so aussehen, als würden Sie von Ihren Teammitgliedern erwarten, dass sie alles stehen und liegen lassen, um einen Build- oder Testfehler zu beheben – aber ein automatisierter CI-Prozess kann innerhalb von Minuten erste Ergebnisse liefern, sodass etwaige Probleme behoben werden können, während die Codeänderungen noch frisch im Gedächtnis sind.

Den Prozess pflegen

Auch nachdem Sie Ihre Builds und Tests automatisiert haben, sollten Sie Ihren CI-Workflow pflegen. Dazu gehört, dass Sie neuen Code mit Unit-Tests flankieren und die Schnelligkeit Ihrer Feedbackschleifen beibehalten.

Das Einrichten eines CI-Servers, um Ihr Repository zu überwachen, Builds auszulösen, automatisierte Tests auszuführen und die Ergebnisse zusammenzuführen, hilft Ihnen, all diese Aspekte miteinander zu verbinden und Ihnen das Schreiben einer eigenen Automatisierungslogik zu ersparen. Ein guter CI-Server kann auch ergänzende Informationen bereitstellen, z. B. Code-Coverage-Statistiken und eine Build-Historie.

Vorteile von CI

Wenn Sie die potenziellen Vorteile von Continuous Integration kennen, können Sie Ihre Teammitglieder zum Ausprobieren neuer Ansätze motivieren und Ihre Stakeholder überzeugen, neue Prozesse zu unterstützen.

Sowohl den einzelnen Entwickler*innen als auch dem gesamten Entwicklungsteam bietet CI verschiedene Vorteile:

  • Reibungslose Merges: Sobald Sie anfangen, die Arbeit in kleinere Schritte aufzuteilen, geht die Zahl der Merge-Konflikte automatisch zurück. Der Schlüssel dazu ist die regelmäßige Synchronisierung Ihres lokalen Repositorys mit den Änderungen der anderen.
  • Effizientere Arbeitsabläufe: Das schnelle Feedback eines automatisierten Build- und Testprozesses weist Sie schon wenige Minuten nach Ihren Änderungen auf eventuelle Probleme in Ihrem Code hin. Wenn Sie sich hingegen auf einen manuellen Build- oder Testprozess verlassen, wird ein durch Ihre Änderung verursachter Fehler womöglich erst nach mehreren Tagen oder Wochen entdeckt.
  • Einfachere Codewartung: Wenn Sie automatisierte Tests hinzufügen, um sicherzustellen, dass Ihr CI-Prozess gut funktioniert, tragen Sie dazu bei, dass Ihr Codebestand leichter zu durchblicken und zu pflegen ist.
  • Verbesserte Kommunikation und Zusammenarbeit: Wenn Sie in kleineren Schritten arbeiten und Ihre Änderungen regelmäßiger teilen, erhalten Sie im Gegenzug auch einen besseren Einblick in die Arbeit der anderen. So haben Sie mehr Möglichkeiten, die Gestaltung eines Features mit Kolleg*innen zu besprechen, Ihren Fortschritt dem Produktmanagement und dem Usability-Team vorzulegen und Ihren Kurs bei Bedarf anzupassen.

Continuous Integration kommt auch dem Unternehmen insgesamt zugute:

  • Weniger Bugs: Continuous Integration verhindert zwar nicht das Auftreten von Fehlern, aber sie macht es dem Entwicklungsteam viel leichter, diese zu finden und zu beheben. Dadurch ist es viel unwahrscheinlicher, dass Bugs in die Produktion gelangen, wo sie sich auf Ihre Benutzer*innen auswirken können.
  • Schnellere und häufigere Releases: Die Automatisierung des Build- und Testprozesses spart Zeit und stellt sicher, dass alle Schritte einheitlich durchgeführt werden. Dadurch können Releases mit weniger manuellem Aufwand für die Veröffentlichung vorbereitet werden. Je mehr Vertrauen Ihr Team in Ihren CI-Prozess fasst, desto häufiger kann es Releases veröffentlichen.

Um mehr über den Nutzen von Continuous Integration, Continuous Delivery und Continuous Deployment zu erfahren, lesen Sie unseren Leitfaden 12 Vorteile von CI/CD.

Herausforderungen von CI

Obwohl Continuous Integration sowohl für die Entwickler*innen als auch für das gesamte Unternehmen Vorteile bietet, wird sie nicht immer mit Jubel empfangen.

Für viele Entwicklungsabteilungen stellt DevOps eine enorme Veränderung in Bezug auf bestehende Arbeitsweisen und Prozesse dar. Damit die teamübergreifende Koordination gelingt und eine Kultur der Zusammenarbeit entsteht, ist eine gute Kommunikation erforderlich.

Wenn Sie bereits agile Methoden einsetzen, ist die Umstellung in der Regel einfacher, da bereits ein Bewusstsein für das Konzept der selbstorganisierenden Teams und für die Bedeutung von Feedback besteht.

Wo dies nicht der Fall ist, kann es beim Überzeugen Ihrer Kolleginnen und Kollegen vom Mehrwert von CI hilfreich sein, sich die Größenordnung der Veränderung bewusst zu machen, auf die Menschen zuzugehen, klein anzufangen und die Vorteile zu veranschaulichen.

Continuous Integration ist auch mit einigen praktischen Herausforderungen verbunden. Bei großen, monolithischen Anwendungen kann es zu langen Buildzeiten kommen, und die Parallelisierung von Testläufen kann ein Problem darstellen, wenn die Testumgebungen nicht in ausreichender Zahl zur Verfügung stehen.

Die Visualisierung Ihres CI-Workflows und die Analyse von statistischen Daten zur Ermittlung von Engpässen können dazu beitragen, Kosten und Nutzen von Investitionen in Architekturänderungen, Infrastrukturerweiterungen und automatisierte Tests zu quantifizieren.

Erste Schritte mit Continuous Integration

Die Einrichtung eines CI-Workflows kann durch ihre Komplexität abschreckend sein. Es sind viele Optionen zu berücksichtigen, und Sie können zahlreiche Dinge automatisieren. Glücklicherweise ist dies ein Prozess, der sich gut in kleinere Teile zerlegen lässt, da jeder Schritt einen gewissen Nutzen bringt.

Die folgenden Bereiche sind gute Einstiegspunkte:

  1. Arbeit in kleinere Schritte aufteilen: Wenn Sie Ihren Code in einer Versionsverwaltung speichern, können Sie Ihre Arbeit in kleinere Blöcke aufteilen und Änderungen häufiger committen, wodurch Merge-Konflikte reduziert werden. Vielleicht können Sie bereits beim Durchgehen Ihres Backlogs damit beginnen, die Entwicklungsaufgaben in kleinere Teile zu zerlegen.
  2. Auf eine Branching-Strategie einigen: Legen Sie fest, welcher Branch oder welche Branches den CI-Workflow durchlaufen sollen und wie die Änderungen veröffentlicht werden. Zu den gängigen Optionen gehören die Trunk-basierte Entwicklung und GitFlow (insbesondere für versionierte Anwendungen).
  3. Während der Entwicklung Unit-Tests schreiben: Unabhängig davon, ob Sie bereits Unit-Tests haben oder bei Null anfangen – wenn in Ihrem Team das Schreiben von Unit-Tests fest zur Arbeit dazugehört, bevor eine Aufgabe abgehakt werden kann, wird Ihre Code-Coverage kontinuierlich besser werden. Ein paar automatisierte Tests sind besser als gar keine, und Sie können auch mit nur wenigen automatisierten Tests in CI einsteigen.
  4. Stückweise automatisieren: Versuchen Sie nicht, jede Phase Ihres CI-Workflows auf einmal zu automatisieren – konzentrieren Sie sich stattdessen auf die Bereiche, die den höchsten Zeitaufwand verursachen oder das wichtigste Feedback liefern können. Wenn Sie soweit sind, können Sie mit einem CI-Server die einzelnen Schritte zu einem automatisierten CI-Prozess verketten.

Mehr über die Einrichtung von CI und CD erfahren Sie in unserem Leitfaden Best Practices für CI/CD.

Fazit

Continuous Integration beschleunigt den Entwicklungsprozess und verbessert gleichzeitig die Codequalität. Durch die Automatisierung der einzelnen Schritte können Sie effizienter arbeiten und sich darauf konzentrieren, Mehrwert für Ihre Benutzergemeinde zu schaffen. Continuous Integration ist jedoch nur der Beginn der CI/CD-Pipeline. Die nächste Stufe, Continuous Delivery, wendet die DevOps-Grundsätze auf den nächsten Teil des Releaseprozesses an.

So kann TeamCity helfen

TeamCity ist eine flexible CI/CD-Plattform, die Sie an Ihre Anforderungen anpassen können. Es bietet Unterstützung für alle wichtigen Versionsverwaltungssysteme – einschließlich Git, Perforce, Mercurial und Subversion – sowie Build- und Testtools für führende Programmiersprachen. Dank einer großen Auswahl an CI-Triggern können Sie nach jedem Commit in einem dafür vorgesehenen Branch den Build- und Testprozess initiieren, eine Untermenge von Checks auf Feature-Branches anwenden, nächtliche Builds erstellen und Teammitgliedern die Möglichkeit geben, CI-Checks lokal auszuführen.

Um Ihnen so schnell wie möglich Feedback zu geben, kann TeamCity Tests und andere Build-Aufgaben parallel ausführen. Slack- und IDE-Integrationen stellen Feedback bereit, wo immer Sie gerade arbeiten, während detaillierte Testberichte Ihnen helfen, Fehlern schnell auf den Grund zu gehen. TeamCity stellt auch eine Reihe von statistischen Daten bereit, um Ihren CI-Prozess zu optimieren und Ihre Test-Coverage zu bewerten.

Wenn Sie sich entscheiden, Ihren CI-Prozess um Continuous Delivery oder Continuous Deployment zu erweitern, bietet Ihnen TeamCity alles, was Sie für die Verwaltung von Umgebungen und die Automatisierung von Deployments benötigen.