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 :
tests'exécute en premierbuildattend quetestsoit terminé avec succèsdeployattend quebuildsoit 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 :
 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 :
- Crée un dépôt
forge-actions - Crée le dossier
.github/workflows/ - Crée un script de test
test.sh - Crée un
README.md - Écris un workflow
verification.ymlqui se déclenche sur push, récupère le code et lance les tests - Commite le tout
- 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.

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. »