Introduction Technique
GitHub Actions est la plateforme d'automatisation CI/CD native intégrée à GitHub. Elle permet de définir, dans des fichiers YAML versionnés au sein même du dépôt, des workflows répondant à tout événement GitHub : push, pull request, release, planification, ou déclenchement manuel. Les workflows s'exécutent sur des runners — machines éphémères hébergées par GitHub ou auto-hébergées — qui orchestrent des séquences de jobs composés de steps.
L'architecture événementielle de GitHub Actions élimine tout serveur CI externe. La définition des pipelines est colocalisée avec le code source, assurant une traçabilité totale, une revue de code des pipelines eux-mêmes, et une cohérence entre le cycle de vie du code et celui des automatisations.
┌────────────────────────────────────────────────────────────────────┐
│ MODÈLE ÉVÉNEMENT → WORKFLOW → JOB → STEP │
└────────────────────────────────────────────────────────────────────┘
DÉPÔT GIT
┌─────────────────────────────────────────────────────────────────┐
│ git push origin main │
│ → Event: push (ref: refs/heads/main) ① │
└──────────────────────────┬──────────────────────────────────────┘
│
▼
WORKFLOW (.github/workflows/ci.yml)
┌─────────────────────────────────────────────────────────────────┐
│ on: push │
│ branches: [main] │
│ ② N Jobs instanciés │
│ ┌─────────────────┐ ┌─────────────────┐ ┌──────────────┐ │
│ │ Job: build │ │ Job: test │ │ Job: deploy │ │
│ │ (runs-on: │ │ (needs: build) │ │ (needs: test)│ │
│ │ ubuntu-latest) │ │ │ │ │ │
│ └────────┬────────┘ └────────┬────────┘ └──────┬───────┘ │
└───────────┼──────────────────────┼──────────────────┼──────────┘
│ ③ Runner │ │
▼ ▼ ▼
┌───────────────────┐ ┌───────────────────┐ ┌────────────────┐
│ Runner Ubuntu │ │ Runner Ubuntu │ │ Runner Ubuntu │
│ ④ Steps : │ │ ④ Steps : │ │ ④ Steps : │
│ 1. checkout │ │ 1. checkout │ │ 1. checkout │
│ 2. setup-node │ │ 2. npm test │ │ 2. deploy.sh │
│ 3. npm install │ │ 3. upload report │ │ │
│ 4. npm run build │ │ │ │ │
│ 5. upload artifact│ │ │ │ │
└───────────────────┘ └───────────────────┘ └────────────────┘
Jobs build et test : PARALLÈLES (pas de needs commun)
Job deploy : SÉQUENTIEL (needs: [test])
Architecture Conceptuelle
GitHub Actions s'articule autour de quatre couches : la couche événementielle (triggers), la couche d'orchestration (workflows/jobs), la couche d'exécution (runners), et la couche d'actions (composants réutilisables). Ces couches interagissent via l'API GitHub et le protocole de communication runner.
┌────────────────────────────────────────────────────────────────────┐
│ ARCHITECTURE GITHUB ACTIONS │
└────────────────────────────────────────────────────────────────────┘
GITHUB PLATFORM
┌────────────────────────────────────────────────────────────────┐
│ │
│ ① Events ② Actions Service │
│ ┌─────────────────┐ ┌─────────────────────────────────┐ │
│ │ push │────►│ Workflow Engine │ │
│ │ pull_request │ │ ┌────────────────────────────┐ │ │
│ │ schedule │ │ │ Parser YAML │ │ │
│ │ workflow_dispatch│ │ │ DAG resolver (needs:) │ │ │
│ │ release │ │ │ Matrix expansion │ │ │
│ │ repository_dispatch│ │ │ Context injection │ │ │
│ └─────────────────┘ │ └────────────────────────────┘ │ │
│ └────────────┬────────────────────┘ │
│ │ ④ Job dispatch │
│ ⑤ Storage │ │
│ ┌─────────────────┐ ▼ │
│ │ Artifacts store │ ┌──────────────────────────────────┐ │
│ │ Cache store │◄───│ Runner Registration Service │ │
│ │ (S3-like) │ │ ③ runners poll via HTTPS │ │
│ └─────────────────┘ └──────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────┘
│
┌─────────────────────┼─────────────────────┐
▼ ▼ ▼
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ GitHub-Hosted │ │ Self-Hosted │ │ Larger Runners │
│ Runner │ │ Runner │ │ (4-64 cores) │
│ ubuntu-latest │ │ On-premise │ │ GPU-enabled │
│ windows-latest │ │ Cloud (EC2/GKE) │ │ Custom images │
│ macos-latest │ │ Kubernetes │ │ Private network │
└──────────────────┘ └──────────────────┘ └──────────────────┘
│ │
└──────────┬──────────┘
│ ⑥ Status + Logs
▼
┌──────────────────────┐
│ GitHub UI / API │
│ Actions tab │
│ PR checks │
│ Deployment API │
└──────────────────────┘
┌────────────────────────────────────────────────────────────────────┐
│ CYCLE DE VIE D'UN WORKFLOW RUN │
└────────────────────────────────────────────────────────────────────┘
Event triggered
│
▼
┌──────────┐ ① ┌──────────────┐ ② ┌────────────────┐
│ Queued │─────────►│ In Progress │──────────►│ Completed │
└──────────┘ └──────────────┘ │ │
│ ✅ success │
│ runner offline │ ❌ failure │
▼ │ ⚠ cancelled │
┌──────────────┐ │ ⏭ skipped ④ │
│ Waiting ⑤ │ └────────────────┘
│ (env review) │
└──────────────┘
CONCLUSION D'UN JOB :
─────────────────────────────────────────────────────────────────
result → success | failure | cancelled | skipped
outcome → idem (avant continue-on-error)
conclusion → idem (après continue-on-error)
ÉTATS D'UN STEP :
─────────────────────────────────────────────────────────────────
✅ success → step exécuté sans erreur (exit code 0)
❌ failure → step échoué (exit code ≠ 0)
⏭ skipped → condition if: évaluée false
⏱ cancelled → workflow annulé pendant l'exécution
ENCHAÎNEMENT CONDITIONNEL :
─────────────────────────────────────────────────────────────────
if: success() → défaut, step précédent OK
if: failure() → exécuter si échec précédent
if: always() → toujours exécuter (cleanup)
if: cancelled() → si workflow annulé
if: steps.build.outcome == 'success' → état step précis
Concepts Fondamentaux
La compréhension approfondie de GitHub Actions repose sur six primitives : les Workflows, les Jobs, les Steps, les Actions, les Contexts et les Secrets/Variables. Leur interaction structure l'intégralité des pipelines CI/CD.
▋
┌────────────────────────────────────────────────────────────────────┐
│ STRATÉGIE MATRIX — PARALLÉLISATION │
└────────────────────────────────────────────────────────────────────┘
DÉFINITION ①
┌──────────────────────────────────────────────────────────────┐
│ strategy: │
│ fail-fast: false │
│ matrix: │
│ os: [ubuntu-latest, windows-latest, macos-latest] │
│ node: [18, 20, 22] │
│ exclude: │
│ - os: windows-latest │
│ node: 18 │
│ include: │
│ - os: ubuntu-latest │
│ node: 22 │
│ experimental: true │
└──────────────────────────────────────────────────────────────┘
│
▼ ② Expansion automatique (8 jobs)
┌──────────────────────────────────────────────────────────────┐
│ │
│ ubuntu / node18 ──► ✅ ubuntu / node20 ──► ✅ │
│ ubuntu / node22 ──► ✅ windows / node20 ──► ✅ │
│ windows / node22 ──► ✅ macos / node18 ──► ✅ │
│ macos / node20 ──► ✅ macos / node22 ──► ✅ │
│ │
│ ③ Exécution en PARALLÈLE sur runners indépendants │
└──────────────────────────────────────────────────────────────┘
│
▼ ④ Agrégation
┌──────────────────────────────────────────────────────────────┐
│ Job parent attend completion de tous les jobs matrix │
│ needs: [test-matrix] │
│ → success si tous success (ou fail-fast: false) │
└──────────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────────────────┐
│ CONTEXTES GITHUB ACTIONS │
└────────────────────────────────────────────────────────────────────┘
① CONTEXTES DISPONIBLES
──────────────────────────────────────────────────────────────────
github.* Métadonnées du run et du dépôt
┌──────────────────────────────────────────────────────────────┐
│ github.sha → commit SHA (abc123...) │
│ github.ref → refs/heads/main │
│ github.event_name → push | pull_request | ... │
│ github.actor → username déclencheur │
│ github.repository → org/repo │
│ github.run_id → ID unique du run │
└──────────────────────────────────────────────────────────────┘
env.* Variables d'environnement (workflow/job/step)
secrets.* Secrets chiffrés (masqués dans les logs)
vars.* Variables de configuration (non sensibles)
inputs.* Inputs workflow_dispatch / workflow_call
steps.<id>.* Sorties des steps précédents
② EXPRESSION SYNTAX
──────────────────────────────────────────────────────────────────
{{github.sha }} → valeur simple
{{secrets.DOCKER_PASSWORD }} → secret injecté
{{env.NODE_VERSION }} → variable env
{{steps.build.outputs.version }} → output d'un step
{{matrix.os }} → valeur matrix courante
③ PRIORITÉ (du plus spécifique au plus général)
──────────────────────────────────────────────────────────────────
Step env → Job env → Workflow env → Repository vars
▋Architecture Technique Détaillée
L'infrastructure d'exécution de GitHub Actions repose sur des runners qui établissent une connexion HTTPS longue durée (long-polling) avec le service Actions de GitHub. Le runner récupère les jobs via ce canal, les exécute dans un environnement isolé, et remonte les logs en temps réel.
┌────────────────────────────────────────────────────────────────────┐ │ RUNNERS GITHUB-HOSTED — SPÉCIFICATIONS │ └────────────────────────────────────────────────────────────────────┘ TYPE OS IMAGE vCPU RAM STOCKAGE ────────────────────────────────────────────────────────────────── ubuntu-latest Ubuntu 24.04 LTS 2 7 GB 14 GB SSD ubuntu-22.04 Ubuntu 22.04 LTS 2 7 GB 14 GB SSD windows-latest Windows Server 2022 2 7 GB 14 GB SSD macos-latest macOS 14 Sonoma 3 14 GB 14 GB SSD macos-13 macOS 13 Ventura 3 14 GB 14 GB SSD PLUS GRANDS RUNNERS (GitHub Team/Enterprise) ────────────────────────────────────────────────────────────────── ubuntu-4-cores 4 vCPU 16 GB 100 GB ubuntu-8-cores 8 vCPU 32 GB 100 GB ubuntu-16-cores 16 vCPU 64 GB 100 GB ubuntu-64-cores 64 vCPU 256 GB 2000 GB OUTILS PRÉ-INSTALLÉS (ubuntu-latest) ────────────────────────────────────────────────────────────────── ① Docker Engine (BuildKit activé) ④ Node.js (NVM) ① kubectl, helm ④ Python, Java, Go, .NET ① aws-cli, azure-cli, gcloud ④ git, jq, curl, wget ② Réseau : IP publique éphémère ⑤ ~500 outils courants ISOLATION ③ ────────────────────────────────────────────────────────────────── Chaque job → VM fraîche (image snapshot restaurée) Durée max → 6h (standard) / 35 jours (self-hosted) Workspace → /home/runner/work/<repo>/<repo>/ Nettoyage → automatique post-job (aucune persistance)
┌────────────────────────────────────────────────────────────────────┐ │ SELF-HOSTED RUNNERS — ARCHITECTURE │ └────────────────────────────────────────────────────────────────────┘ MODE VM / BARE METAL ┌────────────────────────────────────────────────────────────────┐ │ ① Runner Agent (./run.sh) │ │ │ │ │ │ HTTPS long-polling → api.github.com/actions/runner │ │ │ │ │ ▼ ② Job assigné (JITC = Just-In-Time Config) │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ Worker process │ │ │ │ → télécharge actions depuis github.com │ │ │ │ → exécute steps dans le répertoire workspace │ │ │ │ → stream logs vers GitHub │ │ │ └──────────────────────────────────────────────────────────┘ │ └────────────────────────────────────────────────────────────────┘ MODE KUBERNETES — Actions Runner Controller (ARC) ⑤ ┌────────────────────────────────────────────────────────────────┐ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ ARC Controller (Deployment) │ │ │ │ Watches RunnerSet CRD │ │ │ └─────────────────────┬───────────────────────────────────┘ │ │ │ crée │ │ ▼ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Runner │ │ Runner │ │ Runner │ │ Runner │ │ │ │ Pod 1 │ │ Pod 2 │ │ Pod 3 │ │ Pod N │ │ │ │(ephémère)│ │(ephémère)│ │(ephémère)│ │ auto- │ │ │ └──────────┘ └──────────┘ └──────────┘ │ scale │ │ │ └──────────┘ │ │ Autoscaling : 0 → N pods selon la charge de la queue │ └────────────────────────────────────────────────────────────────┘ LABELS RUNNERS (ciblage dans workflows) ────────────────────────────────────────────────────────────────── runs-on: [self-hosted, linux, x64, gpu] runs-on: [self-hosted, production, high-memory]
Mise en Place
▋▋Configuration
▋
┌────────────────────────────────────────────────────────────────────┐
│ HIÉRARCHIE DES SECRETS ET VARIABLES │
└────────────────────────────────────────────────────────────────────┘
ORGANISATION (github.com/org)
┌─────────────────────────────────────────────────────────────────┐
│ ② Secrets d'organisation │
│ DOCKER_HUB_TOKEN, NPM_TOKEN, SLACK_WEBHOOK │
│ Visibilité : tous repos | repos sélectionnés | repos privés │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ REPOSITORY (github.com/org/repo) │ │
│ │ │ │
│ │ ① Secrets de repository │ │
│ │ KUBE_CONFIG_DEV, API_KEY_STG │ │
│ │ │ │
│ │ ┌────────────────────────────────────────────────────┐ │ │
│ │ │ ENVIRONMENT: production │ │ │
│ │ │ │ │ │
│ │ │ ③ Secrets d'environnement │ │ │
│ │ │ KUBE_CONFIG_PROD (surcharge le secret repo) │ │ │
│ │ │ DB_PASSWORD_PROD │ │ │
│ │ │ │ │ │
│ │ │ Protection rules : │ │ │
│ │ │ • Required reviewers (2 personnes min) │ │ │
│ │ │ • Wait timer: 5 minutes │ │ │
│ │ │ • Allowed branches: main, release/* │ │ │
│ │ └────────────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
ACCÈS DANS LES WORKFLOWS :
{{secrets.DOCKER_HUB_TOKEN }} → org ou repo
{{secrets.KUBE_CONFIG_PROD }} → environment (si job dans env production)
{{vars.NODE_VERSION }} → variable non sensible (visible dans logs)
Cas d'Usage Professionnels
┌────────────────────────────────────────────────────────────────────┐
│ PIPELINE CI/CD PRODUCTION — GITHUB ACTIONS │
└────────────────────────────────────────────────────────────────────┘
TRIGGER: push to main / tag v*.*.*
────────────────────────────────────────────────────────────────
┌──────────────────────────────────────────────────────────────┐
│ JOB: build ① │
│ docker buildx build --platform linux/amd64,linux/arm64 │
│ → ghcr.io/org/app:{{github.sha }} │
└──────────────────────────────────┬───────────────────────────┘
│ needs: build
┌─────────────────────┼─────────────────────┐
▼ ▼ ▼
┌────────────────────┐ ┌────────────────────┐ ┌────────────────────┐
│ JOB: unit-tests ②│ │ JOB: integration ②│ │ JOB: security-scan③│
│ npm test │ │ docker compose up │ │ trivy image │
│ --coverage │ │ npm run test:int │ │ docker scout cves │
│ Upload: Codecov │ │ │ │ SARIF → GitHub │
└──────────┬─────────┘ └──────────┬──────────┘ └─────────┬──────────┘
└─────────────────┬─────┘ │
needs: [unit-tests, integration, │
security-scan] │
└──────────────────────────────┘
│
▼
┌──────────────────────┐
│ JOB: push-registry ④│
│ docker push │
│ cosign sign │
│ sbom attest │
└──────────┬────────────┘
│
┌──────────▼────────────┐
│ JOB: deploy-staging ⑤│
│ helm upgrade staging │
│ environment: staging │
└──────────┬────────────┘
│
┌──────────▼────────────┐
│ JOB: smoke-tests ⑥ │
│ curl health endpoints │
│ playwright e2e subset │
└──────────┬────────────┘
│ only on tag v*
┌──────────▼────────────┐
│ JOB: deploy-prod ⑦ │
│ environment: production│
│ ⏳ Manual approval │
│ helm upgrade prod │
└───────────────────────┘
▋Bonnes Pratiques Professionnelles
▋Anti-patterns et Erreurs Fréquentes
┌────────────────────────────────────────────────────────────────────┐
│ ANTI-PATTERNS GITHUB ACTIONS — RÉFÉRENCE │
└────────────────────────────────────────────────────────────────────┘
❌ CRITIQUE — Risques Sécurité
┌──────────────────────────────────────────────────────────────┐
│ 1. Actions tierces sans SHA pinning │
│ Risque : compromission de la chaîne de supply │
│ Fix : uses: actions/checkout@<SHA_COMPLET> │
├──────────────────────────────────────────────────────────────┤
│ 2. Script injection via github.event inputs │
│ # ❌ VULNÉRABLE : │
│ run: echo "{{github.event.pull_request.title }}" │
│ # ✅ SÉCURISÉ : │
│ env: │
│ PR_TITLE: {{github.event.pull_request.title }} │
│ run: echo "$PR_TITLE" │
├──────────────────────────────────────────────────────────────┤
│ 3. permissions: write-all (ou absentes = write par défaut) │
│ Risque : compromission totale du repo si runner compromis │
│ Fix : permissions explicites et minimales │
├──────────────────────────────────────────────────────────────┤
│ 4. Secrets affichés dans les logs (echo $SECRET) │
│ Risque : exposition dans l'historique des runs │
│ Fix : GitHub masque automatiquement — ne pas exporter │
└──────────────────────────────────────────────────────────────┘
⚠ MAJEUR — Maintenabilité et Performance
┌──────────────────────────────────────────────────────────────┐
│ 5. Duplication YAML entre workflows (no reuse) │
│ Fix : Reusable Workflows + Composite Actions │
├──────────────────────────────────────────────────────────────┤
│ 6. Pas de cache pour les dépendances │
│ Impact : +3-10 min par run sur npm install / pip install │
│ Fix : actions/cache ou cache: intégré de setup-* │
├──────────────────────────────────────────────────────────────┤
│ 7. Secrets statiques AWS/GCP en lieu de OIDC │
│ Impact : rotation manuelle, risque de fuite long-lived │
│ Fix : aws-actions/configure-aws-credentials + OIDC │
└──────────────────────────────────────────────────────────────┘
⚡ OPÉRATIONNEL
┌──────────────────────────────────────────────────────────────┐
│ 8. Absence de timeout-minutes → run bloqué 6h │
│ 9. Pas de continue-on-error sur steps non critiques │
│ 10. Artifacts sans retention-days → stockage illimité │
│ 11. Pas de concurrency → déploiements simultanés conflictuels│
└──────────────────────────────────────────────────────────────┘
Sécurité
┌────────────────────────────────────────────────────────────────────┐
│ SÉCURITÉ GITHUB ACTIONS — DÉFENSE EN PROFONDEUR │
└────────────────────────────────────────────────────────────────────┘
① GITHUB_TOKEN — PERMISSIONS
┌──────────────────────────────────────────────────────────────┐
│ Token éphémère généré par GitHub pour chaque run │
│ │
│ Scope Lecture Écriture │
│ ────────────────────────────────────────── │
│ contents ✅ ❌ (par défaut read-only) │
│ pull-requests ✅ ❌ │
│ packages ✅ ❌ │
│ id-token ❌ ❌ (à activer explicitement)│
│ │
│ Bonne pratique : permissions: { contents: read } au minimum│
└──────────────────────────────────────────────────────────────┘
② SUPPLY CHAIN — Actions tierces
┌──────────────────────────────────────────────────────────────┐
│ SHA pinning : uses: owner/action@<SHA40> │
│ Dependabot pour les mises à jour d'actions │
│ OpenSSF Scorecard : audit automatisé des dépendances │
└──────────────────────────────────────────────────────────────┘
③ OIDC — Authentification sans secrets statiques
┌──────────────────────────────────────────────────────────────┐
│ GitHub émet un JWT signé → présenté au cloud provider │
│ AWS / Azure / GCP / Vault acceptent via OIDC federation │
│ Token TTL : 1h maximum, non réutilisable │
│ Condition : repo + environment + branch dans le claim │
└──────────────────────────────────────────────────────────────┘
④ ENVIRONNEMENTS PROTÉGÉS
┌──────────────────────────────────────────────────────────────┐
│ Required reviewers (approbation manuelle) │
│ Wait timer (délai de déploiement) │
│ Deployment branches (branches autorisées) │
│ Custom deployment protection rules (webhooks) │
└──────────────────────────────────────────────────────────────┘
⑤ AUDIT
┌──────────────────────────────────────────────────────────────┐
│ GitHub Audit Log : toute action sur secrets/environments │
│ SARIF upload : résultats scan → Security tab GitHub │
│ CodeQL Analysis : SAST intégré nativement │
└──────────────────────────────────────────────────────────────┘
▋Observabilité et Exploitation
┌────────────────────────────────────────────────────────────────────┐
│ OBSERVABILITÉ GITHUB ACTIONS — PRODUCTION │
└────────────────────────────────────────────────────────────────────┘
① LOGS NATIFS
┌──────────────────────────────────────────────────────────────┐
│ Rétention : 90 jours (public) / 400 jours (Enterprise) │
│ Download : Actions API /repos/{owner}/{repo}/actions/runs/ │
│ Debug logging : ACTIONS_STEP_DEBUG=true (secret) │
│ Runner diagnostic : ACTIONS_RUNNER_DEBUG=true │
└──────────────────────────────────────────────────────────────┘
② RAPPORTS SÉCURITÉ (SARIF)
┌──────────────────────────────────────────────────────────────┐
│ - name: Upload SARIF │
│ uses: github/codeql-action/upload-sarif@v3 │
│ with: │
│ sarif_file: trivy-results.sarif │
│ → Visible dans Security > Code scanning alerts │
└──────────────────────────────────────────────────────────────┘
③ MÉTRIQUES VIA API REST
┌──────────────────────────────────────────────────────────────┐
│ GET /repos/{owner}/{repo}/actions/runs │
│ → status, conclusion, created_at, updated_at │
│ → billing: GET /repos/{owner}/{repo}/actions/billing │
│ │
│ Métriques clés à monitorer : │
│ • workflow_run.duration_ms (temps de build) │
│ • workflow_run.conclusion (success rate) │
│ • billing.total_minutes_used (coût CI) │
└──────────────────────────────────────────────────────────────┘
④ NOTIFICATIONS — Intégration Slack
┌──────────────────────────────────────────────────────────────┐
│ - name: Notify Slack on failure │
│ if: failure() │
│ uses: slackapi/slack-github-action@v1.27.0 │
│ with: │
│ channel-id: 'C0123456789' │
│ slack-message: App deployment failed │
└──────────────────────────────────────────────────────────────┘
⑤ OPENTELEMETRY — Traces de pipeline
┌──────────────────────────────────────────────────────────────┐
│ uses: inception-health/otel-export-trace-action@v0.1.0 │
│ → Envoie les traces vers Jaeger/Tempo/Honeycomb │
│ → Visualisation du pipeline comme distributed trace │
└──────────────────────────────────────────────────────────────┘
Intégration dans l'Écosystème DevOps
┌────────────────────────────────────────────────────────────────────┐
│ GITHUB ACTIONS DANS L'ÉCOSYSTÈME DEVOPS │
└────────────────────────────────────────────────────────────────────┘
① CODE ② CI (GitHub Actions) ③ REGISTRY
───────── ───────────────────────── ──────────────
┌─────────┐ push ┌──────────────────────────┐ ┌─────────────┐
│ Dev │───────►│ Workflow CI/CD │──►│ GHCR / ECR │
│ PR │ │ 1. lint + test │ │ Harbor │
└─────────┘ │ 2. docker buildx │ │ cosign sign │
│ 3. trivy scan │ └──────┬──────┘
│ 4. push + sign │ │
└──────────────────────────┘ │
│ ④ ArgoCD poll
INTÉGRATIONS NATIVES : ▼
───────────────────────────────────────────── ┌──────────────┐
│ ArgoCD │
Terraform → hashicorp/setup-terraform │ (GitOps CD) │
Ansible → workflow_dispatch + SSH └──────┬───────┘
Docker → docker/build-push-action │
Kubernetes → azure/k8s-deploy ▼
Helm → azure/setup-helm ┌──────────────┐
AWS → aws-actions/configure-aws │ Kubernetes │
Azure → azure/login │ Cluster │
GCP → google-github-actions/auth └──────┬───────┘
Vault → hashicorp/vault-action │
Slack → slackapi/slack-github-action ⑥ Observabilité
Sonar → SonarSource/sonarcloud-github │
Snyk → snyk/actions Prometheus / Grafana
Codecov → codecov/codecov-action Loki / Jaeger
ACTIONS MARKETPLACE :
─────────────────────────────────────────────────────────────────
> 21 000 actions disponibles sur marketplace.github.com
Critères de sélection : Verified creator + SHA pinning + Stars
Exercices Pratiques
- ▸Créer un workflow CI Node.js avec lint, test et coverage
- ▸Configurer une stratégie matrix pour 3 versions de Node
- ▸Mettre en place le cache npm avec actions/cache
- ▸Publier une image Docker sur GHCR depuis un workflow
- ▸Créer une Composite Action réutilisable pour le build Docker
- ▸Implémenter un Reusable Workflow de déploiement multi-env
- ▸Configurer des environnements protégés avec reviewers obligatoires
- ▸Mettre en place l'authentification OIDC vers AWS (sans secrets)
- ▸Déployer Actions Runner Controller (ARC) sur Kubernetes
- ▸Construire un pipeline complet avec SBOM, cosign et SLSA Level 3
- ▸Implémenter OpenTelemetry sur les workflows GitHub Actions
- ▸Auditer et corriger une supply chain compromise (SHA pinning + Scorecard)
Résumé Technique
┌────────────────────────────────────────────────────────────────────┐
│ RÉSUMÉ TECHNIQUE GITHUB ACTIONS │
└────────────────────────────────────────────────────────────────────┘
PRIMITIVES
─────────────────────────────────────────────────────────────────
Workflow → Fichier YAML dans .github/workflows/
Event → Déclencheur (push, PR, schedule, dispatch...)
Job → Ensemble de steps sur un runner
Step → Action ou commande run (séquentiel dans le job)
Runner → Machine d'exécution (GitHub-hosted ou self-hosted)
Action → Composant réutilisable (uses:)
Context → Variables d'exécution ({{github.* }})
Secret → Variable chiffrée ({{secrets.* }})
Environment → Cible de déploiement avec protection rules
Artifact → Fichier persisté inter-jobs ou pour download
EVENTS PRINCIPAUX
─────────────────────────────────────────────────────────────────
push → commit poussé
pull_request → PR ouverte/mise à jour/mergée
schedule → CRON (ex: '0 2 * * *')
workflow_dispatch → déclenchement manuel avec inputs
workflow_call → appelé depuis un autre workflow
release → publication d'une release
repository_dispatch → webhook externe
SÉCURITÉ — CHECKLIST PRODUCTION
─────────────────────────────────────────────────────────────────
✅ SHA pinning sur toutes les actions tierces
✅ permissions: explicites et minimales (contents: read)
✅ OIDC pour AWS/Azure/GCP (0 secret statique cloud)
✅ Script injection évité (variables env intermédiaires)
✅ Environments protégés avec reviewers (production)
✅ Dependabot pour les mises à jour des actions
✅ SARIF upload pour les résultats de scan
✅ concurrency: défini par branche/PR
✅ timeout-minutes défini sur chaque job
✅ Secrets d'environnement séparés des secrets de repo