Continuous Integration
Ein typisches Szenario in der Software-Entwicklung ist das Zusammenführen und Übersetzen von Änderungen am Quellcode, die von unterschiedlichen Entwicklern eines oder mehrerer Teams gemacht wurden. Dieser als Integration bezeichnete Vorgang kann aus unterschiedlichen Gründen sehr zeitaufwändig werden. Fast immer korrelieren jedoch die Aufwände umgekehrt mit der Häufigkeit der Integration: je seltener sie durchgeführt wird, umso mehr Fehler und "Inkompatibilitäten" müssen behoben werden. Letzteres bedeutet, dass die Änderungen von unterschiedlichen Entwicklern nicht zusammen passen.
Was liegt da näher, als die Zeiten zwischen den Integrationen systematisch zu minimieren, um im Idealfall sogar fast kontinuierlich zu integrieren? Genau das ist die Idee der Continuous Integration (CI).
Kernstück der CI ist ein Server für die Automatisierung von Übersetzungs-, Build- und sogar Testaufgaben, die dann bei allen Software-Änderungen zeitnah durchgeführt werden.
So werden Fehler frühzeitig aufgedeckt und müssen von den beteiligten Entwicklern auch sofort wieder behoben werden. Die Offenlegung von Fehlern und ihre sofortige Beseitigung verhindern das Einsteuern weiterer Software-Änderungen. Die Software bleibt mit Ausnahme von kurzen Zeitperioden baubar, testbar und ausführbar. Der Qualitätsstand der Software ist dabei immer für alle Beteiligte transparent.
Continuous Integration erfordert
- einen Build-Server zum Planen und Ausführen von Builds und von Tests,
- eine Versionsverwaltung für den Quellcode,
- einen automatisierten Buildprozess, der die zu testenden Produkte erstellt
- automatisierte Unit-Tests, um die gebauten Build-Produkte zu testen.
Alle diese Aufgaben können durch den Einsatz von kommerzieller Software, Open-Source-Software oder einer Kombination aus beidem bewältigt werden. Weiterhin kann ein CI-System als "Minimalsystem" aufgesetzt werden, um es dann schrittweise zu erweitern. Z.B. mit
- Code-Coverage-Auswertungen (wieviel Teile des Codes werden beim Unit-Test durchlaufen)
- weiterführenden automatisierten Tests (wie z.B. GUI- oder Schnittstellen-Tests)
- Code-Style-Checks (statische Codeanalyse), um Abweichungen von Programmierkonventionen festzustellen
- Produkt-Repositories zum automatischen Auflösen von abhängigen Artefakten, die beim Build-Prozess benötigt und erstellt werden
- Dashboards zur übersichtlichen Darstellung der beim Build- und Testprozess gewonnenen Qualitätsdaten
Für ein Unternehmen, ein Projekt und für Entwickler entsteht der Nutzen aus der Continuous Integration, weil sie
- die Softwareentwicklungskosten durch das frühe Erkennen und Beseitigen von Fehlern im Software-Lifecycle senkt,
- Qualitätsaspekte der Software durch automatische Checks sicherstellt,
- die Transparenz des Build-Prozesses durch die notwendige Automatisierung erhöht,
- den Entwicklungsprozess unterstützt, z.B. durch getriggerte Email-Benachrichtiungen, Dashboards oder Softwaremetriken,
- moderne agile Methoden der Softwareentwicklung (z.B. Scrum) unterstützt,
- den Entwickler beim Programmieren durch automatisches Ausführen von Builds und Tests auf einem dedizierten Build-Server entlastet.
Der Einführung und Etablierung von Continuous Integration können weitere Schritte zur Qualitäts- und Effizienzsteigerung des Entwicklungsprozesses folgen. Die Disziplinen Continuous Deploy und Continuous Delivery führen den Gedanken von CI fort und haben zum Ziel, einen kontinuierlichen Auslieferungsprozeß für ein Softwareprodukt zu etablieren.
Mit der Erfahrung von argumentum in den Disziplinen Continuous Integration, Continuous Deploy und Continuous Delivery gelingt Ihnen die Einführung und Weiterentwicklung eines "kontinuierlichen Entwicklungsprozesses". Wir unterstützen Sie bei der
- Planung,
- Einführung,
- Implementierung und
- Administration
eines CI- und/oder eines CD-Systems.