Retour aux articles

Mettre en place un pipeline CI/CD de bout en bout avec GitLab pour un projet Spring Boot + Angular

Mettre en place un pipeline CI/CD de bout en bout avec GitLab pour un projet Spring Boot + Angular | Laty Gueye Samba - Développeur Full Stack Dakar Sénégal, Expert Java Spring Boot Angular

Le développement logiciel moderne exige rapidité, fiabilité et qualité. Au cœur de cette exigence se trouve l'intégration et le déploiement continus (CI/CD), une pratique qui transforme la manière dont les applications sont conçues, testées et livrées. Pour les projets combinant un backend robuste comme Spring Boot et un frontend dynamique tel qu'Angular, la mise en place d'un pipeline CI/CD de bout en bout est non seulement un atout, mais une nécessité stratégique.

Cet article, inspiré par l'expertise de Laty Gueye Samba, développeur Full Stack Java Spring Boot + Angular basé à Dakar, Sénégal, explore les étapes et les meilleures pratiques pour architecturer un pipeline CI/CD complet avec GitLab. L'objectif est d'automatiser les processus de build, de test et de déploiement pour les deux parties de l'application, assurant ainsi une livraison logicielle fluide et efficace. La maîtrise de tels outils est fondamentale pour un expert Java Spring Boot Angular souhaitant optimiser les cycles de développement.

Le fait de disposer d'une approche unifiée pour la gestion des deux composants (backend et frontend) au sein d'un même pipeline GitLab CI/CD permet de réduire les erreurs, d'accélérer les mises à jour et de garantir une cohérence entre les différentes versions déployées. Cela est particulièrement pertinent dans des environnements de développement complexes, où la synchronisation des déploiements est cruciale pour le bon fonctionnement des applications métier.

Comprendre les Fondamentaux de GitLab CI/CD pour un Projet Hybride

GitLab CI/CD est un outil puissant intégré nativement à GitLab, permettant d'automatiser les étapes du cycle de vie du développement logiciel. Le cœur de GitLab CI/CD réside dans le fichier .gitlab-ci.yml, un fichier YAML placé à la racine du dépôt, qui définit les tâches (jobs) à exécuter et les étapes (stages) dans lesquelles ces tâches s'inscrivent.

Pour un projet Spring Boot + Angular, le défi consiste à orchestrer le build et le déploiement de deux bases de code distinctes mais interdépendantes. Chaque partie aura ses propres dépendances, outils de build (Maven/Gradle pour Java, npm/yarn pour Angular) et stratégies de test. Le pipeline doit être suffisamment flexible pour gérer ces spécificités tout en garantissant que les deux parties peuvent être déployées conjointement ou indépendamment selon les besoins.

Les concepts clés à maîtriser incluent :

  • Stages : Des groupes logiques de jobs qui s'exécutent séquentiellement. Des stages typiques incluent build, test, deploy.
  • Jobs : Des tâches individuelles qui s'exécutent au sein d'un stage. Un job peut par exemple compiler le backend, exécuter les tests unitaires du frontend, ou déployer une image Docker.
  • Runners : Des agents qui exécutent les jobs définis dans le .gitlab-ci.yml. Ils peuvent être partagés par GitLab ou spécifiques à une instance.
  • Services : Des conteneurs Docker qui peuvent être liés aux jobs, utiles pour des bases de données de test ou d'autres dépendances externes.

L'utilisation de Docker est fortement recommandée. Elle permet d'encapsuler l'environnement de build et d'exécution, garantissant ainsi la reproductibilité et l'isolation des processus, un avantage considérable pour les développeurs full stack à Dakar et ailleurs.

Mettre en Œuvre le Pipeline pour le Backend Spring Boot

La section backend d'un projet Spring Boot nécessite un pipeline qui compile le code Java, exécute les tests et, idéalement, construit une image Docker de l'application. Voici un exemple de configuration pour un projet Spring Boot utilisant Maven :


# .gitlab-ci.yml (extrait pour le backend Spring Boot)

stages:
  - build-backend
  - test-backend
  - package-backend
  - deploy-backend

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
  SPRING_BOOT_APP_NAME: "mon-api-spring-boot"

cache:
  paths:
    - .m2/repository

