# Git-basiertes Deployment - Test Anleitung

**Datum:** 2025-01-31  
**Status:** ⏳ Ready to Test

---

## ✅ Vorbereitung abgeschlossen

### Implementiert:
- ✅ `docker/entrypoint.sh` - Git Clone/Pull Funktionalität
- ✅ `Dockerfile.production` - Git + Composer installiert
- ✅ `deployment/stacks/application/docker-compose.yml` - Git Environment Variables
- ✅ `deployment/ansible/templates/application.env.j2` - Git Template Variablen
- ✅ `deployment/ansible/playbooks/sync-code.yml` - Code-Sync Playbook

---

## 🧪 Test-Schritte

### Schritt 1: Image neu bauen (mit Git-Funktionalität)

**Ziel:** Sicherstellen dass Image die Git-Funktionalität enthält

```bash
# Im Projekt-Root
docker build -f Dockerfile.production \
  -t registry.michaelschiemer.de/framework:test-git \
  .

# Image pushen
docker push registry.michaelschiemer.de/framework:test-git
```

**Prüfen:**
```bash
# Git installiert?
docker run --rm registry.michaelschiemer.de/framework:test-git git --version

# Composer installiert?
docker run --rm registry.michaelschiemer.de/framework:test-git composer --version

# Entrypoint hat Git-Logik?
docker run --rm registry.michaelschiemer.de/framework:test-git cat /usr/local/bin/entrypoint.sh | grep -A 5 "GIT_REPOSITORY_URL"
```

---

### Schritt 2: Git-Variablen in .env setzen (auf Production Server)

**Ziel:** Git-Repository-URL in .env konfigurieren

```bash
# Option A: Via Ansible Playbook (Empfohlen)
cd deployment/ansible
ansible-playbook -i inventory/production.yml \
  playbooks/sync-code.yml \
  -e "git_repo_url=https://git.michaelschiemer.de/michael/michaelschiemer.git" \
  -e "git_branch=main"
```

**Oder manuell auf Production-Server:**
```bash
# SSH zum Production-Server
ssh deploy@94.16.110.151

# .env bearbeiten
cd ~/deployment/stacks/application
nano .env

# Folgende Zeilen hinzufügen:
GIT_REPOSITORY_URL=https://git.michaelschiemer.de/michael/michaelschiemer.git
GIT_BRANCH=main
```

**Wenn Repository privat ist (Token hinzufügen):**
```bash
# Token in .env hinzufügen:
GIT_TOKEN=your_git_token_here
```

---

### Schritt 3: Container mit Git-Variablen starten

**Ziel:** Prüfen ob Container Git Clone/Pull beim Start ausführt

```bash
# Auf Production-Server
cd ~/deployment/stacks/application

# Container neu starten
docker compose restart app

# Oder falls Container noch nicht läuft:
docker compose up -d app

# Logs prüfen (sollte Git Clone/Pull zeigen)
docker logs app --tail 100 | grep -E "(Git|Clone|Pull|✅|❌)"
```

**Erwartete Logs:**
```
📥 Cloning/Pulling code from Git repository...
📥 Cloning repository from https://git.michaelschiemer.de/michael/michaelschiemer.git (branch: main)...
📦 Installing/updating Composer dependencies...
✅ Git sync completed
```

---

### Schritt 4: Code-Verifikation im Container

**Ziel:** Prüfen ob Code tatsächlich im Container ist

```bash
# Auf Production-Server
docker exec app ls -la /var/www/html/ | head -20

# Prüfen ob wichtige Dateien vorhanden sind
docker exec app test -f /var/www/html/composer.json && echo "✅ composer.json vorhanden" || echo "❌ Fehlt"
docker exec app test -d /var/www/html/src && echo "✅ src/ vorhanden" || echo "❌ Fehlt"
docker exec app test -d /var/www/html/.git && echo "✅ .git vorhanden" || echo "❌ Fehlt"

# Prüfen welcher Commit
docker exec app sh -c "cd /var/www/html && git log --oneline -1"
```

**Erwartetes Ergebnis:**
- ✅ Dateien sind im Container
- ✅ `.git` Verzeichnis existiert (zeigt dass Git Clone funktioniert hat)
- ✅ Git Commit zeigt aktuellen Stand

---

### Schritt 5: Code-Update testen (Git Pull)

