ci(e2e): provide mail templates under remote docker daemon
Refs #38 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
aa421b12b0
commit
354fdd4e41
2 changed files with 54 additions and 0 deletions
49
.forgejo/scripts/fix-remote-template-mounts.sh
Executable file
49
.forgejo/scripts/fix-remote-template-mounts.sh
Executable 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
|
||||||
|
|
@ -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: |
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue