Atlassians Continuous Delivery-Werkzeug Bamboo erlaubt die Verwendung sogenannter Plan Branches. Dies sind Build-Konfigurationen, die automatisch für neu angelegte Entwicklungszweige aus einem bestehenden Build Plan erzeugt werden. Mit Hilfe der Branch Detection von Bamboo werden neu erstellte Entwicklungszweige automatisch erkannt. Für jeden neuen Zweig wird dann ein Plan Branch angelegt, mit dem der Zweig genauso wie der Hauptentwicklungszweig gebaut, getestet und deployt wird. Dies ist eine großartige Hilfe bei der featuregetriebenen Softwareentwicklung, da neue Feature Branches damit automatisch die Continuous Delivery-Pipeline des Projekts durchlaufen und somit sofort alle qualitätssichernden Maßnahmen für diesen Zweig durchgeführt werden.

Mit einer solchen Konfiguration ist es auch möglich, Feature Branches nach erfolgreichem Build und Test gleich auf einem Zielsystem auszubringen, sodass das neue Feature dort manuell getestet werden kann. Man bekommt dadurch die Möglichkeit, Feature Branches direkt testen zu können, ohne erst auf die Rückintegration in den Hauptentwicklungszweig warten zu müssen.

Hat man mehrere parallel entwickelte Feature Branches auf verschiedenen Testsystemen ausgebracht, steht man vor der Herausforderung, hier noch den Überblick zu behalten. Es muss für die Entwickler jederzeit erkennbar sein, mit welchem Entwicklungsstand sie es gerade zu tun haben. Dazu ist es hilfreich, zu wissen, welcher Entwicklungszweig (und eventuell welcher Commit) gerade auf einem bestimmten Testsystem verfügbar ist. Damit weiß man genau, womit man es gerade zu tun hat.

Wenn die zu testende Anwendung diese Information kennt, kann diese zum Beispiel auf der Bedienoberfläche angezeigt werden, oder über einen Funktionsaufruf (zum Beispiel über eine REST-Schnittstelle) verfügbar gemacht werden. Dazu muss man nur die Information in die Anwendung übertragen. Wie kann man das erreichen?

Bamboo Variablen

Bamboo bietet die Möglichkeit, Variablen in allen Feldern (ausgenommen Passwortfelder) einer Build Plan-Konfiguration zu referenzieren. Diese Variablen werden über die folgende Syntax eingebunden:

${bamboo.variableName}

Bamboo ersetzt beim Ausführen eines Build Plans diese Variable durch ihren zum aktuellen Zeitpunkt gültigen Wert. Man hat die Möglichkeit, eigene Bamboo Variablen zu definieren, oder man verwendet die standardmäßig von Bamboo zur Verfügung gestellten Variablen. Einen Überblick über die vordefinierten Bamboo Variablen bietet die Seite „Bamboo variables“ in der Bamboo Dokumentation.

Unter anderem bietet Bamboo die Variable bamboo.planRepository.branch an. Diese enthält den Namen des Branches, der gerade im aktuellen Plan Branch gebaut wird. Die Verfügbarkeit dieser Variable hängt vom verwendeten Versionierungssystem ab. Für Git ist dieser Wert zum Beispiel verfügbar. Wenn man diese Variable dem aktuellen Build-Prozess übergibt, kann man den Wert der Variable dort weiterverarbeiten und an entsprechender Stelle in der deployten Anwendung anzeigen. Dazu übergibt man die Variable dem Aufruf des vom Projekt verwendeten Build Tools (Maven, Gradle, etc.) und verarbeitet den Wert dort weiter.

Beispiel für ein Maven-Projekt

Ein Beispiel soll dies für einen Maven-Build verdeutlichen.

Verwendet man Maven für sein Projekt, hat man damit die Möglichkeit, über sogenanntes Resource Filtering Maven-Variablen in die Ressourcen des Projektes einzufügen. Dazu referenziert man in seinen Ressourcen-Dateien eine Maven-Variable mit der gleichen Syntax wie die von Bamboo verwendete: ${variableName}. Der konkrete Wert einer solchen Variable kann entweder in der pom.xml definiert werden oder über die Kommandozeile übergeben werden. Das Resource Filtering muss in der pom.xml entsprechend aktiviert werden.

Damit haben wir einen Übergabepunkt einer Bamboo-Variablen an Maven: Wir übergeben in der Konfiguration des Maven Build-Tasks in Bamboo die Bamboo-Variable für den aktuellen Entwicklungszweig an Maven über die Goal-Definition des Maven-Builds. Diese Variable kann dann über Mavens Resource Filtering in die Anwendung übernommen werden.

Zum Beispiel können wir den Namen des aktuellen Entwicklungszweigs in eine Property-Datei project.properties einfügen, die im Projekt unter src/main/resources liegt. Diese Konfigurationsdatei kann wie folgt aufgebaut sein:

app.current.branch=${current.branch}

current.branch ist hier eine Maven-Variable, die beim Bau des Projekts mit dem entsprechenden Variablenwert ersetzt wird. Der Wert dieser Variable wird Maven beim Aufruf des Builds über die Kommandozeile übergeben. Die folgende Abbildung zeigt die Maven Task-Definition in Bamboo, bei der die Bamboo-Variable bamboo.planRepository.branch an Maven übergeben wird.

Die Übergabe geschieht in der Goal-Definition mit -Dcurrent.branch=${bamboo.planRepository.branch}. Bamboo ersetzt bamboo.planRepository.branch mit dem aktuellen Branch-Namen, der dann der Maven-Variable current.branch übergeben wird. Maven fügt diesen Wert anschließend in die Datei project.properties ein. Diese Konfigurationsdatei kann dann von der Anwendung ausgelesen werden. Damit hat die Anwendung Zugriff auf den aktuellen Branch-Namen und kann ihn z. B. auf einer Weboberfläche anzeigen.