CI/CD: Moderne Builds und Deployments mit GitHub

Posted on | 1316 words | ~7 mins

Kürzlich haben wir in unserem Tech Blog über die fünf Handlungsfelder berichtet, auf die wir uns im Zuge unserer OKRs in 2022 konzentrieren werden. Als Cloud-/Plattform-Team in der Anwendungsentwicklung ist “Cloud First” definitiv das relevanteste Handlungsfeld.

Marktdifferenzierende Anwendungen entwickeln wir grundsätzlich selbst, mit einer Vielzahl an EntwicklerInnen, und setzen Web- Frameworks und Programmiersprachen wie bspw. Kotlin, Spring Boot und Angular ein. Um unsere hohen Qualitätsstandards flächendeckend zu gewährleisten, forcieren wir die Entwicklungsarbeit in immer kürzeren Zyklen und in Form automatisierter Releases. Hierzu braucht es ein Source Control System und Pipelines zum Bauen, Integrieren und Testen der Entwicklungsstände.

Als Lösung für diese Anforderung haben wir uns für GitHub entschieden, das im CI/CD Umfeld sicherlich zu den eindeutigen Marktgrößen zählt und in den letzten Jahren den Umfang der im Enterprise-Umfeld relevanten Features deutlich erhöht hat.

Neben GitHub haben wir im Laufe unserer Evaluierungsphase auch Azure DevOps und GitLab näher betrachtet. Für GitHub haben wir uns letztendlich aus den folgenden Gründen entschieden:

  • Starke Verbreitung im Markt und große Bekanntheit im Entwicklerumfeld
  • Für uns (zukünftig) vielversprechende Funktionen wie GitHub Actions und Codespaces (eine Entwicklungsumgebung auf Basis von Visual Studio Code komplett im Browser)
  • Zugehörigkeit zu Microsoft und sommit die Perspektive, dass GitHub aufgrund des starken Backings langfristig bestehen wird

Nachdem wir Ende letzten Jahres damit begonnen haben, unsere Source Code Repositories nach GitHub umzuziehen und hier in den letzten Zügen liegen, migrieren wir gleichzeitig unsere Build & Deployment Verfahren von Jenkins auf GitHub Actions. Diese Aufgabe werden wir Ende 2022 vollständig abgeschlossen haben.

Schon jetzt merken wir als Cloud-/Plattform-Team, dass einige GitHub Features auf großes Interesse bei unseren EntwicklerInnen stoßen und uns das Leben einfacher machen. Da wir uns mit unseren gebündelten Services (Cloud Services, K8S, Source Control System & CI/CD) als Plattform-Dienstleister für unsere EntwicklerInnen betrachten, sehen wir den Ausbau dieser Services sowohl in der Breite als auch in der Tiefe als einen unserer wichtigsten Hebel für die Optimierung unserer Anwendungsentwicklung.

Die für uns spannendsten Features wollen wir im Folgenden kurz skizzieren.

GitHub Workflows & Actions

GitHub beinhaltet eine integrierte Workflow-Lösung. Über diese lassen sich bestimmte Aktionen, die sogenannten GitHub Actions, in mehreren Schritten durchführen, wenn bspw. Code eingecheckt oder ein Pull Request eröffnet wird. Diese Aktionen funktionieren nach dem Baukasten-Prinzip, d.h. es ist in den allermeisten Fällen nicht notwendig, die notwendigen Abläufe im Detail selbst zu programmieren bzw. zu scripten. Stattdessen stehen über den GitHub Marketplace vielzählige Actions zur sofortigen Nutzung bereit, die sich in die eigenen Workflows integrieren lassen. Hierzu zählen beispielsweise die Installation einer bestimmten Java Version, ein Maven Build oder das Deployment in einen Kubernetes Cluster.

Der Vorteil für unser Cloud-/Plattform-Team: Wir können uns ganz auf den übergreifenden Deployment- und Test-Workflow konzentrieren ohne uns mit den Implementierungs-Details der verschiedenen Programmiersprachen und Kubernetes-APIs beschäftigen.

Reusable Workflows

Mit Reusable Workflows können wir zentral standardisierte Workflows zur Verfügung stellen und pflegen. Diese Workflows können dann von den verschiedenen Entwicklungsteams genutzt werden.

Dies haben wir genutzt, um aus dem Cloud-Team heraus standardisierte Build- und Deployment-Workflows für Maven, NodeJS, Kubernetes sowie diverse Azure PaaS Services (App Service / Azure Functions) bereitzustellen. Unsere EntwicklerInnen können diese “out of the box” nutzen, während alle für uns wichtigen und erforderlichen Rahmenbedingungen automatisiert erfüllt werden.

Diese Workflows werden zentral von unserem Cloud-Plattform-Team verwaltet. Bei einer Änderung werden automatisch Pull Requests in allen Repositories erstellt, die den jeweiligen Reusable Workflow nutzen. Die EntwicklerInnen werden somit proaktiv über Updates informiert und können die verbesserte Version des Workflows übernehmen. So profitieren alle von einem gemeinsamen Standard und haben weniger Implementierungsaufwand.

Dependabot

Dependabot ist ein Tool, das Dependencies in einer Anwendung analysiert und über neue Versionen oder potenzielle Schwachstellen in diesen Abhängigkeiten informieren kann. Dies gilt für eine Vielzahl von Programmiersprachen, wie die uns beispielsweise relevanten Sprachen Kotlin, Typescript und Golang. Dependabot wurde vor einigen Jahren von GitHub aufgekauft und ist mittlerweile nahtlos in die GitHub-Oberfläche und -Prozesse integriert.

