Continuous Integration und Continuous Deployment bedeuten: Code pushen, Tests laufen automatisch, bei Erfolg wird deployed. Kein manuelles SSH, kein vergessenes Deployment, keine „läuft bei mir"-Probleme.
Continuous Integration (CI) prüft automatisch bei jedem Push ob der Code funktioniert: Tests laufen, Linting, Build. Fehler werden sofort sichtbar – nicht erst nach dem Deployment.
Continuous Deployment (CD) deployt automatisch wenn CI grün ist. Bei selbst gehosteten Projekten oft als simpler Deploy-Schritt via SSH:
GitHub Actions vs. Gitea Actions vs. selbst gehostet
Drei Optionen – mit unterschiedlichen Trade-offs:
GitHub Actions: 2000 Freiminuten/Monat auf kostenlosen Accounts. Riesiges Ökosystem an fertigen Actions. Für Open-Source und öffentliche Repos ideal.
Gitea Actions: Kompatibel mit GitHub-Actions-Syntax – einfache Migration. Auf selbst gehostetem Gitea laufend, volle Kontrolle über die Pipeline-Umgebung.
Selbst gehosteter Runner: Eigener Runner läuft auf dem Zielserver – kein SSH nötig, Runner hat direkt Zugriff. Sicherheitsüberlegungen wichtig (vertrauenswürdige Repos only).
Für Hobby-Projekte: GitHub Actions mit SSH-Deploy ist der einfachste Einstieg. Kein zusätzlicher Server nötig, Secrets sicher in GitHub gespeichert.
Docker Images bauen und in Registry pushen
Professionelle CI/CD-Pipelines bauen Docker Images und pushen sie in eine Registry:
GitHub Container Registry (ghcr.io): Kostenlos für öffentliche Images, eng integriert mit GitHub Actions
Selbst gehostete Registry: Gitea oder eigene Docker Registry – für private Images ohne Cloud-Dependency
Multi-Arch Builds:docker buildx baut Images für AMD64 und ARM64 gleichzeitig – wichtig wenn Raspberry Pi-Deployment geplant ist
Cache nutzen: Build-Cache in Actions mit `cache-from: type=gha` verkürzt Build-Zeit von Minuten auf Sekunden
Kompletter Flow: Push → Test → Build Image → Push to Registry → Server pulled neues Image → Compose Restart.
Häufige Fragen zu CI/CD
Minimum: Linting (Code-Formatierung/Stil), Unit Tests, Build-Schritt (kompiliert/startet es?). Für Docker-Projekte: Image bauen ohne Fehler. Mehr ist besser aber lieber eine einfache Pipeline die läuft als eine komplexe die niemand versteht.
Secrets in den Repository-Einstellungen speichern (GitHub: Settings → Secrets), nie in YAML-Dateien einchecken. Als `${{ secrets.MEIN_SECRET }}` referenzieren. GitHub maskiert Secret-Werte automatisch in Logs. SSH-Keys für Server-Zugriff als Deployment-Key anlegen – nicht den persönlichen Key nutzen.
GitHub Actions: Logs direkt in der UI, re-run mit Debug-Logging aktivieren. Lokal testen mit `act` (Docker-basiertes Tool das GitHub Actions lokal ausführt). Häufige Ursachen: fehlende Secrets im Fork, falsche Branch-Namen, abgelaufene SSH-Keys.
Für Solo-Projekte oder Skripte die selten ändern: ein einfaches `git pull` auf dem Server per Cron oder Webhook reicht. CI/CD lohnt sich wenn: mehrere Personen am Code arbeiten, Tests existieren die automatisch laufen sollen, oder Deployments komplex und fehleranfällig sind.