Aller au contenu
CI/CD & Automatisation medium

act : exécuter les workflows GitHub Actions en local

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

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
Fenêtre de terminal
# Par chemin de fichier
act -W .github/workflows/ci.yml
# Par nom du workflow (défini dans name:)
act -W .github/workflows/build.yml

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

Pour des tests rapides ou en CI :

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

Fenêtre de terminal
# Encore plus détaillé (inclut les appels Docker)
act -vv

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
Fenêtre de terminal
# Exécuter avec logs détaillés
act -j build -v
# Garder le conteneur après l'exécution pour investiguer
act --reuse

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

.github/workflows/matrix.yml
jobs:
build:
runs-on: ubuntu-latest
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-latest
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.

Voici un workflow typique et son exécution avec act :

.github/workflows/ci.yml
name: CI
on:
push:
branches: [main]
pull_request:
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Lint
run: echo "Linting..."
test:
runs-on: ubuntu-latest
needs: lint
steps:
- uses: actions/checkout@v4
- name: Run tests
run: echo "Tests passed!"
build:
runs-on: ubuntu-latest
needs: test
steps:
- uses: actions/checkout@v4
- 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
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
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 -v / act -vvMode verbeux / très verbeux
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)
  • 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 : logs verbeux (-v, -vv) 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

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.