Aller au contenu
CI/CD & Automatisation medium

act : exécuter les workflows GitHub Actions en local

45 min de lecture

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.

Architecture act : workflow local → Docker → runner container → résultats

act lit vos fichiers YAML dans .github/workflows/, crée des conteneurs Docker qui imitent les runners GitHub, et exécute les jobs comme s'ils tournaient sur GitHub. Les résultats (logs, artifacts, status) sont affichés localement.

  • Installer act sur Linux, macOS et Windows
  • Exécuter des workflows avec différents événements (push, PR, workflow_dispatch)
  • Gérer les secrets et variables d'environnement
  • Configurer les images Docker optimales
  • Débugger efficacement avec les options avancées

Avant d'installer act, vous devez avoir :

  • Docker installé et en cours d'exécution (act crée des conteneurs)
  • Un terminal (bash, zsh, PowerShell)
  • Un projet avec des workflows dans .github/workflows/

Pour vérifier que Docker fonctionne :

Fenêtre de terminal
docker version

Si Docker n'est pas installé, consultez le guide Docker.

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.

Avec Homebrew :

Fenêtre de terminal
brew install act

Vérification de l'installation :

Fenêtre de terminal
act --version
Sortie attendue
act version 0.2.84

À la première exécution, act vous demande quelle image Docker utiliser pour simuler les runners GitHub. Trois options sont proposées :

ImageTailleCompatibilité
Micro (~200 Mo)Très légèreLimitée (manque beaucoup d'outils)
Medium (~500 Mo)ÉquilibréeBonne pour la plupart des cas
Large (~18 Go)ComplèteProche de l'environnement GitHub

Pour commencer, choisissez Medium. Vous pourrez changer plus tard.

Fenêtre de terminal
# Premier lancement - choisissez Medium
act

act sauvegarde votre choix dans ~/.actrc pour les prochaines exécutions.

La commande act sans argument simule un événement push et exécute les workflows qui répondent à cet événement :

Fenêtre de terminal
act

L'option -W attend un chemin, pas le name: déclaré dans le fichier. Pointez-la sur un fichier précis pour n'exécuter que celui-là, ou sur un répertoire pour restreindre la recherche à un sous-ensemble de workflows. 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
act -W .github/workflows/

Si votre workflow contient plusieurs jobs, vous pouvez n'en exécuter qu'un :

Fenêtre de terminal
# Exécuter uniquement le job "test"
act -j test
Sortie
[CI/test] 🚀 Start image=catthehacker/ubuntu:act-latest
[CI/test] 🐳 docker pull image=catthehacker/ubuntu:act-latest
[CI/test] 🐳 docker create image=catthehacker/ubuntu:act-latest
[CI/test] ⭐ Run Main Checkout
[CI/test] ✅ Success - Main Checkout
[CI/test] ⭐ Run Main Run tests
| Tests passed!
[CI/test] ✅ Success - Main Run tests
[CI/test] 🏁 Job succeeded

Les icônes indiquent le statut : ⭐ step en cours, ✅ succès, ❌ échec.

Fenêtre de terminal
# Exécuter uniquement le job "build" du workflow ci.yml
act -W .github/workflows/ci.yml -j build

GitHub Actions se déclenche sur différents événements. act peut les simuler :

Fenêtre de terminal
# Simuler un push (par défaut)
act push
# Simuler une pull request
act pull_request
# Simuler un workflow manuel
act workflow_dispatch
# Simuler un événement de release
act release

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.

Fenêtre de terminal
# Voir les jobs pour un événement spécifique
act -l push
act -l pull_request

Pour voir graphiquement l'ordre d'exécution des jobs :

Fenêtre de terminal
act -g
Sortie
╭──────╮
│ test │
╰──────╯
╭───────╮
│ build │
╰───────╯

Utile pour comprendre les dépendances needs: entre jobs.

Les workflows utilisent souvent des secrets (${{ secrets.TOKEN }}). act propose plusieurs méthodes pour les fournir.

Créez un fichier .secrets à la racine du projet :

Fenêtre de terminal
# .secrets (format clé=valeur)
GITHUB_TOKEN=ghp_xxxxxxxxxxxx
NPM_TOKEN=npm_xxxxxxxxxx
AWS_ACCESS_KEY_ID=AKIAXXXXXXXX
AWS_SECRET_ACCESS_KEY=xxxxxxxxxx

Ensuite, utilisez :

Fenêtre de terminal
act --secret-file .secrets

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. Cette forme évite d'écrire le secret en clair sur la ligne de commande.

Fenêtre de terminal
act -s GITHUB_TOKEN=ghp_xxxx -s MY_SECRET=valeur

Pour les variables ${{ vars.X }} (non sensibles), utilisez un fichier .vars :

.vars
ENVIRONMENT=development
API_URL=https://api-dev.example.com
Fenêtre de terminal
act --var-file .vars

Créez un fichier .actrc à la racine du projet pour sauvegarder vos options :

.actrc
--secret-file .secrets
--var-file .vars
-P ubuntu-24.04=catthehacker/ubuntu:act-latest
-P ubuntu-22.04=catthehacker/ubuntu:act-22.04
--container-architecture linux/amd64

Chaque ligne correspond à une option de la commande act.

act utilise des images Docker qui imitent les runners GitHub. Par défaut, ces images sont plus légères mais moins complètes. Pour plus de compatibilité :

Fenêtre de terminal
# Utiliser une image plus complète
act -P ubuntu-24.04=catthehacker/ubuntu:act-latest
# Ou votre propre image
act -P ubuntu-24.04=mon-registry/mon-image:tag

--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'"
level=debug msg="Found workflow 'ci.yml'"
level=debug msg="Planning job: test"
level=debug msg="Job.Steps: Checkout"
level=debug msg="Job.Steps: Run tests"
level=debug msg="using github ref: refs/heads/main"
level=debug msg="Detected CPUs: 16"

Le mode -v révèle le chargement des workflows, la planification des jobs et les variables d'environnement Git détectées. Pour aller plus loin, deux options complémentaires existent :

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::)
act -s ACTIONS_STEP_DEBUG=true -s ACTIONS_RUNNER_DEBUG=true

