Développement Continu / Intégration Continue (CI/CD)

Framework Java Spring et GitHub Actions

Vue d'ensemble du cours

Ce cours offre une introduction complète aux pratiques de Développement Continu (Continuous Development) et d'Intégration Continue (Continuous Integration), avec un focus particulier sur l'implémentation avec le framework Java Spring et l'utilisation de GitHub Actions pour l'automatisation des pipelines CI/CD.

Les étudiants apprendront à concevoir, configurer et maintenir des pipelines CI/CD efficaces pour des applications Spring Boot, en automatisant les processus de build, test, et déploiement. Le cours couvre les meilleures pratiques de l'industrie, les outils modernes, et les stratégies de déploiement automatisé.

Introduction au CI/CD

Qu'est-ce que l'Intégration Continue (CI) ?

L'Intégration Continue (Continuous Integration) est une pratique de développement logiciel où les développeurs intègrent fréquemment leur code dans un dépôt partagé, idéalement plusieurs fois par jour. Chaque intégration déclenche automatiquement un build et des tests automatisés pour détecter rapidement les erreurs d'intégration.

Principes fondamentaux de l'Intégration Continue :

  • Commits fréquents : Intégrer le code dans le dépôt principal aussi souvent que possible
  • Build automatisé : Chaque commit déclenche automatiquement un build
  • Tests automatisés : Exécution automatique de la suite de tests à chaque build
  • Feedback rapide : Notification immédiate en cas d'échec du build ou des tests
  • Build rapide : Les builds doivent être rapides pour ne pas bloquer le développement
  • Environnement de test reproductible : Utiliser des environnements identiques pour tous les tests

Avantages de l'Intégration Continue :

  • Détection précoce des bugs et des problèmes d'intégration
  • Réduction du temps nécessaire pour intégrer de nouvelles fonctionnalités
  • Amélioration de la qualité du code grâce aux tests automatisés
  • Confiance accrue dans le code déployé
  • Documentation automatique de l'état du projet
  • Facilitation de la collaboration entre développeurs

Qu'est-ce que le Déploiement Continu (CD) ?

Le Déploiement Continu (Continuous Deployment) est une extension de l'Intégration Continue qui automatise le déploiement des applications en production après chaque build réussi. Le Déploiement Continu permet de livrer rapidement de nouvelles fonctionnalités aux utilisateurs finaux.

Différence entre Continuous Delivery et Continuous Deployment :

  • Continuous Delivery : Le code est toujours dans un état déployable, mais le déploiement en production nécessite une intervention manuelle
  • Continuous Deployment : Le déploiement en production est entièrement automatisé après chaque build réussi

Avantages du Déploiement Continu :

  • Livraison rapide de nouvelles fonctionnalités
  • Réduction du temps entre le développement et la mise en production
  • Déploiements plus fréquents et plus petits, réduisant les risques
  • Feedback rapide des utilisateurs
  • Réduction des erreurs de déploiement manuel
  • Amélioration de la réactivité aux besoins du marché

Le Pipeline CI/CD

Un pipeline CI/CD est une série d'étapes automatisées qui transforment le code source en une application déployée. Un pipeline typique comprend :

  • Source : Récupération du code depuis le dépôt (Git, SVN, etc.)
  • Build : Compilation du code source en artefacts exécutables
  • Test : Exécution de tests unitaires, d'intégration, et de bout en bout
  • Quality Assurance : Analyse statique du code, vérification de la couverture de tests
  • Package : Création d'artefacts déployables (JAR, WAR, Docker images, etc.)
  • Deploy (Staging) : Déploiement dans un environnement de staging
  • Test (Staging) : Tests supplémentaires dans l'environnement de staging
  • Deploy (Production) : Déploiement en production (automatique ou manuel selon la stratégie)

CI/CD avec Java Spring Framework

Spring Boot et CI/CD

Spring Boot est particulièrement bien adapté aux pratiques CI/CD grâce à ses caractéristiques :

  • Convention over Configuration : Configuration minimale nécessaire
  • Embedded Server : Serveur intégré (Tomcat, Jetty) facilitant le packaging
  • Profiles : Gestion de différentes configurations pour différents environnements
  • Actuator : Endpoints de monitoring et de gestion de l'application
  • Testing Support : Support complet pour les tests avec Spring Test
  • Dependency Management : Gestion automatique des versions de dépendances

