corentin_wakdo/db/migrate-container.sh
Imugiii 56b26db0c1
All checks were successful
CI / auto-merge (pull_request) Successful in 4s
CI / secret-scan (pull_request) Successful in 9s
CI / php-lint (pull_request) Successful in 21s
CI / static-tests (pull_request) Successful in 42s
CI / js-tests (pull_request) Successful in 19s
chore: remplace le Makefile par un service compose wakdo-migrate (migrate + seed idempotents)
Le Makefile portait surtout des cibles mortes/trompeuses (test/test-unit/
test-integration/lint annoncaient "pas implemente" alors que les tests tournent ;
install-hooks pointait sur des fichiers absents) ; sa seule cible porteuse, `init`,
existait parce que `docker compose up` seul n'applique pas les migrations.

En deplacant migrate + seed DANS la stack, `docker compose up` devient l'unique
commande qui amene une stack complete et loginnable -> Cr 7.c.4 satisfait sans
dependance a l'outil `make`.

- db/migrate-container.sh : runner in-container (connexion par le reseau compose),
  applique db/migrations/*.sql (suivi schema_migrations) puis db/seeds/*.sql (suivi
  seeds_applied), idempotent.
- Service one-shot `wakdo-migrate` (depends_on db healthy) ; wakdo-app/web attendent
  sa completion (service_completed_successfully).
- Makefile supprime ; db/migrate.sh (hote) conserve pour l'usage manuel / --status.
- Docs realignees : README, .env.example, db/README, docker-compose, PROJECT_CONTEXT
  (`make *` -> `docker compose *`, Cr 7.b porte par les scripts Bash). Correction au
  passage : la CI/CD est Forgejo Actions (pas GitHub Actions), protections cote Forgejo.
- Journal : docs/journal/2026-06-17--makefile-to-compose-migrate.md (rationale + verif
  sur base ephemere : 2 migrations + 2 seeds, idempotent ; note de deploiement pour
  les bases deja seedees).

Verifie : docker compose config valide ; runner teste sur MariaDB ephemere (5 roles,
23 permissions, admin present) ; re-run = 0 nouveau. Aucun code PHP/JS touche.
2026-06-17 12:41:36 +00:00

66 lines
2.6 KiB
Bash

#!/usr/bin/env bash
#
# Wakdo - runner migrations + seed IN-CONTAINER (service compose one-shot wakdo-migrate).
#
# Applique, dans l'ordre lexicographique et de maniere IDEMPOTENTE :
# 1. db/migrations/*.sql (suivi : table schema_migrations)
# 2. db/seeds/*.sql (suivi : table seeds_applied)
# Relancer ne rejoue que les fichiers en attente (tracking par nom de fichier).
#
# Contrairement a db/migrate.sh (hote, via `docker exec`), ce runner tourne DANS
# un conteneur et se connecte a la base PAR LE RESEAU compose (DB_HOST). Il est
# lance par le service `wakdo-migrate` apres que `wakdo-db` soit healthy ; les
# services applicatifs (app/web) attendent sa COMPLETION (service_completed_successfully).
#
# But : `docker compose up` amene une stack COMPLETE et utilisable (schema + donnees
# de reference, dont l'admin bootstrap) en une seule commande, sans dependance a
# l'hote (Cr 7.c.4) -> remplace `make init`.
#
# Variables injectees par docker-compose : DB_HOST, DB_PORT, DB_NAME, DB_ROOT_PASSWORD.
# Root requis : migrations = DDL, seeds = INSERT de reference.
#
set -euo pipefail
: "${DB_HOST:?DB_HOST manquant}"
: "${DB_NAME:?DB_NAME manquant}"
: "${DB_ROOT_PASSWORD:?DB_ROOT_PASSWORD manquant}"
PORT="${DB_PORT:-3306}"
db() { mariadb -h "$DB_HOST" -P "$PORT" -uroot -p"$DB_ROOT_PASSWORD" "$@"; }
# Applique les *.sql d'un dossier non encore enregistres dans sa table de suivi.
apply_tracked() {
local dir="$1" table="$2"
local f base n applied=0
db "$DB_NAME" -e "CREATE TABLE IF NOT EXISTS ${table} (
filename VARCHAR(255) NOT NULL PRIMARY KEY,
applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"
shopt -s nullglob
local files=("$dir"/*.sql)
if [ ${#files[@]} -eq 0 ]; then
echo "[${table}] aucun fichier dans ${dir}"
return 0
fi
for f in "${files[@]}"; do
base="$(basename "$f")"
n="$(db "$DB_NAME" -N -s -e "SELECT COUNT(*) FROM ${table} WHERE filename='${base}';")"
if [ "$n" = "0" ]; then
echo "[${table}] application de ${base} ..."
db "$DB_NAME" < "$f"
db "$DB_NAME" -e "INSERT INTO ${table} (filename) VALUES ('${base}');"
applied=$((applied + 1))
else
echo "[${table}] ${base} deja applique, ignore"
fi
done
echo "[${table}] termine (${applied} nouveau(x))."
}
echo "[migrate] cible ${DB_HOST}:${PORT}/${DB_NAME}"
apply_tracked /db/migrations schema_migrations
apply_tracked /db/seeds seeds_applied
echo "[migrate] stack a jour (schema + donnees de reference)."