ci: setup CI/CD pipeline with Gitea Actions and secrets configuration

This commit is contained in:
2025-10-31 01:31:44 +01:00
parent 38baaca06b
commit 55c04e4fd0
28 changed files with 2113 additions and 958 deletions

View File

@@ -0,0 +1,86 @@
# Automatisches Secrets-Setup
## Schnellstart
```bash
# Interaktives Script (fragt nach Token)
bash scripts/setup-gitea-secrets-interactive.sh
```
Das Script:
1. Fragt nach einem Gitea Access Token
2. Setzt automatisch alle drei Secrets via API
## Token generieren
Falls noch kein Token vorhanden:
1. **Gehe zu Gitea Settings:**
```
https://git.michaelschiemer.de/user/settings/applications
```
2. **Klicke "Generate New Token"**
3. **Konfiguration:**
- Name: `secrets-setup` (oder beliebig)
- Disponível scopes:
- ✅ `write:repository` (mindestens)
- ✅ Oder wähle alle für volle Berechtigung
4. **Kopiere den Token** (wird nur einmal angezeigt!)
## Script ausführen
```bash
# Script starten
bash scripts/setup-gitea-secrets-interactive.sh
# Token eingeben (wird nicht angezeigt)
Gitea Token: <token-einfügen>
# Script setzt automatisch:
# ✅ REGISTRY_USER = admin
# ✅ REGISTRY_PASSWORD = registry-secure-password-3125
# ✅ SSH_PRIVATE_KEY = <aus ~/.ssh/production>
```
## Verifizierung
Nach erfolgreichem Setup:
1. **Prüfe in Gitea UI:**
```
https://git.michaelschiemer.de/michael/michaelschiemer/settings/secrets/actions
```
2. **Sollte zeigen:**
- ✅ REGISTRY_USER
- ✅ REGISTRY_PASSWORD
- ✅ SSH_PRIVATE_KEY
Alle drei Secrets sollten "Hidden" als Wert anzeigen.
## Troubleshooting
### "Token ungültig"
- Prüfe, ob Token korrekt kopiert wurde (keine Leerzeichen)
- Prüfe, ob Token die Berechtigung `write:repository` hat
### "Repository nicht gefunden"
- Prüfe Repository-Name: `michael/michaelschiemer`
- Prüfe, ob du Zugriff auf das Repository hast
### "HTTP 403 Forbidden"
- Token hat keine ausreichenden Berechtigungen
- Generiere neuen Token mit `write:repository` scope
### API nicht erreichbar
- Prüfe Gitea URL: `https://git.michaelschiemer.de`
- Prüfe Netzwerkverbindung
## Alternative: Manuelles Setup
Falls das automatische Setup nicht funktioniert:
Siehe `.gitea/workflows/QUICK_SECRETS_SETUP.md` für manuelle Anleitung.

View File