Pour voir ce qui serait exécuté sans vraiment l'exécuter :

Fenêtre de terminal
act -n
Sortie dry-run
*DRYRUN* [CI/test] ⭐ Run Set up job
*DRYRUN* [CI/test] 🚀 Start image=catthehacker/ubuntu:act-latest
*DRYRUN* [CI/test] 🐳 docker pull image=catthehacker/ubuntu:act-latest
*DRYRUN* [CI/test] ✅ Success - Set up job
*DRYRUN* [CI/test] ⭐ Run Main Checkout
*DRYRUN* [CI/test] ✅ Success - Main Checkout
*DRYRUN* [CI/test] 🏁 Job succeeded

Le préfixe *DRYRUN* indique qu'aucun conteneur n'est créé. Utile pour valider la syntaxe et la structure avant une vraie exécution.

act ne peut pas reproduire 100% de l'environnement GitHub Actions. Voici les principales limitations à connaître :

LimitationExplication
Événements limitésschedule, deployment, page_build ne sont pas supportés
API GitHub limitéePas d'accès à l'API GitHub comme en production
Services DockerLes containers de service peuvent se comporter différemment
Cacheactions/cache fonctionne partiellement (stockage local)
Artifactsactions/upload-artifact crée des fichiers locaux, pas d'API
MarketplaceCertaines actions tierces ont des incompatibilités

Quand utiliser act :

  • Tests de syntaxe et structure
  • Développement itératif de workflows
  • Validation des commandes et scripts
  • Debug de problèmes de logique

Quand NE PAS compter sur act :

  • Validation finale (toujours tester sur GitHub)
  • Tests d'intégration avec l'API GitHub
  • Workflows avec services complexes

Le drapeau --reuse (-r) empêche act de supprimer le conteneur à la fin d'un workflow terminé avec succès, ce qui permet à la fois 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 du run précédent, donc un build qui passe 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 -j build -v
# Conserver le conteneur d'un run réussi pour l'inspecter
act --reuse

act exécute automatiquement toutes les combinaisons de la matrice en parallèle :

.github/workflows/matrix.yml
jobs:
build:
runs-on: ubuntu-24.04
strategy:
matrix:
node: [18, 20, 22]
steps:
- run: echo "Testing Node.js ${{ matrix.node }}"
Fenêtre de terminal
act -W .github/workflows/matrix.yml
Sortie (3 jobs parallèles)
[Matrix Build/build-1] 🚀 Start image=catthehacker/ubuntu:act-latest
[Matrix Build/build-2] 🚀 Start image=catthehacker/ubuntu:act-latest
[Matrix Build/build-3] 🚀 Start image=catthehacker/ubuntu:act-latest
[Matrix Build/build-1] ⭐ Run Main
| Testing Node.js 18
[Matrix Build/build-2] ⭐ Run Main
| Testing Node.js 20
[Matrix Build/build-3] ⭐ Run Main
| Testing Node.js 22

Pour n'exécuter qu'une seule combinaison de la matrice :

Fenêtre de terminal
# Filtrer par valeur de matrice
act --matrix node:20

Pour un workflow avec des inputs :

.github/workflows/deploy.yml
on:
workflow_dispatch:
inputs:
environment:
description: 'Environment to deploy'
required: true
type: choice
options: [dev, staging, prod]
jobs:
deploy:
runs-on: ubuntu-24.04
steps:
- run: echo "Deploying to ${{ github.event.inputs.environment }}"

Créez un fichier d'événement JSON :

event.json
{
"inputs": {
"environment": "staging"
}
}

Puis exécutez :

