PD-13 — Retour d'expérience¶
📚 Navigation User Story
| Document | | | ---------- | -- | | 📋 [Spécification](PD-13-specification.md) | | | 🛠️ [Plan d'implémentation](PD-13-plan.md) | | | ✅ [Critères d'acceptation](PD-13-acceptability.md) | | | 📝 **Retour d'expérience** | *(ce document)* | [← Retour à backend-core](../PD-186-epic.md) · [↑ Index User Story](index.md)1. Résumé exécutif¶
La User Story PD-13 visait à initialiser le projet backend NestJS avec une architecture modulaire, TypeScript strict, outils de qualité (ESLint, Prettier, SonarQube), CI/CD GitLab et conteneurisation Docker. L'implémentation fournit une base solide avec tous les modules métier, une CI/CD très complète (incluant CloudHSM), mais présente 4 écarts MAJEURS (Dockerfile non fonctionnel, validation env absente, couverture 80% vs 85%, module jobs incomplet) et 1 écart MINEUR (ADR manquant). Verdict : ACCEPTÉ AVEC RÉSERVES.
2. Points fluides¶
- Architecture modulaire : tous les modules métier créés (auth, crypto, documents, audit, storage, jobs, blockchain, vault)
- Common utilities : structure complète avec decorators, filters, guards, interceptors, pipes
- TypeScript strict : mode strict activé avec path aliases (@/, @config/, @common/, @modules/)
- CI/CD GitLab complète : 7 stages (validate, migrate, test, security, sonar, build, docker, deploy)
- Intégration CloudHSM : jobs dédiés pour validation HSM, tests avec HSM, compilation pkcs11js
- Tests configurés : Jest avec coverage, tests unitaires, intégration, e2e
- Qualité code : ESLint avec eslint-plugin-security, Prettier, SonarQube
- Modules métier riches : auth avec controllers, services, DTOs, entities, strategies, middleware
- Scripts npm complets : lint, format, type-check, test, build, migrations, docs
- Sécurité Docker : utilisateur non-root, healthcheck, dumb-init pour PID 1
3. Points difficiles¶
| Difficulté | Contexte |
|---|---|
| Dockerfile multistage | npm ci --only=production suivi de npm run build échoue car TypeScript/Nest CLI sont en devDependencies |
| CloudHSM intégration | Nécessite node:20-bookworm (GLIBC 2.32+), compilation pkcs11js avec Python, configuration VPN |
| Couverture branches | Atteindre 85% difficile avec code défensif et early returns |
| Module jobs | Dépendance BullMQ/Redis non initialisée dans cette US fondatrice |
4. Hypothèses révélées tardivement¶
| Hypothèse initiale | Réalité découverte |
|---|---|
| npm ci --only=production suffisant pour builder | FAUX — TypeScript, Nest CLI requis pour npm run build |
| @nestjs/config valide automatiquement | FAUX — Validation Joi doit être configurée explicitement |
| Couverture 85% facilement atteignable | FAUX — Branches à 80% dues à guards et early returns |
| Module jobs simple à initialiser | FAUX — Dépend de Redis/BullMQ non configurés dans cette US |
| CloudHSM compatible Alpine | FAUX — SDK 5 requiert GLIBC 2.32+ (Debian Bookworm) |
5. Invariants complexes à implémenter¶
| Invariant | Complexité |
|---|---|
| TypeScript strict | Tous les fichiers doivent compiler sans any implicite |
| ESLint 0 erreur | Règles security peuvent bloquer patterns courants |
| Path aliases cohérents | Synchroniser tsconfig.json, jest moduleNameMapper, nest-cli.json |
| CI/CD multi-environnement | dev (HSM), staging, production avec règles différentes |
| Docker non-root | Permissions fichiers, ports > 1024, healthcheck |
6. Dette technique¶
| Dette | Impact | Priorité |
|---|---|---|
| Dockerfile phase builder | Image non construisible en l'état | HAUTE |
| Validation env absente | Variables invalides non détectées au démarrage | HAUTE |
| Couverture branches 80% | Non-conformité spec 85% | MOYENNE |
| Module jobs vide | Pas de service ni test, juste module.ts | MOYENNE |
| ADR non créé | Documentation architecture absente | BASSE |
| excludes coverage | 15+ patterns exclus pour atteindre seuils | BASSE |
7. Risques résiduels¶
| Risque | Probabilité | Impact | Mitigation suggérée |
|---|---|---|---|
| Docker build échoue | Élevée | ÉLEVÉ | Corriger Dockerfile : installer devDeps pour build |
| Env var invalide en prod | Moyenne | ÉLEVÉ | Ajouter validation Joi dans ConfigModule |
| Régression couverture | Moyenne | MOYEN | CI fail si coverage < seuil |
| Module jobs inutilisable | Faible | MOYEN | Compléter dans PD dédiée (BullMQ) |
| CloudHSM timeout CI | Moyenne | MOYEN | wake-hsm job + allow_failure |
8. Améliorations processus¶
| Amélioration | Bénéfice attendu |
|---|---|
| Tester Dockerfile dans CI | Détecter erreur build avant merge |
| Template module minimal | Garantir service + test pour chaque module |
| Validation env obligatoire | Échec rapide si config invalide |
| Séparer US foundation/métier | Ne pas mélanger init projet et modules complexes |
| ADR template automatique | Créer docs/adr/000-template.md dès l'init |
9. Enseignements clés¶
-
Le Dockerfile doit être testé — Un
npm ci --only=production && npm run buildne fonctionne pas car les outils de build (TypeScript, Nest CLI) sont en devDependencies. Le Dockerfile doit installer toutes les dépendances pour builder, puis copier uniquement les artefacts. -
La validation des variables d'environnement est critique — Sans schéma Joi, une variable manquante ou invalide ne sera détectée qu'au runtime, potentiellement en production. ConfigModule.forRoot() doit inclure un validationSchema.
-
Les seuils de couverture doivent être alignés — La spec demande 85% global, le code configure 80% branches. Cette incohérence crée de la confusion et de la dette.
-
Chaque module doit être complet — Un module sans service ni test (jobs) n'est pas utilisable et crée de la dette. Mieux vaut ne pas créer le dossier que de le laisser vide.
-
L'intégration CloudHSM complexifie la CI — Les contraintes GLIBC, Python pour pkcs11js, et VPN nécessitent des jobs dédiés et une image Debian (pas Alpine). Cette complexité était sous-estimée.