build_backend_job:
  stage: build-backend
  image: maven:3.8.7-openjdk-17
  script:
    - echo "Début du build du backend Spring Boot"
    - mvn clean install -DskipTests
  artifacts:
    paths:
      - target/*.jar
    expire_in: 1 week

test_backend_job:
  stage: test-backend
  image: maven:3.8.7-openjdk-17
  script:
    - echo "Exécution des tests unitaires et d'intégration du backend"
    - mvn test
  dependencies:
    - build_backend_job # S'assure que le JAR est disponible
  # services:
  #   - name: postgres:latest
  #     alias: postgresdb
  # variables:
  #   POSTGRES_DB: test_db
  #   POSTGRES_USER: user
  #   POSTGRES_PASSWORD: password

package_backend_job:
  stage: package-backend
  image: docker:20.10.16
  services:
    - docker:20.10.16-dind
  script:
    - echo "Création de l'image Docker du backend"
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $CI_REGISTRY/$CI_PROJECT_PATH/$SPRING_BOOT_APP_NAME:$CI_COMMIT_SHORT_SHA .
    - docker push $CI_REGISTRY/$CI_PROJECT_PATH/$SPRING_BOOT_APP_NAME:$CI_COMMIT_SHORT_SHA
    - docker tag $CI_REGISTRY/$CI_PROJECT_PATH/$SPRING_BOOT_APP_NAME:$CI_COMMIT_SHORT_SHA $CI_REGISTRY/$CI_PROJECT_PATH/$SPRING_BOOT_APP_NAME:latest
    - docker push $CI_REGISTRY/$CI_PROJECT_PATH/$SPRING_BOOT_APP_NAME:latest
  dependencies:
    - build_backend_job # Assure que le JAR est présent pour le build Docker
  only:
    - main

deploy_backend_job:
  stage: deploy-backend
  image: alpine/helm:3.10.0 # Exemple pour un déploiement Kubernetes
  script:
    - echo "Déploiement du backend sur l'environnement cible"
    # Exemple de commandes de déploiement (Kubernetes, SSH, etc.)
    # - helm upgrade --install my-release ./helm/charts/backend --set image.tag=$CI_COMMIT_SHORT_SHA
  environment: production
  only:
    - main

Ce pipeline compile le projet Spring Boot, exécute ses tests, puis crée une image Docker qui est ensuite poussée vers le registre d'images de GitLab. Le déploiement est conditionné à la branche main, une pratique courante pour les environnements de production.

Intégrer le Pipeline pour le Frontend Angular et Orchestrer le Tout

Le frontend Angular, bien que souvent déployé séparément ou servi par le backend, nécessite son propre processus de build et de test. Le pipeline doit installer les dépendances Node.js, compiler l'application Angular pour la production et exécuter les tests.


# .gitlab-ci.yml (suite, pour le frontend Angular)

# ... (stages et variables backend définis précédemment) ...

  - build-frontend
  - test-frontend
  - deploy-frontend # Peut être combiné avec le deploy-backend ou distinct

variables:
  # ... (variables backend) ...
  ANGULAR_APP_NAME: "mon-app-angular"
  NODE_VERSION: "18.17.0"

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - frontend/node_modules/ # Mise en cache des dépendances Angular
  policy: pull-push

build_frontend_job:
  stage: build-frontend
  image: node:$NODE_VERSION-alpine
  script:
    - echo "Début du build du frontend Angular"
    - cd frontend
    - npm ci --cache .npm --prefer-offline # Utilise le cache pour npm install
    - npm run build -- --configuration=production --output-path=../dist/public # Compile pour la production
  artifacts:
    paths:
      - dist/public/ # Le dossier des fichiers Angular compilés
    expire_in: 1 day

test_frontend_job:
  stage: test-frontend
  image: node:$NODE_VERSION-alpine
  script:
    - echo "Exécution des tests unitaires et E2E du frontend"
    - cd frontend
    - npm ci --cache .npm --prefer-offline
    - npm test -- --browsers=ChromeHeadless # Exécution des tests Karma
  allow_failure: true # Les tests frontend peuvent parfois être moins critiques pour le pipeline global

deploy_frontend_job:
  stage: deploy-frontend
  image: docker:20.10.16 # Ou une image avec un client S3, un outil de déploiement, etc.
  services:
    - docker:20.10.16-dind
  script:
    - echo "Déploiement du frontend"
    # Si l'Angular est servi par Spring Boot: Copier les fichiers Angular dans le répertoire public/static du Spring Boot
    # Il faudrait alors modifier le package_backend_job pour inclure ces fichiers.
    # Ou déploiement sur un serveur web/CDN (ex: S3, Nginx)
    - echo "Frontend déployé vers un serveur web statique ou CDN"
    # - aws s3 sync dist/public/ s3://mon-bucket-angular --delete
  dependencies:
    - build_frontend_job
  only:
    - main

Pour un déploiement complet, les fichiers Angular compilés (situés dans dist/public/) peuvent être copiés dans le répertoire src/main/resources/static ou src/main/resources/public du projet Spring Boot avant la création de l'image Docker du backend. Cela permet au Spring Boot de servir les fichiers statiques de l'application Angular. Alternativement, le frontend peut être déployé sur un serveur web statique (Nginx, Apache) ou un service de CDN (AWS S3/CloudFront) indépendant du backend.

Point de vue : développeur full stack à Dakar

Pour un développeur travaillant sur des systèmes comme des applications métier complexes ou des plateformes de gestion des risques, la maîtrise de l'automatisation des déploiements représente un avantage concurrentiel réel sur le marché technologique africain, en pleine expansion. L'adoption de pratiques CI/CD robustes, comme celles présentées avec GitLab pour Spring Boot et Angular, permet d'assurer la fiabilité et la rapidité des mises à jour, des critères essentiels pour des projets exigeants.

Conclusion

La mise en place d'un pipeline CI/CD de bout en bout avec GitLab pour un projet Spring Boot + Angular est une démarche stratégique qui offre des avantages considérables en termes de qualité logicielle, de vitesse de livraison et de collaboration d'équipe. En automatisant les étapes de build, de test et de déploiement pour les deux composants de l'application, les développeurs peuvent se concentrer sur l'innovation et la création de valeur.

Laty Gueye Samba, développeur Full Stack Java Spring Boot + Angular, expert dans la conception de solutions robustes, souligne l'importance cruciale de ces pratiques. La compréhension et l'implémentation de pipelines CI/CD performants sont des compétences incontournables pour tout professionnel souhaitant exceller dans l'écosystème technologique actuel, particulièrement pour un développeur Full Stack à Dakar, Sénégal, où l'exigence de systèmes fiables est en constante augmentation.

Pour approfondir vos connaissances, il est recommandé de consulter la documentation officielle :

À 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