Wikipedia · einfach zusammengefasst · Stand
Kontinuierliche Integration
Das Ziel der kontinuierlichen Integration ist die Steigerung der Softwarequalität. Typische Aktionen sind das Übersetzen und Linken der Anwendungsteile, …
Inhalt5 Abschnitte
Definition und Ablauf
Kontinuierliche Integration, kurz CI (englisch continuous integration), bezeichnet in der Softwareentwicklung das fortlaufende Zusammenfügen von Komponenten zu einer Anwendung. Ihr Ziel ist eine höhere Softwarequalität. Sobald jemand Änderungen in die Versionsverwaltung eincheckt, wird der Integrationsvorgang automatisch ausgelöst.
Typischerweise übersetzt und verknüpft das System die Anwendungsteile und baut das Gesamtsystem neu. Zusätzlich führt es automatisierte Tests aus und erstellt Softwaremetriken, also messbare Kennzahlen zur Softwarequalität. Grundsätzlich können auch andere Operationen durchgeführt werden, die aus dem Quellcode abgeleitete Informationen erzeugen.
Eine Vorstufe ist der Nightly Build, bei dem die Software nachts automatisch erstellt wird. CI und Nightly Build können kombiniert werden. In DevOps heißt die Automatisierung auch Pipeline, weil ihre einzelnen Schritte nacheinander abgearbeitet werden. Entwickler erhalten dadurch schon nach wenigen Minuten eine Rückmeldung darüber, ob die festgelegten Qualitätsanforderungen erfüllt sind.
Eine Weiterentwicklung ist Continuous Delivery (CD): Dabei wird in bestimmten Zeitabständen oder nach Erreichen einer bestimmten Qualitätsmetrik eine neue Softwareversion ausgeliefert.
Technische und organisatorische Grundlagen
Für eine erfolgreiche kontinuierliche Integration gelten mehrere Grundsätze:
• Gemeinsame Codebasis: Alle Entwickler integrieren ihre Änderungen fortlaufend in eine gemeinsame Versionsverwaltung.
• Automatisierte Übersetzung: Jede Integration durchläuft einheitlich festgelegte Prüfungen, beispielsweise statische Code-Überprüfungen. Dafür muss der Übersetzungs- und Build-Prozess automatisiert sein. Separate Testumgebungen machen die Ergebnisse von den Arbeitsumgebungen der Entwickler unabhängig und können gezielt für kurze Testlaufzeiten eingerichtet werden.
• Kontinuierliche Testentwicklung: Zu jeder Änderung sollte möglichst gleichzeitig ein passender Test entstehen, etwa durch testgetriebene Entwicklung. Kontrollflussorientierte Testverfahren und die Code Coverage Analysis messen, welche Teile des Codes durch Tests abgedeckt werden.
• Häufige Integration: Entwickler sollen Änderungen möglichst oft in die gemeinsame Codebasis übernehmen. Kurze Abstände senken das Risiko fehlgeschlagener Integrationen und sichern den Arbeitsfortschritt in der gemeinsamen Codebasis.
• Integration in den Hauptbranch: Änderungen werden in den Hauptzweig des Produkts übernommen. Dort startet automatisch ein Build- und Testzyklus, der kontinuierliche Integrationsbuild.
Tests, Umgebung und Bereitstellung
Die Testzyklen vor einer Integration sollen kurz bleiben, damit häufige Integrationen möglich sind. Höhere Qualitätsanforderungen verlängern jedoch die Tests. Deshalb muss sorgfältig entschieden werden, welche Prüfungen vor der Integration notwendig sind; weniger wichtige Tests können erst danach ausgeführt werden.
Änderungen sollten in einem Abbild der tatsächlichen Produktionsumgebung getestet werden. CI kann auf jedem Rechner mit Zugriff auf den Quellcode stattfinden und gleichzeitig auf verschiedenen Systemen, beispielsweise unterschiedlichen Betriebssystemen, ausgeführt werden.
Die Ergebnisse müssen auch für Nicht-Entwickler einfach zugänglich sein. Tester können etwa auf das im Testsystem bereitgestellte Produkt zugreifen, Qualitätsverantwortliche auf Qualitätskennzahlen, Release Manager auf ein fertig paketiertes Abbild. Auch Dokumentationen können bereitgestellt werden.
Ein automatisiertes Reporting informiert leicht zugänglich darüber, wann die letzte erfolgreiche Integration stattfand, welche Änderungen seit der letzten Auslieferung hinzugekommen sind und welche Qualität die aktuelle Version besitzt. Eine automatisierte Softwareverteilung soll außerdem ermöglichen, jede Version einfach in die Produktionsumgebung oder deren Abbild zu übertragen.
Nutzen und Einschränkung
Kontinuierliche Integration entdeckt und behebt Integrationsprobleme fortlaufend, statt sie erst kurz vor einem Meilenstein sichtbar werden zu lassen. Nicht zusammenpassende Komponenten werden früh erkannt. Sofort ausgeführte Unittests, also Tests einzelner Programmeinheiten, können zeitnah zeigen, ob beispielsweise ein bestimmter Commit einen Fehler eingeführt hat.
Ein lauffähiger Stand bleibt ständig für Demonstrationen, Tests oder Vertriebszwecke verfügbar. Die unmittelbare Reaktion auf fehlerhaften oder unvollständigen Code fördert einen verantwortungsvolleren Umgang mit Änderungen und kürzere Check-in-Abstände. Das ist wichtig, weil der Aufwand für das Zusammenführen von Änderungen wächst, je länger die Integration aufgeschoben wird.
Als Nachteil nennt der Artikel, dass traditionelle Meilensteine im herkömmlichen Sinne entfallen.
Werkzeuge
Für kontinuierliche Integration gibt es verschiedene Server, Frameworks und Plattformen. Beispiele sind:
• Bamboo, ein kommerzieller CI-Server von Atlassian. • Rational Build Forge, ein Framework der IBM-Tochter Rational Software zur Automatisierung von Build- und Release-Prozessen. • Continuum, ein Subprojekt von Apache Maven mit Unterstützung für Maven 1, Maven 2, Ant und Shell-Skripte. • CruiseControl, ein Java-basiertes Framework für kontinuierliche Erstellungsprozesse, mit Varianten für das .Net-Framework und Ruby. • GitLab mit MIT-Lizenz und Unterstützung für Git und Shell-Skripte. • Hudson mit MIT-Lizenz, in Java geschrieben und in Servlet-Containern ausführbar; es unterstützt CVS, Subversion, Ant, Maven und Shell-Skripte. • Jenkins, ein Fork von Hudson mit MIT-Lizenz. Es ist in Java geschrieben, läuft eigenständig oder in Servlet-Containern und unterstützt unter anderem CVS, Apache Subversion, Git, ClearCase, Ant, Maven, Perforce und Shell-Skripte. • Team Foundation Server, eine Plattform für gemeinsame Softwareprojekte auf Basis von Microsoft SQL Server und Windows SharePoint Services. • Teamcity von JetBrains, ein webbasiertes Werkzeug, das mit IntelliJ IDEA, Eclipse und Microsoft Visual Studio zusammenarbeitet. • Travis CI, ein gehostetes und verteiltes Werkzeug für GitHub-Projekte.