act : exécuter les workflows GitHub Actions en local
Testez vos workflows GitHub Actions localement avec act. Installation, configuration, secrets, debug et bonnes pratiques pour un développement itératif rapide.
L’issue s’ouvre déjà remplie avec le titre et l’adresse de cette page.
Testez vos workflows GitHub Actions en quelques secondes, sans pousser sur GitHub. act exécute vos workflows localement via Docker, permettant un développement itératif rapide. Vous économisez vos minutes Actions et évitez les allers-retours frustrants push → attente → échec → correction → push.
act lit vos fichiers YAML dans .github/workflows/, crée des conteneurs Docker qui imitent les runners GitHub, puis exécute les jobs dans cet environnement. Les journaux, les artefacts et le statut final s'affichent dans votre terminal, sans qu'aucune minute Actions ne soit consommée.
act est un binaire Go statique sans dépendance système : l'installation se résume à récupérer un exécutable et à le placer dans le PATH. Les gestionnaires de paquets ci-dessous font ce travail pour vous et gèrent la mise à jour ; la méthode manuelle vaut surtout quand vous devez figer une version précise, par exemple pour qu'une équipe entière teste avec le même comportement.
# Doit afficher "act_Linux_x86_64.tar.gz: OK" avant toute extraction
sha256sum--check--ignore-missingchecksums.txt
tar-xzfact_Linux_x86_64.tar.gzact
sudoinstall-m0755act/usr/local/bin/act
Le fichier checksums.txt est publié par le pipeline de release d'act à côté des archives, et c'est lui qui rend la vérification possible. Si sha256sum --check ne répond pas OK, arrêtez-vous là : l'archive a été altérée ou le téléchargement est incomplet.
L'option -W attend un chemin, pas le name: déclaré dans le fichier, et c'est une confusion fréquente. Pointez-la sur un fichier précis pour n'exécuter que celui-là, ou sur un répertoire pour restreindre la recherche. Sans -W, act balaie tout .github/workflows/, ce qui devient vite pénible sur un dépôt qui en compte une dizaine.
Fenêtre de terminal
# Par chemin de fichier
act-W.github/workflows/ci.yml
# Par répertoire : tous les workflows d'un dossier
Avant de lancer quoi que ce soit, act -l donne l'inventaire de ce qu'act a réellement compris de vos fichiers. C'est le premier réflexe de diagnostic : un job absent de cette liste ne s'exécutera jamais, en général parce que son événement déclencheur ne correspond pas à celui simulé, ou parce que le fichier YAML est mal placé.
Fenêtre de terminal
# Voir tous les workflows et leurs jobs
act-l
Sortie
Stage Job ID Job name Workflow name Workflow file Events
0 test test CI ci.yml push,pull_request
1 build build CI ci.yml push,pull_request
Chaque ligne indique : le stage (ordre d'exécution), l'ID du job, son nom, le workflow parent et les événements déclencheurs.
Cette forme convient à un test ponctuel, pas à un usage régulier : la valeur passe dans l'historique du shell et reste visible dans ps pendant l'exécution. Si vous omettez la valeur (-s GITHUB_TOKEN), act reprend la variable d'environnement du même nom, et à défaut vous la demande de façon interactive, sans jamais l'écrire en clair sur la ligne de commande.
Chaque ligne correspond à une option de la commande act.
L'image du runner s'épingle comme une action. Le tag act-latest, que la plupart des tutoriels recommandent, est mobile : l'image qu'il désigne change sans prévenir, et votre exécution locale cesse alors de reproduire celle de vos collègues. Le tag act-24.04 correspond au label ubuntu-24.04 que vos workflows demandent, et le digest qui le suit fige l'image exactement. C'est la règle que cette formation applique aux actions ; elle vaut tout autant pour le conteneur qui les exécute.
act utilise des images Docker qui imitent les runners GitHub, sans les
reproduire : les images par défaut sont plus légères et embarquent donc
moins d'outils. Un workflow qui échoue sur un command not found alors
qu'il passe sur GitHub désigne presque toujours cette différence d'image :
--verbose est un interrupteur booléen, pas un niveau : act n'a qu'un seul palier de verbosité, et répéter le drapeau ne change rien à la sortie. Ce mode sert surtout à comprendre ce qu'act a chargé et quel contexte Git il a déduit du dépôt local, deux causes fréquentes de divergence entre une exécution locale et le vrai runner.
Fenêtre de terminal
# Logs détaillés
act-v
Extrait sortie verbose
level=debug msg="Loading workflows from '.github/workflows'"
Le mode -v révèle le chargement des workflows, la planification des jobs et le contexte Git qu'act a déduit du dépôt local. Deux options le complètent, et elles ne servent pas la même chose :
Fenêtre de terminal
# Logs structurés, exploitables par un outil d'analyse
act--json
# Activer les logs de debug côté GitHub Actions (::debug::)
Le drapeau --reuse (-r) empêche act de supprimer le conteneur à la fin d'un workflow réussi, ce qui permet de garder l'état entre deux exécutions et d'entrer dans le conteneur avec docker exec pour inspecter le système de fichiers. Attention à la contrepartie : le conteneur conservé garde les fichiers de l'exécution précédente, donc un build qui ne passe que grâce à un artefact résiduel vous donnera une fausse confiance. Nettoyez-le avant la validation finale.
Fenêtre de terminal
# Exécuter un job précis avec logs détaillés
act-jbuild-v
# Conserver le conteneur d'un run réussi pour l'inspecter
Le workflow ci-dessous enchaîne trois jobs liés par needs: et applique les règles de durcissement de la formation : actions épinglées par SHA avec le tag en commentaire, permissions: {} au niveau du workflow puis le strict minimum par job, persist-credentials: false sur le checkout et une version de runner figée. C'est cette combinaison qu'act vous permet de vérifier localement, avant le premier push.
.github/workflows/ci.yml
name: CI
on:
push:
branches: [main]
pull_request:
# Aucun droit par défaut : chaque job demande le minimum
Presque tous les échecs d'act se rangent en deux catégories. Soit Docker ne répond pas comme attendu (démon arrêté, permissions du socket, architecture du processeur), soit l'image du runner ne contient pas l'outil que le workflow appelle. Le message d'erreur pointe rarement vers la vraie cause : commencez par docker info, puis par l'image effectivement utilisée, qu'act affiche en tête de chaque job.
Problème
Cause
Solution
Cannot connect to Docker daemon
Docker non démarré ou permissions
docker info pour vérifier. Sur Linux : sudo usermod -aG docker $USER puis logout/login
Les quatre premières lignes couvrent l'essentiel d'un usage quotidien ; les suivantes servent quand quelque chose résiste ou que vous testez un cas particulier. Retenez surtout leur enchaînement : act -l pour vérifier ce qui est détecté, act -n pour valider la structure sans créer de conteneur, puis act -j pour n'exécuter que le job qui vous intéresse.
Vérifiez que l'essentiel de ce guide est acquis. Les questions portent
uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
6 questions
6 min.
70% requis
Informations
Le chronomètre démarre au clic sur Démarrer
Questions à choix multiples, vrai/faux et réponses courtes
Vous pouvez naviguer entre les questions
Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
⏱️--:--
0 / 6
Vérification
(0/0)
--:--
0%
0Correctes
0À revoir
0:00Temps
-Niveau
Score par domaine
Un domaine regroupe plusieurs guides et reçoit plusieurs questions : son score est plus fiable qu'un score par thème, qui porte souvent sur une seule question.
Bilan
Points forts
Aucun sujet réussi à 80 % sur au moins deux questions pour l’instant.
act est un outil en ligne de commande qui exécute vos workflows GitHub Actions localement sur votre machine, sans avoir besoin de pousser le code sur GitHub.
Comment ça fonctionne ?
act lit vos fichiers YAML dans .github/workflows/
Il crée des conteneurs Docker qui imitent les runners GitHub
Il exécute les jobs comme s'ils tournaient sur GitHub
Avantages principaux
Avantage
Description
Itération rapide
Tests en secondes au lieu de minutes
Économie
Pas de consommation de minutes GitHub Actions
Debug local
Logs détaillés, investigation dans les conteneurs
Offline
Fonctionne sans connexion internet (après le pull initial)
Exemple rapide
# Tester le workflow ci.yml
act -W .github/workflows/ci.yml
# Voir ce qui serait exécuté (dry-run)
act -n
Comparaison
Critère
act (local)
GitHub Actions (cloud)
Environnement
Conteneurs Docker locaux
VMs GitHub-hosted
Images
~500 Mo (Medium)
~18 Go (complète)
Latence
Secondes
Minutes (queue + boot)
API GitHub
Limitée
Complète
Secrets
Fichier .secrets
GitHub Secrets
Cache
Local uniquement
Partagé entre runs
Coût
Gratuit (Docker local)
Minutes facturées
Ce que act supporte bien
✅ Syntaxe YAML et structure des workflows
✅ Steps avec run: et uses:
✅ Variables d'environnement et secrets
✅ Matrices de build
✅ Actions du Marketplace (la plupart)
Ce que act ne supporte pas (ou partiellement)
❌ Événements schedule, deployment, page_build
⚠️ actions/cache (stockage local uniquement)
⚠️ actions/upload-artifact (fichiers locaux, pas d'API)
❌ Accès complet à l'API GitHub
❌ Services Docker complexes
Recommandation
Utilisez act pour : développement, tests rapides, debug Validez toujours sur GitHub : avant merge en production
Prérequis
Docker doit être installé et en cours d'exécution :
docker version
macOS
brew install act
Linux
Option 1 : Homebrew
brew install act
Option 2 : release GitHub, avec vérification de l'empreinte
VERSION=0.2.84
curl -sSL -O "https://github.com/nektos/act/releases/download/v${VERSION}/act_Linux_x86_64.tar.gz"
curl -sSL -O "https://github.com/nektos/act/releases/download/v${VERSION}/checksums.txt"
# Doit afficher "act_Linux_x86_64.tar.gz: OK" avant toute extraction
sha256sum --check --ignore-missing checksums.txt
tar -xzf act_Linux_x86_64.tar.gz act
sudo install -m 0755 act /usr/local/bin/act
Un curl | bash exécuterait un script distant sans rien vérifier : la somme de contrôle publiée par le projet est ce qui distingue une installation reproductible d'une confiance aveugle.Option 3 : asdf-vm
# Ajouter l'utilisateur au groupe docker
sudo usermod -aG docker $USER
# IMPORTANT : se déconnecter et reconnecter
# Ou utiliser newgrp
newgrp docker
# Vérifier
docker info
Cause 3 : Socket Docker inaccessible
# Vérifier le socket
ls -la /var/run/docker.sock
# Doit afficher quelque chose comme :
# srw-rw---- 1 root docker ... /var/run/docker.sock
Cause 4 : Docker Desktop non lancé (macOS/Windows)
Ouvrez l'application Docker Desktop et attendez que l'icône indique "Running".
Test final
docker run hello-world
act --version
Comportement par défaut
act exécute toutes les combinaisons de la matrice :
Pour tester rapidement, créez un fichier de workflow de test :
# .github/workflows/ci-local.yml
jobs:
test:
strategy:
matrix:
node: [20] # Une seule version
act -W .github/workflows/ci-local.yml
Performance
Les matrices volumineuses (ex: 3 OS × 4 versions = 12 jobs) peuvent être longues. Préférez tester une combinaison localement, puis valider la matrice complète sur GitHub.