Exercices et projets
Table des matières
- Exercices de base
- Exercices intermédiaires
- Projet 1 : Pipeline Node.js
- Projet 2 : Release automatique
- Projet 3 : Monorepo
- Checklist de validation
1 - Exercices de base
Exercice 1.1 : Hello World
Créez un workflow qui affiche "Hello World" à chaque push.
Solution
name: Hello World
on: push
jobs:
hello:
runs-on: ubuntu-latest
steps:
- run: echo "Hello World!"
Exercice 1.2 : Multi-événements
Créez un workflow déclenché par push ET pull_request.
Solution
name: Multi-Event
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: echo "Triggered by ${{ github.event_name }}"
Exercice 1.3 : Variables d'environnement
Créez un workflow avec une variable globale et une variable de step.
Solution
name: Variables
on: push
env:
GLOBAL_VAR: "I am global"
jobs:
vars:
runs-on: ubuntu-latest
steps:
- name: Use global
run: echo "$GLOBAL_VAR"
- name: Use local
env:
LOCAL_VAR: "I am local"
run: echo "$LOCAL_VAR"
Exercice 1.4 : Checkout et list
Créez un workflow qui checkout le code et liste les fichiers.
Solution
name: Checkout
on: push
jobs:
list:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ls -la
- run: cat README.md || echo "No README"
🔝 Retour à la table des matières
2 - Exercices intermédiaires
Exercice 2.1 : Cache npm
Créez un workflow avec cache npm utilisant setup-node.
Solution
name: Build with Cache
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- run: npm ci
- run: npm run build
Exercice 2.2 : Matrix multi-version
Testez sur Node 16, 18 et 20.
Solution
name: Matrix Test
on: push
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node: [16, 18, 20]
name: Node ${{ matrix.node }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
- run: node --version
Exercice 2.3 : Jobs dépendants
Créez 3 jobs : build → test → deploy (séquentiels).
Solution
name: Pipeline
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: echo "Building..."
test:
needs: build
runs-on: ubuntu-latest
steps:
- run: echo "Testing..."
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- run: echo "Deploying..."
Exercice 2.4 : Artifacts
Créez un fichier dans un job et téléchargez-le dans un autre.
Solution
name: Artifacts
on: push
jobs:
create:
runs-on: ubuntu-latest
steps:
- run: echo "Hello" > message.txt
- uses: actions/upload-artifact@v4
with:
name: message
path: message.txt
read:
needs: create
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
with:
name: message
- run: cat message.txt
Exercice 2.5 : Conditions
Exécutez un job uniquement sur la branche main.
Solution
name: Conditional
on: push
jobs:
always:
runs-on: ubuntu-latest
steps:
- run: echo "Always runs"
main-only:
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- run: echo "Only on main"
🔝 Retour à la table des matières
3 - Projet 1 : Pipeline Node.js complet
Objectif
Créez un pipeline CI/CD complet pour une application Node.js :
- Lint avec ESLint
- Tests avec Jest
- Build
- Déploiement conditionnel
Solution
name: Node.js CI/CD
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
env:
NODE_VERSION: '18'
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- run: npm ci
- run: npm run lint
test:
needs: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- run: npm ci
- run: npm test -- --coverage
- uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage/
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- run: npm ci
- run: npm run build
- uses: actions/upload-artifact@v4
with:
name: build
path: dist/
deploy-staging:
needs: build
if: github.ref == 'refs/heads/develop'
runs-on: ubuntu-latest
environment: staging
steps:
- uses: actions/download-artifact@v4
with:
name: build
path: ./dist
- run: echo "Deploying to staging..."
deploy-production:
needs: build
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/download-artifact@v4
with:
name: build
path: ./dist
- run: echo "Deploying to production..."
🔝 Retour à la table des matières
4 - Projet 2 : Release automatique
Objectif
Créez un workflow qui :
- Se déclenche sur les tags
v* - Build l'application
- Crée une release GitHub avec les assets
Solution
name: Release
on:
push:
tags:
- 'v*'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- run: npm ci
- run: npm run build
- name: Create archive
run: tar -czf dist.tar.gz dist/
- uses: actions/upload-artifact@v4
with:
name: release-archive
path: dist.tar.gz
release:
needs: build
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/download-artifact@v4
with:
name: release-archive
- name: Create Release
uses: softprops/action-gh-release@v1
with:
files: dist.tar.gz
generate_release_notes: true
🔝 Retour à la table des matières
5 - Projet 3 : Monorepo
Objectif
Créez un pipeline pour un monorepo avec :
- Frontend (React)
- Backend (Node.js)
- Déploiement conditionnel selon les fichiers modifiés
Solution
name: Monorepo CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
changes:
runs-on: ubuntu-latest
outputs:
frontend: ${{ steps.filter.outputs.frontend }}
backend: ${{ steps.filter.outputs.backend }}
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v2
id: filter
with:
filters: |
frontend:
- 'frontend/**'
backend:
- 'backend/**'
frontend:
needs: changes
if: needs.changes.outputs.frontend == 'true'
runs-on: ubuntu-latest
defaults:
run:
working-directory: frontend
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
cache-dependency-path: frontend/package-lock.json
- run: npm ci
- run: npm test
- run: npm run build
backend:
needs: changes
if: needs.changes.outputs.backend == 'true'
runs-on: ubuntu-latest
defaults:
run:
working-directory: backend
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
cache-dependency-path: backend/package-lock.json
- run: npm ci
- run: npm test
deploy:
needs: [frontend, backend]
if: always() && github.ref == 'refs/heads/main' && (needs.frontend.result == 'success' || needs.backend.result == 'success')
runs-on: ubuntu-latest
steps:
- run: echo "Deploying changed components..."
🔝 Retour à la table des matières
6 - Checklist de validation
Compétences à valider
| Compétence | Vérifié |
|---|---|
| Créer un workflow basique | ☐ |
| Utiliser checkout et setup-node | ☐ |
| Configurer le cache | ☐ |
| Utiliser les variables et secrets | ☐ |
| Créer des jobs dépendants | ☐ |
| Utiliser les artifacts | ☐ |
| Configurer une matrix | ☐ |
| Ajouter des conditions | ☐ |
| Cr éer un workflow réutilisable | ☐ |
| Configurer des environments | ☐ |
| Déployer automatiquement | ☐ |
Auto-évaluation
- Pouvez-vous créer un pipeline lint → test → build → deploy ?
- Savez-vous utiliser le cache pour accélérer vos builds ?
- Pouvez-vous tester sur plusieurs versions de Node ?
- Savez-vous partager des données entre jobs ?
- Pouvez-vous déployer conditionnellement selon la branche ?
Félicitations !
Vous avez terminé le cours GitHub Actions ! 🎉
Vous maîtrisez maintenant :
- ✅ La création de workflows CI/CD
- ✅ L'utilisation des actions du Marketplace
- ✅ La gestion des secrets et variables
- ✅ L'optimisation avec cache et artifacts
- ✅ Les tests multi-environnements avec matrix
- ✅ Les workflows réutilisables
- ✅ Les pipelines de déploiement complets
Prochaines étapes
- Appliquez ces connaissances sur vos projets
- Explorez le Marketplace pour découvrir de nouvelles actions
- Créez vos propres actions réutilisables
- Partagez vos workflows avec votre équipe