diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8edfe70..59eac7e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -186,7 +186,7 @@ jobs: - name: Sauvegarde puis restauration run: | set -euo pipefail - bash tools/docker-restore-check.sh + bash tools/docker-restore-check.sh http://localhost:8080 bash tools/docker-smoke.sh http://localhost:8080 # Un second front qui joint l'API par le nom de son conteneur (API_UPSTREAM), comme sur Umbrel. diff --git a/tools/docker-restore-check.sh b/tools/docker-restore-check.sh index 8b686e0..3148bf0 100755 --- a/tools/docker-restore-check.sh +++ b/tools/docker-restore-check.sh @@ -2,12 +2,14 @@ # Sauvegarde puis restauration d'une installation compose avec les commandes du README, et contrôle # que rien ne s'est perdu : comptes, arbres, personnes, migrations et fichiers des médias. # -# Usage : bash tools/docker-restore-check.sh (depuis le dossier du dépôt, installation démarrée) -# La CI le lance après le test de fumée, qui a déjà créé un compte et un arbre. +# Usage : bash tools/docker-restore-check.sh [http://localhost:8080] (depuis le dossier du dépôt, installation démarrée) +# Nécessite curl et jq. La CI le lance après le test de fumée. # Attention : la base et les médias sont effacés puis restaurés. Jamais sur une installation en service. set -euo pipefail cd "$(dirname "$0")/.." +BASE_URL="${1:-http://localhost}" +BASE_URL="${BASE_URL%/}" DB_USER="${POSTGRES_USER:-parenthese}" DB_NAME="${POSTGRES_DB:-parenthese}" MEDIA_VOLUME="parenthese_media" @@ -18,10 +20,21 @@ fail() { echo "ÉCHEC : $*" >&2; exit 1; } sql() { docker compose exec -T db psql -U "$DB_USER" -d "$DB_NAME" -v ON_ERROR_STOP=1 -At -c "$1"; } counts() { sql "SELECT (SELECT count(*) FROM users) || ' ' || (SELECT count(*) FROM trees) || ' ' || (SELECT count(*) FROM persons) || ' ' || (SELECT count(*) FROM _prisma_migrations)"; } +# Données à retrouver : un compte, un arbre et une personne créés par l'API, un fichier dans les médias +api() { + local method="$1" path="$2" body="$3" token="${4:-}" + curl -fsS --max-time 30 -X "$method" "$BASE_URL$path" -H 'Content-Type: application/json' \ + ${token:+-H "Authorization: Bearer $token"} --data "$body" +} +stamp="$(date +%s)-$RANDOM" +token="$(api POST /auth/register "$(jq -nc --arg e "restore-$stamp@example.com" '{firstName: "Test", email: $e, password: "restauration-test-1"}')" | jq -r .token)" +tree_id="$(api POST /trees "$(jq -nc --arg s "restore-$stamp" '{name: "Arbre de restauration", slug: $s, visitorPassword: "visiteur-test-1", contributorPassword: "contributeur-test-1"}')" "$token" | jq -r .tree.id)" +api POST "/trees/$tree_id/persons" '{"firstName": "Jeanne", "lastName": "Test"}' "$token" >/dev/null docker run --rm -v "$MEDIA_VOLUME":/data alpine sh -c 'echo "souvenir de test" > /data/restore-check.txt' + before="$(counts)" -read -r users trees _ _ <<< "$before" -[ "$users" -ge 1 ] && [ "$trees" -ge 1 ] || fail "il faut au moins un compte et un arbre avant la sauvegarde (lancer d'abord tools/docker-smoke.sh)" +read -r users trees persons _ <<< "$before" +[ "$users" -ge 1 ] && [ "$trees" -ge 1 ] && [ "$persons" -ge 1 ] || fail "données de test absentes avant la sauvegarde ($before)" echo "Avant : $before (comptes, arbres, personnes, migrations)" # Sauvegarde, mêmes commandes que le README (fichiers écrits dans un dossier temporaire)