ToolBox Hub

Tutoriel GitHub Actions : Automatiser CI/CD pour vos Projets en 2026

Tutoriel GitHub Actions : Automatiser CI/CD pour vos Projets en 2026

Tutoriel GitHub Actions étape par étape. Apprenez à automatiser les tests, builds et déploiements avec des exemples pratiques pour Node.js et Python.

17 mars 20267 min de lecture

Pourquoi Automatiser avec CI/CD ?

Imaginez ce scénario : votre équipe compte 10 développeurs qui commitent des dizaines de fois par jour. Si après chaque fusion de code il faut manuellement lancer les tests, faire le build et déployer, ce n'est pas seulement inefficace, c'est aussi source d'erreurs. C'est exactement ce que résout CI/CD (Intégration Continue/Déploiement Continu).

GitHub Actions est l'outil CI/CD natif de GitHub – totalement gratuit pour les dépôts publics (illimité), avec 2 000 minutes gratuites par mois pour les dépôts privés. Profondément intégré à GitHub, simple à configurer et puissant, il s'est imposé en 2026 comme l'outil standard des équipes de développement.

Concepts Fondamentaux

ConceptExplication
WorkflowDéfinition complète d'un processus d'automatisation (fichier YAML)
EventDéclencheur d'un workflow (push, PR, timer, etc.)
JobUnité d'exécution dans le workflow, tourne sur une VM dédiée
StepOpération individuelle dans un job – commande ou Action
ActionUnité d'automatisation réutilisable, disponible sur le Marketplace
RunnerVM qui exécute le workflow (hébergée par GitHub ou auto-hébergée)

Votre Premier Workflow GitHub Actions

Les fichiers de workflow doivent être stockés dans le répertoire .github/workflows/ :

# .github/workflows/bonjour-monde.yml
name: Mon premier workflow

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  accueillir:
    runs-on: ubuntu-latest
    steps:
      - name: Afficher le message de bienvenue
        run: echo "Bonjour, GitHub Actions !"

      - name: Vérifier l'environnement
        run: |
          echo "Système : $(uname -a)"
          echo "Version Node.js : $(node --version)"
          echo "Version Python : $(python3 --version)"

Workflow CI/CD Complet pour Node.js

# .github/workflows/node-ci.yml
name: Node.js CI/CD

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  test:
    name: Tests
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18.x, 20.x, 22.x]

    steps:
      - name: Récupérer le code
        uses: actions/checkout@v4

      - name: Configurer Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'

      - name: Installer les dépendances
        run: npm ci

      - name: Vérification du linting
        run: npm run lint

      - name: Lancer les tests unitaires
        run: npm test -- --coverage

      - name: Uploader le rapport de couverture
        uses: codecov/codecov-action@v4
        if: matrix.node-version == '20.x'
        with:
          token: ${{ secrets.CODECOV_TOKEN }}

  build:
    name: Build
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: '20.x'
          cache: 'npm'

      - run: npm ci
      - run: npm run build

      - name: Uploader les artefacts de build
        uses: actions/upload-artifact@v4
        with:
          name: build-files
          path: dist/
          retention-days: 7

  deploy:
    name: Déploiement en production
    needs: build
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    environment: production

    steps:
      - uses: actions/checkout@v4

      - name: Télécharger les artefacts de build
        uses: actions/download-artifact@v4
        with:
          name: build-files
          path: dist/

      - name: Déployer sur le serveur
        uses: appleboy/ssh-action@v1.0.0
        with:
          host: ${{ secrets.DEPLOY_HOST }}
          username: ${{ secrets.DEPLOY_USER }}
          key: ${{ secrets.DEPLOY_SSH_KEY }}
          script: |
            cd /var/www/myapp
            git pull origin main
            npm ci --production
            pm2 restart myapp

Workflow CI pour Projet Python

