Aller au contenu principal

Exercices et projets


Table des matières

  1. Exercices de base
  2. Exercices intermédiaires
  3. Projet 1 : Pipeline Node.js
  4. Projet 2 : Release automatique
  5. Projet 3 : Monorepo
  6. 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étenceVé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

  1. Pouvez-vous créer un pipeline lint → test → build → deploy ?
  2. Savez-vous utiliser le cache pour accélérer vos builds ?
  3. Pouvez-vous tester sur plusieurs versions de Node ?
  4. Savez-vous partager des données entre jobs ?
  5. 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

← Retour à la table des matières du cours