CI/CD + Drone
Auf meinem Server zuhause laufen einige persönliche Anwendungen wie z.B. meine Homepage, beim Blog, die Heimsteuerung, …
Ein Thema, das ich schon länger vor mir herschiebe ist die Automatisierung dahingehend, dass wenn ich neuen Code zu GitHub pushe, dieser direkt veröffentlicht wird, ohne dass ich dies manuell machen muss.
Themen, die hiermit stark verwandt sind sind CI (continuous integration) und CD (continuous delivery bzw. deployment), wenngleich in meinem Fall eher die Rede von CD ist ;-).
Continuous Integration
Bei CI geht es darum, dass Änderungen regelmäßig eingecheckt werden, um sie zeitnah zu testen (automatisiert und/oder manuell). Weiters werden beispielsweise Merge-Konflikte vermieden bzw. frühzeitig erkannt.
Continuous Delivery bzw. Deployment
Dies ist der Schritt nach CI, wo es um die Bereitstellung der geänderten Anwendung geht. Dies kann dafür genützt werden, dass die Anwendung zum Test zur Verfügung gestellt wird, aber auch, um die Version direkt in der produktiven Umgebung zu veröffentlichen.
Bei Continuous Delivery und Continuous Deployment handelt es sich genaugenommen um zwei unterschiedliche Konzepte, die allerdings oft als Synonyme verwendet werden. Am Beispiel mit Docker lässt sich das sehr gut erklären.
Continuous Delivery würde ein Image erstellen und dieses im Registry veröffentlichen, während Continuous Deployment dieses Image im nächsten Schritt aktiviert.
Drone
Ich verwende als Codeverwaltung Git bzw. GitHub. Drone ist ein Open Source Tool, das sich exzellent mit GitHub koppeln lässt. Dies bedeutet, dass sobald eine Änderung in GitHub, wie beispielsweise in Push stattfindet, GitHub ein Event an Drone sende, welches dann den Buildvorgang aktiviert.
Drone setzt stark auf Docker. Der eigentliche Drone-Server läuft als Docker Container. Zusätzlich laufen noch ein oder mehrere sogenannte Runner, ebenfalls als separate Container. Ein Runner ist z.B. Docker. Zum Erstellen der Builds werden Docker-Images definiert sowie die Befehle angegeben, die innerhalb des Docker Containers ausgeführt werden sollen. Alternativ dazu gibt es auch ein Docker-Plugin, welches mit Dockerfiles arbeitet und das fertige Docker-Image auf Docker-Hub oder ein anderes privates Registry pushed.
Die gesamte Installation von Drone hat mit Hilfe der wirklich sehr guten Drone-Dokumentation weniger als zwei Stunden gedauert. Mittlerweile habe ich bereits vier meiner Projekte auf Drone umgestellt.
Zuvor habe ich versucht dies mit Jenkins zu realisieren. Das hat zwar nach vielem Probieren auch geklappt, aber wir sind leider nicht wirklich warm miteinander geworden. Außerdem hatte ich dabei immer das Gefühl, dass mit Kanonen auf Spatzen geschoßen wird, da mein Ziel ein sehr simples war und ich den ganzen Jenkins overhead nicht benötigt habe.