RousselTMLEARNING

DevOps

CI/CD de bout en bout (3/5) : artefacts, registres et environnements

Livrer en continu : artefacts immuables et versionnés, registres d'images et de paquets, promotion d'un même artefact entre environnements, configuration et secrets par environnement, approbations, environnements éphémères et migrations de base de données.

1. Artefacts et versions #

Ce que l'on déploie vraiment.

Un artefact immuable #

L'artefact est le résultat du build : image de conteneur, binaire, paquet (jar, wheel, npm), archive. Il doit être immuable (jamais écrasé), versionné et traçable jusqu'au commit qui l'a produit.

ÉtiquetteUsage
SHA du commit (3f9c2e1)identifiant unique de chaque build : c'est lui que l'on déploie
Version sémantique (1.5.0)versions publiées, lisibles par les humains
Digest (sha256:…)référence cryptographique exacte d'une image
latestà éviter pour déployer : ambigu et mouvant
docker build -t registry.example.com/shop/api:${GIT_SHA} \
  --label org.opencontainers.image.revision=${GIT_SHA} \
  --label org.opencontainers.image.source=https://git.example.com/shop/api .
docker push registry.example.com/shop/api:${GIT_SHA}
docker tag registry.example.com/shop/api:${GIT_SHA} registry.example.com/shop/api:1.5.0   # même image, nom de version
docker buildx imagetools inspect registry.example.com/shop/api:1.5.0   # digest

Registres #

Type d'artefactRegistres
Images OCIGitHub Container Registry, GitLab Registry, Harbor, Amazon ECR, Google Artifact Registry, Docker Hub
PaquetsNexus, Artifactory, GitLab Package Registry, PyPI/npm privés
Charts Helmregistres OCI, ChartMuseum
Bonne Pratique : Configurez la rétention (supprimer les images de branches après quelques jours, garder les versions publiées) et l'analyse de vulnérabilités du registre.

2. Environnements et promotion #

Du staging à la production.

Promouvoir le même artefact #

Promotion entre environnements
On ne reconstruit jamais pour la production.
EnvironnementButDéploiement
Éphémère (par pull request)tester et montrer une modification isoléeautomatique, détruit à la fusion
Staging / préproductionvalider dans des conditions proches de la productionautomatique depuis main
Productionservir les utilisateursautomatique (déploiement continu) ou après approbation

Configuration et secrets #

L'artefact ne contient aucune configuration propre à un environnement : URL, tailles, drapeaux et secrets sont injectés au déploiement (variables d'environnement, ConfigMaps, gestionnaire de secrets).

# GitHub Actions : un job lié à un environnement protégé
deploy-prod:
  needs: deploy-staging
  environment: { name: production, url: https://shop.example.com }   # approbateurs, secrets dédiés
  permissions: { id-token: write, contents: read }                   # OIDC
  runs-on: ubuntu-latest
  steps:
    - uses: aws-actions/configure-aws-credentials@v4
      with: { role-to-assume: arn:aws:iam::123456789012:role/deploy-prod, aws-region: eu-west-3 }
    - run: ./deploy.sh production ${{ github.sha }}
Bonne Pratique : Préférez la fédération d'identité OIDC entre la CI et le cloud à des clés d'accès longues stockées en secret : le jeton est temporaire et limité à un dépôt, une branche ou un environnement.

3. Les bases de données #

Le point délicat du déploiement continu.

Migrations versionnées #

Le schéma évolue avec le code, via des migrations versionnées dans le dépôt (Flyway, Liquibase, Alembic, migrations Django ou Rails), appliquées automatiquement par le pipeline avant ou pendant le déploiement.

# Alembic : une migration par changement de schéma, versionnée avec le code
alembic revision -m "ajouter colonne email_verifie"
alembic upgrade head          # exécuté par le pipeline (job dédié ou init container)

Expand / contract #

  1. Expand : ajouter la nouvelle colonne, compatible avec l'ancienne version du code.
  2. Déployer le code qui écrit dans les deux colonnes et lit la nouvelle.
  3. Migrer les données existantes.
  4. Contract : supprimer l'ancienne colonne dans une version ultérieure.
Erreur Courante : Une migration destructive (renommage, suppression) dans le même déploiement que le code empêche tout retour arrière et casse les instances encore à l'ancienne version pendant un déploiement progressif.

4. Traçabilité #

Savoir ce qui tourne et pourquoi.

Lier tout ensemble #

  • Chaque déploiement est enregistré : version, commit, auteur, date, environnement, résultat.
  • Les outils d'observabilité reçoivent un événement de déploiement pour corréler une dégradation avec une version.
  • Les notes de version sont générées depuis les commits conventionnels.
  • Une SBOM et une signature accompagnent l'artefact (voir la leçon DevSecOps).

Articles liés

Organiser le DevOps : flux de valeur, équipes et culture sans blâme

Mettre en place une organisation DevOps : chaîne de valeur et value stream mapping, Team Topologies, « you bu…

Git pour le DevOps : branches, revues de code et versions

Organiser le travail avec Git dans une démarche DevOps : trunk-based development ou GitFlow, branches courtes…

CI/CD de bout en bout (1/5) : principes et anatomie d'un pipeline

Comprendre la CI/CD de bout en bout : intégration continue, livraison continue et déploiement continu, étapes…

Pour aller plus loin