@@ -0,0 +1,90 @@
# CI/CD Pipeline - Setup Checklist
## ✅ Status
### 1. Repository Secrets in Gitea ✅ BEREIT
**Pfad**: Repository → Settings → Secrets
**Schnelles Setup:**
```bash
bash scripts/prepare-secrets.sh
```
**Erforderliche Secrets:**
- [ ] **REGISTRY_USER**: `admin`
- [ ] **REGISTRY_PASSWORD**: `registry-secure-password-2025`
- [ ] **SSH_PRIVATE_KEY**: Vollständiger Inhalt von `~/.ssh/production`
**Details**: Siehe `.gitea/workflows/QUICK_SECRETS_SETUP.md`
**Hinweis**: Alle Secrets müssen in Gitea konfiguriert werden, bevor die Pipeline läuft.
### 2. Docker Registry ✅
- ✅ Registry läuft auf `git.michaelschiemer.de:5000`
- ✅ Authentifizierung konfiguriert (admin/registry-secure-password-2025)
- ✅ Erreichbar via HTTP auf `127.0.0.1:5000`
- ✅ Image `framework` bereits vorhanden
**Registry-Test**:
```bash
curl -u admin:registry-secure-password-2025 http://127.0.0.1:5000/v2/_catalog
# Erwartete Ausgabe: {"repositories":["framework"]}
```
### 3. Ansible Playbooks ✅
-`deploy-update.yml` - Aktualisiert für Docker Compose
-`rollback.yml` - Aktualisiert für Docker Compose
-`setup-infrastructure.yml` - Enthält Registry-Setup
-`sync-stacks.yml` - Synchronisiert Stack-Konfigurationen
### 4. Workflow-Konfiguration ✅
-`.gitea/workflows/production-deploy.yml` - Haupt-Workflow
-`Dockerfile.production` - Production Dockerfile erstellt
- ✅ Application Stack konfiguriert (`deployment/stacks/application/docker-compose.yml`)
## 📋 Nächste Schritte
### Schritt 1: Secrets in Gitea hinzufügen
Siehe `.gitea/workflows/SECRETS_SETUP.md` für detaillierte Anleitung.
### Schritt 2: Workflow manuell testen
1. Gehe zu: `https://git.michaelschiemer.de/<username>/michaelschiemer/actions`
2. Wähle "Production Deployment Pipeline"
3. Klicke "Run workflow"
4. Wähle Branch `main`
5. Beobachte die Ausführung
### Schritt 3: Automatisches Deployment testen
1. Push zu `main` Branch
2. Workflow sollte automatisch starten
3. Prüfe Logs in Gitea Actions
## 🔧 Troubleshooting
### Registry nicht erreichbar
```bash
# Prüfe Registry-Status
ssh deploy@94.16.110.151 "docker ps | grep registry"
# Teste Registry-Erreichbarkeit
ssh deploy@94.16.110.151 "curl -u admin:registry-secure-password-2025 http://127.0.0.1:5000/v2/_catalog"
```
### Workflow schlägt bei Registry-Login fehl
- Prüfe, ob `REGISTRY_USER` und `REGISTRY_PASSWORD` Secrets korrekt gesetzt sind
- Prüfe, ob das Passwort in Gitea mit dem Server übereinstimmt
### Image Pull schlägt fehl
- Prüfe, ob das Image in der Registry existiert:
```bash
curl -u admin:registry-secure-password-2025 http://127.0.0.1:5000/v2/framework/tags/list
```
- Prüfe Registry-Logs für Fehler
### Deployment schlägt fehl
- Prüfe Ansible-Logs im Workflow
- Prüfe, ob `deployment/stacks/application/docker-compose.yml` auf dem Server existiert
- Prüfe Docker-Logs auf dem Server:
```bash
ssh deploy@94.16.110.151 "cd ~/deployment/stacks/application && docker compose logs"
```

View File

@@ -0,0 +1,101 @@
# Manuelles Secrets-Setup - Einfache Anleitung
Da das automatische Setup Probleme macht, hier die manuelle Lösung:
## Schritt 1: Gehe zu Gitea Secrets-Seite
Öffne im Browser:
```
https://git.michaelschiemer.de/michael/michaelschiemer/settings/secrets/actions
```
**Hinweis**: Falls diese Seite nicht existiert oder einen 404 gibt:
- Prüfe, ob das Repository wirklich `michael/michaelschiemer` heißt
- Prüfe, ob du Zugriff auf das Repository hast
- Prüfe, ob Actions aktiviert ist
## Schritt 2: Füge die drei Secrets hinzu
Für jedes Secret: **Klicke "New Secret"**, fülle aus, **Save**
### Secret 1: REGISTRY_USER
- **Name**: `REGISTRY_USER`
- **Value**: `admin`
- **Save**
### Secret 2: REGISTRY_PASSWORD
- **Name**: `REGISTRY_PASSWORD`
- **Value**: `registry-secure-password-2025`
- **Save**
### Secret 3: SSH_PRIVATE_KEY
- **Name**: `SSH_PRIVATE_KEY`
- **Value**: Führe aus `cat ~/.ssh/production` und kopiere den KOMPLETTEN Inhalt
```bash
cat ~/.ssh/production
```
**Wichtig**: Kopiere ALLES, inklusive:
- `-----BEGIN OPENSSH PRIVATE KEY-----`
- Alle Zeilen dazwischen
- `-----END OPENSSH PRIVATE KEY-----`
- **Save**
## Schritt 3: Verifizierung
Nach dem Setup sollten alle drei Secrets in der Liste erscheinen:
- ✅ REGISTRY_USER
- ✅ REGISTRY_PASSWORD
- ✅ SSH_PRIVATE_KEY
Alle zeigen "Hidden" als Wert.
## Falls die Secrets-Seite nicht erreichbar ist
### Option A: Repository-Name prüfen
```bash
# Prüfe aktuelle Remote-URL
git remote get-url origin
# Sollte zeigen:
# https://git.michaelschiemer.de/<owner>/<repo>.git
```
Falls der Name anders ist, verwende die korrekte URL.
### Option B: Repository erstellen
Falls das Repository noch nicht existiert:
1. Gehe zu: `https://git.michaelschiemer.de/repos/new`
2. Erstelle das Repository `michaelschiemer`
3. Dann gehe zu: `https://git.michaelschiemer.de/michael/michaelschiemer/settings/secrets/actions`
### Option C: Actions aktivieren
Falls Actions nicht aktiviert ist:
1. Gehe zu Repository Settings
2. Prüfe, ob "Actions" aktiviert ist
3. Falls nicht, aktiviere es in den Repository-Einstellungen
## Nächster Schritt
Nach erfolgreichem Setup der Secrets:
1. **Teste den Workflow:**
```
https://git.michaelschiemer.de/michael/michaelschiemer/actions
```
2. **Oder pushe einen Commit:**
```bash
git push origin main
```
Der Workflow sollte dann automatisch starten.

