Ce document détaille les systèmes d'automatisation mis en œuvre pour garantir la fiabilité du déploiement et la disponibilité de la solution.
Vue d'ensemble
Pipelines CI par dépôt
Control-Hub-Back
| Étape | Commande | Outil |
|---|
| TypeCheck | pnpm typecheck | TypeScript |
| Lint | pnpm lint | ESLint |
| Format | pnpm format --check | Prettier |
| Security Audit | pnpm audit --prod | npm audit |
| Tests | pnpm test (Japa) | Japa + MySQL + Redis |
| Coverage | npx c8 --reporter=lcov | c8 |
| Build | pnpm build | AdonisJS |
| SonarQube | Scan + Quality Gate | SonarQube |
Services CI : MySQL 8 et Redis démarrés comme services GitHub Actions pour les tests d'intégration.
Control-Hub Frontend (my-app)
| Étape | Commande | Outil |
|---|
| TypeCheck | tsc --noEmit | TypeScript |
| Lint | pnpm run lint | ESLint |
| Format | pnpm run format --check | Prettier |
| Security Audit | pnpm audit | npm audit |
| Tests unitaires | pnpm test | Vitest |
| Tests E2E | pnpm test:e2e | Playwright (headless) |
| Storybook Build | pnpm build-storybook | Storybook |
| A11y Tests | Storybook test runner | @storybook/addon-a11y |
| Build | pnpm build | Next.js |
| SonarQube | Scan + Quality Gate | SonarQube |
Firstbreath Showcase
| Étape | Commande | Outil |
|---|
| TypeCheck | tsc --noEmit | TypeScript |
| Lint | next lint | ESLint |
| Format | pnpm run format --check | Prettier |
| Security Audit | pnpm audit | npm audit |
| Prisma | prisma generate + validation schéma | Prisma |
| Build | next build | Next.js |
| Storybook | Build + tests A11y | Storybook |
| Tests unitaires | pnpm test | Vitest |
| SonarQube | Scan + Quality Gate | SonarQube |
Firstbreath Vision
| Étape | Commande | Outil |
|---|
| Format | black --check | Black |
| Lint | flake8 --select=E9,F63,F7,F82 | Flake8 |
| Security | safety check -r requirements.txt | Safety |
| Tests | pytest --cov (par service) | pytest + pytest-cov |
| SonarQube | Scan + Quality Gate | SonarQube |
| Docker Build | Build + push images | Docker / GHCR |
Tests CPU-only : les tests utilisent des versions CPU de PyTorch pour éviter la dépendance GPU en CI.
App Mobile
| Étape | Commande | Outil |
|---|
| Lint | ESLint | ESLint |
| Tests | jest | Jest (jest-expo) |
| SonarQube | Scan + Quality Gate | SonarQube |
SonarQube — Quality Gates
Notre instance SonarQube auto-hébergée (sonar.firstbreath.fr) applique les règles suivantes :
| Règle | Seuil |
|---|
| Bugs critiques | 0 |
| Duplication | < 3% |
| Maintenabilité | Rating A |
| Coverage minimum | Variable par module |
| Security Hotspots | Revue obligatoire |
Configuration par dépôt
Chaque dépôt contient un sonar-project.properties définissant :
sonar.sources — répertoires source à analyser
sonar.exclusions — fichiers exclus (node_modules, build, tests, config)
sonar.coverage.exclusions — code non-testable (contrôleurs, validateurs)
sonar.javascript.lcov.reportPaths — rapport de couverture
Déploiement continu (CD)
Mécanisme de déploiement
| Composant | Mécanisme CD | Détails |
|---|
| Control-Hub-Back | Dokploy webhook | Push sur main → build Docker → rolling restart |
| Firstbreath Vision | Dokploy webhook | Push sur main → build Docker → restart (GPU) |
| Showcase | Dokploy webhook | Push sur main → build Docker (Prisma migrate) → restart |
| Documentation | Dokploy webhook | Push sur main → build Docusaurus → restart Nginx |
Watchtower (ancienne infrastructure)
L'ancienne infrastructure utilisait Watchtower pour le CD :
- Poll toutes les 5 minutes (
WATCHTOWER_POLL_INTERVAL=300)
- Pull automatique des nouvelles images Docker depuis GHCR
- Nettoyage des anciennes images (
WATCHTOWER_CLEANUP=true)
- Filtrage par label (
WATCHTOWER_LABEL_ENABLE=true)
Cette approche a été remplacée par Dokploy pour un meilleur contrôle des déploiements.
Interactions entre systèmes
| Métrique | Objectif | Monitoring |
|---|
| Temps de build CI | < 5 min | GitHub Actions |
| Temps de déploiement | < 3 min | Dokploy logs |
| Disponibilité API | > 99% (uptime) | Grafana + healthchecks |
| Latence inférence | < 200ms/frame | Prometheus (batch-inference) |
| Temps de restart | < 30s | Docker healthcheck start_period |