1. Concepts CI/CD

CI/CD regroupe deux pratiques complémentaires : l'Intégration Continue (CI) et la Livraison / Déploiement Continus (CD). Ensemble, elles forment un pipeline automatisé qui transforme chaque commit en production sans intervention manuelle.

Intégration Continue (CI)

L'idée : tester le code à chaque push. DÚs qu'un développeur pousse un commit ou ouvre une Pull Request, le pipeline CI s'exécute automatiquement : il installe les dépendances, lance les tests, vérifie le lint
 Si quelque chose casse, l'équipe est alertée immédiatement, avant le merge.

  • DĂ©tection rapide des bugs (quelques minutes, pas des semaines)
  • Confiance accrue lors des merges
  • Historique de qualitĂ© visible sur chaque PR

Livraison & Déploiement Continus (CD)

Livraison Continue (Continuous Delivery) : le code est toujours dans un Ă©tat dĂ©ployable — il suffit d'un clic pour envoyer en production.
DĂ©ploiement Continu (Continuous Deployment) : va encore plus loin — chaque merge sur main se dĂ©ploie automatiquement en production, sans intervention humaine.

ÉtapeQui l'exĂ©cute ?Quand ?
git pushDĂ©veloppeurÀ chaque commit
CI — tests / lint / buildGitHub ActionsAutomatiquement
Review & merge PRÉquipeAprùs CI vert
Déploiement stagingCD pipelineAutomatiquement
Déploiement productionCD (auto) ou boutonSelon stratégie
BĂ©nĂ©fice concret : Une Ă©quipe sans CI peut passer des jours Ă  dĂ©boguer un merge conflictuel. Avec CI, chaque PR affiche un badge ✅ ou ❌ — le problĂšme est localisĂ© en moins de 5 minutes.

2. Anatomie d'un workflow

Un workflow GitHub Actions est un fichier YAML placé dans .github/workflows/. Il décrit quand s'exécuter et quoi faire.

Structure YAML minimale

name: CI                     # Nom affiché dans l'onglet Actions

on:                         # Déclencheur(s)
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:                        # Un ou plusieurs jobs
  test:                      # ID du job
    runs-on: ubuntu-latest  # Runner (machine virtuelle)
    steps:                   # Liste ordonnée d'étapes
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
      - run: npm ci
      - run: npm test
      - run: npm run build

Les 4 clés racines

CléRÎleObligatoire
nameNom affiché dans l'onglet ActionsNon
onÉvĂ©nements dĂ©clencheursOui
jobsEnsemble des tùches à exécuterOui
envVariables d'environnement globalesNon
Le fichier doit ĂȘtre sauvegardĂ© dans .github/workflows/ci.yml (ou tout nom se terminant en .yml / .yaml). GitHub dĂ©tecte automatiquement tous les workflows dans ce dossier.

3. Triggers

Le champ on: définit quand le workflow se déclenche. On peut combiner plusieurs événements.

push & pull_request

on:
  push:
    branches: [main, develop]    # Seulement ces branches
    paths:                         # Seulement si ces fichiers changent
      - 'src/**'
      - 'package.json'
  pull_request:
    branches: [main]
    types: [opened, synchronize, reopened]

schedule (cron)

on:
  schedule:
    - cron: '0 2 * * 1'   # Chaque lundi Ă  2h UTC
    - cron: '0 */6 * * *'  # Toutes les 6 heures

workflow_dispatch (déclenchement manuel)

on:
  workflow_dispatch:
    inputs:
      environment:
        description: 'Target environment'
        required: true
        default: 'staging'
        type: choice
        options: [staging, production]

Autres événements utiles

ÉvĂ©nementDĂ©clenchĂ© quand...
releaseUne release GitHub est publiée
issuesUne issue est ouverte/fermée/modifiée
workflow_callAppelé depuis un autre workflow
repository_dispatchÉvĂ©nement envoyĂ© via l'API GitHub

4. Jobs & Steps

Un job est un ensemble de steps qui s'exĂ©cutent sur la mĂȘme machine virtuelle (runner). Par dĂ©faut, les jobs s'exĂ©cutent en parallĂšle. Pour les sĂ©quencer, on utilise needs:.

Structure d'un job