View File

@@ -0,0 +1,87 @@
# Secrets Setup mit Token - Schritt für Schritt
## ✅ Du hast bereits ein Token - Perfekt!
## Option 1: Automatisches Setup (Empfohlen)
Führe einfach dieses Kommando aus (ersetze `<DEIN_TOKEN>` mit deinem Token):
```bash
bash scripts/setup-gitea-secrets-with-token.sh <DEIN_TOKEN>
```
**Beispiel:**
```bash
bash scripts/setup-gitea-secrets-with-token.sh ghp_1234567890abcdefghijklmnopqrstuvwxyz
```
Das Script:
1. ✅ Testet die API-Verbindung
2. ✅ Setzt automatisch `REGISTRY_USER` = `admin`
3. ✅ Setzt automatisch `REGISTRY_PASSWORD` = `registry-secure-password-2025`
4. ✅ Setzt automatisch `SSH_PRIVATE_KEY` = Inhalt von `~/.ssh/production`
## Option 2: Manuell über Gitea UI
Falls das automatische Setup nicht funktioniert:
### Schritt 1: Gehe zu Secrets-Seite
```
https://git.michaelschiemer.de/michael/michaelschiemer/settings/secrets/actions
```
### Schritt 2: Füge jedes Secret einzeln hinzu
**REGISTRY_USER:**
1. Klicke "New Secret"
2. Name: `REGISTRY_USER`
3. Value: `admin`
4. Save
**REGISTRY_PASSWORD:**
1. Klicke "New Secret"
2. Name: `REGISTRY_PASSWORD`
3. Value: `registry-secure-password-2025`
4. Save
**SSH_PRIVATE_KEY:**
1. Klicke "New Secret"
2. Name: `SSH_PRIVATE_KEY`
3. Value: Kompletter Inhalt von `~/.ssh/production`
```bash
cat ~/.ssh/production
```
(Kopiere ALLES, inklusive `-----BEGIN` und `-----END` Zeilen)
4. Save
## Verifizierung
Nach dem Setup:
1. **Prüfe in Gitea UI:**
```
https://git.michaelschiemer.de/michael/michaelschiemer/settings/secrets/actions
```
2. **Sollte zeigen:**
- ✅ REGISTRY_USER
- ✅ REGISTRY_PASSWORD
- ✅ SSH_PRIVATE_KEY
Alle drei Secrets sollten "Hidden" als Wert anzeigen.
## Troubleshooting
### "API-Verbindung fehlgeschlagen"
- Prüfe Token-Kopierung (keine Leerzeichen)
- Prüfe Token-Berechtigung: `write:repository` Scope nötig
- Prüfe Repository-Name: `michael/michaelschiemer`
### "HTTP 403 Forbidden"
- Token hat keine ausreichenden Berechtigungen
- Generiere neuen Token mit `write:repository` scope
### "HTTP 404 Not Found"
- Repository existiert nicht oder falscher Name
- Prüfe: `https://git.michaelschiemer.de/michael/michaelschiemer`

View File

