Retour aux articles

Déploiement continu d'applications Spring Boot et Angular avec Docker et GitLab CI/CD

Déploiement continu d'applications Spring Boot et Angular avec Docker et GitLab CI/CD | Laty Gueye Samba - Développeur Full Stack Dakar Sénégal, Expert Java Spring Boot Angular

Le développement d'applications modernes, en particulier celles exploitant des architectures robustes comme Spring Boot pour le backend et Angular pour le frontend, exige une agilité et une fiabilité accrues dans le processus de livraison. Pour répondre à ces exigences, le déploiement continu (CD) s'impose comme une pratique essentielle. Cet article explore comment Docker, en tant qu'outil de conteneurisation, et GitLab CI/CD, en tant que plateforme d'automatisation, peuvent être orchestrés pour mettre en œuvre un pipeline de déploiement continu efficace pour des applications Spring Boot et Angular.

La mise en place d'un tel pipeline transforme le cycle de vie du développement logiciel, permettant des livraisons plus fréquentes, plus rapides et avec un risque réduit. En automatisant chaque étape, de la construction à la mise en production, les équipes de développement peuvent se concentrer sur l'innovation, tandis que la cohérence de l'environnement est garantie. Laty Gueye Samba, développeur Full Stack à Dakar, expert en Java Spring Boot et Angular, souligne l'importance de ces pratiques pour garantir la robustesse et l'évolutivité des solutions logicielles.

Dockerisation des applications Spring Boot et Angular

Docker est la pierre angulaire de ce processus, offrant un moyen standardisé d'empaqueter les applications et leurs dépendances dans des conteneurs isolés. Cette approche garantit que l'application s'exécute de manière identique, quel que soit l'environnement.

Dockerfile pour une application Spring Boot

Pour une application Spring Boot, un Dockerfile utilise souvent une approche de construction multi-étapes. Cela permet de réduire la taille de l'image finale en séparant l'environnement de compilation de l'environnement d'exécution.


# Étape de compilation
FROM maven:3.8.5-openjdk-17 AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests

# Étape d'exécution
FROM openjdk:17-jre-slim
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

Ce Dockerfile compile le projet Spring Boot avec Maven dans une première étape, puis copie uniquement le fichier JAR exécutable vers une image JRE légère pour l'exécution, optimisant ainsi la taille et la sécurité.

Dockerfile pour une application Angular

De même, une application Angular bénéficie d'une approche multi-étapes pour construire les fichiers statiques, puis les servir via un serveur web léger comme Nginx.


# Étape de compilation
FROM node:18-alpine AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build -- --configuration=production

# Étape de service avec Nginx
FROM nginx:alpine
COPY --from=build /app/dist/votre-projet-angular /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Ici, les dépendances Angular sont installées et l'application est compilée dans une première étape. Les artefacts de build sont ensuite copiés vers une image Nginx, qui servira l'application frontend.

Mise en place de GitLab CI/CD

GitLab CI/CD est un outil puissant intégré à GitLab qui permet de définir des pipelines d'intégration et de déploiement continus directement dans le dépôt de code via un fichier .gitlab-ci.yml.

Les fondamentaux du .gitlab-ci.yml

Le fichier .gitlab-ci.yml décrit les étapes (stages) et les tâches (jobs) du pipeline. Chaque tâche s'exécute dans un conteneur Docker distinct, garantissant l'isolation et la reproductibilité.


stages:
  - build_backend
  - test_backend
  - build_frontend
  - test_frontend
  - deploy_docker_images
  - deploy_to_server

variables:
  SPRING_BOOT_APP_NAME: my-spring-boot-app
  ANGULAR_APP_NAME: my-angular-app
  DOCKER_REGISTRY_URL: $CI_REGISTRY

Les stages définissent l'ordre d'exécution global. Les variables peuvent être utilisées pour paramétrer le pipeline. Les secrets (mots de passe, clés SSH) doivent être gérés via les variables CI/CD sécurisées de GitLab.

Conception du Pipeline de Déploiement Continu

Un pipeline de déploiement continu typique pour des applications Spring Boot et Angular inclura des étapes de construction, de test et de déploiement.

Stage Build & Test (Backend Spring Boot)

Cette étape est dédiée à la compilation du backend, l'exécution des tests unitaires et l'empaquetage de l'application dans une image Docker.


build_backend_image:
  stage: build_backend
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t $DOCKER_REGISTRY_URL/$SPRING_BOOT_APP_NAME:$CI_COMMIT_SHORT_SHA -t $DOCKER_REGISTRY_URL/$SPRING_BOOT_APP_NAME:latest ./backend
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $DOCKER_REGISTRY_URL
    - docker push $DOCKER_REGISTRY_URL/$SPRING_BOOT_APP_NAME:$CI_COMMIT_SHORT_SHA
    - docker push $DOCKER_REGISTRY_URL/$SPRING_BOOT_APP_NAME:latest
  only:
    - main

