Déployer des applications Spring Boot et Angular en continu avec GitLab CI/CD et Docker
La mise en production d’une application Spring Boot couplée à un front Angular devient robuste lorsqu’elle est automatisée via GitLab CI/CD et Docker. Cette approche permet de fiabiliser les déploiements, de réduire le temps de correction et d’unifier le cycle de vie applicatif.
Architecture cible
Le modèle recommandé sépare clairement les responsabilités :
- Backend : application Spring Boot packagée en image Docker.
- Frontend : application Angular buildée en fichiers statiques, servis via un conteneur (ex. Nginx).
- Réseau et configuration : variables d’environnement, URLs et secrets gérés par GitLab.
Pré-requis
La démarche suppose l’existence :
- D’un dépôt Git avec un dossier backend et un dossier frontend.
- D’images Docker publiées (GitLab Container Registry ou autre registre).
- D’un environnement de déploiement accessible (VM, cluster, ou Docker Engine distant).
Docker pour le backend Spring Boot
L’objectif est de construire une image reproductible et légère. Un multi-stage build améliore le temps de build et réduit la taille finale.
Exemple Dockerfile (backend)
Docker pour le frontend Angular
Angular doit être compilé une fois au build, puis servir les fichiers statiques via un serveur HTTP (souvent Nginx).
Exemple Dockerfile (frontend)
Gestion de la configuration
La configuration doit être externalisée. Le backend Spring Boot consomme généralement des variables d’environnement. Le frontend Angular peut aussi être paramétré via :
- des variables injectées au build (moins flexible),
- ou un modèle basé sur un fichier runtime (ex.
config.js) servi par Nginx.
Exemple variables backend
Pipeline GitLab CI/CD : principes
Le pipeline peut être découpé en étapes logiques :
- Build : compilation backend/frontend, puis construction d’images Docker.
- Test : exécution des tests unitaires et/ou intégration (optionnel mais recommandé).
- Push : publication des images sur GitLab Container Registry.
- Deploy : mise à jour automatique sur la cible (VM/serveur/cluster).
Exemple .gitlab-ci.yml (build + deploy)
L’exemple ci-dessous illustre une approche typique avec build, push, puis déploiement via SSH. Le déploiement peut être ajusté en fonction de l’infrastructure (Docker Compose, scripts, Kubernetes, etc.).
~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts
script:
- |
ssh "$DEPLOY_USER@$DEPLOY_HOST" bash -lc "'
export IMAGE_BACKEND=$IMAGE_BACKEND
export IMAGE_FRONTEND=$IMAGE_FRONTEND
export TAG=$CI_COMMIT_SHA
docker login -u \"$CI_REGISTRY_USER\" -p \"$CI_REGISTRY_PASSWORD\" $CI_REGISTRY || true
# Exemple avec Docker Compose (à adapter)
# Le serveur doit contenir un docker-compose.yml qui référence les variables.
docker compose pull backend frontend || true
docker compose up -d --remove-orphans
'"
only:
- main
]]>
Note : l’exemple suppose l’existence d’un docker-compose.yml côté serveur.
Une variante consiste à utiliser le digest ou des tags stables (ex. staging, latest).
docker-compose côté serveur
Un déploiement par Docker Compose simplifie la mise à jour et la gestion de services.
Exemple docker-compose.yml (serveur)
Déploiement progressif et rollback
Pour renforcer la résilience, le pipeline peut intégrer :
- Tags versionnés (sha, semver) et conservations d’historiques.
- Rollback : relancer l’ancien tag en cas d’échec.
- Déploiement progressif : staging avant production.
Bonnes pratiques de sécurité
-
Secrets uniquement via Variables GitLab protégées (ex.
DEPLOY_SSH_KEY,DB_PASSWORD). - Accès minimal : compte SSH dédié, permissions restreintes.
- Scan d’images : vérifier les vulnérabilités (optionnel selon tooling).
-
Images immuables : déployer un artefact précis (tag sha) plutôt que
latesten production.
Optimisations de performance
Pour réduire le temps CI/CD :
- Utiliser un cache Maven et Node (ou des volumes dans le runner).
- Activer des build multi-stage (déjà utilisé dans les exemples).
- Limiter les triggers (déployer seulement sur
mainou sur tags).
Exigences de qualité (tests)
Les tests doivent être intégrés tôt dans le pipeline. Le backend peut exécuter JUnit et des tests d’intégration, tandis que le frontend exécute des tests unitaires (Jest/Karma selon configuration).
Exemple ajout stage de tests (idée)
Conclusion
En combinant Docker (builds reproductibles) et GitLab CI/CD (automatisation du cycle de vie), la mise en production de Spring Boot et Angular devient continue, traçable et plus simple à faire évoluer. La séparation backend/frontend, l’externalisation de la configuration et la gestion de versions d’images renforcent la fiabilité globale.
Prochaine étape : adapter les scripts de déploiement à l’infrastructure (VM, Docker Compose, ou Kubernetes) et ajouter des tests et un contrôle qualité plus stricts.
À propos de l'auteur
Laty Gueye Samba est développeur Full Stack basé à Dakar, Sénégal. Spécialiste des écosystèmes Java / Spring Boot et Angular.
Contact : latygueyesamba@gmail.com | Dakar, Sénégal