@@ -0,0 +1,119 @@
# ✅ Secrets erfolgreich gesetzt!
## Status
✅ Repository erstellt
✅ Secrets konfiguriert:
- REGISTRY_USER
- REGISTRY_PASSWORD
- SSH_PRIVATE_KEY
## 🚀 Nächster Schritt: CI/CD Workflow testen
### Option 1: Workflow manuell triggern (Empfohlen)
1. **Gehe zu Actions:**
```
https://git.michaelschiemer.de/michael/michaelschiemer/actions
```
2. **Workflow auswählen:**
- Suche nach "Production Deployment Pipeline"
- Klicke auf den Workflow
3. **Workflow starten:**
- Klicke "Run workflow" (rechts oben)
- Branch: `main`
- `skip_tests`: deaktiviert (Tests sollen laufen)
- Klicke "Run workflow"
4. **Logs beobachten:**
- Prüfe jeden Schritt in den Logs
- Er_warte ~8-15 Minuten für komplette Ausführung
### Option 2: Automatisches Deployment via Commit
```bash
# Stelle sicher, dass alles committed ist
git add .
git commit -m "chore: CI/CD pipeline setup complete"
# Push zu main - startet automatisch den Workflow
git push origin main
```
## 📊 Workflow-Schritte
Der Workflow führt folgende Schritte aus:
1. **Tests** (~2-5 Min)
- PHP Setup
- Composer Dependencies
- Tests ausführen
2. **Build** (~3-5 Min)
- Multi-Stage Docker Build
- Composer Dependencies (Production)
- Frontend Build (npm)
- Final Production Image
3. **Push** (~1-2 Min)
- Docker Login zur Registry
- Image Tag generieren
- Image zur Registry pushen
4. **Deploy** (~2-4 Min)
- Ansible Playbook ausführen
- Image auf Production pullen
- Application Stack aktualisieren
- Services neu starten
**Gesamtzeit: ~8-15 Minuten**
## ✅ Erfolgreiche Ausführung erkennen
Der Workflow ist erfolgreich, wenn:
- ✅ Alle Jobs grün sind
- ✅ Keine Fehler in den Logs
- ✅ "Deploy via Ansible" erfolgreich
- ✅ Application läuft auf Production-Server
## 🔍 Verifizierung nach Deployment
```bash
# Prüfe Application-Status
ssh deploy@94.16.110.151 "cd ~/deployment/stacks/application && docker compose ps"
# Prüfe Logs
ssh deploy@94.16.110.151 "cd ~/deployment/stacks/application && docker compose logs --tail=50"
# Prüfe Health Endpoint
curl -k https://michaelschiemer.de/health
```
## 🐛 Troubleshooting
### Workflow startet nicht
- Prüfe, ob `.gitea/workflows/production-deploy.yml` im Repository ist
- Prüfe Workflow-Syntax
### "Secret not found" Fehler
- Prüfe Secrets-Seite: `https://git.michaelschiemer.de/michael/michaelschiemer/settings/secrets/actions`
- Prüfe, ob Namen exakt übereinstimmen (Groß-/Kleinschreibung!)
### Registry Login fehlgeschlagen
- Prüfe `REGISTRY_USER` und `REGISTRY_PASSWORD` Secrets
- Teste Registry: `curl -u admin:registry-secure-password-2025 http://127.0.0.1:5000/v2/_catalog`
### Deployment fehlgeschlagen
- Prüfe `SSH_PRIVATE_KEY` Secret
- Prüfe Ansible-Verbindung: `ssh deploy@94.16.110.151 "echo OK"`
- Prüfe Server-Logs
## 🎉 Nach erfolgreichem Test
Du kannst jetzt:
- ✅ Commits pushen → Automatisches Deployment
- ✅ Workflow manuell triggern für kontrollierte Deployments
- ✅ Branch-Protection aktivieren für sichere Deployments

View File

