Arc 4 Quête 16

Les Actions du Royaume

GitHub Actions, workflows YAML et automatisation

Le Maître Archiviste te guide dans les profondeurs de la Grande Forge. Autour de toi, d'immenses machines tournent sans relâche, alimentées par des flux de magie bleue. Des parchemins descendent sur des tapis roulants, passent sous des tampons automatiques, puis sont triés et rangés dans des alcôves lumineuses. Pas un seul forgeron en vue - tout fonctionne seul.

« Lors de ta dernière quête, tu as découvert les Forges Éternelles et compris les principes de l'intégration et du déploiement continus. Aujourd'hui, tu vas apprendre à programmer les Forges toi-même. Chaque Forge obéit à des Actions - des parchemins d'instructions enchantés qui lui disent exactement quoi faire quand de nouvelles chroniques arrivent. Tu vas écrire ta première Action. »

Qu'est-ce qu'une GitHub Action ?

Une GitHub Action est un workflow automatisé qui s'exécute directement sur les serveurs de GitHub. Tu n'as rien à installer, rien à configurer sur ta machine - GitHub s'occupe de tout.

Le principe est simple : tu décris dans un fichier ce que tu veux qu'il se passe et quand tu veux que ça se passe. GitHub exécute ces instructions automatiquement.

Par exemple :

  • À chaque push, lancer les tests
  • À chaque pull request, vérifier le style du code
  • Chaque nuit à minuit, générer un rapport
  • Quand une version est taguée, déployer l'application

« Imagine un scribe infatigable qui attend dans la Forge, jour et nuit. Dès qu'un nouveau parchemin arrive, il lit les instructions que tu as écrites et les exécute à la lettre. C'est exactement ce que font les Actions. »

Les concepts clés

Avant d'écrire ta première Action, tu dois comprendre le vocabulaire. GitHub Actions utilise cinq concepts fondamentaux :

Workflow - le parchemin d'instructions

Un workflow est un fichier YAML qui décrit un processus automatisé complet. C'est le parchemin que tu écris pour la Forge. Un dépôt peut contenir plusieurs workflows.

Job - la tâche

Un job est un ensemble d'étapes qui s'exécutent sur la même machine. Un workflow peut contenir plusieurs jobs. Par défaut, les jobs s'exécutent en parallèle (en même temps).

Step - l'étape

Un step est une action individuelle à l'intérieur d'un job. Chaque step est soit une commande shell (run:), soit une action réutilisable (uses:).

Action - le composant réutilisable

Une action (avec un "a" minuscule) est un composant préfabriqué que tu peux utiliser dans tes steps. Il en existe des milliers sur le marketplace de GitHub. La plus courante est actions/checkout@v4 qui récupère ton code.

Runner - la machine d'exécution

Un runner est la machine virtuelle sur laquelle ton job s'exécute. GitHub propose des runners gratuits sous Ubuntu, Windows et macOS.

Concept Analogie de la Forge Description
Workflow Le parchemin d'instructions Fichier YAML décrivant le processus complet
Job Une tâche dans la Forge Ensemble d'étapes sur une même machine
Step Un geste du forgeron Une action individuelle (commande ou action)
Action Un outil préfabriqué Composant réutilisable du marketplace
Runner L'enclume de la Forge Machine virtuelle qui exécute le job

« Un parchemin d'instructions (workflow) contient une ou plusieurs tâches (jobs). Chaque tâche est une série de gestes (steps). Certains gestes utilisent des outils préfabriqués (actions) forgés par d'autres Maîtres. Et le tout s'exécute sur une enclume magique (runner) que GitHub te prête gratuitement. »

Où placer les workflows ?

GitHub cherche les workflows dans un dossier bien précis :

ton-depot/
  .github/
    workflows/
      mon-workflow.yml
      autre-workflow.yml

Le chemin est toujours .github/workflows/. Si tu places ton fichier ailleurs, GitHub l'ignorera.

