Skip to content

Sprint 0 — Fondations & CI/CD de base

Mise en place GitLab, Docker, Alembic. Les fondations sont fragiles. 😅


INC-001 — Variable GitLab CI Protected sur feature branch

Contexte : Pipeline test stage
SymptĂŽme :

pydantic_core.ValidationError: SECRET_KEY Field required

Cause :

Variable GitLab CI marquée "Protected"
Feature branch non protĂ©gĂ©e → variable non injectĂ©e

Fix :

Settings → CI/CD → Variables → SECRET_KEY
Protected : ❌ → Masked : ✅

Leçon :

Protected  = injecté uniquement sur branches protégées (main, develop)
Masked     = cache la valeur dans les logs → suffisant pour la sĂ©curitĂ©
Rùgle : CI/CD variables → Masked uniquement sauf secrets production

INC-002 — Pydantic BaseSettings prioritĂ© .env vs variables d'environnement

Contexte : Docker Compose networking
SymptĂŽme :

Connection refused: localhost:5432

Cause :

Pydantic BaseSettings lit le fichier .env en priorité
DB_HOSTNAME=localhost dans .env écrase DB_HOSTNAME=db injecté par Docker

Fix :

# Créer un fichier .env.docker séparé
DB_HOSTNAME=db   # nom du service Docker Compose

Leçon :

Pydantic BaseSettings priorité :
1. Variables d'environnement (haute)
2. Fichier .env (basse par défaut)
→ En dev Docker : utiliser .env.docker
→ En CI/CD : pas de fichier .env (variables injectĂ©es)

INC-003 — Migration Alembic dupliquĂ©e

Contexte : Démarrage de l'application
SymptĂŽme :

sqlalchemy.exc.ProgrammingError: DuplicateTable relation "users" already exists

Cause :

Migration c9e6377cb51d_new_migration.py recréait des tables
déjà créées par les migrations précédentes

Fix :

# Identifier et supprimer la migration problématique
rm alembic/versions/c9e6377cb51d_new_migration.py

Leçon :

Toujours vérifier l'historique Alembic avant d'ajouter une migration
alembic history --verbose
Ne jamais créer une migration qui recrée des tables existantes

📊 RĂ©sumĂ© Sprint 0

  • 3 incidents : Variables, Networking, Database
  • ClĂ© : Comprendre les prioritĂ©s (Protected vs Masked, .env vs env vars)
  • DurĂ©e de fix : ~5-10 min chacun (quand on sait 😅)

→ Voir Sprint 1