Aller au contenu

Automatiser Spring Boot + Docker avec GitLab CI (facile)

Les objectifs de ce TP de mise en pratique CI/CD sont les suivants :

Contexte du TP : Windows + Docker Desktop + WSL2 côté dev. Le pipeline GitLab s’exécute côté serveur (runner)

Par contre il faut remplir les conditions suivantes :

Si vous êtes habitué à GitLab, il vous faut activer le Container Registry (une fois).

Dans votre projet GitLab / Settings / Packages & Registries / Container Registry puis Enable.

Les variables d’authentification intégrées CI_REGISTRY_USER et CI_REGISTRY_PASSWORD seront disponibles automatiquement.

Premier Job build

Créez le fichier .gitlab-ci.yml à la racine du repo dont voici le code ci-dessous :

## Définit les étapes
stages:
  - build
  - image

# votre image de job : Maven + le JDK 17
image: maven:3.9.8-eclipse-temurin-17

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"

cache:
  key: maven-cache
  paths:
    - .m2/repository

build:maven:
  stage: build
  script:
    - mvn -B -DskipTests package
  artifacts:
    when: always
    paths:
      - target/*.jar
    expire_in: 1 week

Explications de ce que fait chaque ligne de ce script :

stages:
  - build
  - image

Rôle : Définit les étapes (stages) du pipeline CI/CD.

Ordre : Les étapes s’exécutent séquentiellement, d’abord build puis image.

image: maven:3.9.8-eclipse-temurin-17

Rôle : Spécifie l’image Docker utilisée pour exécuter les jobs du pipeline.

Tous les jobs du pipeline utiliseront cette image comme environnement d’exécution.

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"

Rôle : Définit des variables d’environnement pour notre pipeline.

Cela permet de persister le cache Maven entre les exécutions du pipeline.

cache:
  key: maven-cache
  paths:
    - .m2/repository

Rôle : Configure le cache pour accélérer les builds futurs.

Les dépendances Maven téléchargées seront sauvées en cache et réutilisées lors des prochains builds, ce qui réduit le temps d’exécution. Si vous ne le faites pas, ce n’est pas grave, mais c’est bien pratique de le faire.

build:maven:

Rôle : Définit un job nommé build:maven dans le pipeline.

Ce job appartient à l’étape build (définie plus haut dans stages).

  stage: build

Rôle : Associe le job build:maven à l’étape build. Le job s’exécutera pendant la phase build du pipeline.

  script:
    - mvn -B -DskipTests package

Rôle : Définit les commandes à exécuter pendant le job.

mvn -B -DskipTests package :

  artifacts:
    when: always
    paths:
      - target/*.jar
    expire_in: 1 week

Rôle : Définit les artifacts (fichiers générés) à sauvegarder après le job.

Résumé global du script

On utilise ce type de script dans un pipeline CI/CD pour :

Remarques : L’utilisation de -DskipTests permet d’ignorer les tests avec skipTest. Ainsi, si vous voulez les exécuter, retirez cette option. Pour le Cache, il faut s’assurer que le chemin .m2/repository est correct pour le projet. L’utilisation de Artifacts permet de conserver le .jar pour être utilisés dans les étapes suivantes comme le déploiement.

Deuxième Job image (Docker-in-Docker, le plus simple pour commencer)

ça fonctionnera si votre runner autorise Docker-in-Docker ou dind (dans GitLab.com Shared Runners).

C’est le plus simple à comprendre au début !

Et à utiliser

image: docker:27

services:
  - name: docker:27-dind
    command: ["--tls=false"]

# Ces variables évitent le TLS pour simplifier notre démo.
variables:
  DOCKER_HOST: tcp://docker:2375
  DOCKER_TLS_CERTDIR: ""

build:image:
  stage: image
  needs: ["build:maven"]    # attend que le jar soit construit
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'   # ne build l’image que sur main
    - if: '$CI_COMMIT_TAG'                # ou sur un tag
  before_script:
    - echo "Login to GitLab Registry"
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
  script:
    # Tags utiles : SHA et branche
    - export IMAGE="$CI_REGISTRY_IMAGE"
    - export TAG_SHA="$CI_COMMIT_SHORT_SHA"
    - export TAG_BRANCH="$CI_COMMIT_REF_SLUG"

    # Construire l’image (le Dockerfile copie déjà le jar depuis 'target/')
    - docker build -t "$IMAGE:$TAG_SHA" -t "$IMAGE:$TAG_BRANCH" -t "$IMAGE:latest" .

    # Faire un push des tags
    - docker push "$IMAGE:$TAG_SHA"
    - docker push "$IMAGE:$TAG_BRANCH"
    - docker push "$IMAGE:latest"

A chaque push sur le main (ou création de tag), le pipeline :

Remarque : Il se peut que nous ayons quelques soucis sur Windows, pour le Runner Windows, préférez un runner Linux (Shell ou Docker executor). Les images maven/docker officielles sont Linux !

Documentation

Vous avez la documentation pour GitLab/CI qui est plutôt bien faite.