GitHub Actions : Workflow
Un workflow GitHub Actions est un fichier YAML placé dans .github/workflows/. Il orchestre des jobs qui s'exécutent sur des runners en réponse à des événements. Comprendre les primitives disponibles — matrix, container, artefacts, conditions — permet de construire des pipelines maintenables sans duplication.
Structure d'un job
Chaque job s'exécute dans un environnement indépendant. Les steps d'un même job partagent le filesystem du runner ; deux jobs distincts ne partagent rien par défaut.
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build
run: make build
runs-on sélectionne le runner. Pour un runner auto-hébergé avec un label personnalisé :
runs-on: [self-hosted, linux, gpu]
Container
Par défaut, les steps s'exécutent directement sur le runner. Spécifier un container fait tourner toutes les steps dans un conteneur Docker — utile pour garantir un environnement reproductible indépendamment du runner :
jobs:
test:
runs-on: self-hosted
container:
image: python:3.12-slim
steps:
- uses: actions/checkout@v4
- run: pip install pytest && pytest
Sans container, le job dépend des outils installés sur la machine hôte. Avec container, l'environnement est défini par l'image — portable et prévisible.
Matrix
strategy.matrix génère automatiquement plusieurs exécutions d'un job à partir d'une combinaison de variables. Utile pour tester sur plusieurs versions de langage ou systèmes d'exploitation :
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12"]
steps:
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- run: pytest
Avec 3 versions, GitHub crée 3 jobs parallèles. Pour une matrice à deux dimensions :
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
python-version: ["3.11", "3.12"]
4 combinaisons → 4 jobs parallèles. matrix.include ajoute des combinaisons spécifiques, matrix.exclude en supprime.
Artefacts
Les artefacts permettent de partager des fichiers entre jobs ou de les conserver après l'exécution du workflow (logs, rapports de tests, binaires compilés).
Upload :
- name: Upload coverage report
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: htmlcov/
retention-days: 7
Download dans un job suivant :
- name: Download coverage report
uses: actions/download-artifact@v4
with:
name: coverage-report
path: ./coverage
Les artefacts persistent après la fin du workflow et sont téléchargeables depuis l'onglet Actions du dépôt.
Dépendances et conditions
needs impose un ordre d'exécution entre jobs. Sans needs, tous les jobs démarrent en parallèle :
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: make build
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- run: make deploy
if conditionne l'exécution d'un job ou d'une step :
deploy:
needs: build
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
if: always() force l'exécution même si un job précédent a échoué — utile pour les steps de nettoyage.
Permissions du GITHUB_TOKEN
Chaque exécution reçoit automatiquement un GITHUB_TOKEN avec des permissions par défaut. Les permissions se réduisent au minimum nécessaire :
permissions:
contents: read
packages: write
pull-requests: write
Les permissions peuvent se définir au niveau du workflow (globales) ou du job (locales, plus précises).
Variables d'environnement
env définit des variables à plusieurs niveaux :
env:
NODE_ENV: production # niveau workflow — disponible partout
jobs:
build:
env:
BUILD_FLAGS: "--minify" # niveau job
steps:
- run: echo $BUILD_FLAGS
env:
DEBUG: "true" # niveau step — prioritaire sur les niveaux supérieurs
$GITHUB_OUTPUT permet à une step d'exporter une valeur vers les steps suivantes du même job :
- name: Get version
id: version
run: echo "tag=$(git describe --tags)" >> $GITHUB_OUTPUT
- name: Use version
run: echo "Deploying ${{ steps.version.outputs.tag }}"