test_backend:
  stage: test_backend
  image: maven:3.8.5-openjdk-17
  script:
    - cd backend
    - mvn test
  artifacts:
    when: always
    reports:
      junit: backend/target/surefire-reports/*.xml
  only:
    - main

Le job build_backend_image construit l'image Docker du backend et la pousse vers le registre Docker de GitLab. Le job test_backend exécute les tests Maven.

Stage Build & Test (Frontend Angular)

Similaire au backend, cette étape compile l'application Angular, exécute les tests et crée une image Docker.


build_frontend_image:
  stage: build_frontend
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t $DOCKER_REGISTRY_URL/$ANGULAR_APP_NAME:$CI_COMMIT_SHORT_SHA -t $DOCKER_REGISTRY_URL/$ANGULAR_APP_NAME:latest ./frontend
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $DOCKER_REGISTRY_URL
    - docker push $DOCKER_REGISTRY_URL/$ANGULAR_APP_NAME:$CI_COMMIT_SHORT_SHA
    - docker push $DOCKER_REGISTRY_URL/$ANGULAR_APP_NAME:latest
  only:
    - main

test_frontend:
  stage: test_frontend
  image: node:18-alpine
  script:
    - cd frontend
    - npm install
    - npm test -- --no-watch --no-progress --browsers=ChromeHeadlessCI
  artifacts:
    when: always
    reports:
      junit: frontend/junit.xml
  only:
    - main

Les jobs build_frontend_image et test_frontend gèrent la conteneurisation et les tests de l'application Angular.

Stage Deploy (Production)

Une fois les images construites et testées, elles sont déployées sur le serveur cible. Cela peut impliquer l'utilisation de SSH pour se connecter au serveur, s'authentifier au registre Docker, puis démarrer les nouveaux conteneurs.


deploy_to_production:
  stage: deploy_to_server
  image: alpine/git
  before_script:
    - apk add --no-cache openssh-client
    - eval "$(ssh-agent -s)"
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - ssh-keyscan $PRODUCTION_SERVER_IP >> ~/.ssh/known_hosts
    - chmod 644 ~/.ssh/known_hosts
  script:
    - ssh $PRODUCTION_SERVER_USER@$PRODUCTION_SERVER_IP "
        docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $DOCKER_REGISTRY_URL &&
        docker pull $DOCKER_REGISTRY_URL/$SPRING_BOOT_APP_NAME:latest &&
        docker pull $DOCKER_REGISTRY_URL/$ANGULAR_APP_NAME:latest &&
        docker stop $SPRING_BOOT_APP_NAME $ANGULAR_APP_NAME || true &&
        docker rm $SPRING_BOOT_APP_NAME $ANGULAR_APP_NAME || true &&
        docker run -d --name $SPRING_BOOT_APP_NAME -p 8080:8080 $DOCKER_REGISTRY_URL/$SPRING_BOOT_APP_NAME:latest &&
        docker run -d --name $ANGULAR_APP_NAME -p 80:80 $DOCKER_REGISTRY_URL/$ANGULAR_APP_NAME:latest
      "
  environment:
    name: production
    url: http://$PRODUCTION_SERVER_IP
  when: manual # Ou on_success pour un déploiement entièrement automatique
  only:
    - main

Le script de déploiement utilise SSH pour exécuter des commandes Docker sur le serveur de production, tirant les nouvelles images, arrêtant les anciens conteneurs et démarrant les nouveaux. L'utilisation ds variables d'environnement (SSH_PRIVATE_KEY, PRODUCTION_SERVER_USER, etc.) est cruciale pour la sécurité.

Point de vue : développeur full stack à Dakar

Pour un développeur travaillant sur des systèmes de gestion hospitalière ou des applications métier complexes à Dakar, la maîtrise de pipelines CI/CD avec Docker et GitLab représente un avantage concurrentiel réel sur le marché technologique africain, en pleine expansion. L'automatisation des déploiements permet une livraison rapide des fonctionnalités et une maintenance simplifiée, des atouts majeurs pour des projets à fort impact.

Conclusion

Le déploiement continu d'applications Spring Boot et Angular avec Docker et GitLab CI/CD offre une solution robuste et efficace pour moderniser le processus de livraison logicielle. En conteneurisant les applications et en automatisant le pipeline de construction, de test et de déploiement, les équipes de développement peuvent améliorer significativement leur productivité, la qualité du code et la rapidité des mises à jour.

Cette approche permet non seulement de réduire les erreurs manuelles, mais aussi de garantir la cohérence des environnements, de la machine du développeur à la production. Laty Gueye Samba, Développeur Full Stack à Dakar, expert Java Spring Boot et Angular, encourage l'adoption de ces pratiques pour bâtir des systèmes résilients et performants.

Ressources Officielles

À 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