L’objectif de cette nouvelle étape consiste à professionnaliser le projet Spring Boot de la Chocolaterie de Pâques en le plaçant sur GitLab et en mettant en œuvre un pipeline CI/CD complet.
Ce pipeline devra permettre au minimum :
Le projet Chocolaterie de Pâques est désormais une application Spring Boot structurée en couches :
entity
repository
service
controller
security
config
L’application utilise :
Le projet contient également :
Cette étape vise donc à automatiser tout cela dans un pipeline GitLab.
À la fin de cette étape, vous serez capable de :
.gitlab-ci.yml
Avant de mettre en place le pipeline, le dépôt GitLab doit être propre.
chocolaterie-paques-springboot-v3/ ├── .gitlab-ci.yml ├── .gitignore ├── pom.xml ├── README.md ├── src/ │ ├── main/ │ └── test/ └── docs/
Vous devez versionner :
pom.xml
application.yml
application-test.yml
Le .gitignore doit au minimum exclure :
.gitignore
target/ .idea/ .project .classpath .settings/ *.iml logs/
Le pipeline GitLab est défini dans le fichier : .gitlab-ci.yml
Ce fichier permet de décrire :
Pour ce projet, une stratégie simple et progressive est recommandée.
Vous pouvez structurer le pipeline en plusieurs étapes :
build
test
package
quality
deploy
Dans un premier temps, les 3 premiers suffisent :
Voici une première version propre et réaliste du pipeline.
J’ai mis la version 21, mais on peut utiliser la 17.
image: maven:3.9.9-eclipse-temurin-21 stages: - build - test - package variables: MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository" MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version" cache: paths: - .m2/repository before_script: - java -version - mvn -version build: stage: build script: - mvn $MAVEN_CLI_OPTS clean compile -DskipTests artifacts: paths: - target/ expire_in: 1 hour test: stage: test script: - mvn $MAVEN_CLI_OPTS test artifacts: when: always reports: junit: - target/surefire-reports/*.xml paths: - target/surefire-reports/ expire_in: 1 week package: stage: package script: - mvn $MAVEN_CLI_OPTS clean package -DskipTests artifacts: paths: - target/*.jar expire_in: 1 week
Pour cette démonstration, nous allons utiliser une image Docker en espérant que cela soit possible pour vous !
image: maven:3.9.9-eclipse-temurin-21
Le job s’exécute dans un conteneur Docker contenant Maven et Java.
stages: - build - test - package
Les jobs sont exécutés dans cet ordre logique.
variables: MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository" MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version"
MAVEN_OPTS
MAVEN_CLI_OPTS
cache: paths: - .m2/repository
Le cache permet d’éviter de re-télécharger toutes les dépendances Maven à chaque pipeline.
before_script
before_script: - java -version - mvn -version
Très utile pour vérifier rapidement dans les logs si les versions sont correctes :
build: stage: build script: - mvn $MAVEN_CLI_OPTS clean compile -DskipTests
Ce job vérifie que le code compile.
Il permet d’échouer rapidement si :
test: stage: test script: - mvn $MAVEN_CLI_OPTS test
Ce job exécute les tests.
Dans votre projet, cela couvre :
artifacts: when: always reports: junit: - target/surefire-reports/*.xml
Cela permet à GitLab de lire les rapports JUnit et d’afficher les résultats de tests dans l’interface.
package: stage: package script: - mvn $MAVEN_CLI_OPTS clean package -DskipTests
Ce job construit le fichier JAR final à livrer qui est l’exécutable.
Une fois le pipeline minimal validé, vous pouvez passer à une version un peu plus professionnelle.
image: maven:3.9.9-eclipse-temurin-21 stages: - validate - build - test - package - quality variables: MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository" MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version" cache: key: "${CI_COMMIT_REF_SLUG}" paths: - .m2/repository before_script: - java -version - mvn -version validate: stage: validate script: - mvn $MAVEN_CLI_OPTS validate build: stage: build script: - mvn $MAVEN_CLI_OPTS compile -DskipTests test: stage: test script: - mvn $MAVEN_CLI_OPTS test artifacts: when: always reports: junit: - target/surefire-reports/*.xml paths: - target/surefire-reports/ expire_in: 1 week package: stage: package script: - mvn $MAVEN_CLI_OPTS clean package -DskipTests artifacts: paths: - target/*.jar expire_in: 1 week quality: stage: quality script: - mvn $MAVEN_CLI_OPTS verify
Parce que vos tests utilisent H2 via application-test.yml.
C’est un excellent choix pour la CI, car GitLab n’a pas besoin :
Cela rend le pipeline :
Votre pipeline doit vérifier que les tests suivants passent :
LigneCommandeServiceTest
RepositoryIntegrationTest
ProduitRestControllerMockMvcTest
SecurityAndRestIntegrationTest
Autrement dit, votre job test doit valider :
En plus du JAR, vous pouvez conserver :
Exemple :
artifacts: when: always paths: - target/*.jar - target/surefire-reports/
Une bonne amélioration consiste à intégrer JaCoCo pour mesurer la couverture de tests, mais le rapport semble être généré lorsque tout va bien mais ne l’est pas lorsqu’un test échoue avec notre configuration VDI. Je laisse ce chapitre mais on ne va pas l’aborder.
Cela nécessitera :
Vous pouvez décider que certains jobs ne s’exécutent que dans certains cas. Ici, ce sont des spécificités expliquées dans le cours complet sur Gitlab.
package: stage: package script: - mvn $MAVEN_CLI_OPTS clean package -DskipTests rules: - if: '$CI_COMMIT_BRANCH == "main"' - if: '$CI_COMMIT_TAG'
main
Une fois la CI stable, vous pourrez ajouter une vraie étape de déploiement.
Build -> Test -> Package -> Docker Build -> Push Registry -> Deploy
Quand vous serez prêt, vous pourrez ajouter un job du type :
docker-build: stage: package image: docker:latest services: - docker:dind script: - docker build -t chocolaterie-paques .
Cette partie est à réserver à une étape ultérieure, quand la CI Maven sera parfaitement stable.
Pour les étapes futures, vous pourrez stocker dans GitLab :
Ces variables doivent être placées dans :
Ne versionnez jamais ces secrets dans le dépôt.
Votre README.md devrait au minimum contenir :
README.md
validate
Vous devez rendre :
À la fin de cette étape, le projet Chocolaterie de Pâques doit :
Un pipeline CI/CD se construit comme une boîte de chocolats sérieuse : par couches bien ordonnées, pas en jetant tout dans le moule en espérant un miracle.
Voici une version finale prête à tester pour ce projet :
image: maven:3.9.9-eclipse-temurin-21 stages: - build - test - package variables: MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository" MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version" cache: paths: - .m2/repository before_script: - java -version - mvn -version build: stage: build script: - mvn $MAVEN_CLI_OPTS clean compile -DskipTests test: stage: test script: - mvn $MAVEN_CLI_OPTS test artifacts: when: always reports: junit: - target/surefire-reports/*.xml paths: - target/surefire-reports/ expire_in: 1 week package: stage: package script: - mvn $MAVEN_CLI_OPTS clean package -DskipTests artifacts: paths: - target/*.jar expire_in: 1 week
Quand cette étape sera maîtrisée, vous pourrez enchaîner sur :
Ce sera alors la vraie suite industrielle du projet. Mais j’ignore encore quel sera votre processus complet chez CA !