Structure d'un Projet Spring Boot pour CI/CD

Un projet Spring Boot bien structuré pour CI/CD doit inclure :

  • pom.xml (Maven) ou build.gradle (Gradle) : Configuration du build
  • Tests unitaires : Tests JUnit avec Spring Test
  • Tests d'intégration : Tests avec @SpringBootTest
  • Application properties : Configuration par environnement (dev, test, prod)
  • Dockerfile : Pour la containerisation
  • docker-compose.yml : Pour les environnements de développement et de test
  • GitHub Actions workflow : Configuration du pipeline CI/CD

Build et Packaging avec Maven/Gradle

Spring Boot supporte à la fois Maven et Gradle comme outils de build. Les deux permettent de :

  • Compiler le code source Java
  • Gérer les dépendances
  • Exécuter les tests
  • Créer des artefacts JAR/WAR exécutables
  • Publier des artefacts vers des dépôts Maven

Commandes Maven essentielles :

  • mvn clean : Nettoie le répertoire target
  • mvn compile : Compile le code source
  • mvn test : Exécute les tests
  • mvn package : Crée le JAR/WAR
  • mvn install : Installe l'artefact dans le dépôt local
  • mvn spring-boot:run : Lance l'application Spring Boot

Commandes Gradle essentielles :

  • ./gradlew clean : Nettoie le répertoire build
  • ./gradlew build : Compile, teste et crée l'artefact
  • ./gradlew test : Exécute les tests
  • ./gradlew bootRun : Lance l'application Spring Boot

Tests avec Spring Boot

Spring Boot fournit un support complet pour les tests avec Spring Test, Mockito, et JUnit 5. Les types de tests incluent :

  • Tests unitaires : Testent des composants isolés avec des mocks
  • Tests d'intégration : Testent l'interaction entre plusieurs composants
  • Tests de régression : Vérifient que les fonctionnalités existantes continuent de fonctionner
  • Tests de performance : Vérifient les temps de réponse et la charge

Les tests Spring Boot peuvent utiliser @SpringBootTest pour charger le contexte complet de l'application, ou @WebMvcTest pour tester uniquement la couche web.

GitHub Actions : Focus Principal

Introduction à GitHub Actions

GitHub Actions est une plateforme d'automatisation CI/CD intégrée directement dans GitHub. Elle permet d'automatiser les workflows de développement logiciel directement depuis votre dépôt GitHub, sans nécessiter de serveur externe.

Avantages de GitHub Actions :

  • Intégration native : Fonctionne directement avec GitHub, pas besoin de configuration externe
  • Gratuit pour les projets open source : Illimité pour les dépôts publics
  • Configuration simple : Workflows définis en YAML dans le dépôt
  • Matrice de builds : Teste sur plusieurs versions de Java, systèmes d'exploitation
  • Marketplace d'actions : Bibliothèque riche d'actions pré-construites
  • Parallélisation : Exécution parallèle de jobs pour des builds plus rapides
  • Gestion des secrets : Stockage sécurisé des informations sensibles

Structure d'un Workflow GitHub Actions

Les workflows GitHub Actions sont définis dans des fichiers YAML placés dans le répertoire .github/workflows/. Un workflow typique comprend :

  • name : Nom du workflow
  • on : Événements qui déclenchent le workflow (push, pull_request, etc.)
  • jobs : Tâches à exécuter
  • steps : Étapes individuelles dans chaque job
  • runs-on : Type de machine virtuelle à utiliser

Exemple de Workflow CI/CD pour Spring Boot

Voici un exemple de workflow GitHub Actions complet pour une application Spring Boot :