# .github/workflows/python-ci.yml
name: Python CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        python-version: ["3.11", "3.12", "3.13"]

    steps:
      - uses: actions/checkout@v4

      - name: Configurer Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
          cache: 'pip'

      - name: Installer les dépendances
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
          pip install pytest pytest-cov black flake8 mypy

      - name: Vérifier le formatage du code (black)
        run: black --check .

      - name: Vérifier la qualité du code (flake8)
        run: flake8 . --max-line-length=100

      - name: Vérification des types (mypy)
        run: mypy src/

      - name: Lancer les tests
        run: pytest tests/ -v --cov=src --cov-report=xml

      - name: Uploader la couverture
        uses: codecov/codecov-action@v4
        if: matrix.python-version == '3.12'

  docker:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'

    steps:
      - uses: actions/checkout@v4

      - name: Se connecter à Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Extraire les métadonnées
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: monnom/mon-app
          tags: |
            type=ref,event=branch
            type=sha,prefix=sha-
            type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}

      - name: Construire et pousser l'image Docker
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

Gestion des Secrets

Les données sensibles (clés API, mots de passe, clés SSH) ne doivent jamais apparaître dans le code. GitHub Actions fournit une gestion sécurisée des secrets.

Ajouter des Secrets

  1. Ouvrir le dépôt → Settings → Secrets and variables → Actions
  2. Cliquer sur "New repository secret"
  3. Saisir le nom (ex : DEPLOY_SSH_KEY) et la valeur

Utiliser dans le Workflow

steps:
  - name: Utiliser les secrets
    env:
      API_KEY: ${{ secrets.API_KEY }}
      DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
    run: |
      echo "API_KEY=$API_KEY" >> .env
      # Important : ne jamais afficher les secrets dans les logs !

Optimisation du Cache : Accélérer les Workflows

# Mettre en cache les dépendances npm
- uses: actions/setup-node@v4
  with:
    node-version: '20'
    cache: 'npm'   # Support de cache intégré

# Ou configuration manuelle
- name: Mettre en cache node_modules
  uses: actions/cache@v4
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-

# Cache pip Python
- uses: actions/setup-python@v5
  with:
    python-version: '3.12'
    cache: 'pip'

Un bon usage du cache peut réduire les temps d'exécution des workflows de plusieurs minutes à quelques secondes.

Builds en Matrice : Tests Multi-Environnements

strategy:
  matrix:
    os: [ubuntu-latest, windows-latest, macos-latest]
    node: [18, 20, 22]
    exclude:
      - os: windows-latest
        node: 18
  fail-fast: false  # L'échec d'une combinaison ne stoppe pas les autres

runs-on: ${{ matrix.os }}

Tâches Planifiées

on:
  schedule:
    # Chaque jour à 01h00 UTC (02h00 heure de Paris)
    - cron: '0 1 * * *'
    # Chaque lundi à 09h00 UTC
    - cron: '0 9 * * 1'

Cas d'usage courants pour les tâches planifiées :

  • Analyse des vulnérabilités de sécurité dans les dépendances
  • Sauvegardes de données
  • Benchmarks de performance
  • Synchronisation périodique de données

Protection des Environnements

Pour les déploiements en production, des règles d'approbation peuvent être configurées :

deploy:
  environment:
    name: production
    url: https://mon-app.fr
  # Les approbateurs doivent être configurés dans les paramètres du dépôt

Actions Recommandées

ActionUtilisation
actions/checkoutRécupérer le code (toujours nécessaire)
actions/setup-nodeConfigurer l'environnement Node.js
actions/setup-pythonConfigurer l'environnement Python
actions/cacheMettre en cache les dépendances
actions/upload-artifactUploader les artefacts de build
docker/build-push-actionConstruire et pousser les images Docker
appleboy/ssh-actionDéploiement SSH distant
codecov/codecov-actionUploader la couverture de code

Conclusion

GitHub Actions est une infrastructure centrale du développement logiciel moderne. Avec ce tutoriel, vous avez appris :

  • La structure de base des workflows et les concepts fondamentaux
  • Les pipelines CI/CD complets pour Node.js et Python
  • La gestion des secrets et les pratiques de sécurité
  • L'optimisation du cache et les builds en matrice
  • Les tâches planifiées et la protection des environnements

Configurez CI/CD pour vos projets dès aujourd'hui. Même la suite de tests automatisée la plus simple améliore significativement la qualité du code et la collaboration en équipe. Au fil de l'expérience, faites évoluer votre pipeline d'automatisation et faites de GitHub Actions votre assistant d'automatisation le plus fiable.

Articles associés