Aller au contenu
CI/CD & Automatisation medium

actionlint : valider vos workflows GitHub Actions

11 min de lecture

Vous avez passé une heure à écrire un workflow GitHub Actions. Vous le poussez, et… échec immédiat. Une erreur de syntaxe. Un nom d’action mal orthographié. Une référence à un secret qui n’existe pas. Ces erreurs auraient pu être détectées avant le push.

actionlint est un linter statique qui analyse vos fichiers de workflow et détecte les erreurs avant qu’elles ne se produisent sur GitHub.

actionlint est un outil en ligne de commande qui analyse statiquement vos workflows GitHub Actions. Il vérifie la syntaxe YAML, les références aux actions, les expressions, les permissions, et bien plus — le tout sans exécuter le workflow.

Concrètement, actionlint détecte :

  • Les erreurs de syntaxe YAML (indentation, structure)
  • Les propriétés inconnues ou mal orthographiées
  • Les références invalides à des contexts (${{ github.sha }})
  • Les actions inexistantes ou mal référencées
  • Les permissions incorrectes
  • Les problèmes de type dans les expressions
  • Les patterns glob invalides
  • Et plus de 50 autres types d’erreurs
Sans actionlintAvec actionlint
Erreur découverte après le pushErreur détectée avant le commit
Attente du runner (30s à plusieurs min)Validation instantanée (< 1s)
Historique pollué de runs échouésRuns plus propres
Debug par essai-erreurMessages d’erreur clairs et précis

Avec Homebrew :

Fenêtre de terminal
brew install actionlint

Vérification de l’installation :

Fenêtre de terminal
actionlint --version

La commande doit afficher la version installée (ex: 1.7.7).

À la racine de votre projet :

Fenêtre de terminal
actionlint

actionlint trouve automatiquement les fichiers dans .github/workflows/ et les analyse tous.

Exemple de sortie :

.github/workflows/ci.yml:15:9: property "node-verion" is not defined in object type {cache: string; ...} [expression]
|
15 | node-verion: 20
| ^~~~~~~~~~~~
.github/workflows/ci.yml:23:7: "actions/checkout@v4" is not pinned by a SHA [security]
|
23 | - uses: actions/checkout@v4
| ^~~~~~~~~~~~~~~~~~~~~~~~~
Fenêtre de terminal
actionlint .github/workflows/ci.yml

Utile pour les scripts ou les pipelines :

Fenêtre de terminal
cat .github/workflows/ci.yml | actionlint -

actionlint fournit des messages précis avec le numéro de ligne, la colonne, et une explication. Voici les catégories principales :

.github/workflows/ci.yml:10:3: "on" section is missing [syntax]

Le workflow n’a pas de section on: qui définit quand il se déclenche.

.github/workflows/ci.yml:15:9: property "node-verion" is not defined [expression]

Faute de frappe : node-verion au lieu de node-version.

.github/workflows/ci.yml:8:5: "runs-on" expects string or array, but got number [syntax]

La valeur de runs-on doit être une chaîne, pas un nombre.

.github/workflows/ci.yml:12:7: "actions/checkout@v4" is not pinned by a SHA [security]

L’action utilise un tag mutable au lieu d’un SHA. Voir Épinglage SHA.

.github/workflows/ci.yml:20:15: undefined variable "github.secret" [expression]

Le context github.secret n’existe pas (c’est secrets.X qu’il faut utiliser).

Fenêtre de terminal
# Format par défaut (lisible)
actionlint
# Format JSON (pour intégration CI)
actionlint -format json
# Format SARIF (pour GitHub Code Scanning)
actionlint -format sarif > results.sarif
# Format compatible avec les problèmes GitHub Actions
actionlint -format '{{range $err := .}}::error file={{$err.Filepath}},line={{$err.Line}},col={{$err.Column}}::{{$err.Message}}{{end}}'
Fenêtre de terminal
# Ignorer les erreurs de sécurité (épinglage SHA)
actionlint -ignore 'SC2086'
# Ignorer plusieurs règles
actionlint -ignore 'SC2086' -ignore 'SC2129'

Vous pouvez aussi ignorer des erreurs dans le fichier lui-même :

# actionlint: ignore=expression
- name: Step with ignored warning
run: echo "${{ github.secret }}"
Fenêtre de terminal
actionlint -verbose

Affiche les fichiers analysés et le temps d’exécution.

Par défaut, actionlint vérifie que les actions référencées existent. Pour désactiver (en cas de problème réseau) :

Fenêtre de terminal
actionlint -no-color -oneline

actionlint s’intègre avec les éditeurs pour afficher les erreurs en temps réel.

  1. Installez l’extension GitHub Actions de GitHub
  2. Elle utilise automatiquement actionlint s’il est installé

