@enzoooooo/ci-cd-project
    Preparing search index...

    @enzoooooo/ci-cd-project

    📋 CI/CD Project — Gestion d'inscriptions (React + Python + MySQL)

    CI/CD Docker codecov npm

    Application full-stack : un front React + TypeScript avec un formulaire d'inscription (validation + notifications toast) qui sauvegarde les inscrits en base de données MySQL via une API Python (FastAPI). Un compte administrateur peut se connecter pour consulter les informations privées des inscrits et les supprimer. Le tout avec une architecture Docker et une pipeline CI/CD complÚte (tests unitaires, intégration, infrastructure, end-to-end, déploiements).



    Visiteur

    • Formulaire d'inscription Ă  6 champs (PrĂ©nom, Nom, Email, Date de naissance, Ville, Code Postal)
    • Bouton dĂ©sactivĂ© tant que tous les champs ne sont pas valides
    • Messages d'erreur en rouge sous chaque champ + toasts d'erreur Ă  la soumission invalide
    • À l'inscription valide : enregistrement en base MySQL, toast de succĂšs, champs vidĂ©s

    Administrateur (connexion par email / mot de passe)

    • Authentification JWT (mot de passe hachĂ© en bcrypt)
    • Affichage de la liste des utilisateurs avec leurs informations privĂ©es (email, date de naissance, code postal)
    • Suppression d'un inscrit
    • En mode admin, le formulaire d'inscription public est masquĂ©

    L'administrateur est créé automatiquement au premier démarrage de la base, à partir de variables d'environnement (ADMIN_EMAIL / ADMIN_PASSWORD).


    ┌──────────────┐      ┌───────────────────┐      ┌──────────────┐
    │ React (Vite)│ ───â–ș │ FastAPI (Python) │ ───â–ș │ MySQL │
    │ front │ HTTP │ API REST + JWT │ SQL │ base │
    └──────────────┘ └───────────────────┘ └──────────────┘
    Environnement Front Back Base de données
    Local Vite (Docker) FastAPI (Docker) MySQL (Docker) + Adminer + Dozzle
    Production GitHub Pages Vercel (serverless) Aiven (MySQL managé, SSL)
    Méthode Route AccÚs Description
    GET / public Santé du service
    GET /users public Liste des inscrits (infos réduites : nom, prénom, ville)
    POST /users public Inscription
    POST /login public Connexion admin → renvoie un token JWT
    GET /users/details admin Liste avec infos privées
    DELETE /users/{id} admin Suppression d'un inscrit

    Champ RĂšgle
    Prénom / Nom / Ville Minimum 2 caractÚres, lettres uniquement (accents, tréma, tiret acceptés), pas de chiffres ni caractÚres spéciaux
    Email Format valide : nom@domaine.extension
    Date de naissance L'utilisateur doit avoir au moins 18 ans
    Code postal Format français : exactement 5 chiffres

    # Créer le fichier .env à partir de l'exemple
    cp .env.example .env

    # Construire l'image MySQL de migration puis lancer toute la stack
    docker build -t migration_mysql .
    docker compose up -d --build
    Service URL
    Front React http://localhost:3000/ci-cd-project/
    API FastAPI http://localhost:8000
    Adminer (DB) http://localhost:8080
    Dozzle (logs) http://localhost:8081
    npm install
    npm run dev # http://localhost:5173/ci-cd-project/

    En local, le front cible http://localhost:8000. En production, l'URL du backend est injectée au build via la variable VITE_API_URL.


    Couverture > 95 % (statements, branches, functions, lines — hors composants UI ShadCN).

    • Vitest (src/tests/unitaire/) : checkAge, checkName, checkCP, checkMail
    • Jest (src/tests/unitaire/api.test.ts) : client API axios (countUsers, addUser)
    • app.test.tsx — compteur, inscription, erreurs serveur, parcours admin (login → suppression → logout)
    • homePage.test.tsx — validation des champs et soumission
    • loginForm.test.tsx — connexion admin (succĂšs / Ă©chec), dĂ©connexion
    • usersList.test.tsx — liste rĂ©duite vs privĂ©e, suppression

    Exécutés contre la vraie stack Docker : inscription réelle en base, connexion admin, affichage des infos privées, suppression. Inclut des scénarios mode offline (réseau coupé via cy.intercept) qui vérifient les messages d'erreur (chargement, inscription, connexion).

    npm test           # Vitest (unitaires Vitest + intégration) + couverture
    npm run test:unit # Jest (test unitaire de l'API)
    npm run cypress # Cypress (E2E, interface) — stack Docker requise

    .
    ├── server/
    │ └── server.py # API FastAPI (auth JWT, CRUD utilisateurs, seed admin)
    ├── migration/ # Scripts SQL (crĂ©ation DB + table, init Docker)
    ├── src/
    │ ├── components/
    │ │ ├── LoginForm.tsx # Connexion administrateur
    │ │ ├── UsersList.tsx # Liste des inscrits (vue admin)
    │ │ └── ui/ # Composants ShadCN UI
    │ ├── pages/HomePage/ # Formulaire d'inscription
    │ ├── utils/ # Validations (age, form, mail)
    │ ├── lib/api.ts # Client HTTP (axios) vers le backend
    │ └── tests/ # unitaire/ + integration/
    ├── cypress/ # Tests end-to-end
    ├── docker-compose.yml # Stack mysql / adminer / python / react / dozzle
    ├── vercel.json # DĂ©ploiement du backend Python sur Vercel
    └── .github/workflows/ # Pipelines CI/CD

    Les dĂ©ploiements sont conditionnĂ©s Ă  la rĂ©ussite des tests (pas de tests verts → pas de dĂ©ploiement).

    1. Installation (npm ci)
    2. Tests unitaires Jest (npm run test:unit)
    3. Tests unitaires + intĂ©gration Vitest (npm test, avec couverture → Codecov)
    4. Publication du package npm
    5. Build du front (avec VITE_API_URL) + documentation TypeDoc
    6. Déploiement GitHub Pages (dépend de la réussite des tests)
    1. Build & push des images Docker (front + back)
    2. Tests d'infrastructure : démarrage de la stack + vérification des healthchecks
    3. Tests end-to-end Cypress contre la stack
    4. Déploiement du backend sur Vercel (dépend de la réussite des tests d'infra + E2E, uniquement sur main)

    Technologie Usage
    React 19 + TypeScript Front
    Vite Bundler / dev server
    FastAPI (Python) API REST
    MySQL Base de données
    JWT (PyJWT) + bcrypt Authentification
    Docker / Docker Compose Conteneurisation
    Vercel Hébergement du backend
    Aiven MySQL managé (prod)
    Vitest + Jest Tests unitaires / intégration
    Cypress Tests end-to-end
    ShadCN UI + TailwindCSS + Sonner UI
    TypeDoc + Codecov Documentation / couverture