à la fin de ce Capstone Project, vous aurez un pipeline CI/CD pour un microservice Maven banking : dépÎt GitHub, branches et revues, build Maven/JUnit, image Docker taguée, job de test, e-mail, Ansible (Java + Apache) et conteneur sur la production.
Niveau : IntermĂ©diaire · Temps estimĂ© : 90â120 min · Versions cibles : Git 2.x · Maven 3.9+ · OpenJDK 17 · Jenkins 2.452+ · Docker Engine 27+ · Ansible 2.16+ · Ubuntu 24.04 LTS (ou RHEL 9) · DerniĂšre vĂ©rification : 2026-09-11
Slug proposé :
capstone-project· Série : DevOps · Leçon : CI/CD & Jenkins 11 / 11 · Publish : HOLD (feu vert Maßtre requis)
Prérequis
- Git : commit, branche, PR, merge
- Maven Build Tool :
pom.xml,test/package - Jenkins avec agent Maven + Docker
- Docker : Dockerfile, build, run, tags
- Bases Ansible : inventaire + playbook
- Compte GitHub + serveur Linux lab (Ubuntu 24.04 LTS) avec sudo
- SMTP lab (plugin Email Extension Jenkins)
Objectif : le brief client ABC (Agile, banking, microservices / REST API, SDLC encore manuel) devient un pipeline automatisé de bout en bout.
Ce que nous allons construire
Capstone BankingMicroservice (CI/CD & Jenkins 11/11)
âââ Repo GitHub BankingMicroservice + README.md
âââ Branches dĂ©veloppeurs + revue â Master/main
âââ Maven : App.java, src/test/, JUnit, JAR target/
âââ Jenkinsfile : mvn â Docker build/tag/run â test dummy
âââ E-mail si UNSTABLE
âââ Ansible : Java + Apache sur prod
âââ Docker image/conteneur sur la prod
(Schéma à remplacer par une image locale, alt : « Pipeline Capstone BankingMicroservice de Git à Docker prod ».)
Ătape 1 â Contexte mĂ©tier ABC
ABC suit lâAgile pour un client banking. Le SDLC est encore trop manuel. Le client migre vers des microservices et des API REST et demande dâautomatiser via CI/CD.
Ce Capstone clĂŽture Jenkins (11/11). Vous ĂȘtes Ă la fois dĂ©veloppeur et Code Reviewer.
| Bloc brief | Livrable |
|---|---|
| Git | Repo BankingMicroservice, branches, revue, README |
| Maven | Build auto sur Master, JUnit, JAR dans target/ |
| Docker | Dockerfile, image taguée, conteneur |
| Testing | Job dummy + e-mail si unstable |
| Prod | Ansible : Java + Apache démarré |
| Prod Docker | Image + conteneur sur le serveur Linux |
Ătape 2 â Git, branches et revue
Squelette Maven
mkdir -p BankingMicroservice/src/main/java/com/abc/banking
mkdir -p BankingMicroservice/src/test/java/com/abc/banking
cd BankingMicroservice
pom.xml (JUnit en dĂ©pendance â rĂ©solution automatique Maven) :
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.abc.banking</groupId>
<artifactId>banking-microservice</artifactId>
<version>1.0.0</version>
<properties><maven.compiler.release>17</maven.compiler.release></properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.5</version>
</plugin>
</plugins>
</build>
</project>
App.java (main) et test sous src/test/ :
package com.abc.banking;
public class App {
public static String health() { return "OK"; }
public static void main(String[] args) { System.out.println(health()); }
}
package com.abc.banking;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class AppTest {
@Test void healthIsOk() { assertEquals("OK", App.health()); }
}
Repo GitHub BankingMicroservice
- Créez le remote
BankingMicroservice. - Commits locaux puis push remote (exigence brief).
- Une branche par développeur (
feature/dev-alice, âŠ) ; push sur sa branche ; revue PR ; mergeMaster(oumainsi câest la convention lab â alignez Jenkins). README.mddistant : objectif, JDK/Maven/Docker,mvn test/package, Dockerfile, lien job Jenkins.
git init && git add . && git commit -m "feat: squelette Maven + JUnit"
git branch -M Master
git remote add origin git@github.com:<org>/BankingMicroservice.git
git push -u origin Master
git checkout -b feature/dev-alice
Tout changement sur App.java / tests est tracké et revu avant merge.
Ătape 3 â Maven : build auto, JUnit, JAR
- Build automatique dĂšs update Master (webhook GitHub â Jenkins ou poll SCM).
- Dépendances (JUnit) résolues par Maven.
- JAR sous
target/.
mvn -B clean test && mvn -B clean package && ls -la target/*.jar
Attendu : tests verts + banking-microservice-1.0.0.jar dans target/.
Ătape 4 â Docker : image taguĂ©e et conteneur
Dockerfile dans le repo. à chaque changement fusionné : nouvelle image, nouveau tag, puis conteneur avec cette image.
FROM maven:3.9-eclipse-temurin-17 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn -B -DskipTests package
FROM eclipse-temurin:17-jre
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app/app.jar"]
docker build -t banking-microservice:${BUILD_NUMBER:-local} .
docker run -d --name banking-ms banking-microservice:${BUILD_NUMBER:-local}
docker ps --filter name=banking-ms
Détails Engine / images : hub Docker.
Ătape 5 â Jenkinsfile CI/CD + test + e-mail
Job Pipeline from SCM sur BankingMicroservice / Master, trigger push.
pipeline {
agent any
environment { IMAGE = "banking-microservice:${env.BUILD_NUMBER}" }
stages {
stage('Checkout') { steps { checkout scm } }
stage('Maven Test & Package') {
steps {
sh 'mvn -B clean test package'
archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
}
}
stage('Docker Build & Tag') {
steps { sh 'docker build -t ${IMAGE} .' }
}
stage('Docker Run (lab)') {
steps {
sh 'docker rm -f banking-ms || true; docker run -d --name banking-ms ${IMAGE}'
}
}
stage('Testing (dummy)') {
steps {
echo 'Test applicatif dummy â remplacer plus tard par intĂ©gration / smoke HTTP'
sh 'docker exec banking-ms java -jar /app/app.jar || true'
}
}
}
post {
unstable {
emailext(
subject: "[UNSTABLE] BankingMicroservice #${env.BUILD_NUMBER}",
body: "Tests instables : ${env.BUILD_URL}",
to: "${env.CHANGE_AUTHOR_EMAIL ?: 'developer@example.com'}"
)
}
failure {
emailext(
subject: "[FAILED] BankingMicroservice #${env.BUILD_NUMBER}",
body: "Ăchec pipeline : ${env.BUILD_URL}",
to: "${env.CHANGE_AUTHOR_EMAIL ?: 'developer@example.com'}"
)
}
}
}
Le brief autorise un job de test dummy. Alternative : job séparé post-build qui passe UNSTABLE sur smoke KO. Configurez SMTP + Email Extension : si unstable, mail au développeur (exigence CI).
Ătape 6 â Prod Linux avec Ansible
Prod = Linux (Ubuntu ou Red Hat). Ansible doit :
- Installer Java
- Installer Apache
- Démarrer Apache
[prod]
prod1 ansible_host=192.168.56.20 ansible_user=ubuntu
- hosts: prod
become: true
tasks:
- name: Installer OpenJDK 17
apt: { name: openjdk-17-jre-headless, state: present, update_cache: true }
when: ansible_os_family == "Debian"
- name: Installer Apache
apt: { name: apache2, state: present }
when: ansible_os_family == "Debian"
- name: Démarrer Apache
service: { name: apache2, state: started, enabled: true }
when: ansible_os_family == "Debian"
ansible-playbook -i inventory.ini site.yml
java -version && systemctl status apache2
Sur RHEL : java-17-openjdk, httpd. Parcours Ansible ; alternative menu : Puppet.
Ătape 7 â Docker sur la production
RĂ©pĂ©tez lâexigence Docker sur prod : rebuild/tag Ă chaque changement pertinent, puis conteneur avec la derniĂšre image (SSH depuis Jenkins, ou modules community.docker).
docker build -t banking-microservice:prod-${BUILD_NUMBER} .
docker rm -f banking-ms-prod || true
docker run -d --name banking-ms-prod -p 8080:8080 banking-microservice:prod-${BUILD_NUMBER}
En entreprise : push registry puis docker pull en prod. Ensuite : orchestration Kubernetes.
Approfondissement â revue, webhook et qualitĂ©
En tant que Code Reviewer, exigez une PR avec description, lien ticket Agile (si Boards/Jira lab), et statut CI vert sur la branche feature avant merge Master. ProtĂ©gez Master : pas de push direct, 1 approval minimum. Les commits restent dâabord dans le dĂ©pĂŽt local de chaque dĂ©veloppeur ; seul le travail validĂ© part sur le remote BankingMicroservice.
CĂŽtĂ© Jenkins, prĂ©fĂ©rez un webhook GitHub (/github-webhook/) au poll SCM pour dĂ©clencher dĂšs le merge Master. VĂ©rifiez que lâagent a mvn, docker et les credentials SCM. Archivez le JAR (archiveArtifacts) pour tracer chaque build banking â utile si le client ABC demande un audit de livrable.
Pour le stage Testing dummy : vous pouvez forcer UNSTABLE avec catchError ou un script qui Ă©choue volontairement une fois, afin de vĂ©rifier que lâe-mail part bien au dĂ©veloppeur. Documentez lâadresse SMTP et le destinataire dans le README du Capstone.
Sur la prod, Apache nâhĂ©berge pas forcĂ©ment lâAPI Java : il prĂ©pare le terrain (reverse proxy, health page statique, futur front). Java systĂšme reste utile pour outillage hors conteneur ; le runtime applicatif principal reste le JRE de lâimage Docker.
Si vous ĂȘtes sur RHEL 9, remplacez les tĂąches apt/apache2 par dnf/httpd / java-17-openjdk-headless, et adaptez le nom de service. Gardez le mĂȘme inventaire Ansible : un seul playbook avec when: ansible_os_family couvre Ubuntu et Red Hat, comme demandĂ© par le brief (« Ubuntu or RedHat »).
Enfin, alignez le Capstone sur le reste du menu DevOps : outillage Git/Maven/Jenkins en amont, Docker/Ansible au milieu, puis ouverture vers Kubernetes et Nagios pour lâaprĂšs-lab. Le client banking attend surtout un pipeline reproductible â pas une dĂ©mo one-shot.
Pourquoi ce scénario banking reste pédagogique en 2026
Le brief ABC nâest pas un cas dâĂ©cole dĂ©coratif : il force Ă relier des outils que les tutos isolent. Git sans revue produit un Master sale. Maven sans tests automatiques livre un JAR « qui compile chez moi ». Docker sans tag reproductible empĂȘche de savoir quelle image tourne en prod. Jenkins sans e-mail laisse un UNSTABLE invisible. Ansible sans inventaire crĂ©e des snowflake servers. Le Capstone exige que chaque maillon parle au suivant.
Gardez le pĂ©rimĂštre volontairement simple (un microservice, un dummy test, Apache « pour plus tard ») : le client banking veut dâabord un pipeline reproductible, pas un mesh de vingt services. Une fois le fil vert, vous pourrez remplacer le dummy par un smoke HTTP, pousser lâimage vers un registry, et dĂ©ployer sur Kubernetes avec un Service et une probe. Nagios viendra observer le port 8080 et Apache â aprĂšs, pas avant, que le conteneur rĂ©ponde.
Revue et qualité : ce que le Code Reviewer refuse
En tant que reviewer, refusez une PR sans description, sans lien avec le brief (ou un ticket Agile), et sans CI verte sur la branche feature. Exigez que App.java et les tests restent dans lâarbre Maven standard : un test « oubliĂ© » hors src/test ne sera jamais lancĂ© par mvn test. VĂ©rifiez que le Dockerfile nâembarque pas de secret (token GitHub, mot de passe SMTP) et que le tag dâimage contient au moins le numĂ©ro de build Jenkins.
ProtĂ©gez Master : pas de push direct, une approval minimum. Les dĂ©veloppeurs committent dâabord en local sur leur branche ; seul le travail relu part sur le remote BankingMicroservice. Câest exactement le contrat Git du brief â et la raison pour laquelle le job Jenkins sâaccroche Ă Master, pas Ă chaque branche feature (sauf si vous basculez plus tard en Multibranch).
Déclenchement, artefacts et audit
CĂŽtĂ© Jenkins, prĂ©fĂ©rez un webhook GitHub (/github-webhook/) au poll SCM. VĂ©rifiez que lâagent a mvn, docker et les credentials SCM. Archivez le JAR (archiveArtifacts) : le client ABC peut demander un audit de livrable six semaines plus tard. Pour le stage Testing dummy, forcez une fois UNSTABLE (catchError ou script qui Ă©choue) afin de prouver que lâe-mail part. Documentez SMTP et destinataire dans le README.
Sur la prod, Apache nâhĂ©berge pas forcĂ©ment lâAPI Java : il prĂ©pare reverse proxy, page de santĂ©, futur front. Java systĂšme sert lâoutillage hors conteneur ; le runtime applicatif reste le JRE de lâimage Docker. Sur RHEL 9, remplacez apt/apache2 par dnf/httpd / java-17-openjdk-headless grĂące Ă when: ansible_os_family. Le brief dit « Ubuntu or RedHat » : un seul playbook, deux familles.
Alignez ensuite le Capstone sur le menu DevOps : Git / Maven / Jenkins en amont, Docker / Ansible au milieu, Kubernetes et Nagios pour lâaprĂšs-lab. Vous nâavez pas « fini DevOps » : vous avez un fil rouge que vous pouvez montrer, rejouer et durcir.
Ătape 8 â Check-list Capstone
- [ ] Repo
BankingMicroservice+README.md - [ ]
App.java+ testssrc/test/, historique Git - [ ] Branches dev, revue, merge Master
- [ ]
mvn test/packageâ JARtarget/ - [ ] Jenkins auto sur update Master
- [ ] Dockerfile, image taguée, conteneur lab
- [ ] Testing (dummy OK) + e-mail UNSTABLE
- [ ] Ansible : Java + Apache started
- [ ] Docker image + conteneur sur prod
Fil rouge à rejouer (pas une démo jetable)
Quand le pipeline est vert une fois, rejouez-le depuis une VM propre : clone, Wrapper ou Maven dâagent, build, image, playbook, conteneur. Si une Ă©tape dĂ©pend dâun fichier oubliĂ© sur votre laptop, le Capstone nâest pas terminĂ©. Le client banking paie la reproductibilitĂ©, pas le souvenir dâun vendredi soir oĂč « ça a marchĂ© ». Notez dans le README les versions (JDK, Maven, Jenkins LTS, Docker Engine, Ansible) et le nom exact de la branche protĂ©gĂ©e.
Erreurs fréquentes
- Webhook Jenkins muet : URL, token, branche
Master/main docker: permission deniedpourjenkins: groupedocker+ restart agent- JAR manquant : archiver aprĂšs
packageseulement - Mails absents : tester E-mail Notification ; Mailpit en lab
- RHEL :
httpd, pasapache2 - Conteneur prod KO :
docker logs banking-ms-prod
Aller plus loin
- Multibranch + SonarQube avant merge
- Registry + scan Trivy
- Apache
ProxyPassvers le conteneur - DĂ©ploiement K8s aprĂšs ce Capstone mono-nĆud â Kubernetes
- Supervision Nagios sur la prod lab
Conclusion
Brief ABC enrichi en parcours opĂ©rationnel : Git/revue, Maven/JUnit/JAR, Jenkins CI/CD, Docker taguĂ©, tests + e-mail, Ansible Java/Apache, Docker prod. Chaque exigence du brief live (Git, Maven, Docker, Testing dummy, e-mail dĂ©veloppeur, Ansible Java/Apache, Docker sur prod) est couverte sans suppression du fond pĂ©dagogique dâorigine â uniquement densifiĂ©e en français, avec commandes et check-list.
Leçon 11/11 du fil CI/CD & Jenkins : pont entre les tutos outillage du menu DevOps et un scénario client banking réaliste (microservices, REST API, automatisation du SDLC).
Publish : densification FR QA58 â update post 209, enrichir sans supprimer le brief.
FAQ
Master ou main ?
Le brief dit Master. En 2026, main est frĂ©quent. Une seule branche dâintĂ©gration protĂ©gĂ©e suffit â alignez Jenkins.
Le test peut rester dummy ?
Oui (brief). Remplacez ensuite par intégration ou smoke HTTP.
Ansible obligatoire avec Docker ?
Oui ici : Java + Apache sur le Linux prod font partie du périmÚtre.
OĂč mettre le Dockerfile ?
à la racine de BankingMicroservice, versionné avec le code.



