Aller au contenu
Sommaire

Fiche mémo CI/CD avec GitHub Actions

Fiche mémo · environ 5 min de lecture

Validé

Validé. Ce site n’exécute aucune commande. 3 points non vérifiés · Sources

Avant toute publication (règle de l'Orchestrator)

  1. Donnée privée ou secret : cible local, pas de CI vers un hébergement public (ADR 0001).
  2. Toute publication passe par /publier-pages : gardien-confidentialite (bloquant) et cyberagent.
  3. Une CI qui déploie ne remplace jamais cette revue ; noindex,nofollow sur toute page publique.

Pipeline type

Schéma : un push ou une pull request déclenche un workflow ; le job qualité (lint et tests) est un premier contrôle ; le job build produit un artefact ; un environnement protégé exige une approbation, second contrôle, avant le job de déploiement.push ou pull requestWorkflow YAMLJob qualitélint + tests : contrôle 1Job build (needs)jeton en lecture seuleArtefact (dist)Environnement protégéapprobation : contrôle 2Job déploiementsecret de l'environnement
Pipeline GitHub Actions avec deux points de contrôle : tests et approbation d'environnement (schéma simplifié).

Anatomie d'un workflow

CléRôle
onpush, pull_request, schedule, workflow_dispatch, workflow_call
permissionsdroits du GITHUB_TOKEN (workflow ou job)
jobs.<id>.runs-onrunner
needsordre entre jobs
steps : uses / runaction tierce / commande
strategy.matrix, fail-fastdéclinaison de jobs
if, timeout-minutes, concurrencycondition, durée max, exécutions simultanées
environmentcible protégée (relecteurs, branches, secrets d'environnement)
env, vars.X, secrets.Xvariables d'environnement, variables, secrets

Fichiers dans .github/workflows/*.yml.

Squelette sûr

YAML
name: ci
on:
  pull_request:
  push:
    branches: [main]

permissions:
  contents: read

concurrency:
  group: ci-${{ github.ref }}
  cancel-in-progress: true

jobs:
  qualite:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@<SHA-COMPLET-40-CARACTERES> # v4
      - run: make lint
      - run: make test

  build:
    needs: qualite
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@<SHA-COMPLET-40-CARACTERES> # v4
      - run: make build
      - uses: actions/upload-artifact@<SHA-COMPLET-40-CARACTERES> # v4
        with:
          name: site-demo
          path: dist
          retention-days: 5

make lint, make test, make build supposent un Makefile du projet. Un déploiement dépend toujours (needs) des tests.

Cache ou artefact

CacheArtefact
Butréutiliser des dépendancespasser un résultat entre jobs / le conserver
Clékey: deps-${{ hashFiles('requirements.txt') }} + restore-keysname + path
Limites (d'après les pages)10 Go par dépôt, 7 jours sans accès, key ≤ 512 caractèresretention-days plafonné par dépôt/organisation

Attention : ni secret, ni jeton, ni .env dans un cache ou un artefact (lisibles par quiconque lit le dépôt). Téléverser dist, pas la racine.

GITHUB_TOKEN

YAML
permissions:
  contents: read

jobs:
  commentaire:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    steps:
      - run: echo "Seul ce job peut commenter"

Lecture seule en tête, élargir par job. Réglage des permissions par défaut du dépôt : chemin de menu non vérifié.

Secrets et variables

  • Variables (vars) pour le non sensible ; secrets (secrets) pour le reste ; secrets d'environnement pour le déploiement.
  • Un secret par valeur (pas de JSON/YAML en secret) ; moindre privilège ; ::add-mask::VALEUR pour une valeur dérivée.
  • Passer un secret par env: d'un seul step, jamais par echo.

Attention : un secret n'est jamais dans le dépôt, un fichier de workflow, un cache, un artefact ni un journal. Le masquage des journaux est un filet de sécurité, pas une garantie. Secrets locaux de Stéphane : Trousseau macOS (bin/secret).

Supply chain : épingler par SHA

YAML
      - uses: actions/checkout@<SHA-COMPLET-40-CARACTERES> # v4

Un tag peut être déplacé ; un SHA complet identifie un contenu précis. Relever le SHA sur le dépôt de l'auteur, le noter avec la version. Compléter par Dependabot, revue des dépendances et CODEOWNERS sur .github/workflows/.

Terminal
grep -rn "uses:" .github/workflows | grep -v "@[0-9a-f]\{40\}"
  • Contexte : Terminal, racine du dépôt de test ; les actions locales (./) apparaissent et sont normales.
  • Droits : utilisateur normal, lecture seule.
  • Effet : liste les uses: non épinglés par un SHA de 40 caractères ; ne modifie rien.
  • Vérification : liste vide (hors actions locales) = tout est épinglé.
  • Retour arrière : sans objet.

Injection de script et pull_request_target

YAML
      # À éviter : donnée tierce injectée dans le script
      - run: echo "${{ github.event.pull_request.title }}"

      # Préférable : variable d'environnement intermédiaire
      - env:
          TITRE: ${{ github.event.pull_request.title }}
        run: echo "$TITRE"
RisqueRègle
${{ … }} avec titre, branche, message, corps de ticket dans run:variable intermédiaire
pull_request_target / workflow_run + checkout de code non fiablene jamais extraire ni exécuter le code de la PR
runner auto-hébergé sur dépôt public« presque jamais » ; préférer des runners éphémères
action tierce non épingléeSHA complet
modification d'un workflow par un tiersCODEOWNERS, revue

Environnement protégé et déploiement

YAML
  deploiement:
    needs: [qualite, build]
    runs-on: ubuntu-latest
    environment: production
    permissions:
      contents: read
    steps:
      - uses: actions/download-artifact@<SHA-COMPLET-40-CARACTERES> # v5
        with:
          name: site-demo

Règles possibles : relecteurs (jusqu'à 6), temporisation, branches autorisées, contournement des administrateurs. GitHub Free : environnements limités aux dépôts publics (d'après la page) ; offre de Stéphane à vérifier.

Cloudflare Pages en renvoi (cours « Cloudflare ») : deux secrets (identifiant de compte, jeton d'API limité à Pages), commande pages deploy <DOSSIER> --project-name=<NOM-PROJET>. Paramètres exacts de l'action : à relire sur la page.

Pièges fréquents

PiègeParade
Déploiement sans testsneeds: qualite et branche protégée
@v4 croisé pour du SHAépingler, commenter la version
permissions absentcontents: read en tête
Secret affiché dans un journalpas d'echo, pas d'env complet, masque
Dossier racine téléversé en artefactn'envoyer que dist
Cache partagé entre branchesles branches sœurs ne se voient pas ; clé avec hashFiles
Matrice trop largechaque combinaison consomme des minutes

Points non vérifiés

  • Offre GitHub de Stéphane, quotas, prix ; image ubuntu-latest ; versions courantes des actions.
  • Fichier de verrouillage des dépendances de workflow ; secrets et GITHUB_TOKEN pour les forks ; chemins de menus.
  • Paramètres de l'action Cloudflare ; versions de wrangler : inconnues.

Sources

Toutes consultées le 18 octobre 2026 (service sans numéro de version ; dates de page non relevées sauf mention).