Meistere CI mit Feature-Branches und Bamboo

Branching macht es einfacher, kurzfristig zu releasen – aber es gibt einen Haken.

Sepideh Setayeshfar Sepideh Setayeshfar

Es ist kein Geheimnis, dass Entwickler die Freiheit brauchen, Änderungen und Tests durchzuführen, ohne zu befürchten, dass sie die Hauptcodezeile durcheinanderbringen. Dank Branching ist das möglich – dem magischen Element, mit dem Teile des Codes isoliert und parallel modifiziert, entwickelt und getestet werden können.

Mit Git und Mercurial ist produktives Branching aus dem Reich der mythischen Praktiken in die Welt der Praxis übergetreten, wie wir ausführlich in Fünf Tipps für CI-freundliche Git-Repositorys besprochen haben. Und trotz aller Vorteile kann die Nutzung von Branches in einer Continuous-Delivery-Pipeline zwei unterschiedliche Probleme verursachen:

Anforderungen

Zeit:

30 Minuten

Zielpublikum:

Du bist neu bei Continuous Deployment und/oder Bitbucket Pipelines

Voraussetzungen:

Kostenlos testen

Duplizierung und Abweichung der Build-Konfiguration

  • Wenn Entwickler einen Branch erstellen, müssen eine Handvoll Build-Konfigurationen auf dem CI-Server manuell geklont werden. Da der Schritt manuell ausgeführt werden muss, machen sich manche Entwickler diese Mühe nicht, und deshalb werden bei der Entwicklung der Funktion keine Tests durchgeführt. Selbst wenn wir uns die Mühe machen, CI-Konfigurationen für unsere Feature-Branches zu kopieren, führen wir hier und da oft kleine Verbesserungen durch. Dann klonen wir die optimierten Konfigurationen für unseren nächsten Feature-Branch, nehmen weitere Änderungen vor, und schließlich weicht die Build-Konfiguration von der ursprünglichen Konfiguration ab, von der sie geklont wurde. Das führt zu Problemen bei der Verwaltung (und zu unangenehmen Überraschungen, wenn der Branch zurück zum Main gemergt wird).

Unsicherheit beim Integrationszustand

  • Wenn wir Änderungen von der Hauptzeile (ich nenne sie Main) nicht ständig in unseren Branch mergen und die Tests durchführen, besteht immer Unsicherheit darüber, ob unsere Änderungen funktionieren oder nicht – zumindest, bis der Branch mit dem Main gemergt wurde. Zwangsläufig funktionieren die Änderungen nicht wie erwartet und der Main ist jetzt mit beschädigtem Code belastet, wodurch der gesamte Sinn der Feature-Branches und der CI zunichtegemacht wird!

Bamboo löst diese beiden Probleme mit einem Feature, das wir als "Plan-Branches" bezeichnen. Mehr darüber erfährst du weiter unten auf dieser Seite. Es lohnt sich also, weiterzulesen.

Plan-Branches für Feature-Branches

Ein Plan-Branch ist ein Element deines Build-Plans in Bamboo, das einem Branch in deinem Repository entspricht. Er erbt die gesamte vom übergeordneten Plan definierte Konfiguration, mit der Ausnahme, dass er Builds nicht im Main erstellt, sondern in einem Branch. Wenn der Branch-Build erfolgreich ist, können Änderungen automatisch vom Branch zum Main gemergt werden. Alternativ können erfolgreiche Branch-Builds mithilfe der Bereitstellungsfunktionen von Bamboo in einer Testumgebung bereitgestellt werden (mehr dazu in einem anderen Artikel).

Wie du im Screenshot unten sehen kannst, erstellt unser Plan namens "A CI-Tests" nicht nur Builds im Main, sondern auch für den Integrations-Branch und eine Handvoll Branches für einzelne Jira-Vorgänge (zum Beispiel BDEV-10045-bump-tomcat-plugin-5-1). In Bamboo ist anhand des angezeigten Branch-Symbols einfach zu erkennen, welche Pläne Branches haben.

Screenshot "Build-Dashboard der Plan-Branches in Bamboo"

So kannst du das für einen bereits bestehenden Plan festlegen:

  • Melde dich als Benutzer mit Administratorrechten für diesen Plan an.
  • Wechsle zum Konfigurationsbildschirm, indem du im Dashboard von Bamboo auf das Bleistiftsymbol klickst oder das Aktions-Menü auf dem Bildschirm mit den Build-Ergebnissen nutzt.
  • Klicke auf dem Konfigurationsbildschirm auf die Registerkarte Branches.

Von hier aus können wir Bamboo so konfigurieren, dass es automatisch neue Branches im Repository erkennt und den entsprechenden Plan-Branch erstellt. Beachte, dass die automatische Branch-Erkennung derzeit nur für Repositorys von Git, Mercurial und Subversion verfügbar ist. Aber bitte fühle dich nicht ausgegrenzt, wenn du ein anderes Versionskontrollsystem wie TFS oder Perforce nutzt – du kannst Plan-Branches auch manuell erstellen.

Profitipp: Du wirst vermutlich nicht jeden einzelnen Branch, den du erstellst, auch entwickeln wollen. Wenn du eine Namenskonvention verwendest, bei der alle zu testenden Branches beispielsweise mit "feature-*" beginnen, dann kann Bamboo so konfiguriert werden, dass nur Plan-Branches erstellt werden, die diesem Präfix entsprechen. (Du kannst in diesen Konfigurationen auch reguläre Ausdrücke verwenden).

