⚡ GitHub Actions — CI/CD natif GitHub
Workflows YAML dans .github/workflows/ déclenchés par des events (push/PR/schedule/dispatch), composés de jobs et steps exécutés sur des runners (hosted ou self-hosted). :contentReference[oaicite:1]{index=1}
Vue d’ensemble
Définition, composants (workflow/job/step/action), triggers, cas d’usage.
CI/CDGitHubYAMLArchitecture & concepts
Events → workflow → jobs → steps, artifacts, caching, concurrency, permissions.
JobsStepsArtifactsWorkflow YAML
Syntaxe officielle, events, matrix, conditions, env, outputs, reusable blocks.
workflow.ymlmatrixconditionsTriggers (Events)
push / pull_request / schedule / workflow_dispatch, filtres branches/paths.
eventsfiltersscheduleActions & Marketplace
Réutiliser des actions (checkout, setup-*), marketplace, version pinning, supply chain.
MarketplaceReusePinningRéutilisation
Reusable workflows vs composite actions, templates d’org, standardisation multi-repos.
ReusableCompositeDRYRunners
GitHub-hosted vs self-hosted, labels/groups, scaling, service, durcissement réseau.
HostedSelf-hostedLabelsSécurité & secrets
Secrets repo/org/environment, env protections, OIDC (no long-lived keys), permissions.
SecretsOIDCEnvironmentsDeployments & Environments
Environments, protection rules, required reviewers, déploiements multi-cibles.
DeployApprovalsGatesBonnes pratiques
Fast vs full pipelines, artifact immuable, cache, concurrency, observabilité (logs/reports).
Best practicesCacheGatesMigration
Mapping Jenkins/Bamboo/CircleCI → GHA, stratégie progressive, pièges, checklist.
MigrationCI/CDChecklistLiens & docs
Docs officielles : getting started, syntaxe, triggers, runners, secrets, OIDC, reuse.
DocsReferenceSecurityCheat-sheet
Résumé ultra opérationnel + phrase “CV-ready” (impact recruteur).
TL;DRCVOpsGitHub Actions en 30 secondes
GitHub Actions exécute des workflows définis en YAML dans .github/workflows et déclenchés par des événements GitHub (push, pull_request, schedule, manuel, etc.). :contentReference[oaicite:2]{index=2}
Un workflow contient des jobs (souvent parallélisables) composés de steps : scripts shell et/ou actions réutilisables. La syntaxe officielle est documentée dans “Workflow syntax”. :contentReference[oaicite:3]{index=3}
Catégorisation IDEO-Lab
Diagramme “event → runner”
Event (push / PR / schedule / dispatch)
└─ Workflow (.github/workflows/*.yml)
├─ Job A (runs-on: ubuntu-latest)
│ ├─ uses: actions/checkout
│ └─ run: tests
└─ Job B (needs: Job A)
└─ deploy (environment: prod)
Objets clés
| Objet | Rôle | Exemple |
|---|---|---|
| Event | déclencheur | push, pull_request, schedule, workflow_dispatch :contentReference[oaicite:4]{index=4} |
| Workflow | orchestration | jobs + permissions + concurrency :contentReference[oaicite:5]{index=5} |
| Job | unité d’exécution | runs-on + steps + needs |
| Step | action ou script | uses: … / run: … |
| Runner | machine d’exécution | hosted ou self-hosted :contentReference[oaicite:6]{index=6} |
✅ Très pertinent si…
- Ton code est déjà sur GitHub (zéro friction : PR checks natifs).
- Tu veux du CI/CD “as code” simple à adopter par l’équipe.
- Tu veux standardiser via réutilisation (workflows réutilisables / composite actions). :contentReference[oaicite:7]{index=7}
- Tu veux sécuriser tes déploiements sans secrets longs via OIDC. :contentReference[oaicite:8]{index=8}
⚠️ Points d’attention
- Les runners self-hosted nécessitent ops + hardening (surface d’attaque). :contentReference[oaicite:9]{index=9}
- La supply chain dépend beaucoup de ton hygiène (pinning versions, permissions minimales, secrets).
- Pour les SI très régulés : réflexion réseau + isolation environnements + approbations.
Positionnement rapide (lecture DevOps)
| Plateforme | Forces | Quand préférer |
|---|---|---|
| GitHub Actions | natif GitHub, PR checks, reuse, OIDC | repos GitHub, adoption rapide |
| GitLab CI | natif GitLab, monolithique CI/CD | repos GitLab |
| Jenkins | ultra flexible | legacy + besoins très spécifiques |
| Azure DevOps | suite ALM complète | enterprise MS + governance ALM |
Modèle mental “CI productisée”
Repo
└─ .github/workflows/ci.yml
on: [push, pull_request]
jobs:
lint: ...
tests: ... (needs: lint)
build: ... (needs: tests)
deploy: ... (needs: build, environment: prod)
Jobs parallèles, dépendances explicites
- Par défaut les jobs peuvent être parallèles ; on crée des dépendances via needs.
- On garde un pipeline “fast” PR et un pipeline “full” nightly/schedule.
- Les triggers d’events sont documentés officiellement. :contentReference[oaicite:11]{index=11}
Permissions : la base de la sécurité (principe)
Pattern conseillé:
- limiter les permissions par défaut au strict nécessaire
- séparer “build/test” vs “deploy”
- secrets uniquement au job qui en a besoin (env / org / repo)
Artifacts : evidence + outputs
- Publier reports de tests, coverage, logs (debug rapide).
- Publier un artefact “release” immuable (zip, wheel, image taguée) → “build once, deploy many”.
Concurrency : éviter les doublons (principe)
Objectif:
- si 5 push sur une PR: annuler les anciens runs
- protéger “deploy prod”: un seul déploiement à la fois
Workflow syntax (référence GitHub)
GitHub documente la syntaxe YAML officielle (on/jobs/steps/env/permissions/etc.). :contentReference[oaicite:13]{index=13}
name: CI
on:
push:
branches: [ "main" ]
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: echo "hello"
Exemple Django (lint + tests)
name: Django CI
on:
pull_request:
push:
branches: [ "main" ]
jobs:
ci:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install
run: |
python -m pip install -U pip
pip install -r requirements.txt
- name: Lint + Tests
run: |
ruff check .
pytest -q --maxfail=1
Matrix (multi-versions) — concept
strategy:
matrix:
python: ["3.10","3.11","3.12"]
steps:
- uses: actions/setup-python@v5
with:
python-version: $
Conditions (if) — concept
- name: Deploy only on main
if: github.ref == 'refs/heads/main'
run: ./deploy.sh
Events officiels
GitHub liste les événements qui déclenchent les workflows (activité GitHub, schedule, events externes). :contentReference[oaicite:14]{index=14}
on:
push:
branches: [ "main" ]
pull_request:
schedule:
- cron: "0 2 * * *"
workflow_dispatch:
“uses:” = step réutilisable
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
Supply chain : “version pinning” (principe)
- Éviter
@main/@mastersur les actions critiques. - Pin sur version tag + (idéalement) digest/sha quand tu veux verrouiller.
- Limiter permissions du workflow au strict nécessaire.
Gouvernance (teams)
- Catalogue “approved actions” (liste blanche), surtout pour les repos sensibles.
- Workflows templates au niveau organisation (standardisation).
- Scan régulier des workflows (permissions/secrets/3rd party actions).
Deux outils DRY complémentaires
GitHub compare explicitement reusable workflows et composite actions : l’un réutilise un workflow complet, l’autre regroupe des steps en “mini action”. :contentReference[oaicite:15]{index=15}
| Option | Réutilise | Quand |
|---|---|---|
| Reusable workflow | workflows multi-jobs | standardiser CI/CD complète (org) |
| Composite action | suite de steps | factoriser une logique récurrente (build, scan, deploy step) |
Appeler un reusable workflow
GitHub documente l’appel via uses au niveau job (pas dans steps). :contentReference[oaicite:16]{index=16}
jobs:
ci:
uses: org/repo/.github/workflows/ci.yml@v1
Composite action
GitHub explique comment créer une composite action (pack de steps réutilisables). :contentReference[oaicite:17]{index=17}
steps:
- uses: ./.github/actions/my-composite
Hosted vs self-hosted
GitHub décrit les self-hosted runners et leur rôle (environnement custom, exécution gérée par toi). :contentReference[oaicite:18]{index=18}
| Type | Avantages | Inconvénients |
|---|---|---|
| GitHub-hosted | zéro ops, démarrage rapide | moins de contrôle, env éphémère |
| Self-hosted | réseau privé, caches persistants, toolchains | ops + sécurité + scaling |
Gestion : labels, services, lifecycle
GitHub documente la gestion des self-hosted runners (labels, config service, etc.). :contentReference[oaicite:19]{index=19}
Bonnes pratiques:
- runners dédiés "prod-deploy" (isolation)
- labels: linux-x64, docker, highmem
- runner comme service (auto-start)
- patching + rotation + monitoring
Usage YAML
jobs:
build:
runs-on: ubuntu-latest
deploy_private:
runs-on: [self-hosted, linux, prod-deploy]
Environments (dev/stage/prod)
GitHub explique les environments, leurs secrets et les règles de protection. :contentReference[oaicite:20]{index=20}
Required reviewers (approvals)
GitHub indique que les reviewers requis protègent les secrets d’environnement : un job ne peut pas accéder aux secrets tant que l’approbation n’est pas accordée. :contentReference[oaicite:21]{index=21}
Pattern:
- environment: prod
- required reviewers: Release Managers
- restrict deploy branches: main + tags v*
Exemple (concept)
jobs:
deploy_prod:
if: github.ref == 'refs/heads/main'
environment: prod
runs-on: ubuntu-latest
steps:
- run: ./deploy.sh
Secrets (repo / org / environment)
GitHub détaille la création et l’usage des secrets à plusieurs niveaux. :contentReference[oaicite:22]{index=22}
Règles:
✅ secrets jamais en clair dans le repo
✅ limiter l’accès (environments + approvals)
✅ rotation + audit
OIDC : authentifier sans secrets long-lived
GitHub Actions peut utiliser des tokens OIDC pour s’authentifier auprès de cloud providers au lieu de secrets. :contentReference[oaicite:23]{index=23}
Pattern:
- job demande un token OIDC
- trust policy côté cloud (AWS/Azure/GCP)
- permissions minimales par environnement
Environments + protection rules
GitHub recommande des protection rules sur les environments, notamment quand on les utilise avec OIDC. :contentReference[oaicite:24]{index=24}
Prod:
- required reviewers
- branches/tags autorisés
- secrets uniquement prod
Runners self-hosted : surface d’attaque
GitHub décrit les self-hosted runners et leur gestion (labels, service, etc.) : c’est à toi de sécuriser l’OS, le réseau, et les accès. :contentReference[oaicite:25]{index=25}
Hardening minimal:
- isolation réseau (VPC/subnet dédiée)
- runners dédiés prod
- patching + rotation
- monitoring + logs
Top 10 “pro”
- PR = pipeline “fast”, schedule = pipeline “full”. :contentReference[oaicite:26]{index=26}
- Limiter secrets au strict besoin (repo/env/org). :contentReference[oaicite:27]{index=27}
- Préférer OIDC aux clés statiques pour cloud. :contentReference[oaicite:28]{index=28}
- Environments + required reviewers pour prod. :contentReference[oaicite:29]{index=29}
- Pinning des actions (éviter @main sur l’essentiel).
- Runners self-hosted dédiés prod (isolation). :contentReference[oaicite:30]{index=30}
- Artifacts : reports tests + build outputs (evidence).
- Éviter doublons : concurrency/cancel previous.
- Matrix seulement si utile (coût/temps).
- Standardiser via reusable workflows / composite actions. :contentReference[oaicite:31]{index=31}
DRY & standardisation
GitHub pousse la réutilisation via reusable workflows et composite actions. :contentReference[oaicite:32]{index=32}
Pattern org:
- repo "ci-templates"
- workflows réutilisables: ci.yml, release.yml, deploy.yml
- composite actions: setup, lint, security-scan
Phrase CV-ready
Industrialisation CI/CD avec GitHub Actions : workflows YAML (events push/PR/schedule),
jobs parallélisés, standardisation via reusable workflows/composite actions, déploiements sécurisés
par environments + required reviewers, et authentification cloud via OIDC (suppression de clés statiques),
avec runners self-hosted isolés pour déploiements sensibles.
Mapping conceptuel
| Jenkins | Bamboo/CircleCI | GitHub Actions | Notes |
|---|---|---|---|
| Jenkinsfile | config.yml | workflow.yml | syntax officielle :contentReference[oaicite:33]{index=33} |
| Stages | Workflows | jobs + needs | graph explicite |
| Agents | Runners | runners hosted/self-hosted | docs runners :contentReference[oaicite:34]{index=34} |
| Shared libs | Orbs | reusable workflows / composite actions | comparatif GitHub :contentReference[oaicite:35]{index=35} |
| Credentials | Contexts | secrets repo/env/org + OIDC | secrets + OIDC :contentReference[oaicite:36]{index=36} |
Stratégie progressive
- Pilote sur 1–2 repos (non critique) → reproduire “CI identique”.
- Mettre des templates : reusable workflows + conventions.
- Définir une politique sécurité : secrets, environments, approbations.
- Basculer par lots (team/repo), puis ajouter optimisations (cache, concurrency).
- Si on-prem: déployer self-hosted runners avec hardening. :contentReference[oaicite:37]{index=37}
Pièges fréquents
- Self-hosted runner “fourre-tout” (trop de repos) → privilégier isolation par groupes/labels.
- Secrets trop exposés (au niveau repo alors que prod devrait être environment + approvals). :contentReference[oaicite:38]{index=38}
- Pas d’OIDC → accumulation de clés statiques (risque). :contentReference[oaicite:39]{index=39}
- Pas de DRY → duplication YAML, drift → passer sur reuse/composite. :contentReference[oaicite:40]{index=40}
Checklist
| Item | OK ? | Notes |
|---|---|---|
| Workflow syntax & conventions (names, structure) | ⬜ | |
| Triggers (PR fast, schedule full) | ⬜ | |
| Reusable workflows / composite actions (DRY) | ⬜ | |
| Secrets repo/env/org + approvals prod | ⬜ | |
| OIDC cloud auth (no long-lived keys) | ⬜ | |
| Runners : hosted vs self-hosted, labels, hardening | ⬜ | |
| Artifacts (reports + build outputs) + rollback plan | ⬜ |
Docs GitHub
- Getting started / Understanding Actions
- Workflow syntax (YAML)
- Events that trigger workflows
- Self-hosted runners (overview)
- Managing self-hosted runners
- Reusing workflow configurations
- Creating a composite action
- Environments & deployment protections
- Using secrets
- OpenID Connect (OIDC)
- OIDC in cloud providers (security hardening)
TL;DR
GitHub Actions = CI/CD natif GitHub
Core:
- workflows YAML dans .github/workflows/ (event-driven) :contentReference[oaicite:41]{index=41}
- jobs/steps + actions réutilisables (uses:)
- runners: GitHub-hosted ou self-hosted :contentReference[oaicite:42]{index=42}
Enterprise/Sec:
- secrets repo/env/org :contentReference[oaicite:43]{index=43}
- environments + protection rules + required reviewers :contentReference[oaicite:44]{index=44}
- OIDC pour cloud auth sans clés longues :contentReference[oaicite:45]{index=45}
Standardisation:
- reusable workflows vs composite actions :contentReference[oaicite:46]{index=46}