@@ -0,0 +1,104 @@
# Quick Secrets Setup für Gitea CI/CD
## Zusammenfassung der benötigten Werte
### REGISTRY_USER
```
admin
```
### REGISTRY_PASSWORD
```
registry-secure-password-2025
```
### SSH_PRIVATE_KEY
Kopiere den kompletten Inhalt von φ~/.ssh/production`:
```bash
# Zeige SSH Key Inhalt (für Copy-Paste)
cat ~/.ssh/production
```
**Wichtig**: Der komplette Inhalt muss kopiert werden, inklusive:
- `-----BEGIN OPENSSH PRIVATE KEY-----`
- Alle Zeilen dazwischen
- `-----END OPENSSH PRIVATE KEY-----`
## Schnelle Vorbereitung
Führe das Helper-Script aus, um alle Werte anzuzeigen:
```bash
bash scripts/prepare-secrets.sh
```
Dies zeigt alle drei Secrets an, die du kopieren kannst.
## Manuelle Einrichtung in Gitea
1. **Gehe zu Repository Settings:**
```
https://git.michaelschiemer.de/<username>/michaelschiemer/settings/secrets
```
2. **Klicke auf "New Secret"**
3. **Füge jedes Secret hinzu:**
**REGISTRY_USER:**
- Name: `REGISTRY_USER`
- Value: `admin`
- Save
**REGISTRY_PASSWORD:**
- Name: `REGISTRY_PASSWORD`
- Value: `registry-secure-password-2025`
- Save
**SSH_PRIVATE_KEY:**
- Name: `SSH_PRIVATE_KEY`
- Value: `<kompletter Inhalt von cat ~/.ssh/production>`
- Save
## Verifizierung
Nach dem Setup sollten alle drei Secrets in der Liste erscheinen:
- ✅ REGISTRY_USER
- ✅ REGISTRY_PASSWORD
- ✅ SSH_PRIVATE_KEY
Alle zeigen "Hidden" als Wert.
## Nächster Schritt
Sobald die Secrets konfiguriert sind:
1. **Workflow manuell testen:**
```
https://git.michaelschiemer.de/<username>/michaelschiemer/actions
```
- Wähle "Production Deployment Pipeline"
- Klicke "Run workflow"
- Wähle Branch `main`
2. **Oder automatisches Deployment testen:**
- Pushe einen Commit zu `main`
- Workflow startet automatisch
## Troubleshooting
### Secrets werden nicht erkannt
- Prüfe, ob die Namen exakt übereinstimmen (Groß-/Kleinschreibung!)
- Prüfe, ob keine Leerzeichen am Anfang/Ende
### SSH Key Fehler
- Stelle sicher, dass der komplette Key kopiert wurde
- Prüfe, dass `-----BEGIN` und `-----END` Zeilen enthalten sind
### Registry Login Fehler
- Prüfe, ob `REGISTRY_USER` und `REGISTRY_PASSWORD` korrekt sind
- Teste Registry-Erreichbarkeit:
```bash
curl -u admin:registry-secure-password-2025 http://127.0.0.1:5000/v2/_catalog
```

View File

@@ -0,0 +1,30 @@
# Docker Registry Information
## Registry Details
- **URL**: `git.michaelschiemer.de:5000` (intern) oder `registry.michaelschiemer.de` (via Traefik)
- **Standard Credentials**:
- **Username**: `admin`
- **Password**: `registry-secure-password-2025`
⚠️ **WICHTIG**: Das Passwort sollte in Produktion geändert werden!
## Für Gitea Secrets
Verwende folgende Werte in den Gitea Repository Secrets:
- **REGISTRY_USER**: `admin`
- **REGISTRY_PASSWORD**: `registry-secure-password-2025` (oder das aktuell gesetzte Passwort)
## Registry Test
```bash
# Login testen
echo "registry-secure-password-2025" | docker login git.michaelschiemer.de:5000 -u admin --password-stdin
# Images auflisten
curl -u admin:registry-secure-password-2025 http://git.michaelschiemer.de:5000/v2/_catalog
# Oder via Traefik (HTTPS)
curl -u admin:registry-secure-password-2025 https://registry.michaelschiemer.de/v2/_catalog
```

View File

@@ -0,0 +1,86 @@
# Gitea Repository Secrets Setup
## Erforderliche Secrets
Diese Secrets müssen in Gitea konfiguriert werden unter:
**Repository → Settings → Secrets**
### 1. REGISTRY_USER
- **Beschreibung**: Benutzername für Docker Registry Login
- **Typ**: String
- **Wert**: Standardmäßig `admin` oder der Benutzername für die Registry
- **Verwendung**: Docker Registry Authentication beim Image Push
### 2. REGISTRY_PASSWORD
- **Beschreibung**: Passwort für Docker Registry Login
- **Typ**: Password (versteckt)
- **Wert**: Das Passwort für die Docker Registry auf `git.michaelschiemer.de:5000`
- **Verwendung**: Docker Registry Authentication beim Image Push
### 3. SSH_PRIVATE_KEY
- **Beschreibung**: SSH Private Key für Zugriff auf Production Server
- **Typ**: SSH Key (versteckt)
- **Wert**: Der komplette Inhalt der SSH-Private-Key-Datei (~/.ssh/production)
- **Verwendung**: SSH-Verbindung zum Production-Server für Ansible Deployment
## Setup-Anleitung
### Schritt 1: SSH Key erstellen/exportieren
```bash
# Falls noch nicht vorhanden, SSH Key für Production erstellen
ssh-keygen -t ed25519 -f ~/.ssh/production -C "gitea-ci-cd"
# SSH Key Inhalt anzeigen (für Copy-Paste)
cat ~/.ssh/production
```
**⚠️ Wichtig**: Der komplette Inhalt der Datei (inkl. `-----BEGIN OPENSSH PRIVATE KEY-----` und `-----END OPENSSH PRIVATE KEY-----`) muss in das Secret eingefügt werden.
### Schritt 2: Docker Registry Credentials prüfen
Die Registry läuft auf dem Production-Server. Prüfe die Credentials:
```bash
# SSH zum Production-Server
ssh deploy@94.16.110.151
# Prüfe, ob Registry läuft
docker ps | grep registry
# Prüfe Registry-Konfiguration (falls vorhanden)
cat ~/deployment/stacks/registry/docker-compose.yml 2>/dev/null || echo "Registry Config nicht gefunden"
```
**Hinweis**: Falls die Registry noch nicht konfiguriert ist, müssen die Credentials festgelegt werden.
### Schritt 3: Secrets in Gitea hinzufügen
1. Gehe zu: `https://git.michaelschiemer.de/<username>/michaelschiemer/settings/secrets`
2. Klicke auf **"Add Secret"**
3. Füge jedes Secret einzeln hinzu:
**REGISTRY_USER**:
- Name: `REGISTRY_USER`
- Value: `admin` (oder der tatsächliche Registry-Benutzername)
- Save
**REGISTRY_PASSWORD**:
- Name: `REGISTRY_PASSWORD`
- Value: `<registry-password>`
- Save
**SSH_PRIVATE_KEY**:
- Name: `SSH_PRIVATE_KEY`
- Value: `<kompletter-inhalt-von-~/.ssh/production>`
- Save
### Schritt 4: Secrets verifizieren
Nach dem Hinzufügen sollten alle drei Secrets in der Liste erscheinen mit "Hidden" als Wert.
**✅ Checkliste**:
- [ ] REGISTRY_USER hinzugefügt
- [ ] REGISTRY_PASSWORD hinzugefügt
- [ ] SSH_PRIVATE_KEY hinzugefügt
- [ ] Alle Secrets zeigen "Hidden" als Wert

