Aller au contenu

Environnements et Promotion d'Artefacts

Structurer les environnements de déploiement, promouvoir les artefacts de façon traçable et gérer la configuration et les secrets sans les exposer.


Dev / Staging / Production

Trois environnements couvrent la majorité des besoins. Chacun a un rôle précis.

Environnement Rôle Audience
Dev Intégration continue, tests automatises Développeurs
Staging Validation fonctionnelle, tests E2E, UAT Équipe produit, QA
Production Service aux utilisateurs finaux Utilisateurs

Le principe de parite

L'environnement de staging doit être le plus proche possible de la production. Les différences entre environnements sont une source majeure de bugs qui n'apparaissent qu'en prod.

Checklist de parite :

  • même image Docker, même version
  • même moteur de base de données et version
  • même configuration réseau (certificats, DNS)
  • même taille d'infrastructure (ou proportion representive)

Staging n'est pas un luxe

Déployer directement de CI vers production sans staging, c'est faire tester les utilisateurs finaux. Le staging absorbe les problèmes de configuration, les bugs d'intégration et les comportements inattendus sous charge réelle.


Promotion d'artefacts

Un artefact (image Docker, binaire, wheel) est builde une seule fois en CI, puis promu de staging en production. On ne rebuilde jamais pour la prod.

graph LR
    A["Commit Git\n+ tag SHA"] --> B["CI Build\nimage Docker"]
    B --> C["Registre\nd'artefacts"]
    C -->|"Deploiement staging"| D["Staging\nTests E2E"]
    D -->|"Validation OK\nPromotion"| E["Registre prod\n(retag)"]
    E -->|"Deploiement prod"| F["Production"]
    style F fill:#2ecc71,color:#fff
    style B fill:#3498db,color:#fff

Le retag (ou la promotion dans le registre) signale explicitement qu'une image a été validee. En staging on deploie myapp:abc1234 (SHA du commit). En production on deploie myapp:1.5.0 (tag de release), mais c'est le même binaire.

Ne jamais rebuilder pour la production

Rebuilder l'image au moment du déploiement production introduit un risque : une dépendance externe peut avoir change, l'environnement de build peut être différent. L'image en prod doit être exactement celle qui a été testée en staging.


Configuration par environnement

La configuration qui varie entre environnements ne doit pas être dans l'image. Le principe est celui des 12-factor apps : la config dans l'environnement, pas dans le code.

Variables d'environnement

# .env.staging
DATABASE_URL=postgres://user:pass@staging-db:5432/app
LOG_LEVEL=debug
FEATURE_NEW_DASHBOARD=true

# .env.production
DATABASE_URL=postgres://user:pass@prod-db:5432/app
LOG_LEVEL=warn
FEATURE_NEW_DASHBOARD=false

Fichiers de config par environnement

# config/staging.yaml
api:
  rate_limit: 100
  timeout: 30s
  debug: true

# config/production.yaml
api:
  rate_limit: 1000
  timeout: 10s
  debug: false

12-factor app

Une application 12-factor stocke sa configuration dans des variables d'environnement. Cela permet de déployer la même image dans n'importe quel environnement en changeant uniquement les variables injectees au runtime.


Gestion des secrets

Les secrets (mots de passe, clés API, certificats) obeyent a des règles strictes.

Règles fondamentales :

  • Jamais dans le code source : ni en clair, ni encodes en base64
  • Jamais dans l'image Docker : une image est potentiellement publique
  • Jamais dans les variables CI en clair : utiliser les secrets du CI (masked, protected)
  • Rotation périodique : les secrets ne doivent pas être eternels

Principe de moindre privilege

Chaque composant n'a accès qu'aux secrets dont il a strictement besoin. L'API ne connait pas les credentials de la base de monitoring. Le pipeline CI ne connait pas les secrets de production.

graph TB
    CI["Pipeline CI"] -->|"secret: REGISTRY_TOKEN"| REG["Registre Docker"]
    APP["Application"] -->|"secret: DB_PASSWORD"| DB["Base de donnees"]
    APP -->|"secret: API_KEY"| EXT["API externe"]
    CI -.->|"N'a PAS acces"| DB
    CI -.->|"N'a PAS acces"| EXT
    style CI fill:#3498db,color:#fff
    style APP fill:#2ecc71,color:#fff

Outils

Outil Description Lien
Docker Construction et gestion des images conteneur docs.docker.com
Harbor Registre Docker self-hosted avec scan de vulnérabilités intégré goharbor.io
GHCR GitHub Container Registry, intégré aux GitHub Actions docs.github.com/en/packages
HashiCorp Vault Gestion centralisee des secrets, rotation automatique vaultproject.io
dotenv Chargement de variables d'environnement depuis .env github.com/motdotla/dotenv