Avant toute publication (règle de l'Orchestrator)
- Donnée privée ou secret : cible
local, pas de CI vers un hébergement public (ADR 0001). - Toute publication passe par
/publier-pages:gardien-confidentialite(bloquant) etcyberagent. - Une CI qui déploie ne remplace jamais cette revue ;
noindex,nofollowsur toute page publique.
Pipeline type
Anatomie d'un workflow
| Clé | Rôle |
|---|---|
on | push, pull_request, schedule, workflow_dispatch, workflow_call |
permissions | droits du GITHUB_TOKEN (workflow ou job) |
jobs.<id>.runs-on | runner |
needs | ordre entre jobs |
steps : uses / run | action tierce / commande |
strategy.matrix, fail-fast | déclinaison de jobs |
if, timeout-minutes, concurrency | condition, durée max, exécutions simultanées |
environment | cible protégée (relecteurs, branches, secrets d'environnement) |
env, vars.X, secrets.X | variables d'environnement, variables, secrets |
Fichiers dans .github/workflows/*.yml.
Squelette sûr
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: 5make lint, make test, make build supposent un Makefile du projet. Un déploiement dépend toujours (needs) des tests.
Cache ou artefact
| Cache | Artefact | |
|---|---|---|
| But | réutiliser des dépendances | passer un résultat entre jobs / le conserver |
| Clé | key: deps-${{ hashFiles('requirements.txt') }} + restore-keys | name + path |
| Limites (d'après les pages) | 10 Go par dépôt, 7 jours sans accès, key ≤ 512 caractères | retention-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
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::VALEURpour une valeur dérivée. - Passer un secret par
env:d'un seul step, jamais parecho.
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
- uses: actions/checkout@<SHA-COMPLET-40-CARACTERES> # v4Un 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/.
grep -rn "uses:" .github/workflows | grep -v "@[0-9a-f]\{40\}"Bloc actif : la touche C copie la commande seule, sans invite ni sortie.
- 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
# À é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"| Risque | Règle |
|---|---|
${{ … }} avec titre, branche, message, corps de ticket dans run: | variable intermédiaire |
pull_request_target / workflow_run + checkout de code non fiable | ne 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ée | SHA complet |
| modification d'un workflow par un tiers | CODEOWNERS, revue |
Environnement protégé et déploiement
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-demoRè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ège | Parade |
|---|---|
| Déploiement sans tests | needs: qualite et branche protégée |
@v4 croisé pour du SHA | épingler, commenter la version |
permissions absent | contents: read en tête |
| Secret affiché dans un journal | pas d'echo, pas d'env complet, masque |
| Dossier racine téléversé en artefact | n'envoyer que dist |
| Cache partagé entre branches | les branches sœurs ne se voient pas ; clé avec hashFiles |
| Matrice trop large | chaque 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_TOKENpour 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).
- Workflow syntax (s’ouvre dans un nouvel onglet)
- Secure use reference (s’ouvre dans un nouvel onglet)
- Dependency caching reference (s’ouvre dans un nouvel onglet)
- Store and share data with workflow artifacts (s’ouvre dans un nouvel onglet)
- Automatic token authentication (s’ouvre dans un nouvel onglet)
- Managing environments for deployment (s’ouvre dans un nouvel onglet)
- Cloudflare Pages : Direct Upload avec une CI (s’ouvre dans un nouvel onglet) (2026-09-18, d'après résumé)
- ADR 0001 de l'Orchestrator (
docs/decisions/0001-cibles-de-deploiement.md)