GitHub Actions : workflows réutilisables multi-repo
À la fin de ce tutoriel, vous saurez distinguer reusable workflows (
workflow_call) et composite actions, centraliser les pipelines dansorg/platform-workflows, appeler un workflow avec inputs / secrets / outputs, appliquer le least privilegepermissions, utilisersecrets: inherit, pinner les refs, et esquisser un job OIDC AWS enca-central-1. Angle DevOps Elastic Hayway (DEH) : DRY multi-repo, zéro secret en clair, lab à ~0 €.Niveau : Intermédiaire · Temps estimé : 55–75 min · Versions cibles : GitHub Actions 2026 ·
workflow_call· composite actions · OIDC AWS · AWS CLI v2 · Dernière vérification : 2026-09-11 · Region :ca-central-1Slug :
wow-github-actions-reusable· Série : WOW (37/50) · Mot-clé SEO : github actions reusable workflows · Publish : READY← Précédent : GitLab CI avancé (WOW 36) · → Suivant : Buildkite agents (WOW 38) · Aussi : GHA OIDC AWS · DevSecOps pipeline · Platform Engineering 2026
Prérequis
- Org GitHub de lab (placeholder
org) avec Actions activées et droits pour un repo privéplatform-workflows - Bases YAML CI — DevSecOps pipeline · GitLab CI avancé
- Notions IAM / OIDC — GitHub Actions OIDC AWS
- Compte AWS lab optionnel (
AWS_PROFILE=lab) — Démarrer avec AWS - Aucun secret réel : placeholders uniquement
Coût estimé : ~0 € (minutes GitHub Free / org ; IAM OIDC = 0 $ ; pas d’EC2, NAT, RDS).
export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1
aws sts get-caller-identity
Ce que nous allons construire
GitHub Actions reusable (WOW 37/50) — ca-central-1
├── Reusable workflow_call vs composite actions
├── Repo central org/platform-workflows
├── Caller : uses + inputs / secrets / outputs
├── permissions least privilege + secrets: inherit
├── Pinning SHA / tags immuables
├── Sketch OIDC AWS job (ca-central-1)
└── Anti-patterns + quiz + FAQ + maillage
(Schéma — alt : « App repos appellent un reusable central org/platform-workflows ; OIDC assume un rôle AWS en ca-central-1 ».)
Étape 1 — Pourquoi des workflows réutilisables en 2026 ?
Copier le même .github/workflows/ci.yml dans 40 repos crée du toil : drift de versions, permissions trop larges, secrets dupliqués, scans oubliés. Les orgs matures traitent la CI comme un produit plateforme — même esprit que Platform Engineering 2026.
Les reusable workflows (on: workflow_call) exposent un contrat versionné : inputs typés, secrets, outputs, jobs complets. Les app teams appellent ; la plateforme maintient.
| Pression | Réponse DEH |
|---|---|
| Drift multi-repo | Un repo platform-workflows |
| Minutes / coûts | Path lint/test/build standard |
| Sécu | permissions + OIDC |
| Compliance | Pinning + CODEOWNERS |
| Onboarding | Un uses: au lieu de 200 lignes |
Étape 2 — Reusable workflow vs composite action
Deux outils, deux portées.
| Critère | Reusable workflow | Composite action |
|---|---|---|
| Déclencheur | on: workflow_call |
runs: using: composite |
| Unité | Jobs (voire plusieurs) | Steps dans un job |
| Environments / concurrency | Oui | Non |
| Cas idéal | Pipeline lint→test→deploy | Setup Node, checkout+cache |
Règle DEH : composite pour un bloc de steps ; reusable pour un pipeline multi-repo. Souvent les deux : le reusable appelle des composites internes. Évitez un unique monolithe YAML : un golden path = un fichier workflow_call versionné.
Étape 3 — Pattern org : org/platform-workflows
Dépôt privé recommandé :
org/platform-workflows
├── .github/workflows/
│ ├── ci-node.yml
│ └── deploy-s3-lab.yml
├── actions/setup-node-deh/action.yml
├── README.md
└── CODEOWNERS
Settings → Actions → General → Access → « Accessible from repositories in the organization ». Sans ça, uses: org/platform-workflows/... échoue. CODEOWNERS sur .github/workflows/ : toute PR CI centrale passe par la plateforme.
Étape 4 — Lab YAML : reusable workflow_call
# org/platform-workflows/.github/workflows/ci-node.yml
name: reusable-ci-node
on:
workflow_call:
inputs:
node-version:
type: string
default: "22"
run-tests:
type: boolean
default: true
working-directory:
type: string
default: "."
secrets:
NPM_TOKEN:
required: false
outputs:
artifact-name:
description: "Artefact produit"
value: ${{ jobs.build.outputs.artifact-name }}
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
outputs:
artifact-name: ${{ steps.meta.outputs.name }}
defaults:
run:
working-directory: ${{ inputs.working-directory }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
cache: npm
cache-dependency-path: ${{ inputs.working-directory }}/package-lock.json
- run: npm ci
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- run: npm run lint --if-present
- name: Test
if: ${{ inputs.run-tests }}
run: npm test --if-present
- id: meta
run: echo "name=app-${{ github.sha }}" >> "$GITHUB_OUTPUT"
Inputs typés, permissions restrictives dès le reusable, outputs remontés via jobs.<id>.outputs.
Étape 5 — Caller applicatif
# org/demo-payments/.github/workflows/ci.yml
name: ci
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
jobs:
call-ci:
uses: org/platform-workflows/.github/workflows/ci-node.yml@v1
with:
node-version: "22"
run-tests: true
working-directory: "."
secrets: inherit
secrets: inherit vs nommés
secrets: inherit: tous les secrets du caller (repo / org / environment). Simple en lab.- Nommés :
secrets: { NPM_TOKEN: ${{ secrets.NPM_TOKEN }} }— moindre surface. DEH :inheriten lab privé ; mapping explicite pourdeploy-*prod.
Consommer un output
jobs:
call-ci:
uses: org/platform-workflows/.github/workflows/ci-node.yml@v1
secrets: inherit
notify:
needs: call-ci
runs-on: ubuntu-latest
steps:
- run: echo "Artifact ${{ needs.call-ci.outputs.artifact-name }}"
Étape 6 — Least privilege permissions
Déclarez permissions au caller et au reusable.
| Besoin | Permission |
|---|---|
| Checkout | contents: read |
| Commentaire PR | pull-requests: write |
| GHCR | packages: write |
| OIDC AWS | id-token: write + contents: read |
Anti-pattern : write-all « pour que ça marche ». Ouvrez au fur et à mesure et documentez chaque élargissement dans le README du central.
Étape 7 — Pinning
# Fragile
uses: org/platform-workflows/.github/workflows/ci-node.yml@main
# Mieux : tag semver
uses: org/platform-workflows/.github/workflows/ci-node.yml@v1.4.0
# Max supply-chain : SHA
uses: org/platform-workflows/.github/workflows/ci-node.yml@a1b2c3d4e5f678901234567890abcdef1234567
DEH : tags v1 / v1.4.0 + changelog ; repos prod SHA ou tag patch ; Renovate sur les callers. Jamais @main pour un deploy production.
Étape 8 — Sketch OIDC AWS ca-central-1
Détails IAM dans github-actions-oidc-aws. Version reusable minimale :
# org/platform-workflows/.github/workflows/deploy-s3-lab.yml
name: reusable-deploy-s3-lab
on:
workflow_call:
inputs:
bucket:
type: string
required: true
role-arn:
type: string
required: true
permissions:
contents: read
id-token: write
jobs:
deploy:
runs-on: ubuntu-latest
environment: lab
steps:
- uses: actions/checkout@v4
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ inputs.role-arn }}
aws-region: ca-central-1
- run: aws sts get-caller-identity
- run: echo "aws s3 sync ./dist s3://${{ inputs.bucket }}/ --delete"
Caller :
jobs:
deploy-lab:
uses: org/platform-workflows/.github/workflows/deploy-s3-lab.yml@v1
with:
bucket: "lab-gha-oidc-REPLACE"
role-arn: "arn:aws:iam::123456789012:role/gha-lab-site-deploy"
Trust IAM bornée (sub / repository / environment:lab) — pas de *. Aucune access key dans Secrets. Le lab reste un dry-run (sts get-caller-identity) sauf si vous avez un bucket jetable déjà provisionné.
Étape 9 — Composite (complément) et check-list
# org/platform-workflows/actions/setup-node-deh/action.yml
name: setup-node-deh
inputs:
node-version:
default: "22"
runs:
using: composite
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
cache: npm
- run: npm ci
shell: bash
Appel : uses: org/platform-workflows/actions/setup-node-deh@v1. Utile dans un reusable pour factoriser sans multiplier les workflows.
Anti-patterns : @main partout ; clés AWS longues ; write-all ; reusable monstre sans inputs ; contournements locaux non documentés ; accès org oublié ; region us-east-1.
Check-list DEH : repo central + Access OK · workflow_call + caller @vX · permissions minimales · inherit lab / mapping prod · pinning tag/SHA · OIDC ca-central-1 · CODEOWNERS · coût ~0 €.
Erreurs fréquentes
| Erreur | Impact | Correction |
|---|---|---|
uses vers repo inaccessible |
Job rouge | Access org / visibility |
| Composite vs reusable confondus | Pas d’environments | workflow_call pour pipelines |
OIDC sans id-token: write |
Assume-role refuse | Ajouter la permission |
| Secrets non transmis | Registry 401 | inherit ou mapping |
@main en prod |
Drift supply-chain | Tag / SHA + Renovate |
| Region us-east-1 | Drift FinOps DEH | Forcer ca-central-1 |
| Clés IAM longues | Fuite | OIDC + trust bornée |
Quiz (5 questions)
1. Un reusable workflow se déclare avec :
– A. runs: using: composite uniquement
– B. on: workflow_call
– C. Un webhook Slack
2. Différence clé reusable vs composite :
– A. Aucune
– B. Reusable = jobs ; composite = steps
– C. Composite seul peut faire OIDC
3. Pour transmettre tous les secrets du caller :
– A. Les coller en clair dans YAML
– B. secrets: inherit
– C. Les committer dans platform-workflows
4. Region lab DEH de ce tutoriel :
– A. us-east-1
– B. ca-central-1
– C. eu-west-3
5. Pinning recommandé pour un deploy prod :
– A. @main
– B. Tag immuable ou commit SHA
– C. Branche personnelle du stagiaire
Réponses : 1‑B · 2‑B · 3‑B · 4‑B · 5‑B
FAQ
Reusable ou composite en premier ?
Pipeline lint/test/scan multi-repo → reusable. Setup Node/Go répété → composite. Les deux cohabitent dans platform-workflows.
Repo public obligatoire pour uses: ?
Non. Privé org + Access « repositories in the organization » suffit.
secrets: inherit est-il dangereux ?
Pratique en lab. En prod partagée : mapping explicite + environments avec reviewers.
Combien de workflows dans le central ?
Un par golden path (Node, Go, Terraform plan, deploy S3…), versionné (v1), inputs documentés.
Lien avec Platform Engineering ?
platform-workflows est un golden path CI — wow-platform-engineering-2026.
Où approfondir OIDC ?
Lab IAM + S3 : github-actions-oidc-aws. Ici on l’encapsule en reusable.
Coût réel du lab ?
~0 € (workflows + dry-run sts get-caller-identity). Pas d’infra lourde.
Pour aller plus loin
- GitLab CI avancé (WOW 36)
- Buildkite agents (WOW 38)
- GitHub Actions OIDC AWS
- DevSecOps pipeline
- Platform Engineering 2026
- Démarrer avec AWS
- IAM users, groupes, rôles
Maillage série WOW
| ← Précédent | GitLab CI avancé (WOW 36) |
| → Suivant | Buildkite agents (WOW 38) |
| Aussi | GHA OIDC AWS · DevSecOps pipeline · Platform Engineering 2026 · Démarrer avec AWS |
Meta publication (SEO)
- Title SEO : GitHub Actions reusable workflows 2026 : DRY multi-repo (guide FR)
- Meta description : GitHub Actions reusable workflows 2026 : workflow_call vs composite, org platform-workflows, secrets inherit, OIDC ca-central-1, pinning, FAQ et quiz DEH.
- Focus keyword : github actions reusable workflows
- Secondary : workflow_call, composite actions, secrets inherit, platform-workflows, OIDC GitHub Actions ca-central-1
- Image :
assets/web/devopelastichayway/cover-wow-github-actions-reusable-1200x630.webp(à générer) - Catégorie : WOW / CI-CD · Niveau : Intermédiaire
- URL cible : https://devopelastichayway.com/tutoriels/wow-github-actions-reusable/
- Post live : N/A (nouveau) · slug
wow-github-actions-reusable· Publish : READY (feu vert contenu — draft only ; Maître centralise le publish WP)
Pour aller plus loin — hubs live
Retour parcours Catalogue Tutoriels — hub de la série et leçons sœurs.