ci(e2e): provide mail templates under remote docker daemon
Some checks failed
CI / flutter (pull_request) Successful in 1m12s
CI / web-build (pull_request) Successful in 53s
CI / supabase (pull_request) Successful in 3s
CI / supabase-tests (pull_request) Successful in 30s
CI / e2e (pull_request) Failing after 53s

Refs #38

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
cschlaefke 2026-11-03 11:09:21 +01:00
parent aa421b12b0
commit 354fdd4e41
2 changed files with 54 additions and 0 deletions

View file

@ -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/<name>.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

View file

@ -249,6 +249,11 @@ jobs:
- name: Datenbank zurücksetzen - name: Datenbank zurücksetzen
run: npx --yes supabase@${{ env.SUPABASE_CLI_VERSION }} db reset 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 - name: Lokale Schlüssel lesen
# Öffentliche Demo-Schlüssel der CLI; trotzdem wird die Maske gesetzt, bevor sie irgendwo ausgegeben werden. # Öffentliche Demo-Schlüssel der CLI; trotzdem wird die Maske gesetzt, bevor sie irgendwo ausgegeben werden.
run: | run: |