View File

@@ -0,0 +1,132 @@
# CI/CD Workflow Testen
## ✅ Secrets sind konfiguriert - Perfekt!
## Option 1: Workflow manuell triggern (Empfohlen)
### Schritt 1: Gehe zu Actions
Öffne im Browser:
```
https://git.michaelschiemer.de/michael/michaelschiemer renewal/actions
```
### Schritt 2: Workflow auswählen
1. Suche nach "Production Deployment Pipeline"
2. Klicke auf den Workflow
### Schritt 3: Workflow manuell starten
1. Klicke auf "Run workflow" (rechts oben)
2. Wähle Branch: `main`
3. Optional: `skip_tests` deaktiviert lassen (Tests sollen laufen)
4. Klicke "Run workflow"
### Schritt 4: Logs beobachten
Der Workflow führt folgende Schritte aus:
1. **Checkout code** - Code wird ausgecheckt
2. **Run Tests** - PHP Tests werden ausgeführt
3. **Build Docker Image** - Docker Image wird gebaut
4. **Push to Registry** - Image wird zur Registry gepusht
5. **Deploy via Ansible** - Deployment auf Production-Server
**Beobachte die Logs** und prüfe jeden Schritt!
## Option 2: Automatisches Deployment via Commit
### Test-Commit pushen
```bash
# Stelle sicher, dass alles committed ist
git add .
git commit -m "test: CI/CD workflow test" || echo "Keine Änderungen"
# Push zu main Branch
git push origin main
```
Der Workflow startet automatisch nach dem Push.
## Was passiert beim Workflow?
### 1. Tests (ca. 2-5 Minuten)
- PHP Version Setup
- Composer Dependencies installieren
- Tests ausführen
### 2. Build (ca. 3-5 Minuten)
Live - Multi-Stage Docker Build:
- Composer Dependencies (Production)
- Frontend Build (npm)
- Finales Production Image
### 3. Push (ca. 1-2 Minuten)
- Docker Login zur Registry
- Image Tag generieren (SHA + Timestamp)
- Image zur Registry pushen
### 4. Deploy (ca. 2-4 Minuten)
- Ansible Playbook ausführen
- Image auf Production-Server pullen
- Application Stack aktualisieren
- Services neu starten
**Gesamtzeit: ~8-15 Minuten**
## Workflow-Status prüfen
### In Gitea UI:
```
https://git.michaelschiemer.de/michael/michaelschiemer/actions
```
### Via Command Line:
```bash
# Prüfe ob Workflow läuft
curl -s -H "Authorization: token <DEIN_TOKEN>" \
"https://git.michaelschiemer.de/api/v1/repos/michael/michaelschiemer/actions/runs" | \
jq '.workflow_runs[0] | {status, conclusion, created_at}'
```
## Erfolgreiche Ausführung erkennen
Der Workflow ist erfolgreich, wenn:
✅ Alle Jobs grün sind
✅ Keine Fehler in den Logs
✅ Letzter Schritt "Deploy via Ansible" erfolgreich
✅ Application läuft auf Production-Server
## Troubleshooting
### Workflow startet nicht
- Prüfe, ob `.gitea/workflows/production-deploy.yml` im Repository ist
- Prüfe, ob Workflow-Syntax korrekt ist
- Prüfe Gitea Actions ist aktiviert
### "Secret not found" Fehler
- Prüfe, ob alle drei Secrets gesetzt sind
- Prüfe, ob Namen exakt übereinstimmen (Groß-/Kleinschreibung!)
### Registry Login fehlgeschlagen
- Prüfe `REGISTRY_USER` und `REGISTRY_PASSWORD` Secrets
- Prüfe Registry erreichbar: `curl -u admin:registry-secure-password-2025 http://127.0.0.1:5000/v2/_catalog`
### Deployment fehlgeschlagen
- Prüfe `SSH_PRIVATE_KEY` Secret
- Prüfe Ansible-Verbindung zum Server
- Prüfe Server-Logs: `ssh deploy@94.16.110.151 "docker compose -f ~/deployment/stacks/application/docker-compose.yml logs"`
## Nächste Schritte nach erfolgreichem Test
1. ✅ Workflow funktioniert
2. ✅ Automatisches Deployment getestet
3. ✅ Production-Stack läuft
**Du kannst jetzt:**
- Normale Commits pushen → Automatisches Deployment
- Workflow manuell triggern für kontrollierte Deployments
- Branch-Protection aktivieren für sichere Deployments