Ou utilisez l’extension dédiée actionlint :

  1. Ouvrez VS Code
  2. Extensions → Recherchez “actionlint”
  3. Installez l’extension

Les erreurs apparaissent directement dans l’éditeur avec des soulignements.

Dans .vscode/settings.json :

{
"actionlint.executable": "/usr/local/bin/actionlint",
"yaml.schemas": {
"https://json.schemastore.org/github-workflow.json": ".github/workflows/*.yml"
}
}

Créez un workflow qui valide vos autres workflows :

name: Lint Workflows
on:
push:
paths:
- '.github/workflows/**'
pull_request:
paths:
- '.github/workflows/**'
permissions:
contents: read
jobs:
actionlint:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Install actionlint
run: |
curl -sSL https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash | bash
sudo mv actionlint /usr/local/bin/
- name: Validate workflows
run: actionlint -color
name: Lint Workflows
on:
pull_request:
paths:
- '.github/workflows/**'
permissions:
contents: read
jobs:
actionlint:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: reviewdog/action-actionlint@a5524e1c19e62881d79c1f6e6c4278c02d74c3f0 # v1.64.0
with:
reporter: github-pr-review

Cette action utilise reviewdog pour commenter directement les PRs avec les erreurs détectées.

Validez avant chaque commit avec pre-commit :

.pre-commit-config.yaml
repos:
- repo: https://github.com/rhysd/actionlint
rev: v1.7.7
hooks:
- id: actionlint

Puis :

Fenêtre de terminal
pip install pre-commit
pre-commit install

actionlint vérifie de nombreuses règles. Voici les principales catégories :

RègleDescription
syntaxErreurs YAML de base
expressionExpressions ${{ }} invalides
deprecated-commandsCommandes obsolètes (set-output, etc.)
RègleDescription
permissionsPermissions manquantes ou trop larges
credentialsSecrets exposés en clair
shell-injectionInjection possible via ${{ }} dans run:
RègleDescription
actionActions inexistantes ou mal référencées
eventsÉvénements invalides
job-needsDépendances needs: incorrectes
RègleDescription
runner-labelLabels de runner invalides
globPatterns glob invalides dans paths:
matrixErreurs dans la définition de matrice

Pour une validation complète de vos workflows :

  1. actionlint : validation statique (syntaxe, types, références)
  2. act : exécution locale (logique, scripts, comportement)
# Script de validation complet
#!/bin/bash
echo "🔍 Validation statique avec actionlint..."
actionlint
if [ $? -ne 0 ]; then
echo "❌ Erreurs de lint détectées"
exit 1
fi
echo "🚀 Test d'exécution avec act..."
act -n
if [ $? -ne 0 ]; then
echo "❌ Erreurs d'exécution détectées"
exit 1
fi
echo "✅ Workflows valides !"

Voir le guide act pour les tests d’exécution locale.

Créez un fichier .github/actionlint.yaml :

# Configuration actionlint
self-hosted-runner:
labels:
- my-runner
- gpu-runner
config-variables:
- MY_ORG_VAR
- DEPLOYMENT_ENV
paths:
ignore:
- '.github/workflows/deprecated-*.yml'

Si vous utilisez des variables au niveau organisation (${{ vars.ORG_VAR }}), déclarez-les pour éviter les faux positifs :

.github/actionlint.yaml
config-variables:
- ORG_CONFIG
- COMPANY_NAME

Symptôme : le terminal ne trouve pas la commande.

Solutions :

Fenêtre de terminal
# Vérifier l'installation
which actionlint
# Si installé via Go, ajouter au PATH
export PATH="$PATH:$(go env GOPATH)/bin"

Symptôme : actionlint signale des actions locales comme inexistantes.

Solution : les actions locales (./actions/my-action) sont validées si elles existent dans le repo. Vérifiez le chemin.

Symptôme : actionlint échoue à vérifier les actions du Marketplace.

Solution : utiliser le mode hors ligne :

Fenêtre de terminal
actionlint -no-color

Validation instantanée

Détectez les erreurs en moins d’une seconde, avant le push.

50+ règles

Syntaxe, sécurité, types, références — tout est vérifié.

Intégration IDE

Erreurs affichées directement dans VS Code pendant l’écriture.

CI/CD ready

Formats JSON, SARIF, et intégration reviewdog pour les PRs.

Points clés :

  1. Installez actionlint et utilisez-le avant chaque push
  2. Intégrez-le dans VS Code pour une validation en temps réel
  3. Ajoutez un workflow de lint pour valider les PRs automatiquement
  4. Combinez avec act pour une validation complète
  5. Configurez les règles et variables spécifiques à votre organisation