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.
| Ătape | Qui l'exĂ©cute ? | Quand ? |
|---|---|---|
git push | Développeur | à chaque commit |
| CI â tests / lint / build | GitHub Actions | Automatiquement |
| Review & merge PR | Ăquipe | AprĂšs CI vert |
| Déploiement staging | CD pipeline | Automatiquement |
| Déploiement production | CD (auto) ou bouton | Selon stratégie |
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Île | Obligatoire |
|---|---|---|
name | Nom affiché dans l'onglet Actions | Non |
on | ĂvĂ©nements dĂ©clencheurs | Oui |
jobs | Ensemble des tùches à exécuter | Oui |
env | Variables d'environnement globales | Non |
.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Ă©nement | DĂ©clenchĂ© quand... |
|---|---|
release | Une release GitHub est publiée |
issues | Une issue est ouverte/fermée/modifiée |
workflow_call | Appelé 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.
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Ăšme | Action | Usage |
|---|---|---|
| Node.js | actions/setup-node@v4 | Installer Node + cache npm/yarn |
| Python | actions/setup-python@v5 | Installer Python + cache pip |
| Docker | docker/build-push-action@v5 | Build + push image |
| Pages | actions/deploy-pages@v4 | Déployer sur GitHub Pages |
| Couverture | codecov/codecov-action@v4 | Uploader 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/')
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.