jobs:
  build:
    name: Build & Test           # Nom lisible (optionnel)
    runs-on: ubuntu-latest      # Runner : ubuntu / windows / macos
    timeout-minutes: 15          # Évite les runners bloquĂ©s
    steps:
      - name: Checkout code
        uses: actions/checkout@v4  # Clone le dépÎt

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'             # Cache automatique npm

      - name: Install dependencies
        run: npm ci               # Installation reproductible

      - name: Run tests
        run: npm test

      - name: Build
        run: npm run build

Dépendances entre jobs (needs)

jobs:
  test:
    runs-on: ubuntu-latest
    steps: [...]

  build:
    needs: test              # Build attend que test réussisse
    runs-on: ubuntu-latest
    steps: [...]

  deploy:
    needs: [test, build]     # Attend les deux
    runs-on: ubuntu-latest
    steps: [...]
npm ci vs npm install : En CI, prĂ©fĂ©rez toujours npm ci. Il utilise le package-lock.json pour une installation reproductible et supprime node_modules avant d'installer — garantissant un environnement propre.

5. Actions Marketplace

Le GitHub Actions Marketplace regroupe des milliers d'actions prĂȘtes Ă  l'emploi. Chaque action est identifiĂ©e par owner/repo@version.

Actions officielles GitHub

- uses: actions/checkout@v4
  with:
    fetch-depth: 0            # Historique complet (pour git log)

- uses: actions/setup-node@v4
  with:
    node-version: '20'
    cache: 'npm'               # Cache node_modules automatiquement

- uses: actions/upload-artifact@v4
  with:
    name: build-output
    path: dist/
    retention-days: 7

Trouver et évaluer une action

  • Aller sur github.com/marketplace → filtrer par catĂ©gorie
  • VĂ©rifier le nombre d'Ă©toiles et la date de derniĂšre mise Ă  jour
  • PrĂ©fĂ©rer les actions avec le badge Verified creator
  • Toujours Ă©pingler une version (@v4) pour la reproductibilitĂ©
  • Pour une sĂ©curitĂ© maximale, Ă©pingler par hash SHA : @a1b2c3d4...

Actions courantes par écosystÚme

ÉcosystùmeActionUsage
Node.jsactions/setup-node@v4Installer Node + cache npm/yarn
Pythonactions/setup-python@v5Installer Python + cache pip
Dockerdocker/build-push-action@v5Build + push image
Pagesactions/deploy-pages@v4Déployer sur GitHub Pages
Couverturecodecov/codecov-action@v4Uploader le coverage

6. Variables & Secrets

GitHub Actions expose des variables d'environnement et des secrets pour paramétrer les workflows sans hardcoder de données sensibles.

Variables d'environnement

env:                          # Variables globales au workflow
  NODE_ENV: production
  API_URL: https://api.example.com

jobs:
  test:
    runs-on: ubuntu-latest
    env:                        # Variables locales au job
      DATABASE_URL: postgres://localhost/test
    steps:
      - name: Deploy
        env:                      # Variables locales au step
          API_TOKEN: ${{ secrets.API_KEY }}
        run: ./deploy.sh

Secrets

Les secrets sont stockĂ©s de façon chiffrĂ©e dans les paramĂštres du dĂ©pĂŽt (Settings → Secrets). Ils ne sont jamais affichĂ©s dans les logs (masquĂ©s par ***).

- name: Deploy to server
  env:
    DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
    SSH_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
  run: echo "Deploying with token..."

Contextes et expressions

# Exemples d'expressions ${{ ... }}
${{ github.actor }}         # Login de l'utilisateur qui a déclenché
${{ github.ref }}           # Ref complĂšte : refs/heads/main
${{ github.sha }}           # SHA du commit
${{ github.run_number }}    # Numéro d'exécution (1, 2, 3...)
${{ runner.os }}            # Linux, Windows, macOS
${{ env.MY_VAR }}           # Variable d'environnement
${{ secrets.MY_SECRET }}    # Secret

# Condition basée sur le contexte
if: github.ref == 'refs/heads/main'
if: github.event_name == 'push'
if: contains(github.ref, 'release/')
Bonne pratique : Ne jamais afficher un secret avec echo $SECRET. Ne jamais stocker de token dans le code source. Utiliser les Organisation Secrets pour partager un secret entre plusieurs dépÎts d'une organisation.
→ Passer aux exercices O06