Screenshot "Branch-Konfigurationsverwaltung von Bamboo"

Da die meisten Feature-Branches kurzlebig sind (höchstens 3 bis 4 Tage), kannst du den Plan so konfigurieren, dass der Branch und seine Build-Ergebnisse nach einer bestimmten Anzahl von inaktiven Tagen aus Bamboo entfernt werden. Diese Funktion kann pro Branch deaktiviert werden, wenn du ihn auf unbestimmte Zeit behalten möchtest. Danach musst du ihn manuell entfernen. Keine Sorge: Egal, ob du einen Plan-Branch automatisch oder manuell entfernst, Bamboo wird den Branch selbst nicht aus deinem Repository entfernen – diese Entscheidung überlassen wir dir. Das heißt, es ist eine gute Idee, die automatische Bereinigung für manche Branches in Situationen, in denen du vielleicht einen langlebigen "stabilen" Branch deines Projekts verwaltest, vollständig zu deaktivieren.

Der einfache Weg, jeden Branch zu entwickeln

Obwohl wir dir wärmstens empfehlen, Git zu verwenden, kannst du Plan-Branches für jedes Versionskontrollsystem erstellen, das von Bamboo unterstützt wird. So erstellst du einen Plan-Branch von Hand:

  • Wechsle zum Build-Ergebnis-Bildschirm für deinen Plan und wähle im Aktions-Menü die Option Plan konfigurieren.
  • Klicke auf die Registerkarte Branches und dann die Schaltfläche Branch erstellen.
  • Bei Git und Mercurial wird ein Dialogfeld angezeigt, in dem alle verfügbaren Branches im Repository aufgelistet sind, zu denen in Bamboo noch kein entsprechender Plan-Branch vorhanden ist.
  • Wähle einen Branch und klicke auf Erstellen.
  • Benutzer zentralisierter VCS-Repositorys werden aufgefordert, einfach nur einen Namen, eine Beschreibung und den zu verwendenden Branch (bei Subversion ist dies die URL des Branch) anzugeben und dann auf Create (Erstellen) zu klicken.
Screenshot "Erstellen eines Plan-Branches"

Du kannst jetzt, wenn du möchtest, die automatische Bereinigung für den aktuellen Plan-Branch deaktivieren, und im Falle von verteilten Versionskontrollsystem-Repositorys (DVCS) eine Merge-Strategie konfigurieren. Merge-Strategien ermöglichen es Bamboo, Code bei erfolgreichen Builds automatisch zwischen Branches zu mergen (mehr dazu später). Es ist an dieser Stelle auch möglich, Repository-Informationen zu überschreiben (wenn du Plan-Branches mit Subversion verwendest, kannst du hier die SVN-URL von "trunk" auf "branch" ändern) oder Build-Variablen zu überschreiben. Du könntest beispielsweise eine Variable haben, die angibt, ob du für die Produktion bereitstellen wirst, und die du vielleicht für den Plan-Branch ändern möchtest.

Screenshot "Konfigurations-Branch-Konfigurationen von Bamboo"

Da die Build-Schritte für übergeordnete Plan-Builds und Plan-Branch-Builds genau gleich funktionieren, werden Konfigurationen wie Trigger und Benachrichtigungen vom übergeordneten Plan geerbt. Du kannst diese Einstellungen (und mehr) jedoch in den Konfigurationen jedes Plan-Branches pro Branch überschreiben.

Automatisches Mergen von Branches

Bevor du nicht die Änderungen im (oder vom) Main gemergt hast, weißt du nicht wirklich, ob alles funktioniert. Deshalb bietet dir Bamboo zwei Möglichkeiten, das Ganze in DVCS-Repositorys automatisch durchzuführen. Wir nennen diese Optionen "Branch-Updater" und "Gatekeeper", und du kannst beide auf jeden Plan-Branch anwenden. Wenn du den Branch-Updater nutzt, wird Bamboo, bevor der Build läuft, das Neueste vom Main in den Branch mergen, oder du nutzt den Gatekeeper, bei dem Bamboo den Main überprüft und Änderungen aus deinem Branch mergt. (In der Bamboo Dokumentation findest du weitere Informationen zum Thema Auswahl eines Merge-Modells.) Bamboo fährt dann mit der Ausführung des Builds fort.

Screenshot "Mergen von Branches"

Wenn der Build erfolgreich ist und du die Option Push wenn erfolgreich aktiviert hast, dann wird der Merge automatisch committet und zum Repository gepusht. Wenn du das Gatekeeper-Modell verwendest, heißt das, Änderungen am Branch werden zum Main gepusht. Wenn du das Branch-Updater-Modell verwendest, wird der Feature-Branch durch die Änderungen am Main auf den neuesten Stand gebracht.

Screenshot "Integrationsdetails der Build-Ergebnisse von Bamboo"

Das ist wirkliche Continuous Integration!

Wie ich bereits erwähnt hatte, können Plan-Branches mit Deployment-Projekten verbunden werden und Teil dieser Phase des Continuous-Delivery-Zyklus werden. Lies weiter, um mehr darüber zu erfahren.