Continuous Integration (CI) bedeutet, dass Ihr Codebestand nach jedem Merge automatisch kompiliert und getestet wird.
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.
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.
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.
Ein effektiver CI-Workflow erfordert eine Kombination von Tools, Prozessen und Teamarbeit. Schauen wir uns diese Aspekte nacheinander an.
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.
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.
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.
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.
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.
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:
Continuous Integration kommt auch dem Unternehmen insgesamt zugute:
Um mehr über den Nutzen von Continuous Integration, Continuous Delivery und Continuous Deployment zu erfahren, lesen Sie unseren Leitfaden 12 Vorteile von CI/CD.
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.
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:
Mehr über die Einrichtung von CI und CD erfahren Sie in unserem Leitfaden Best Practices für CI/CD.
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.
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.