Important : Le dossier .github commence par un point - c'est un dossier caché. Sur Linux/macOS, utilise ls -a pour le voir. Sur Windows, active l'affichage des fichiers cachés.

Les fichiers doivent avoir l'extension .yml ou .yaml.

Les bases du YAML

Les workflows GitHub Actions sont écrits en YAML (YAML Ain't Markup Language). C'est un format de données lisible par les humains. Voici les règles essentielles :

L'indentation est cruciale

En YAML, l'indentation définit la structure. On utilise des espaces (jamais des tabulations !). Chaque niveau d'imbrication ajoute 2 espaces.

# Correct
parent:
  enfant:
    petit-enfant: valeur

# INCORRECT - mélange d'indentation
parent:
  enfant:
      petit-enfant: valeur   # 6 espaces au lieu de 4 !

Attention : N'utilise jamais de tabulations en YAML ! Uniquement des espaces. C'est l'erreur la plus fréquente chez les débutants.

Les paires clé-valeur

nom: Tests
version: 1.0
actif: true

Les listes

Les éléments de liste commencent par un tiret suivi d'un espace :

fruits:
  - pomme
  - banane
  - cerise

Les textes sur plusieurs lignes

Le caractère | permet d'écrire du texte sur plusieurs lignes :

script: |
  echo "Première ligne"
  echo "Deuxième ligne"
  echo "Troisième ligne"

« Le YAML est comme la calligraphie des parchemins enchantés. Chaque espace compte, chaque retrait a un sens. Un espace de trop ou de moins, et l'enchantement échoue. La rigueur est la clé. »

Ton premier workflow

Voici le workflow le plus simple possible. Il s'exécute à chaque push et affiche un message :

name: Tests
on: push
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: echo "Les tests passent !"

Décortiquons chaque ligne :

Ligne Signification
name: Tests Le nom du workflow (affiché dans GitHub)
on: push Déclencheur : s'exécute à chaque push
jobs: Début de la liste des tâches
test: Nom du job (tu choisis le nom)
runs-on: ubuntu-latest Machine virtuelle Ubuntu
steps: Début de la liste des étapes
- uses: actions/checkout@v4 Étape 1 : récupérer le code du dépôt
- run: echo "..." Étape 2 : exécuter une commande shell

L'action actions/checkout@v4 est presque toujours la première étape. Sans elle, ton code n'est pas disponible sur le runner - le job s'exécute sur une machine vierge !

Les déclencheurs (triggers)

Le mot-clé on: définit quand le workflow se lance. Voici les déclencheurs les plus courants :

À chaque push

on: push

À chaque pull request

on: pull_request

Sur plusieurs événements

on: [push, pull_request]

Sur des branches spécifiques

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

Ce workflow ne se déclenche que pour les pushs sur main ou develop, et pour les pull requests vers main.

Sur un planning (cron)

on:
  schedule:
    - cron: '0 0 * * *'   # Tous les jours à minuit UTC

Manuellement

on: workflow_dispatch

Ce déclencheur ajoute un bouton "Run workflow" dans l'interface GitHub. Très pratique pour les déploiements manuels.

« Les déclencheurs sont les sentinelles de la Forge. Elles veillent en permanence et réveillent les machines au bon moment. Un push ? Les tests se lancent. Une pull request ? La revue automatique démarre. Minuit ? Le rapport se génère. Tout est orchestré. »

Un workflow plus complet

Voici un workflow réaliste pour un projet avec des tests :

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

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

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

      - name: Lancer les tests
        run: npm test

      - name: Vérifier le style
        run: npm run lint

Chaque step peut avoir un name qui apparaît dans les logs. C'est optionnel mais très recommandé pour la lisibilité.

Jobs multiples et dépendances

Par défaut, les jobs s'exécutent en parallèle. Pour créer des dépendances entre jobs, utilise le mot-clé needs:.

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm test

  build:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm run build

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: echo "Déploiement en cours..."

Dans cet exemple :

  • test s'exécute en premier
  • build attend que test soit terminé avec succès
  • deploy attend que build soit terminé avec succès

Si test échoue, ni build ni deploy ne s'exécuteront. C'est exactement le comportement voulu - pas de déploiement si les tests échouent !

Un job peut aussi dépendre de plusieurs jobs :

  deploy:
    needs: [test, build, lint]

« Dans la Forge, certaines opérations doivent se faire dans l'ordre. On ne trempe pas l'épée avant de l'avoir forgée, et on ne la polit pas avant de l'avoir trempée. Le mot-clé needs impose cet ordre sacré. »

Le marketplace - Les outils des autres Maîtres

GitHub dispose d'un marketplace avec des milliers d'actions préfabriquées. Au lieu de tout écrire toi-même, tu peux réutiliser le travail des autres.

Quelques actions populaires :

Action Utilisation
actions/checkout@v4 Récupérer le code du dépôt
actions/setup-node@v4 Installer Node.js
actions/setup-python@v5 Installer Python
actions/upload-artifact@v4 Sauvegarder des fichiers produits
actions/cache@v4 Mettre en cache les dépendances

Exemple avec Node.js :

steps:
  - uses: actions/checkout@v4

  - uses: actions/setup-node@v4
    with:
      node-version: '20'

  - run: npm install
  - run: npm test

Le mot-clé with: permet de passer des paramètres à une action. Ici, on demande Node.js version 20.

« Le marketplace est la grande bibliothèque des Forges. Des milliers de Maîtres Forgerons y ont déposé leurs outils pour que d'autres puissent les utiliser. Pourquoi réinventer l'enclume quand un autre l'a déjà parfaitement forgée ? »

Secrets et variables d'environnement

Certaines informations ne doivent jamais apparaître dans ton code : mots de passe, clés API, tokens d'accès. GitHub permet de les stocker en tant que secrets.

Utiliser un secret dans un workflow

steps:
  - name: Déployer
    run: ./deploy.sh
    env:
      API_KEY: ${{ secrets.API_KEY }}
      DB_PASSWORD: ${{ secrets.DB_PASSWORD }}

Les secrets sont configurés dans les Settings du dépôt GitHub, sous "Secrets and variables" > "Actions".

Variables d'environnement simples

Pour les valeurs non sensibles, tu peux définir des variables d'environnement directement :

env:
  NODE_ENV: production
  APP_NAME: mon-application

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - run: echo "Application : $APP_NAME"

Les variables définies au niveau racine sont disponibles dans tous les jobs. Tu peux aussi les définir au niveau d'un job ou d'un step.

« Les secrets sont comme les formules protégées des Maîtres Forgerons. On ne les écrit jamais sur un parchemin ordinaire - on les enferme dans un coffre magique et on y fait référence par leur nom. Même si quelqu'un vole le parchemin, il ne verra que le nom, jamais la formule. »

Consulter les résultats

Quand un workflow s'exécute, tu peux suivre sa progression dans l'onglet Actions de ton dépôt GitHub.

Les logs

Chaque step produit des logs que tu peux consulter en cliquant dessus. C'est là que tu verras les messages d'erreur si quelque chose échoue.

Les statuts

Chaque exécution a un statut :

  • Vert (succès) : tous les jobs ont réussi
  • Rouge (échec) : au moins un job a échoué
  • Jaune (en cours) : le workflow est en train de s'exécuter
  • Gris (annulé) : le workflow a été annulé

Les badges de statut

Tu peux ajouter un badge dans ton README qui affiche le statut du dernier workflow :

![CI](https://github.com/UTILISATEUR/DEPOT/actions/workflows/NOM_DU_FICHIER.yml/badge.svg)

Ce badge se met à jour automatiquement. Vert si les tests passent, rouge sinon. C'est un signal de confiance pour tous ceux qui visitent ton dépôt.

« Les badges sont les blasons de la Forge. Ils montrent à tous que ton code est testé, vérifié, approuvé par les machines. Un dépôt sans badge, c'est un château sans drapeau - on ne sait pas s'il est habité ou abandonné. »

Exercice pratique - Écrire ta première Action

Écris ton premier parchemin d'instructions pour la Forge :

  1. Crée un dépôt forge-actions
  2. Crée le dossier .github/workflows/
  3. Crée un script de test test.sh
  4. Crée un README.md
  5. Écris un workflow verification.yml qui se déclenche sur push, récupère le code et lance les tests
  6. Commite le tout
  7. Lance le script de vérification

Étape 1 - Créer le dépôt

mkdir forge-actions
cd forge-actions
git init -b main

Étape 2 - Créer la structure des workflows

mkdir -p .github/workflows

C'est le dossier magique que GitHub surveille. Tout fichier .yml placé ici sera traité comme un workflow.

Étape 3 - Créer un script de test

Avant d'écrire le workflow, crée un petit script que le workflow pourra exécuter :

cat > test.sh << 'EOF'
#!/bin/bash
echo "=== Vérification des chroniques ==="
echo "Test 1 : Le fichier README existe..."
if [ -f "README.md" ]; then
    echo "  SUCCÈS"
else
    echo "  ÉCHEC"
    exit 1
fi
echo "Test 2 : Le README n'est pas vide..."
if [ -s "README.md" ]; then
    echo "  SUCCÈS"
else
    echo "  ÉCHEC"
    exit 1
fi
echo "=== Tous les tests passent ==="
EOF
chmod +x test.sh

Étape 4 - Créer le README

cat > README.md << 'EOF'
# Forge Actions

Mon premier dépôt avec GitHub Actions.

![Tests](https://github.com/UTILISATEUR/DEPOT/actions/workflows/verification.yml/badge.svg)
EOF

Étape 5 - Écrire le workflow

C'est le moment crucial. Crée le fichier .github/workflows/verification.yml :

name: Vérification des chroniques
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  verifier:
    runs-on: ubuntu-latest
    steps:
      - name: Récupérer le code
        uses: actions/checkout@v4

      - name: Rendre le script exécutable
        run: chmod +x test.sh

      - name: Lancer les tests
        run: ./test.sh

Vérifie que le fichier est correct :

cat .github/workflows/verification.yml

Étape 6 - Commiter le tout

git add .
git commit -m "Ajouter le workflow de vérification des chroniques"

Étape 7 - Lancer la vérification

bash verifier.sh
.\verifier.ps1

Récapitulatif des concepts

Concept Description
Workflow Fichier YAML décrivant un processus automatisé
Job Ensemble d'étapes exécutées sur une même machine
Step Action individuelle dans un job
Action Composant réutilisable du marketplace
Runner Machine virtuelle qui exécute les jobs
name: Nom du workflow
on: Déclencheur(s) du workflow
jobs: Liste des tâches à exécuter
runs-on: Type de machine virtuelle
steps: Liste des étapes d'un job
uses: Utiliser une action préfabriquée
run: Exécuter une commande shell
needs: Dépendance entre jobs
with: Paramètres passés à une action
env: Variables d'environnement
secrets.* Accès aux secrets du dépôt

Le Maître Archiviste observe le parchemin d'instructions que tu viens d'écrire. Il le tient à la lumière, parcourt chaque ligne du regard, puis hoche lentement la tête.

« Ton premier parchemin pour la Forge est impeccable. Les déclencheurs sont bien définis, les étapes sont claires, et la structure respecte les règles du YAML. Quand tu pousseras ces instructions vers une Forge distante, elles s'exécuteront automatiquement, sans que tu aies à lever le petit doigt. »

Il range soigneusement le parchemin dans un étui de cuir marqué du sceau des Forges.

« Tu sais maintenant programmer les Forges. Mais une seule Action ne suffit pas pour un véritable Maître. Dans ta prochaine quête, tu apprendras à créer des pipelines complexes - des chaînes d'Actions qui testent, construisent et déploient ton code en un seul mouvement fluide. Les Forges n'auront bientôt plus aucun secret pour toi. »