View File

@@ -0,0 +1,75 @@
# Token-Probleme beheben
## Problem
Das Token hat nicht die richtigen Scopes oder das Repository wurde nicht gefunden.
## Lösung: Neuen Token mit richtigen Scopes erstellen
### Schritt 1: Token neu generieren
1. **Gehe zu Gitea Settings:**
```
https://git.michaelschiemer.de/user/settings/applications
```
2. **Falls bereits ein Token existiert:**
- Lösche den alten Token (falls nötig)
- Oder erstelle einen neuen mit anderen Namen
3. **Klicke "Generate New Token"**
4. **WICHTIG - Diese Scopes aktivieren:**
- ✅ `read:user` (mindestens erforderlich)
- ✅ `write:repository` (für Secrets schreiben)
- ✅ Oder wähle **alle Scopes** für volle Berechtigung
5. **Token kopieren** (wird nur einmal angezeigt!)
### Schritt 2: Repository-Name prüfen
Prüfe, ob das Repository wirklich `michael/michaelschiemer` heißt:
```bash
# Prüfe Remote-URL
git remote get-url origin
# Sollte zeigen:
# https://git.michaelschiemer.de/michael/michaelschiemer.git
```
Falls der Name anders ist, setze die Umgebungsvariable:
```bash
REPO_OWNER=<owner> REPO_NAME=<name> bash scripts/setup-gitea-secrets-with-token.sh <token>
```
### Schritt 3: Script erneut ausführen
```bash
bash scripts/setup-gitea-secrets-with-token.sh <NEUER_TOKEN>
```
## Alternative: Manuelles Setup über UI
Falls das automatische Setup weiterhin Probleme macht:
1. **Gehe zu:**
```
https://git.michaelschiemer.de/michael/michaelschiemer/settings/secrets/actions
```
2. **Füge manuell hinzu:**
- `REGISTRY_USER` = `admin`
- `REGISTRY_PASSWORD` = `registry-secure-password-2025`
- `SSH_PRIVATE_KEY` = `cat ~/.ssh/production`
## Troubleshooting
### "token does not have at least one of required scope(s)"
→ Token benötigt `read:user` Scope - neuen Token mit diesem Scope generieren
### "The target couldn't be found" (404)
→ Repository existiert nicht oder falscher Name - prüfe Repository-URL
### "404 page not found" bei Secrets-Endpoint
→ Actions möglicherweise nicht aktiviert - prüfe in Gitea Admin-Panel

View File

