From 354fdd4e41ad9f065e71a55fd294c11ebc9d4238 Mon Sep 17 00:00:00 2001 From: cschlaefke Date: Tue, 3 Nov 2026 11:09:21 +0100 Subject: [PATCH] ci(e2e): provide mail templates under remote docker daemon Refs #38 Co-Authored-By: Claude Sonnet 5.5 --- .../scripts/fix-remote-template-mounts.sh | 49 +++++++++++++++++++ .forgejo/workflows/ci.yml | 5 ++ 2 files changed, 54 insertions(+) create mode 100755 .forgejo/scripts/fix-remote-template-mounts.sh diff --git a/.forgejo/scripts/fix-remote-template-mounts.sh b/.forgejo/scripts/fix-remote-template-mounts.sh new file mode 100755 index 0000000..8fe90c3 --- /dev/null +++ b/.forgejo/scripts/fix-remote-template-mounts.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# Mailvorlagen unter einem entfernten Docker-Daemon (dind) bereitstellen (Issue #38, CI-Lauf 27). +# +# Ursache: Die Supabase CLI bindet supabase/templates/*.html per Bind-Mount (Host-Pfad des Job-Containers) +# in einen ihrer Container ein; GoTrue holt die Vorlage per URL von dort (/email/.html). Im dind +# existiert der Host-Pfad nicht, Docker legt stattdessen ein leeres VERZEICHNIS an, der Webserver liefert +# "Index of /email/confirmation.html/" und GoTrue verschickt diese Seite statt der Vorlage (stiller Fallback, +# der Betreff kommt weiter aus der config.toml). Dieses Skript ersetzt solche Verzeichnisse im dind durch die +# echten Dateien (per Helfer-Container, Inhalt ueber stdin) und startet den betroffenen Container neu. +# Die Auslieferung bleibt eine URL, wie in Staging/Prod geplant (GOTRUE_MAILER_TEMPLATES_*). +# Keine Secrets: es werden nur Container-, Pfad- und Dateinamen ausgegeben. +set -euo pipefail + +PROJECT_ID="${SUPABASE_PROJECT_ID:-shuffle}" +TEMPLATE_DIR="${TEMPLATE_DIR:-supabase/templates}" +fixed=0 + +for c in $(docker ps --format '{{.Names}}' | grep -E "_${PROJECT_ID}\$"); do + while IFS='|' read -r type src dst; do + [ "$type" = bind ] || continue + name=$(basename "$src") + [ -f "$TEMPLATE_DIR/$name" ] || continue + echo "Mount in $c: $src -> $dst" + image=$(docker inspect "$c" --format '{{.Config.Image}}') + # Exit 3 = Quelle ist schon eine Datei (alles in Ordnung) + set +e + docker run --rm -i --user 0 --entrypoint sh -v "$(dirname "$src"):/t" "$image" \ + -c "[ -d '/t/$name' ] || exit 3; rmdir '/t/$name' && cat > '/t/$name'" < "$TEMPLATE_DIR/$name" + rc=$? + set -e + case "$rc" in + 0) echo " $name war ein leeres Verzeichnis, durch Datei ersetzt"; fixed=$((fixed + 1)); restart="${restart:-} $c" ;; + 3) echo " $name ist bereits eine Datei" ;; + *) echo "Fehler beim Ersetzen von $name (Exit $rc)" >&2; exit 1 ;; + esac + done < <(docker inspect "$c" --format '{{range .Mounts}}{{.Type}}|{{.Source}}|{{.Destination}}{{"\n"}}{{end}}') +done + +for c in $(printf '%s\n' ${restart:-} | sort -u); do + echo "Neustart $c" + docker restart "$c" >/dev/null +done +echo "Vorlagen-Mounts korrigiert: $fixed" +if [ "$fixed" -eq 0 ]; then + echo "Hinweis: kein Verzeichnis-Mount ersetzt. Bind-Mounts der Projekt-Container (nur Typ, Quelle, Ziel):" + for c in $(docker ps --format '{{.Names}}' | grep -E "_${PROJECT_ID}\$"); do + docker inspect "$c" --format '{{range .Mounts}}{{if eq .Type "bind"}}'"$c"' {{.Source}} -> {{.Destination}}{{"\n"}}{{end}}{{end}}' + done +fi diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index 810790b..b440379 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -249,6 +249,11 @@ jobs: - name: Datenbank zurücksetzen run: npx --yes supabase@${{ env.SUPABASE_CLI_VERSION }} db reset + - name: Mailvorlagen im dind bereitstellen + # Unter dind existiert der Bind-Mount-Pfad der Vorlagen nicht; ohne diesen Schritt liefert die CLI eine leere + # Seite statt supabase/templates/*.html aus (GoTrue verschickt sie still). Details im Skript. + run: bash .forgejo/scripts/fix-remote-template-mounts.sh + - name: Lokale Schlüssel lesen # Öffentliche Demo-Schlüssel der CLI; trotzdem wird die Maske gesetzt, bevor sie irgendwo ausgegeben werden. run: |