Als Alternative zu Github und Github Actions gibt es für kleinere Teams/Projekte/Organisationen oder private Projekte viele Möglichkeiten, welche selber gehostet werden können. Ich habe die Kombination von Gitea (als Git Service) mit Drone (als CI/CD Service) getestet, insbesondere weil beide einen relativ kleinen Footprint bezüglich CPU und Memory haben. Sie lassen sich gut auf einem kleinen VPS (Virtual Private Server) oder sogar einem Raspberry Pi betreiben.
Für ein privates Projekt, dass ich in Golang entwickelt habe hatte ich folgende Anforderungen:
- Ein Push in den Master Branch soll nachfolgende Schritte vollautomatisch auslösen
- Ein Docker Image bauen, auf einer Registry ablegen und anschliessend die laufende Instanz mit der neuen Version ersetzen
- Die Binaries sollen für gängige Betriebssysteme (Linux, Windows) und gängige Architekturen (amd64, i386, arm64 und armv7) kompiliert und als Releases in Git zur Verfügung gestellt werden
Beim Gitea Release Plugin habe ich ein eigenes Image verwendet, bis mein Pull Request in das offizielle angenommen wird. use tag as title if not user provided fixes #26 by pheelee · Pull Request #28 · drone-plugins/drone-gitea-release (github.com)
|
|
Secrets
Gewisse Parameter gehören nicht in ein Version Control System (Git) wie Passwörter, Tokens und unter Umständen Benutzernamen. Dafür bietet Drone die Möglichkeit Secrets pro Repository zu hinterlegen. Entsprechend wird in der .drone.yml der Parameter mit from_secret
gelesen.
Git push
Nach dem aktivieren des Repositories in Drone und der Eingabe der Secrets kann der Sourcecode auf Gitea pushed werden und die Pipeline führt die entsprechenden Aufgaben aus. Wichtig ist das der Parameter --follow-tags
bei git push mitgegeben wird. Ich habe zusätzlich --set-upstream origin master
mitgegeben, weil es sich um den ersten Push handelt.
Drone Pipelines
Gemäss meinen Angaben in .drone.yml werden nun 2 Pipelines ausgeführt, eine um das Docker Image zu bauen und auf die Registry pushen. Die andere Pipeline kompiliert die Binaries und lädt sie in das Git Repository als Release hoch.