**Ziel:** Prüfen ob `sync-code.yml` Playbook funktioniert

```bash
# Lokal (auf Dev-Machine)
cd deployment/ansible

# Sync-Code Playbook ausführen
ansible-playbook -i inventory/production.yml \
  playbooks/sync-code.yml \
  -e "git_branch=main"

# Container-Logs prüfen (auf Production-Server)
ssh deploy@94.16.110.151
docker logs app --tail 50 | grep -E "(Git|Pull|✅)"
```

**Erwartetes Ergebnis:**
- ✅ Playbook führt erfolgreich aus
- ✅ Container wird neu gestartet
- ✅ Logs zeigen "🔄 Pulling latest changes from main..."
- ✅ Code wird aktualisiert

---

### Schritt 6: Application Health Check

**Ziel:** Prüfen ob Application nach Git-Sync noch funktioniert

```bash
# Health Check
curl -f https://michaelschiemer.de/health || echo "❌ Health Check fehlgeschlagen"

# Application Test
curl -f https://michaelschiemer.de/ || echo "❌ Application fehlgeschlagen"
```

**Erwartetes Ergebnis:**
- ✅ Health Check erfolgreich
- ✅ Application läuft

---

## 🔧 Troubleshooting

### Problem: Container zeigt keine Git-Logs

**Check 1: Prüfen ob GIT_REPOSITORY_URL gesetzt ist**
```bash
docker exec app env | grep GIT_REPOSITORY_URL
```

**Check 2: Prüfen Entrypoint Script**
```bash
docker exec app cat /usr/local/bin/entrypoint.sh | grep -A 10 "GIT_REPOSITORY_URL"
```

**Check 3: Prüfen ob Git installiert ist**
```bash
docker exec app which git
docker exec app git --version
```

**Lösung:**
- Falls nicht gesetzt: Git-Variablen in .env hinzufügen (siehe Schritt 2)
- Falls Entrypoint fehlt: Image neu bauen (siehe Schritt 1)
- Falls Git fehlt: Image neu bauen mit `git` in Dockerfile

---

### Problem: Git Clone fehlgeschlagen

**Check 1: Repository-Zugriff testen**
```bash
docker exec app git clone --depth 1 https://git.michaelschiemer.de/michael/michaelschiemer.git /tmp/test-clone
```

**Check 2: Logs prüfen**
```bash
docker logs app --tail 100 | grep -i "error\|fail"
```

**Mögliche Ursachen:**
1. Repository nicht erreichbar vom Server
2. Falsche Credentials
3. Branch nicht existiert
4. Network-Probleme

**Lösung:**
- Repository-URL prüfen
- Git-Credentials prüfen (Token/Username+Password)
- Branch-Name prüfen
- Network-Verbindung prüfen

---

### Problem: Composer Install fehlgeschlagen

**Check:**
```bash
docker exec app which composer
docker exec app composer --version
docker exec app sh -c "cd /var/www/html && composer install --no-dev --optimize-autoloader --no-interaction"
```

**Lösung:**
- Falls Composer fehlt: Image neu bauen
- Falls Network-Probleme: Network-Verbindung prüfen

---

## 📋 Test-Checkliste

### Vor Test:
- [ ] Image neu gebaut (mit Git-Funktionalität)
- [ ] Image gepusht zur Registry
- [ ] Git-Repository ist erreichbar vom Production-Server
- [ ] Git-Credentials verfügbar (falls private Repository)
- [ ] .env Datei existiert auf Production-Server

### Während Test:
- [ ] Schritt 1: Image neu bauen ✅
- [ ] Schritt 2: Git-Variablen in .env setzen
- [ ] Schritt 3: Container mit Git-Variablen starten
- [ ] Schritt 4: Code-Verifikation im Container
- [ ] Schritt 5: Code-Update testen (Git Pull)
- [ ] Schritt 6: Application Health Check

### Nach Test:
- [ ] Alle Tests erfolgreich
- [ ] Application läuft korrekt
- [ ] Code ist aktuell aus Git
- [ ] Logs zeigen Git-Operationen

---

## 🚀 Ready to Test!

**Nächster Schritt:** Schritt 1 ausführen (Image neu bauen)

**Vollständiger Test-Plan:** Siehe [GIT_DEPLOYMENT_TEST.md](GIT_DEPLOYMENT_TEST.md)
