Pull-Based Deployment Pattern
Contexte
Dans de nombreuses chaînes CI/CD, le système d'intégration continue déploie directement l'application sur les serveurs de production.
Ce modèle est appelé push-based deployment.
Exemple :
flowchart LR
CI[CI Pipeline] -->|SSH| S[Production Server]
S --> D[Deploy Application]
Cependant, ce modèle présente plusieurs limites :
- ouverture du serveur aux connexions externes
- dépendance au réseau entrant
- surface d’attaque plus importante
- complexité dans les environnements NAT
Une alternative consiste à utiliser le pull-based deployment.
Principe
Dans un modèle pull-based, le serveur de production ne reçoit aucune connexion depuis la CI.
Au contraire, il récupère lui-même les nouvelles versions de l'application.
Architecture simplifiée :
flowchart TD
DEV[Developer] -->|Push code| GH[GitHub Repository]
GH --> CI[CI/CD Pipeline]
CI -->|Build & Push Image| REG[(Container Registry)]
REG -->|Pull Image| PS[Production Server]
PS --> DC[Docker Containers]
Le serveur surveille les nouvelles images et met à jour les services automatiquement.
Étapes du pipeline
1 — Push du code
Le développeur pousse le code vers le repository.
git push
Cela déclenche la pipeline CI.
2 — Build des images
La CI :
- compile l’application
- construit les images Docker
- publie les images dans un registry
Exemple :
ghcr.io/my-org/backend:latest
3 — Publication dans le registry
Les images sont stockées dans un container registry :
- GHCR
- Docker Hub
- AWS ECR
- GitLab Registry
Le registry devient la source de vérité des artefacts déployables.
4 — Mise à jour côté serveur
Le serveur de production récupère les nouvelles images.
Exemple :
docker compose pull
docker compose up -d
Cela redémarre automatiquement les services avec les nouvelles versions.
Automatisation avec Watchtower
Un outil comme Watchtower peut automatiser la mise à jour des conteneurs.
Fonctionnement :
- Watchtower surveille les images Docker
- détecte une nouvelle version
- redémarre le container
Exemple de configuration :
com.centurylinklabs.watchtower.enable=true
Avantages
Le pull-based deployment apporte plusieurs bénéfices :
- aucune connexion entrante nécessaire
- meilleure sécurité
- architecture plus simple
- compatibilité avec les environnements NAT
- déploiement automatisé
Limites
Cette approche introduit quelques contraintes :
- moins de contrôle précis sur le moment exact du déploiement
- gestion des versions d’images nécessaire
- surveillance du registry
Cependant ces limitations sont généralement acceptables.
Bonnes pratiques
Pour un système fiable :
- utiliser des images versionnées
- conserver les images précédentes
- surveiller les logs de déploiement
- automatiser les healthchecks
Conclusion
Le pull-based deployment est particulièrement adapté aux architectures conteneurisées.
En combinant :
- CI pour construire les images
- container registry pour stocker les artefacts
- serveur qui récupère les images
il est possible de construire une pipeline de déploiement simple, sécurisée et robuste.