@@ -1,102 +0,0 @@
name: CI/CD Pipeline für michaelschiemer.de
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
env:
REGISTRY_URL: docker-registry:5000 # Container network access
IMAGE_NAME: michaelschiemer
jobs:
test:
runs-on: ubuntu-latest
container:
image: catthehacker/ubuntu:act-latest
services:
redis:
image: redis:8-alpine
mariadb:
image: mariadb:latest
env:
MYSQL_ROOT_PASSWORD: test
MYSQL_DATABASE: test
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.4'
extensions: gd, zip, pdo, pdo_mysql, opcache, pcntl, posix, shmop, redis
tools: composer
- name: Install Dependencies
run: composer install --no-progress --prefer-dist --optimize-autoloader
- name: Build Frontend Assets
run: npm install && npm run build
- name: Run Tests
run: ./vendor/bin/pest
env:
DB_HOST: mariadb
DB_PORT: 3306
DB_DATABASE: test
DB_USERNAME: root
DB_PASSWORD: test
REDIS_HOST: redis
REDIS_PORT: 6379
build:
needs: test
runs-on: ubuntu-latest
container:
image: catthehacker/ubuntu:act-latest
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop'
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Login to Private Registry
run: < /dev/null |
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY_URL }} -u admin --password-stdin
- name: Determine Image Tag
id: tag
run: |
if [ "${{ github.ref }}" = "refs/heads/main" ]; then
echo "tag=latest" >> $GITHUB_OUTPUT
else
echo "tag=develop" >> $GITHUB_OUTPUT
fi
- name: Build and Push Images
run: |
# Build and push PHP image
if [ -f docker/php/Dockerfile ]; then
docker build -t ${{ env.REGISTRY_URL }}/${{ env.IMAGE_NAME }}/php:${{ steps.tag.outputs.tag }} -f docker/php/Dockerfile .
docker push ${{ env.REGISTRY_URL }}/${{ env.IMAGE_NAME }}/php:${{ steps.tag.outputs.tag }}
fi
# Build and push Nginx image
if [ -f docker/nginx/Dockerfile ]; then
docker build -t ${{ env.REGISTRY_URL }}/${{ env.IMAGE_NAME }}/nginx:${{ steps.tag.outputs.tag }} -f docker/nginx/Dockerfile .
docker push ${{ env.REGISTRY_URL }}/${{ env.IMAGE_NAME }}/nginx:${{ steps.tag.outputs.tag }}
fi
# Build and push Worker image
if [ -f docker/worker/Dockerfile ]; then
docker build -t ${{ env.REGISTRY_URL }}/${{ env.IMAGE_NAME }}/worker:${{ steps.tag.outputs.tag }} -f docker/worker/Dockerfile .
docker push ${{ env.REGISTRY_URL }}/${{ env.IMAGE_NAME }}/worker:${{ steps.tag.outputs.tag }}
fi

View File

@@ -1,51 +0,0 @@
name: CI
on:
push:
pull_request:
jobs:
quality:
name: PHP Quality Checks
runs-on: ubuntu-latest
container:
image: composer:2
steps:
# Gitea runners usually have the repo checked out already. We avoid marketplace actions.
- name: Show versions
run: |
php -v
composer --version
- name: Install dependencies
run: |
composer install --no-interaction --prefer-dist --no-progress
- name: Code style (non-blocking for initial adoption)
run: |
if composer run -q cs 2>/dev/null; then
composer cs || true
else
echo "No 'cs' script found, skipping."
fi
- name: PHPStan
run: |
if composer run -q phpstan 2>/dev/null; then
composer phpstan
else
echo "No 'phpstan' script found, attempting vendor bin..."
./vendor/bin/phpstan analyse || exit 1
fi
- name: Pest tests
env:
XDEBUG_MODE: off
run: |
if [ -x ./vendor/bin/pest ]; then
./vendor/bin/pest -q
elif [ -x ./vendor/bin/phpunit ]; then
./vendor/bin/phpunit
else
echo "No test runner found."
exit 1
fi
- name: Composer audit (non-blocking initially)
run: |
composer audit --no-interaction || true

View File

@@ -0,0 +1,74 @@
name: Update Production Secrets
on:
workflow_dispatch:
inputs:
vault_password:
description: 'Ansible Vault Password'
required: true
type: password
env:
DEPLOYMENT_HOST: 94.16.110.151
jobs:
deploy-secrets:
name: Deploy Secrets to Production
runs-on: ubuntu-latest
environment:
name: production-secrets
url: https://michaelschiemer.de
steps:
- name: Checkout deployment configuration
uses: actions/checkout@v4
with:
sparse-checkout: |
deployment/ansible
sparse-checkout-cone-mode: false
- name: Setup SSH key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/production
chmod 600 ~/.ssh/production
ssh-keyscan -H ${{ env.DEPLOYMENT_HOST }} >> ~/.ssh/known_hosts
- name: Install Ansible
run: |
sudo apt-get update
sudo apt-get install -y ansible
- name: Create vault password file
run: |
echo "${{ github.event.inputs.vault_password }}" > /tmp/.vault_pass
chmod 600 /tmp/.vault_pass
- name: Deploy secrets via Ansible
run: |
cd deployment/ansible
ansible-playbook -i inventory/production.yml \
playbooks/setup-production-secrets.yml \
--vault-password-file /tmp/.vault_pass
- name: Cleanup vault password
if: always()
run: |
rm -f /tmp/.vault_pass
- name: Verify secrets deployment
run: |
ssh -i ~/.ssh/production deploy@${{ env.DEPLOYMENT_HOST }} \
"docker secret ls && test -f /home/deploy/secrets/.env.production"
- name: Notify deployment success
if: success()
run: |
echo "✅ Secrets deployed successfully to production"
echo "Services will be restarted automatically"
- name: Notify deployment failure
if: failure()
run: |
echo "❌ Secrets deployment failed"
echo "Check Ansible logs for details"