server_netzwerk.jpg

Build & Deploy

Build

Einige Programmiersprachen, wie zum Beispiel die von uns für unsere Backends eingesetzte Sprache Java, werden vor der Ausführung in lauffähigen Programme kompiliert. Der Quellcode wird dabei für die Hardware, auf der die Software laufen soll, übersetzt. 

Ebenso werden moderne Frontend Frameworks wie React oder Angular transpilliert, um moderne TypeScript Programmierung in von allen Browsern verständliches JavaScript zu übersetzen.  Moderne Webseiten greifen zudem oftmals auf JavaScript Bibliotheken wie typeface.js oder jQuery zurück und setzen Frontend-CSS-Frameworks wie Bootstrap oder Foundation ein. Diese Ressourcen stammen aus unterschiedlichen Quellen und müssen für die Veröffentlichung zusammengesetzt werden. Sowohl der Vorgang des Kompilierens als auch das Verpacken von Frontend-Technologien lässt sich automatisieren. 

Wir setzen sowohl für den Buildprozess in unseren lokalen Entwicklungsumgebungen als auch für das Verpacken der Releasefähigen Inkremente Build-Scripte ein. In Konfigurationsdateien wird definiert, welche Ressourcen und Versionen von externen Quellen geladen und wie diese kombiniert werden müssen. Darüberhinaus werden automatisierte Test durchlaufen und somit sichergestellt, dass die Software problemlos funktioniert. Die Entwickler werden somit von diesen repetitiven Aufgaben befreit, Abhängigkeiten minimiert und die Fehleranfälligkeit reduzieren. 

Durch die gute Dokumentation unserer Prozesse und die einheitlichen Build- und Deploy-Chains können Projekte im Bedarfsfall auch von Dritten bearbeitet, gestartet und ausgerollt werden.


Deployment

Die Zeiten, in denen Webseiten händisch per FTP auf den Webserver kopiert wurden, sind lange vorbei. In unseren Projekten müssen sich die Entwickler nicht mehr um die Interaktion mit dem Server, auf dem sie Software ausgerollt wird, kümmern. Der gesamte Prozess ist voll automatisiert.

Alle Projekte werden in eigenen Git Repositories strukturiert, bearbeitet und versioniert. Für die Weiterentwicklung legen wir sogenannte Feature-Branches an, in denen neue Funktionen entwickelt werden können, ohne dass dies einen Einfluss auf ein Live- oder Testsystem hat. Es handelt sich dabei um Kopien der bisherigen Versionen, die nach der Bearbeitung durch die Programmierer zurückgespielt und die Neuerungen somit übernommen werden.

In all unseren Projekten gibt es drei wichtige Branches, die via. Gitlab CI Chain (Continuous Integration) mit drei Umgebungen verknüpft sind. Werden bestimmte Features in einen der folgenden Branches zurückgespielt, wird die Software vollautomatisch und lauffähig ausgeliefert ohne das ein Entwickler eingreifen muss.

 

  • “Development” - Diese Umgebung ist ein Showroom für experimentelle Features.  Hier werden Funktionen und Konzepte getestet und in den Gesamtkontext gestellt. So können Sie frühzeitig neue Ideen ausprobieren, die noch gar nicht voll ausgereift sein müssen. In Kundenprojekten kommt es nicht selten vor, dass das Look&Feel komplexer Anwendung letztlich über die konkrete Ausgestaltung entscheidet, um ein Optimum an Usability für Ihre Kunden bereitzustellen.
     
  • “Stage” - Hierbei handelt es sich um ein Test- und Abnahmesystem. In diesem veröffentlichen wir eine stabile Version der Software, die potentiell als “Release Kandidat” gehandelt wird. Als Kunde können Sie die Software vollumfänglich testen, Feedback geben und ggf. nachsteuern, z.B. wenn die zugrundeliegenden User Stories angepasst werden sollen.
     
  • “Live” - Im Produktivsystem werden die zuvor auf “Stage” getestete Versionen der Software öffentlich und somit dem Endkunden zugänglich gemacht.

 

Da der Build&Deploy-Prozess bei komplexen Anwendungen üblicherweise mehrere Minuten bis zu Stunden dauern kann, läuft dies bei den meisten Projekten vollautomatisch im Hintergrund ab. Ist das Deployment erfolgreich beendet worden oder treten Probleme währenddessen auf, wird das gesamte Team durch unsere Vollintegration in Slack (Instant-Messaging-Dienst) benachrichtigt. Build & Deploy wird in der Regel zu Projektbeginn eingerichtet und Bedarf dann während der Entwicklung nur minimaler Pflege. 


Flexibilität mit Docker

Standardmäßig setzen wir in allen Projekten Docker ein. Docker ist eine Open-Source-Technologie, die es ermöglicht, Software zu virtualisieren und mithilfe austauschbarer Pakete - in sogenannten Containern - zu betreiben. 

In einem Container werden die Abhängigkeiten der Anwendung installiert und gekapselt zur Verfügung gestellt. So stellen wir sicher, dass die Anwendung perfekt mit externen Abhängigkeiten harmoniert. Projekte die für eine Docker-Infrastruktur vorbereitet sind, können auch zwischen Entwicklern schnell und einfach ausgetauscht werden.

 

Der Produktivserver muss nur noch mit minimalem Aufwand konfiguriert werden und dient lediglich als Bereitstellungs- und Recheninstanz. Im Havariefall können Docker und einzelnen Container einfach und schnell ausgetauscht werden. Darüber hinaus ist es möglich, Cluster-Systeme aufzubauen. So können in Stoßzeiten einfach zusätzliche Docker/Container hinzugeschaltet werden, um Lastspitzen abzufangen. Ebenso vereinfachen sich Updates im Dockerumfeld. Da beim Deployprozess lediglich der Dockercontainer umgeschaltet werden muss, profitieren sie in unseren Projekten von minimierten Ausfallzeiten von wenigen Sekunden bis Minuten bei System-Updates oder der Veröffentlichung neuer Features.

Sollten Sie Anwendung mit dem Ziel “Null Ausfallzeit” beim Deploy betreiben wollen, können wir diesen diesen zusätzlichen Schritt durch geeignete Switching Strategien mit Docker ebenfalls anbieten.