This article is available in French.
1. CI, CD et CD #
Trois pratiques, souvent confondues.
Définitions #
| Pratique | Définition | Condition |
|---|---|---|
| Intégration continue (CI) | chaque modification est intégrée à la branche principale, construite et testée automatiquement, plusieurs fois par jour | tests automatisés rapides, branches courtes |
| Livraison continue (Continuous Delivery) | chaque version qui passe le pipeline est déployable en production à tout moment, en un clic | déploiement automatisé et reproductible |
| Déploiement continu (Continuous Deployment) | chaque version qui passe le pipeline part automatiquement en production | confiance totale dans les tests, déploiements progressifs, retour arrière automatique |
La CI répond à « mon code s'intègre-t-il avec celui des autres ? », la livraison continue à « puis-je livrer maintenant ? », le déploiement continu supprime la question.
Pourquoi c'est rentable #
- Des lots plus petits : chaque déploiement change peu de choses, donc casse peu et se diagnostique vite.
- Un retour rapide : un développeur apprend en minutes qu'il a cassé quelque chose, pas en semaines.
- Un processus reproductible : la mise en production devient un non-événement.
- Des métriques DORA meilleures : fréquence de déploiement, délai, taux d'échec et temps de restauration.
2. Anatomie d'un pipeline #
Les étapes du commit à la production.
Les étapes #
| Étape | Contenu | Durée cible |
|---|---|---|
| Commit stage | compilation, tests unitaires, lint, analyse statique, détection de secrets | < 10 min |
| Package | construction d'un artefact unique et versionné (image, binaire, paquet) | quelques minutes |
| Tests d'acceptation | tests d'intégration et de bout en bout sur un environnement éphémère ou de staging | < 30 min |
| Déploiement | promotion du même artefact vers staging puis production | minutes |
| Vérification | smoke tests, analyse des métriques, retour arrière automatique si dégradation | minutes |
Les briques techniques #
| Notion | Rôle |
|---|---|
| Déclencheur | push, pull request, tag, planification, déclenchement manuel |
| Runner / agent | machine (souvent un conteneur éphémère) qui exécute les jobs |
| Job / étape | unité de travail ; les jobs d'un même stage tournent en parallèle |
| Cache | dépendances réutilisées d'un build à l'autre pour gagner du temps |
| Artefact | résultat produit par un job et transmis aux suivants ou publié |
| Environnement | cible de déploiement (staging, production) avec ses secrets et ses règles d'approbation |
| Secrets | identifiants injectés au moment de l'exécution, jamais écrits dans le dépôt |
3. Les principes fondamentaux #
Ce qui rend un pipeline fiable.
Build once, deploy many #
On construit l'artefact une seule fois, on lui donne une version immuable (le SHA du commit), et c'est ce même artefact qui est testé puis promu de staging en production. Reconstruire pour la production, c'est déployer quelque chose qui n'a jamais été testé.
Erreur Courante : Une image taguée latest ou reconstruite par environnement casse la traçabilité : impossible de savoir exactement ce qui tourne en production ni de revenir à la version précédente.Les autres règles #
- Pipeline as code : la définition du pipeline est versionnée avec le code (
.github/workflows,.gitlab-ci.yml,Jenkinsfile). - Échouer vite : les contrôles rapides d'abord, les plus longs ensuite.
- Le pipeline rouge est prioritaire : on répare (ou on annule le commit) avant de continuer.
- Configuration externe : l'artefact est identique partout, seule la configuration change (variables, secrets, 12 facteurs).
- Reproductibilité : versions d'outils et de dépendances figées, runners éphémères.
- Tout passe par le pipeline, y compris les correctifs urgents : sinon le pipeline cesse d'être la source de vérité.
4. Un premier pipeline #
La même logique avec deux outils.
GitHub Actions #
# .github/workflows/ci.yml
name: ci
on:
push: { branches: [main] }
pull_request: {}
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: "3.12", cache: pip }
- run: pip install -r requirements.txt
- run: pytest -q
build:
needs: test
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build -t app:${{ github.sha }} .GitLab CI #
# .gitlab-ci.yml
stages: [test, build]
test:
stage: test
image: python:3.12
script:
- pip install -r requirements.txt
- pytest -q
build:
stage: build
image: docker:27
services: [docker:27-dind]
rules: [{ if: '$CI_COMMIT_BRANCH == "main"' }]
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .Suite du chapitre : Les quatre leçons suivantes détaillent chaque partie : intégration continue et tests, artefacts et environnements, stratégies de déploiement, puis outils.
My progress
Sign in to track your progress and take notes. Sign in