- Remove middleware reference from Gitea Traefik labels (caused routing issues) - Optimize Gitea connection pool settings (MAX_IDLE_CONNS=30, authentication_timeout=180s) - Add explicit service reference in Traefik labels - Fix intermittent 504 timeouts by improving PostgreSQL connection handling Fixes Gitea unreachability via git.michaelschiemer.de
8.8 KiB
CI/CD Workflow Guide
Stand: 2025-11-07
Status: Vollständige Dokumentation der CI/CD Workflows
Übersicht
Dieses Dokument erklärt die CI/CD Workflows und wie sie funktionieren. Die Workflows verwenden Ansible Playbooks für Deployment, um Idempotenz, bessere Fehlerbehandlung und konsistente Logs zu gewährleisten.
📖 Verwandte Dokumentation:
- Code Deployment Workflow - Unterschiede zwischen Rsync und Git
- Initial Deployment Guide - Initial Deployment Anleitung
- Application Stack Deployment - Detaillierter Ablauf
- CI/CD Status - Aktueller Status
Workflow-Übersicht
Automatische Workflows
.gitea/workflows/build-image.yml
- Trigger: Push zu
stagingodermainBranch - Jobs:
- changes - Prüft ob Build notwendig ist
- test - Führt Tests aus (PHP, Pest, PHPStan, Code Style)
- build - Baut Docker Image und pusht zur Registry
- deploy-staging - Auto-Deploy zu Staging (nur bei
stagingBranch) - deploy-production - Auto-Deploy zu Production (nur bei
mainBranch)
Manuelle Workflows
.gitea/workflows/manual-deploy.yml
- Trigger: Manuell via
workflow_dispatch - Inputs:
environment: staging oder productionimage_tag: Optional, Image Tag zum Deployenbranch: Optional, Branch zum Checkout
- Jobs:
- determine-image - Bestimmt Image zum Deployen
- deploy-staging - Deploy zu Staging
- deploy-production - Deploy zu Production
Deployment-Prozess
Staging Auto-Deploy (build-image.yml)
Trigger: Push zu staging Branch
Ablauf:
-
Code-Deployment (
deploy-application-code.yml)- Git Repository wird auf Server aktualisiert
- Branch:
staging - Ziel:
/home/deploy/michaelschiemer/current
-
Composer Dependencies (
install-composer-dependencies.yml)composer install --no-dev --optimize-autoloader- Im
phpContainer ausgeführt queue-workerundschedulerwerden neu gestartet
-
Image-Deployment (
deploy-image.yml)- Docker Image wird zur Registry gepusht
- Image wird auf Server gepullt
docker-compose.production.ymlwird aktualisiert- Container werden neu gestartet
-
Health-Check
- Prüft
https://staging.michaelschiemer.de/health - Wartet bis zu 10 Versuche (100 Sekunden)
- Prüft
Production Auto-Deploy (build-image.yml)
Trigger: Push zu main Branch
Ablauf:
-
Code-Deployment (
deploy-application-code.yml)- Git Repository wird auf Server aktualisiert
- Branch:
main - Ziel:
/home/deploy/michaelschiemer/current
-
Composer Dependencies (
install-composer-dependencies.yml)- Gleicher Prozess wie Staging
-
Image-Deployment (
deploy-image.yml)- Gleicher Prozess wie Staging
- Environment:
production
-
Health-Check
- Prüft
https://michaelschiemer.de/health - Wartet bis zu 10 Versuche (100 Sekunden)
- Prüft
Ansible Playbooks in Workflows
deploy-application-code.yml
Zweck: Code-Deployment via Git
Parameter:
deployment_environment:stagingoderproductiondeployment_hosts:production(Inventory Group)git_branch: Branch zum Deployen (stagingodermain)
Was passiert:
- Git Repository wird geklont (falls nicht vorhanden)
- Repository wird aktualisiert (
git pull) - Executable Permissions werden gesetzt
- Verifikation: Prüft ob
worker.php,console.php,composer.jsonexistieren
install-composer-dependencies.yml
Zweck: Composer Dependencies Installation
Parameter:
deployment_environment:stagingoderproduction
Was passiert:
composer install --no-dev --optimize-autoloaderim PHP Container- Verifikation: Prüft ob
vendor/autoload.phpexistiert - Restart:
queue-workerundscheduler(nur Production)
deploy-image.yml
Zweck: Docker Image Deployment
Parameter:
deployment_environment:stagingoderproductionimage_tag: Image Tag (z.B.latest,git-abc1234)docker_registry: Registry URLdocker_registry_username: Registry Usernamedocker_registry_password: Registry Password
Was passiert:
- Docker Registry Login
- Image Pull
docker-compose.production.ymlwird aktualisiert- Container werden neu gestartet
- Container Status wird angezeigt
Secrets Konfiguration
Erforderliche Secrets
REGISTRY_USER
- Docker Registry Benutzername
- Standard:
admin
REGISTRY_PASSWORD
- Docker Registry Passwort
- Zu finden in:
deployment/stacks/registry/auth/htpasswd
SSH_PRIVATE_KEY
- SSH Private Key für Production-Server-Zugriff
- Kompletter Inhalt inkl.
-----BEGIN OPENSSH PRIVATE KEY-----
ANSIBLE_VAULT_PASSWORD
- Ansible Vault Password für verschlüsselte Secrets
- Optional: Falls nicht gesetzt, wird leeres Password File verwendet
GITEA_TOKEN (optional)
- Gitea Personal Access Token
- Für automatische Issue-Erstellung bei Security-Scans
Secrets konfigurieren
# In Gitea UI:
https://git.michaelschiemer.de/michael/michaelschiemer/settings/secrets/actions
# Secrets hinzufügen:
- REGISTRY_USER
- REGISTRY_PASSWORD
- SSH_PRIVATE_KEY
- ANSIBLE_VAULT_PASSWORD
Workflow-Beispiele
Staging Deployment (Automatisch)
Trigger: Push zu staging Branch
git checkout staging
git add .
git commit -m "feat: Add new feature"
git push origin staging
Was passiert automatisch:
- Tests werden ausgeführt
- Docker Image wird gebaut
- Image wird zur Registry gepusht
- Code wird via Git deployt
- Composer Dependencies werden installiert
- Image wird deployt
- Health-Check wird durchgeführt
Production Deployment (Automatisch)
Trigger: Push zu main Branch
git checkout main
git merge staging
git push origin main
Was passiert automatisch:
- Gleicher Prozess wie Staging, aber auf Production
Manuelles Deployment
Via Gitea UI:
- Gehe zu:
https://git.michaelschiemer.de/michael/michaelschiemer/actions - Wähle: "Manual Deployment"
- Klicke: "Run workflow"
- Wähle:
- Environment:
productionoderstaging - Image Tag: Optional (z.B.
git-abc1234) - Branch: Optional (Standard:
mainfür Production,stagingfür Staging)
- Environment:
Troubleshooting
Problem: Code-Deployment schlägt fehl
Ursachen:
- Git Repository existiert nicht auf Server
- Git Credentials fehlen
- Branch existiert nicht
Lösung:
- Prüfe
deploy-application-code.ymlLogs - Prüfe ob Git Repository auf Server existiert
- Prüfe Branch-Name
Problem: Composer Dependencies Installation schlägt fehl
Ursachen:
composer.jsonfehlt- PHP Container läuft nicht
- Netzwerk-Probleme
Lösung:
- Prüfe ob
composer.jsonexistiert - Prüfe PHP Container Status
- Prüfe
install-composer-dependencies.ymlLogs
Problem: Image-Deployment schlägt fehl
Ursachen:
- Registry Login fehlgeschlagen
- Image existiert nicht in Registry
- Docker Compose Dateien fehlen
Lösung:
- Prüfe Registry Credentials
- Prüfe ob Image in Registry existiert
- Prüfe
deploy-image.ymlLogs
Problem: Health-Check schlägt fehl
Ursachen:
- Container starten nicht
- Application hat Fehler
- Health-Check Endpoint nicht erreichbar
Lösung:
- Prüfe Container Status:
docker compose ps - Prüfe Container Logs:
docker compose logs - Prüfe Health-Check Endpoint manuell:
curl https://michaelschiemer.de/health
Best Practices
1. Staging First
Empfohlen: Immer zuerst auf Staging deployen, dann auf Production
# 1. Staging
git push origin staging # → Auto-Deploy zu Staging
# 2. Testen auf Staging
# ... Tests durchführen ...
# 3. Production
git checkout main
git merge staging
git push origin main # → Auto-Deploy zu Production
2. Image Tags
Empfohlen: Spezifische Image Tags verwenden statt latest
Vorteile:
- Rollback möglich
- Nachvollziehbarkeit
- Reproduzierbarkeit
Beispiel:
# Manuelles Deployment mit spezifischem Tag
# Image Tag: git-abc1234
3. Vault Password
Empfohlen: ANSIBLE_VAULT_PASSWORD als Secret konfigurieren
Vorteile:
- Automatisiertes Deployment
- Keine manuelle Eingabe nötig
- Sicherer als manuelle Eingabe
4. Monitoring
Empfohlen: Pipeline-Status überwachen
Methoden:
- Gitea Actions UI
- Health-Check Endpoints
- Container Status
Referenz
- Code Deployment Workflow - Code-Deployment-Methoden
- Initial Deployment Guide - Initial Deployment
- Application Stack Deployment - Detaillierter Ablauf
- CI/CD Status - Aktueller Status
- Troubleshooting Guide - Probleme und Lösungen