Mit Dependabot erhalten die Entwicklerteams automatisch einen Pull Request mit der neuen Version einer Abhängigkeit. Bei entsprechender Konfiguration des CI-Workflows wird auch gleich überprüft, ob die Anwendung noch erfolgreich baut und die Tests fehlerfrei auf „grün“ laufen. Auch bei Security-Updates erstellt Dependabot einen automatisierten Pull Request, der in diesem Fall um detaillierte Informationen bspw. zu Schweregrad und konkreter Gefährdungslage informiert.

Für uns ist dies ein wichtiger Baustein, effektiv und effizient kontinuierlich sichere, aktuelle Software für unsere Anwender bereitstellen zu können.

Secret Scanning

Passwörter oder sonstige Geheimnisse haben im Klartext im Quellcode nichts verloren. Sie sollten stattdessen in einem hierfür vorgesehen Secret Store hinterlegt werden, bspw. in einem Azure Key Vault.

GitHub bietet im Kontext das Advanced Security Addon an. Dieses beinhaltet die Möglichkeit, automatisiert den Quellcode auf Passwörter / Access Token oder Private Keys zu durchsuchen. Wird ein solches im Code gefunden, wie automatisch ein Alert am Repository hinterlegt. Ein kürzlich eingeführtes Feature erweitert diese Funktionalität um die Option, das Pushen von Quellcode mit erkannten Passwörtern / Access Tokens oder Private Keys direkt zu unterbinden.

Codespaces

GitHub Codespaces bieten eine vollständige Entwicklungsumgebung auf Basis von Visual Studio Code in der Cloud an. Man benötigt keine lokal installierten Development-Tools, Compiler oder sonstiges. Somit entfällt auch das Problem, verschiedene Versionen einer Entwicklungsumgebung mit ihren Abhängigkeiten und Toolings zu verwalten.

Mit Dev-Containern und Prebuilt-Codespaces bietet GitHub die Möglichkeit, eine vollständig vorkonfigurierte Entwicklungsumgebung, abgestimmt auf das konkrete Projekt, bereitzustellen und innerhalb von Sekunden zu starten. Hierzu sehen wir den Vorteil, dass insbesondere neue Kollegen in unseren Entwicklungsteam die notwendige Toolchain innerhalb von Sekunden verfügbar hat und sich somit schnell auf den Quellcode konzentrieren kann. Außerdem können wir Up- oder Downgrades von Abhängigkeiten zentral steuern und darüber weiteren Overhead von den EntwicklerInnen fernhalten.

Aktuell fehlt uns noch die Möglichkeit, die Region, in der ein Codespace erstellt wird, einzuschränken. Wir werden dies aber im Auge behalten, da wir definitiv Einsatzszenarien für die GitHub Codespaces bei uns sehen. Vor allem für unsere modernen Web-basierten Anwendungen können wir uns einen vielversprechenden Einsatz vorstellen.

Fazit

Mit GitHub stellen wir unseren EntwicklerInnen eine moderne CI/CD-Lösung bereit, die in unseren Augen ein vielversprechendes Weiterentwicklungspotential beinhaltet.

Durch GitHub Actions und Reusable Workflows haben wir erfahren, mit wie wenig Aufwand wir zentrale Build- und Deploy-Pipelines zur Verfügung stellen können, sodass die Entwicklungsteams sich auf die Aufgaben konzentrieren können, die ihnen Spaß machen, nämlich die Entwicklung von neuen Anwendungen, die unsere KundInnen begeistern.

Mit Secret Scanning und Dependabot haben wir die Visibilität für Updates und Security-Lücken deutlich erhöht – und können so deutlich schneller auf Gefährdungslagen und Verbesserungen reagieren. Das erhöht nicht nur die technische Aktualität und Sicherheit unserer Anwendungen und damit die Sicherheit unserer KundInnen und deren KundInnen, sondern erspart uns auch manuellen Recherche- und Upgrade-Aufwand, was wiederum zur Optimierung unserer Reaktionszeiten beiträgt.

Die Kehrseite der Medaille: Es ist trotz der technischen Hilfe durch Dependabot nicht so einfach, mit der Menge an Updates umzugehen. Nahezu täglich gibt es für die von uns verwendeten Dependencies neue Versionen, stellenweise beinhalten diese Breaking Changes. Insofern ist mit dem Anspruch an technische Aktualität auch trotz – oder gerade aufgrund der - Tool-Unterstützung ein gewisser Aufwand in der Entwicklung verbunden.

Viel Potenzial sehen wir in der künftigen Nutzung von GitHub Codespaces. Hiervon versprechen wir uns eine deutliche Verkürzung der Onboading-Dauer neuer Kolleginnen und Kollegen sowie einen effizienten Betrieb der heute noch individuell konfigurierten Entwicklungsumgebungen. Beim Einsatz von Codespaces stehen wir aber noch am Anfang. Wir verproben die Nutzung aktuell in unserem Cloud-/Plattform-Team und werden unsere Erfahrung weiter hier im Tech Blog mit euch teilen.

Ganz neu hat GitHub die Verfügbarkeit des Copilot angekündigt. Der Copilot ist ein KI-gestütztes Tool, das die EntwicklerInnen beim Schreiben von Code unterstützen soll – vergleichbar mit dem Pair-Programming mit KollegInnen. Unsere ersten Versuche haben bei uns einen echten „Wow-Effekt“ hervorgerufen.

Aufgrund der bisherigen Erkenntnisse sind wir von GitHub überzeugt und arbeiten daran, die aktuellen, aber auch zukünftigen Features für unsere EntwicklerInnen flächendeckend sinnvoll nutzbar zu machen, um damit vor allem unsere Entwicklungsgeschwindigkeit und -qualität weiter zu optimieren. Stay tuned!

Lasst uns wissen, falls ihr bereits weitere Anwendungsgebiete oder GitHub-Features erfolgreich implementiert habt.