name: CI/CD Pipeline

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    
    strategy:
      matrix:
        java-version: [11, 17]
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Set up JDK ${{ matrix.java-version }}
      uses: actions/setup-java@v3
      with:
        java-version: ${{ matrix.java-version }}
        distribution: 'temurin'
        cache: maven
    
    - name: Build with Maven
      run: mvn clean compile
    
    - name: Run tests
      run: mvn test
    
    - name: Generate test report
      uses: dorny/test-reporter@v1
      if: always()
      with:
        name: Maven Tests
        path: target/surefire-reports/*.xml
        reporter: java-junit
    
    - name: Build JAR
      run: mvn package -DskipTests
    
    - name: Upload artifacts
      uses: actions/upload-artifact@v3
      with:
        name: application-jar
        path: target/*.jar

  docker-build:
    needs: build-and-test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v2
    
    - name: Login to Docker Hub
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}
    
    - name: Build and push Docker image
      uses: docker/build-push-action@v4
      with:
        context: .
        push: true
        tags: username/app:latest

  deploy:
    needs: docker-build
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    
    steps:
    - name: Deploy to production
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.USERNAME }}
        key: ${{ secrets.SSH_KEY }}
        script: |
          docker pull username/app:latest
          docker-compose up -d

Actions GitHub Actions pour Spring Boot

Plusieurs actions populaires sont disponibles pour les projets Spring Boot :

  • actions/setup-java@v3 : Configure l'environnement Java avec gestion du cache Maven/Gradle
  • actions/cache@v3 : Cache les dépendances Maven/Gradle pour accélérer les builds
  • actions/upload-artifact@v3 : Télécharge les artefacts de build
  • actions/download-artifact@v3 : Télécharge les artefacts dans un job ultérieur
  • codecov/codecov-action@v3 : Upload la couverture de code vers Codecov
  • sonarsource/sonarcloud-github-action : Analyse de code avec SonarCloud
  • docker/build-push-action@v4 : Build et push d'images Docker

Stratégies de Matrice (Matrix Strategy)

GitHub Actions permet de tester votre application sur plusieurs versions de Java et systèmes d'exploitation simultanément en utilisant une stratégie de matrice :

strategy:
  matrix:
    java-version: [11, 17, 21]
    os: [ubuntu-latest, windows-latest, macos-latest]
  fail-fast: false

Cette configuration exécutera les tests sur 9 combinaisons différentes (3 versions Java × 3 OS), permettant de détecter les problèmes de compatibilité rapidement.

Gestion des Secrets

GitHub Actions fournit un système sécurisé pour gérer les secrets (mots de passe, clés API, tokens, etc.) :

  • Les secrets sont stockés de manière chiffrée
  • Ils ne sont jamais affichés dans les logs
  • Ils sont accessibles via ${{ secrets.SECRET_NAME }}
  • Ils peuvent être configurés au niveau du dépôt ou de l'organisation

Exemples de secrets typiques pour un projet Spring Boot :

  • Clés de base de données
  • Tokens d'API externes
  • Clés SSH pour le déploiement
  • Credentials Docker Hub / Container Registry
  • Certificats SSL

Conditions et Environnements

GitHub Actions permet de contrôler l'exécution des workflows avec des conditions :

  • if : Conditions pour exécuter une étape ou un job
  • environments : Protection des environnements de production avec approbations
  • concurrency : Limiter l'exécution simultanée de workflows

Exemple d'utilisation des environnements pour protéger la production :

deploy-production:
  runs-on: ubuntu-latest
  environment: production
  steps:
    - name: Deploy
      run: ./deploy.sh

Bonnes Pratiques CI/CD

Stratégies de Branches

Une stratégie de branches bien définie est essentielle pour un CI/CD efficace :

  • main/master : Branche principale, toujours déployable en production
  • develop : Branche de développement, déploiement automatique en staging
  • feature/* : Branches de fonctionnalités, tests automatiques uniquement
  • release/* : Branches de release, tests complets avant production
  • hotfix/* : Branches de correction urgente, déploiement rapide en production

Tests dans le Pipeline

Les tests doivent être organisés en plusieurs niveaux dans le pipeline :

  • Tests unitaires : Exécutés en premier, très rapides
  • Tests d'intégration : Vérifient l'interaction entre composants
  • Tests de régression : Vérifient que les fonctionnalités existantes fonctionnent toujours
  • Tests de performance : Vérifient les temps de réponse
  • Tests de sécurité : Détection de vulnérabilités

Le principe du "test pyramid" suggère d'avoir beaucoup de tests unitaires rapides, moins de tests d'intégration, et encore moins de tests end-to-end lents.

Gestion des Environnements

Les applications doivent être testées dans plusieurs environnements avant la production :

  • Development : Environnement local des développeurs
  • Integration : Environnement pour les tests d'intégration automatisés
  • Staging : Environnement de pré-production, miroir de la production
  • Production : Environnement réel utilisé par les utilisateurs finaux

Chaque environnement doit avoir sa propre configuration (base de données, services externes, etc.) gérée via des variables d'environnement ou des profils Spring.

Rollback et Recovery

Un pipeline CI/CD robuste doit inclure des stratégies de rollback :

  • Versioning : Taguer chaque déploiement avec un numéro de version
  • Blue-Green Deployment : Maintenir deux environnements identiques pour basculer rapidement
  • Canary Releases : Déployer progressivement à un sous-ensemble d'utilisateurs
  • Database Migrations : Gérer les migrations de base de données de manière réversible

Monitoring et Observabilité

Le monitoring est crucial pour détecter les problèmes en production :

  • Logs : Centralisation et agrégation des logs
  • Metrics : Métriques de performance (temps de réponse, taux d'erreur, etc.)
  • Tracing : Suivi des requêtes à travers les microservices
  • Health Checks : Endpoints de santé pour vérifier l'état de l'application

Spring Boot Actuator fournit des endpoints de monitoring prêts à l'emploi pour la santé de l'application, les métriques, et plus encore.

Containerisation avec Docker

Dockerfile pour Spring Boot

Containeriser une application Spring Boot avec Docker permet d'assurer la cohérence entre les environnements. Voici un exemple de Dockerfile optimisé :

# Stage 1: Build
FROM maven:3.8.6-eclipse-temurin-17 AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package -DskipTests

# Stage 2: Runtime
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

Ce Dockerfile utilise un build multi-stage pour créer une image finale légère, ne contenant que le JAR et le runtime Java.

Intégration Docker dans GitHub Actions

GitHub Actions peut automatiquement builder et publier des images Docker vers des registries comme Docker Hub, GitHub Container Registry, ou AWS ECR. Cela permet de déployer facilement des applications containerisées.

Automatisation Avancée

Déploiement Automatique

Le déploiement automatique peut être configuré pour différents environnements :

  • Staging : Déploiement automatique après chaque merge dans develop
  • Production : Déploiement automatique ou manuel après merge dans main
  • Feature Branches : Déploiement dans des environnements éphémères pour les tests

Notifications et Alertes

Les workflows GitHub Actions peuvent envoyer des notifications :

  • Slack pour les échecs de build
  • Email pour les déploiements en production
  • Discord pour les mises à jour de statut
  • Microsoft Teams pour les rapports de build

Analyse de Code Automatique

L'analyse statique de code peut être intégrée dans le pipeline :

  • SonarCloud : Analyse de qualité de code et détection de bugs
  • CodeQL : Analyse de sécurité par GitHub
  • Checkstyle / SpotBugs : Vérification du style de code et détection de bugs
  • OWASP Dependency Check : Détection de vulnérabilités dans les dépendances

Objectifs d'Apprentissage

À l'issue de ce cours, les étudiants seront capables de :

  • Comprendre les concepts et avantages du CI/CD
  • Configurer des pipelines CI/CD avec GitHub Actions
  • Automatiser le build, les tests, et le déploiement d'applications Spring Boot
  • Utiliser les stratégies de matrice pour tester sur plusieurs environnements
  • Gérer les secrets et la configuration de manière sécurisée
  • Containeriser des applications Spring Boot avec Docker
  • Intégrer l'analyse de code et les tests de sécurité dans le pipeline
  • Implémenter des stratégies de déploiement (blue-green, canary)
  • Configurer le monitoring et l'observabilité
  • Appliquer les meilleures pratiques de CI/CD dans des projets réels

Évaluation

L'évaluation du cours comprend des projets pratiques où les étudiants doivent :

  • Configurer un pipeline CI/CD complet pour une application Spring Boot
  • Implémenter des tests automatisés (unitaires, d'intégration)
  • Configurer GitHub Actions avec des workflows multi-environnements
  • Containeriser l'application avec Docker
  • Automatiser le déploiement vers un environnement de staging
  • Intégrer l'analyse de code et les tests de sécurité
  • Documenter le pipeline et les stratégies de déploiement

Les étudiants sont attendus de démontrer leur compréhension des concepts CI/CD, leur capacité à configurer des pipelines automatisés, et leur maîtrise des outils modernes de développement continu à travers leurs implémentations pratiques.

← Retour aux Cours