Aller au contenu principal

GitHub Actions : Workflow

· 3 minutes de lecture

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