GitHub Actions Débutant

GitHub Actions : Automatisez vos flux de travail comme un pro

Découvrez comment GitHub Actions transforme votre processus de développement en automatisant tests, déploiements et bien plus, sans infrastructure complexe. Un guide pratique pour débuter l'automatisation CI/CD directement dans votre repository.

Preparetoi.academy 30 min

1. Comprendre GitHub Actions et l'automatisation

Définition
GitHub Actions est un service d'intégration continue et de déploiement continu (CI/CD) intégré directement dans GitHub. Il permet d'exécuter automatiquement des tâches (appelées "workflows") en réponse à des événements spécifiques dans votre repository, sans avoir besoin de serveurs externes.

Explication détaillée
Imaginez que vous aviez un assistant personnel qui, chaque fois que vous poussez du code sur GitHub, vérifierait automatiquement s'il fonctionne correctement, exécuterait les tests, et déploierait les modifications en production. C'est exactement ce que fait GitHub Actions. Au lieu de faire ces tâches manuellement à chaque fois, vous définissez une fois les étapes à suivre dans un fichier YAML, et GitHub les exécute automatiquement pour vous.

Les workflows GitHub Actions s'activent en réponse à des "événements" : quand vous créez une pull request, quand vous fusionnez du code sur la branche principale, ou même selon un calendrier fixe. Chaque workflow est composé d'une ou plusieurs "actions" – des unités de travail réutilisables qui exécutent des commandes spécifiques.

Par exemple, un workflow pourrait : lancer votre application au démarrage, exécuter la suite de tests, vérifier la qualité du code, et envoyer un rapport de couverture. Tout cela sans intervention humaine. C'est particulièrement puissant pour les équipes car cela garantit que chaque modification suit les mêmes processus de validation.

Bloc de code

name: Premier Workflow
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Afficher un message
        run: echo "GitHub Actions en action!"

Tableau comparatif : Manuel vs Automatisé

Aspect Processus Manuel GitHub Actions
Temps par deployment 15-30 minutes < 2 minutes
Erreurs humaines Fréquentes Éliminées
Cohérence Variable Garantie
Disponibilité 24/7 Non Oui
Coût infrastructure Élevé Gratuit (limites)

Astuce
Créez un premier workflow simple avec juste un echo pour vérifier que GitHub Actions fonctionne dans votre repository. C'est une excellente façon de vous familiariser sans risque !

⚠️ Attention
Les workflows ne s'exécutent que si le fichier .github/workflows/ est commité correctement. Une erreur de syntaxe YAML bloquera l'exécution. Testez votre YAML avant de le pousser !


2. Les briques essentielles : événements, jobs et steps

Définition
Un workflow GitHub Actions repose sur trois concepts fondamentaux : les événements (qui déclenchent le workflow), les jobs (les grandes tâches à exécuter), et les steps (les actions individuelles au sein d'un job).

Explication détaillée
Pensez à un workflow comme une recette de cuisine : l'événement est le signal de départ ("quand vous avez tous les ingrédients"), le job est la recette complète ("préparer un gâteau"), et les steps sont les étapes individuelles ("mélanger les ingrédients", "cuire au four", "refroidir").

Les événements sont les déclencheurs. Les plus courants sont push (quand du code est poussé), pull_request (quand une PR est créée), schedule (selon un calendrier), et workflow_dispatch (lancement manuel). Vous pouvez spécifier sur quelle branche ou fichier l'événement doit déclencher le workflow.

Les jobs sont les conteneurs d'exécution. Chaque job s'exécute dans une machine virtuelle fraîche (définie par runs-on), généralement ubuntu-latest. Vous pouvez avoir plusieurs jobs qui s'exécutent en parallèle ou de façon séquentielle (avec needs).

Les steps sont les commandes réelles. Elles peuvent être des actions prédéfinies (uses: actions/checkout@v3) ou des commandes shell simples (run: npm test). Chaque step a accès aux variables d'environnement et au contexte du workflow.

Bloc de code

name: Workflow Complet
on:
  push:
    branches: [main, develop]
  pull_request:
  schedule:
    - cron: '0 9 * * *'  # Tous les jours à 9h UTC

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Installer les dépendances
        run: npm install
      - name: Lancer les tests
        run: npm test
      - name: Construire le projet
        run: npm run build

Tableau : Types d'événements courants

Événement Déclencheur Cas d'usage
push Code poussé sur une branche Tester à chaque commit
pull_request PR créée/mise à jour Vérifier avant fusion
schedule Calendrier CRON Tests quotidiens/hebdo
workflow_dispatch Bouton GitHub Exécution manuelle
release Release créée Déployer en production

Astuce
Utilisez branches: [main] dans votre événement push pour que le workflow ne s'exécute que sur la branche principale, économisant ainsi les minutes CI gratuites !

⚠️ Attention
Par défaut, les jobs s'exécutent en parallèle. Si l'ordre importe (par exemple, build puis test), utilisez needs: [autre_job] pour créer une dépendance. Sans cela, vos jobs risquent de s'interferer.


3. Actions GitHub : la réutilisation en pratique

Définition
Les actions GitHub sont des composants réutilisables qui encapsulent des tâches communes. Ce sont des mini-programmes partagés par la communauté ou créés par vous-même, accessibles via le Marketplace ou un repository.

Explication détaillée
Plutôt que de réécrire les mêmes commandes dans chaque workflow, les actions GitHub vous permettent de réutiliser du code éprouvé. C'est comme avoir une bibliothèque de fonctions prêtes à l'emploi. Les actions officielles (maintenues par GitHub) commencent par actions/, comme actions/checkout qui clone votre repository ou actions/setup-node qui configure Node.js.

Il existe trois types d'actions : les actions JavaScript (rapides, directes), les actions Docker (flexibles, conteneurisées), et les actions composites (combinaisons d'autres actions). Pour un débutant, les actions prédéfinies suffisent largement.

