CI / CD Pipeline

Eines der größeren Kundenprojekte im Jahr 2018 war die Verbesserung einer Continuous Integration / Continuous Deployment Pipeline. Dabei hatte ich das Glück auf ein sehr aufgeschlossenes Team zu treffen, das bereits Continuous Integration praktizierte. Continuous Deployment ins Produktionssystem wurde grundsätzlich auch schon gemacht, allerdings war es die erste Version der Pipeline. Diese hatte folgende Probleme:

  • sehr komplex da
    • Ausführungsdetails schwer nachvollziehbar
    • Ausführungslogik auf mehrer Repositories verteilt war
  • Neustart/wiederholte Ausführung nicht möglich
  • Inkonsistenzen möglich
  • Pipelines müssen per Web-UI erstellt bzw. gewartet werden

Das System besteht aus vielen Microservices, wobei jedes den Source Code in einem eigenen Github Repository hostet. Für Continuous Integration ist Travis CI zuständig. Für Continuous Deployment Spinnaker zusammen mit Travis CI und einem eigenen in Python geschriebenen Tool. Die Konfiguration einzelner Services sowie einzelner Mandanten ist in in einem Github Repository abgelegt.

Mit der Einführung von Spinnaker Pipeline templates konnte Komplexität erheblich reduziert werden, da die Pipeline Stages in einer Vorlage definiert wurden und jedes Service nur mehr seine eigenen Pipeline Parameter definieren muss. Somit war auch die Ausführungslogik nurmehr in einem Travis Exekutor Repository womit man im Fehlerfall nur mehr auf ein Ausgabe-Log schauen musste. Durch den Umbau des sh-Skriptes das für das tatsächliche Deployment verantwortlich war, konnten eventuelle Inkonsistenzen bereinigt werden. Dadurch war immer garantiert, dass der Zustand im Produktionssystem dem Zustand im Konfigurations-Repository entspricht.

Mit einem weiteren sh-Skript lässt sich nun auch automatisiert die Version des Pipeline Templates erhöhen sowie ein Pull Request dafür erstellen. Dabei wird noch ein bestimmtes Label für den PR gesetzt, sodass der PR nach erfolgreichem CI-Build wiederrum automatisch gemerged wird was wiederrum automatisch die Ausführung der zugehörigen Spinnaker Pipeline anstößt.

Was Kollegen bzw. Benutzer des Setups dazu meinten:

Fazit

Eine CI/CD Pipeline ist ein sehr wertvolles Werkzeug und sollte in keinem DevOps Setup fehlen. Sie hilft dabei den gesamten Release-Prozess zu automatisieren und ermöglicht es Änderungen an einem System ohne viel Risiko und hoch frequentiert in Produktion zu deployen. Für das initiale Setup muss man zwar mit einer Investition von einigen Mannmonaten rechnen, jedoch nimmt diese den Entwicklern bzw. dem Operations-Team viel lästige Release- und Deploymentarbeit ab. Spinnaker ist außerdem nicht das einzige Tool. Es gibt viele mehr, wie zBsp.

Cloudprovider wie Amazon Web Services, Google Cloud Platform oder Azure haben mittlerweile auch schon ihre eigenen Lösungen für CI/CD.