Fenêtre de terminal
act workflow_dispatch -e event.json
Sortie
[Deploy/deploy] ⭐ Run Main
| Deploying to staging
[Deploy/deploy] ✅ Success - Main
[Deploy/deploy] 🏁 Job succeeded

Créez un hook Git pour valider avant chaque push :

.git/hooks/pre-push
#!/bin/bash
echo "🔍 Validation du workflow CI..."
act -n -W .github/workflows/ci.yml
if [ $? -ne 0 ]; then
echo "❌ Le workflow a des erreurs. Push annulé."
exit 1
fi
echo "✅ Workflow valide"

N'oubliez pas de rendre le script exécutable :

Fenêtre de terminal
chmod +x .git/hooks/pre-push

Pour une validation complète, combinez la validation statique et l'exécution :

Fenêtre de terminal
# 1. Valider la syntaxe avec actionlint (rapide, sans Docker)
actionlint .github/workflows/*.yml
# 2. Si OK, valider la structure avec act en dry-run
act -n
# 3. Si tout passe, exécuter réellement
act

Voir le guide actionlint pour la validation statique des workflows.

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 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
permissions: {}
jobs:
lint:
runs-on: ubuntu-24.04
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- name: Lint
run: echo "Linting..."
test:
runs-on: ubuntu-24.04
needs: lint
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- name: Run tests
run: echo "Tests passed!"
build:
runs-on: ubuntu-24.04
needs: test
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- name: Build
run: echo "Building..."
Fenêtre de terminal
# Visualiser la structure
act -g
Graphe des dépendances
╭──────╮
│ lint │
╰──────╯
╭──────╮
│ test │
╰──────╯
╭───────╮
│ build │
╰───────╯
Fenêtre de terminal
# Exécuter uniquement les tests (avec ses dépendances)
act -j test

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 donc par vérifier docker info et l'image effectivement utilisée, affichée en tête de chaque job.

ProblèmeCauseSolution
Cannot connect to Docker daemonDocker non démarré ou permissionsdocker info pour vérifier. Sur Linux : sudo usermod -aG docker $USER puis logout/login
Image not found / pull 18 GoImage Large sélectionnée par défautUtiliser Medium : -P ubuntu-24.04=catthehacker/ubuntu:act-latest
Action not foundAction Marketplace incompatibleVérifier compatibilité sur repo act, utiliser image Full
exec format error (Mac M1/M2)Image x86 sur ARMAjouter --container-architecture linux/amd64
Secret non trouvéFichier .secrets absent ou mal formatéVérifier format CLE=valeur (pas d'espaces) et --secret-file .secrets
Événement non supportéschedule, deployment non implémentésTester sur GitHub, act ne supporte pas tous les événements
Cache actions/cache partielStockage local uniquementNormal, le cache fonctionne mais n'est pas partagé entre runs

Les quatre premières lignes couvrent 90 % des usages quotidiens. Les suivantes servent quand quelque chose ne se passe pas comme prévu ou quand vous testez un cas particulier. Retenez surtout l'ordre : act -l pour vérifier ce qui est détecté, act -n pour valider la structure sans conteneur, puis act -j pour n'exécuter que le job qui vous intéresse.

CommandeDescription
actExécuter tous les workflows (événement push)
act -lLister tous les jobs
act -gAfficher le graphe des dépendances
act -nDry-run (validation sans exécution)
act -j <job>Exécuter un job spécifique
act pull_requestSimuler une pull request
act workflow_dispatch -e event.jsonDéclencher avec inputs
act -vMode verbeux (drapeau booléen, -vv n'ajoute rien)
act --secret-file .secretsCharger les secrets
act --matrix node:20Filtrer une combinaison de matrice
act -P ubuntu-24.04=catthehacker/ubuntu:act-latestDéfinir l'image
act --container-architecture linux/amd64Forcer l'architecture (Mac M1/M2)

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

  • Itération rapide : testez vos workflows en secondes sans pousser sur GitHub
  • Économie de ressources : pas de consommation de minutes Actions pendant le développement
  • Debug efficace : mode verbeux (-v, un seul palier) et possibilité de garder les conteneurs (--reuse)
  • Configuration : utilisez .secrets et .actrc pour centraliser vos options
  • Images : commencez avec Medium (~500 Mo), passez à Large si nécessaire
  • Validation complète : combinez act avec actionlint pour détecter toutes les erreurs
  • Sécurité : maintenez act à jour (correctifs réguliers sur x/crypto, SELinux)
  • Limitation : act n'est pas un remplacement complet, validez toujours sur GitHub avant merge
  • Formation Dagger : Une autre voie pour exécuter le même pipeline en local et en CI, quand les limites de act deviennent gênantes.
  • pre-commit : Placer les contrôles rapides avant le commit et réserver act aux vérifications lourdes.
  • Docker de A à Z : Maîtriser le moteur de conteneurs dont act dépend pour chaque job simulé.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn