#!/usr/bin/env bash # capture-marketing.sh # # Erzeugt alle 9 Marketing-Screenshots und legt sie unter # apps/marketing/public/preview/ mit den exakten Dateinamen ab. # # Voraussetzungen: # 1. Maestro CLI installiert: curl -Ls "https://get.maestro.mobile.dev" | bash # 2. iOS Simulator läuft mit der rebreak-native App (org.rebreak.app) # z.B.: cd apps/rebreak-native && pnpm exec expo run:ios --device "iPhone 16 Pro" # 3. E2E_TEST_USER und E2E_TEST_PASSWORD gesetzt (via Infisical oder manuell) # 4. Staging-Backend erreichbar # # Aufruf: # bash apps/rebreak-native/.maestro/screens/capture-marketing.sh # # Mit Credentials: # E2E_TEST_USER=admin E2E_TEST_PASSWORD= \ # bash apps/rebreak-native/.maestro/screens/capture-marketing.sh # # Oder via Infisical: # infisical run -- bash apps/rebreak-native/.maestro/screens/capture-marketing.sh set -euo pipefail # ─── Pfade ──────────────────────────────────────────────────────────────────── REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../.." && pwd)" MAESTRO_DIR="$REPO_ROOT/apps/rebreak-native/.maestro" TOUR_FLOW="$MAESTRO_DIR/screens/marketing-tour.yaml" PREVIEW_DIR="$REPO_ROOT/apps/marketing/public/preview" # ─── Credentials-Check ──────────────────────────────────────────────────────── if [[ -z "${E2E_TEST_USER:-}" || -z "${E2E_TEST_PASSWORD:-}" ]]; then echo "FEHLER: E2E_TEST_USER und E2E_TEST_PASSWORD müssen gesetzt sein." echo " Variante A: E2E_TEST_USER=admin E2E_TEST_PASSWORD= bash $0" echo " Variante B: infisical run -- bash $0" exit 1 fi # ─── Maestro-Check ──────────────────────────────────────────────────────────── if ! command -v maestro &>/dev/null; then echo "FEHLER: Maestro CLI nicht gefunden." echo " Installieren: curl -Ls 'https://get.maestro.mobile.dev' | bash" echo " Dann: export PATH=\"\$PATH:\$HOME/.maestro/bin\"" exit 1 fi # ─── Zielverzeichnis sicherstellen ──────────────────────────────────────────── mkdir -p "$PREVIEW_DIR" # ─── iOS Simulator: Status-Bar überschreiben ────────────────────────────────── # Zeigt 9:41, volles Signal/WLAN/Akku — klassischer Apple-Screenshot-State # Erfordert: xcrun simctl status_bar override ... # UDID des laufenden Simulators automatisch ermitteln BOOTED_UDID="" if command -v xcrun &>/dev/null; then BOOTED_UDID=$(xcrun simctl list devices booted --json \ | python3 -c " import json, sys data = json.load(sys.stdin) for runtime, devices in data.get('devices', {}).items(): for d in devices: if d.get('state') == 'Booted': print(d['udid']) exit() " 2>/dev/null || true) fi if [[ -n "$BOOTED_UDID" ]]; then echo "Status-Bar für Simulator $BOOTED_UDID auf 9:41 setzen..." xcrun simctl status_bar "$BOOTED_UDID" override \ --time "9:41" \ --wifiMode "active" \ --wifiBars 3 \ --cellularMode "active" \ --cellularBars 4 \ --batteryState "charged" \ --batteryLevel 100 \ 2>/dev/null || echo " Status-Bar-Override fehlgeschlagen (nicht kritisch — Flow läuft weiter)" else echo "Kein gestarteter iOS-Simulator gefunden — Status-Bar-Override übersprungen." echo " Starte den Simulator zuerst: pnpm exec expo run:ios --device 'iPhone 16 Pro'" fi # ─── Maestro-Flow ausführen ──────────────────────────────────────────────────── echo "" echo "Starte Marketing-Tour-Flow..." echo " Flow: $TOUR_FLOW" echo " User: $E2E_TEST_USER@rebreak.internal" echo "" # Maestro schreibt Screenshots nach ~/.maestro/tests//screenshots/ # --output schreibt JUnit-Report, Screenshot-Pfad ist immer im Default-Verzeichnis TIMESTAMP=$(date +%Y%m%d_%H%M%S) MAESTRO_SCREENSHOT_BASE="$HOME/.maestro/tests" maestro test \ --env="E2E_TEST_USER=$E2E_TEST_USER" \ --env="E2E_TEST_PASSWORD=$E2E_TEST_PASSWORD" \ "$TOUR_FLOW" echo "" echo "Flow abgeschlossen. Screenshots suchen..." # ─── Screenshot-Verzeichnis finden ──────────────────────────────────────────── # Maestro legt Screenshots im neuesten Testlauf-Verzeichnis ab LATEST_RUN=$(ls -td "$MAESTRO_SCREENSHOT_BASE"/*/ 2>/dev/null | head -1 || true) if [[ -z "$LATEST_RUN" ]]; then echo "FEHLER: Kein Maestro-Testlauf-Verzeichnis gefunden unter $MAESTRO_SCREENSHOT_BASE" echo " Manuell suchen: ls ~/.maestro/tests/" exit 1 fi SCREENSHOTS_DIR="$LATEST_RUN/screenshots" if [[ ! -d "$SCREENSHOTS_DIR" ]]; then # Maestro 1.38+ legt Screenshots direkt im Lauf-Verzeichnis ab SCREENSHOTS_DIR="$LATEST_RUN" fi echo "Screenshots-Quellverzeichnis: $SCREENSHOTS_DIR" echo "" # ─── Mapping: Maestro-Name → Marketing-Dateiname ────────────────────────────── # takeScreenshot-Wert in marketing-tour.yaml → Zieldateiname declare -A MAPPING=( ["screenshots/01-onboarding"]="01-onboarding.png" ["screenshots/02-blocker"]="02-blocker.png" ["screenshots/03-blocked"]="03-blocked.png" ["screenshots/04-sos-lyra"]="04-sos-lyra.png" ["screenshots/05-breathing"]="05-breathing.png" ["screenshots/06-mail-schutz"]="06-mail-schutz.png" ["screenshots/07-community"]="07-community.png" ["screenshots/08-streak"]="08-streak.png" ["screenshots/09-geraete"]="09-geraete.png" ) # Maestro benennt Screenshots nach dem letzten Teil des takeScreenshot-Werts # "screenshots/01-onboarding" → Datei heißt "01-onboarding.png" im Maestro-Output COPIED=0 MISSING=0 for MAESTRO_KEY in "${!MAPPING[@]}"; do TARGET_NAME="${MAPPING[$MAESTRO_KEY]}" # Maestro schreibt nur den Basename ohne Verzeichnis BASENAME=$(basename "$MAESTRO_KEY") SOURCE_FILE="$SCREENSHOTS_DIR/${BASENAME}.png" if [[ -f "$SOURCE_FILE" ]]; then cp "$SOURCE_FILE" "$PREVIEW_DIR/$TARGET_NAME" echo " OK $TARGET_NAME ← $SOURCE_FILE" ((COPIED++)) else echo " FEHLT $TARGET_NAME (Quelle nicht gefunden: $SOURCE_FILE)" ((MISSING++)) fi done # ─── Status-Bar zurücksetzen ────────────────────────────────────────────────── if [[ -n "$BOOTED_UDID" ]]; then xcrun simctl status_bar "$BOOTED_UDID" clear 2>/dev/null || true fi # ─── Zusammenfassung ────────────────────────────────────────────────────────── echo "" echo "─────────────────────────────────────────" echo " Screenshots kopiert: $COPIED / 9" if [[ $MISSING -gt 0 ]]; then echo " Fehlend: $MISSING" echo "" echo " Für fehlende Screenshots:" echo " - 03-blocked.png: manuell via Safari + aktivem VPN erstellen" echo " Dann: cp /path/to/screenshot.png $PREVIEW_DIR/03-blocked.png" echo "" echo " Alle Screenshots unter: $SCREENSHOTS_DIR" fi echo " Zielverzeichnis: $PREVIEW_DIR" echo "─────────────────────────────────────────" if [[ $MISSING -gt 0 ]]; then exit 1 fi