Chaque action a ses propres inputs (paramètres d'entrée) et outputs (résultats). Par exemple, actions/setup-node accepte un input node-version et fournit un output node-path. Vous les utilisez avec with: pour les inputs et ${{ steps.mon_step.outputs.valeur }} pour les outputs.

Le Marketplace GitHub (https://github.com/marketplace?type=actions) regroupe des milliers d'actions gratuites : tests, déploiement, notifications Slack, etc. Avant d'écrire du code personnalisé, vérifiez toujours s'il existe une action existante !

Bloc de code

name: Utiliser des Actions
on: push

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      # Action officielle GitHub
      - uses: actions/checkout@v3
      
      # Action pour configurer Node.js avec input
      - uses: actions/setup-node@v3
        with:
          node-version: '18'
      
      # Commande shell simple
      - name: Installer et tester
        run: |
          npm install
          npm test
      
      # Action tierce du Marketplace
      - uses: codecov/codecov-action@v3
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          fail_ci_if_error: true

Tableau : Actions populaires

Action Tâche Utilité
actions/checkout Clone le repo Fondamentale pour accéder au code
actions/setup-node Configure Node.js Nécessaire pour les projets JS
codecov/codecov-action Upload couverture Mesurer la qualité du code
actions/upload-artifact Sauvegarde des fichiers Conserver les logs ou binaires
slackapi/slack-github-action Notifie Slack Alertes en temps réel

Astuce
Consultez toujours la documentation de l'action (lien dans le Marketplace) pour comprendre les inputs recommandés. La plupart des actions acceptent version pour contrôler la version utilisée – utilisez toujours une version fixe ou @v3 plutôt que @latest pour éviter les surprises.

⚠️ Attention
Ne copier-collez jamais des actions depuis des sources non fiables. Les actions peuvent exécuter du code arbitraire. Utilisez uniquement les actions du Marketplace officiel ou vérifiées par votre équipe. Vérifiez le nombre d'étoiles et les contributeurs !


4. Variables, secrets et contexte du workflow

Définition
GitHub Actions fournit des variables d'environnement, des secrets (données sensibles chiffrées) et un contexte (informations sur l'événement déclencheur) pour paramétrer vos workflows dynamiquement.

Explication détaillée
Les workflows ne sont pas figés. Vous avez besoin de les adapter : utiliser différentes versions de Node selon la branche, cacher les tokens d'API, ou accéder au numéro du commit. C'est exactement à quoi servent les variables, secrets et contextes.

Les variables d'environnement simples (env:) permettent de définir des valeurs réutilisables. Elles sont visibles dans les logs, donc ne les utilisez jamais pour les données sensibles. Les secrets (secrets.NOM_DU_SECRET) sont chiffrés et stockés de façon sécurisée. Vous les créez dans les paramètres du repository. Ils sont automatiquement masqués des logs pour éviter les fuites.

Le contexte (${{ github.event_name }}, ${{ github.ref }}, etc.) contient des métadonnées sur l'événement. Par exemple, github.event.pull_request.number est le numéro de la PR, github.sha est le commit actuel. C'est puissant pour créer des workflows adaptatifs.

Pour accéder à ces valeurs, utilisez la syntaxe ${{ variable }}. C'est une variable GitHub Actions, qui est substituée avant l'exécution. Attention : cette substitution ne fonctionne que dans certains contextes (pas à l'intérieur de run: avec des guillemets simples).

Bloc de code

name: Variables et Secrets
on: push

env:
  NODE_VERSION: '18'
  REGISTRY: ghcr.io

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Afficher le contexte
        run: |
          echo "Événement: ${{ github.event_name }}"
          echo "Branche: ${{ github.ref }}"
          echo "Commit: ${{ github.sha }}"
          echo "Repo: ${{ github.repository }}"
      
      - uses: actions/setup-node@v3
        with:
          node-version: ${{ env.NODE_VERSION }}
      
      - name: Déployer avec token secret
        run: npm deploy
        env:
          DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
          API_KEY: ${{ secrets.API_KEY }}
      
      - name: Upload vers registry privé
        run: docker push ${{ env.REGISTRY }}/mon-app:${{ github.sha }}

Tableau : Variables de contexte utiles

Variable Valeur Exemple
github.event_name Type d'événement push, pull_request
github.ref Branche/tag refs/heads/main
github.sha Commit hash abc123def456...
github.repository Propriétaire/Repo monuser/monrepo
github.event.pull_request.number Numéro PR 42
github.actor Utilisateur déclencheur alice

Astuce
Créez vos secrets dans : Settings → Secrets and variables → Actions. Nommez-les en MAJUSCULES_AVEC_UNDERSCORES. Pour les variables non-sensibles, utilisez la section "Variables" (non-secrets) pour plus de flexibilité !

⚠️ Attention
Les secrets sont masqués dans les logs, mais n'exposez jamais un secret via echo ou export. Si vous loggez accidentellement un secret, régénérez-le immédiatement dans les paramètres du repository. N'oubliez pas non plus que tout le contenu du fichier .github/workflows/ est public (visibilité du repo) – évitez d'y hardcoder les secrets !


5. Premiers workflows pratiques et bonnes pratiques

Définition
Cette section couvre des workflows réels que vous pouvez implémenter immédiatement : tests automatisés, vérification de code, et déploiement simple, en suivant les bonnes pratiques de l'industrie.

Explication détaillée
Maintenant que vous comprenez les concepts, mettons-les en pratique. Les workflows les plus courants en CI/CD visent trois objectifs : valider que le code fonctionne (tests), assurer sa qualité (linting, sécurité), et le déployer (si tout passe).

Un bon workflow débute toujours par actions/checkout pour accéder au code. Ensuite, vous configurez votre environnement (Node.js, Python, etc.), installez les dépendances, et lancez les tests. Si tout réussit, vous pouvez construire et déployer. L'ordre est crucial : pas de déploiement sans tests réussis.

Les bonnes pratiques incluent : toujours utiliser des versions d'action explicites (@v3, jamais @latest), mettre en cache les dépendances pour accélérer les workflows, limiter les secrets à leur contexte d'utilisation, et utiliser if: pour contrôler l'exécution (par exemple, déployer uniquement sur main).

Utilisez également les status checks : GitHub bloque les fusions de PR tant que les workflows critiques n'ont pas réussi. C'est une sécurité essentielle. Enfin, documentez vos workflows avec des noms explicites et des commentaires pour aider votre équipe.

Bloc de code

name: CI/CD Pipeline Complet
on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [16, 18, 20]
    
    steps:
      - uses: actions/checkout@v3
      
      - uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'
      
      - name: Installer dépendances
        run: npm ci
      
      - name: Linter le code
        run: npm run lint
      
      - name: Tests unitaires
        run: npm test -- --coverage
      
      - name: Upload couverture
        uses: codecov/codecov-action@v3
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          fail_ci_if_error: false

  build:
    needs: test
    runs-on: ubuntu-latest
    if: success()
    
    steps:
      - uses: actions/checkout@v3
      
      - uses: actions/setup-node@v3
        with:
          node-version: '18'
          cache: 'npm'
      
      - run: npm ci
      
      - name: Construire l'application
        run: npm run build
      
      - name: Archiver les artifacts
        uses: actions/upload-artifact@v3
        with:
          name: build-${{ github.sha }}
          path: dist/
          retention-days: 5

  deploy:
    needs: build
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main' && github.event_name == 'push'
    
    steps:
      - uses: actions/download-artifact@v3
        with:
          name: build-${{ github.sha }}
          path: dist/
      
      - name: Déployer en production
        run: |
          echo "Déploiement de ${{ github.sha }} en production..."
          # Votre script de déploiement ici
        env:
          DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}

Tableau : Bonnes pratiques vs Erreurs courantes

Bonne pratique Erreur à éviter Impact
Versionner les actions (@v3) Utiliser @latest Risque de changements imprévisibles
Cacher les dépendances avec cache Ré-installer chaque fois Workflows lents (5+ min)
needs: [autre_job] pour séquencer Tout laisser en parallèle Déploiements prématurés
if: github.ref == 'refs/heads/main' pour filtrer Pas de condition Déploiements sur mauvaises branches
action@v3 stable et maintenue Actions obscures inconnues Risques de sécurité

Astuce
Utilisez strategy.matrix pour tester sur plusieurs versions (Node.js 16, 18, 20). C'est gratuit et garantit la compatibilité. Activez aussi "Require status checks to pass before merging" dans les paramètres de la branche main pour forcer la validation avant fusion.

⚠️ Attention
Le déploiement en production (deploy job) doit avoir des garde-fous stricts : utilisez if: pour limiter à une branche spécifique et un type d'événement précis (push, jamais pull_request). Une erreur ici pourrait déployer du code testé incomplet. Testez votre workflow sur une branche de développement avant de l'appliquer à main !

Accédez à des centaines d'examens QCM — Découvrir les offres Premium