Exercice 06 : Projet Capstone - Créer un Pipeline CI/CD Complet avec GitHub Actions
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Créer un fichier
.github/workflows/ci.ymlcomplet - ✅ Configurer les déclencheurs
on: pusheton: pull_request - ✅ Utiliser
actions/checkoutetactions/setup-nodedu Marketplace - ✅ Automatiser les tests sur chaque changement de code
- ✅ Construire une image Docker dans le pipeline CI
Durée estimée : 40 minutes
Difficulté : ⭐⭐⭐☆☆ (Intermédiaire)
Prérequis :
- Un repository GitHub avec du code
- Module CI/CD Débutant complété
- Notions GitHub Actions (workflows, jobs, steps, actions)
📖 Contexte
Votre équipe veut s'assurer que chaque modification de code est automatiquement testée et que l'image Docker peut être construite sans erreur. Vous allez créer le premier pipeline CI de l'entreprise avec GitHub Actions.
📋 Énoncé
Créez un workflow GitHub Actions qui se déclenche sur chaque push et pull request, exécute les tests d'une application Node.js, et construit une image Docker.
🧭 Déroulement de l'exercice
Tâche 1 : Initialiser le repository
Créez un repository GitHub devops-ci-demo et initialisez-le avec une application Node.js minimale : server.js, server.test.js, package.json (avec jest et une commande test), et un Dockerfile basique.
Indice : Le
package.jsondoit avoir"test": "jest"dansscripts. GitHub Actions clonersa votre repo et lancera cette commande.
Vérification : git push origin main pousse le code initial. L'onglet "Actions" de GitHub est visible.
Tâche 2 : Créer la structure du workflow
Créez le fichier .github/workflows/ci.yml. Définissez le nom du workflow (CI Pipeline) et les déclencheurs : sur push vers les branches main et develop, et sur tout pull_request.
Indice :
`yamlon:
push:
branches: [main, develop]
pull_request:
`
pull_requestsans branches s'applique à toutes les branches.
Vérification : Le fichier .github/workflows/ci.yml existe. Sa structure YAML est valide.
Tâche 3 : Ajouter le job de tests
Dans le workflow, ajoutez un job test qui :
- Tourne sur
ubuntu-latest - Utilise
actions/checkout@v4pour récupérer le code - Utilise
actions/setup-node@v4avec Node.js version 20 et cache npm - Installe les dépendances avec
npm ci - Lance les tests avec
npm test
Indice :
actions/setup-node@v4acceptenode-version: '20'etcache: 'npm'. Le cache évite de re-téléchargernode_modulesà chaque run.
Vérification : Après git push, l'onglet Actions montre le workflow qui s'exécute et le job test passe au vert.
Tâche 4 : Ajouter le job de build Docker
Ajoutez un second job build-docker qui :
- Tourne sur
ubuntu-latest - Dépend du job
test(s'exécute seulement si les tests passent) - Checkout le code
- Construit l'image Docker avec le tag
devops-ci-demo:${{ github.sha }} - N'est exécuté que sur la branche
main
Indice :
needs: testcrée la dépendance entre jobs.if: github.ref == 'refs/heads/main'conditionne l'exécution.${{ github.sha }}est le hash du commit - un tag unique et traçable.
Vérification : Sur un push vers main, les deux jobs s'exécutent en séquence. Sur une PR, seul test s'exécute.
Tâche 5 : Ajouter un récapitulatif de statut
Ajoutez une étape finale dans le job test qui affiche un résumé dans les logs : le nom du workflow, la branche, le SHA du commit, et l'acteur (utilisateur qui a déclenché le workflow).
Indice : GitHub Actions expose des variables de contexte :
${{ github.workflow }},${{ github.ref_name }},${{ github.sha }},${{ github.actor }}. Utilisezrun: echo "..."ouecho "..." >> $GITHUB_STEP_SUMMARYpour apparaître dans le résumé du job.
Vérification : Dans les logs GitHub Actions, la dernière étape affiche le résumé avec les 4 informations.
Tâche 6 : Déclencher le pipeline et analyser les logs
Faites un commit qui intentionnellement casse un test (modifiez un fichier test), poussez, observez le pipeline échouer, corrigez et vérifiez que le pipeline repasse au vert.
Indice : Modifier
server.test.jspour qu'unexpect()échoue. Poussez, observez le jobtestpasser en rouge. Corrigez, poussez à nouveau.
Vérification : L'onglet Actions affiche un run rouge suivi d'un run vert. Le job build-docker ne s'est pas lancé lors du run rouge.
🗂️ Mini-Projet : Pipeline CI complet
Arborescence du projet :
devops-ci-demo/
├── .github/
│ └── workflows/
│ └── ci.yml
├── server.js
├── server.test.js
├── package.json
├── Dockerfile
└── .dockerignoreVérification finale :
# Déclencher manuellement via GitHub CLI (optionnel)
gh workflow run ci.yml
# Voir les runs récents
gh run list --workflow=ci.yml
# Voir les détails d'un run
gh run view <RUN_ID> --logCheckpoints de validation :
ci.ymlest valide YAML (GitHub Actions ne signale pas d'erreur de syntaxe)- Le workflow se déclenche sur push vers
main - Le job
testpasse au vert (npm testréussit) - Le job
build-dockerne se lance que surmainet aprèstest - Un test cassé fait échouer le pipeline AVANT le build Docker
- L'historique Actions montre au moins un run rouge et un run vert