Créer des flux de travail fiables - sorties, contextes, déclencheurs et transferts inter-tâches

Effectué

Dans cette unité, vous allez apprendre :

  • Comment transmettre des données à travers des flux de travail au moyen des sorties d’étape et de tâche

  • Comment utiliser des contextes GitHub pour la configuration et le contrôle

  • Guide pratique pour concevoir des flux de travail avec des déclencheurs sécurisés et un gating défensif

  • Comment garantir que les flux de travail s’exécutent uniquement dans le contexte correct

  • Comment créer des flux de travail fiables à l’aide de données structurées et d’une logique d’événement

L’autonomie doit être conçue, non supposée

Différentes tâches présentent différents risques. Une bonne architecture d’agent utilise une stratégie pour exprimer différents niveaux d’autonomie plutôt que d’appliquer les mêmes règles partout.

Un modèle d’autonomie simple basé sur les risques peut ressembler à ceci :

Type de tâche Exemples de chemins d’accès Niveau de risque Conception d’autonomie
Faible docs/, mise en forme Faible La fusion peut être automatisée avec GitHub automerge après que les vérifications requises (et les révisions, si elles sont configurées) ont réussi.
Moyenne src/, bosses de dépendance Moyenne Demande de tirage requise + vérifications + au moins une révision
Élevé infra/, .github/workflows/ Élevé CODEOWNERS + plusieurs examens + règles plus strictes
Essentiel production déploie des paramètres, des secrets Essentiel approbations d’environnement ; l’agent se prépare mais ne peut pas agir

Implémentation : approbations d’environnement pour l’exécution à haut risque

Les environnements fournissent un point de contrôle fort pour les actions risquées telles que les déploiements et l’accès aux secrets protégés. Si un environnement est configuré avec les réviseurs requis, un travail ciblant cet environnement s’interrompt jusqu’à ce que l’approbation soit accordée.

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment:
      name: production
    steps:
      - run: echo "Deploying to production..."

Cette conception permet à l’agent de préparer les modifications tout en l’empêchant d’exécuter des actions ayant un impact sur la production indépendamment.

Les sorties sont des contrats de workflow (sorties d'étape contre sorties de travail contre environnement)

Lorsqu'un workflow génère des informations que les étapes ou travaux en aval doivent consommer, traitez ces données comme une sortie explicite plutôt que « juste des fichiers journaux ».

Enseignez et appliquez ces principes :

  • Les sorties d'étape transfèrent des valeurs entre les étapes du même travail.

  • Les sorties de travail transmettent des valeurs entre les travaux (via les dépendances de travail).

  • Les variables d’environnement configurent le comportement d’exécution, mais ne doivent pas remplacer les sorties pour le flux de données structuré.

Motif illustrant (mécanique illustrée, mais pas en forme d’examen) :

- id: generate_plan
  run: |
    echo "plan=high level steps..." >> "$GITHUB_OUTPUT"

- run: |
    echo "Plan: ${{ steps.generate_plan.outputs.plan }}"

Pour le partage entre tâches, publiez un résultat de tâche et faites-y référence à partir d’une tâche dépendante :

jobs:
  plan:
    outputs:
      plan: ${{ steps.generate_plan.outputs.plan }}
    steps:
      - id: generate_plan
        run: echo "plan=..." >> "$GITHUB_OUTPUT"

  implement:
    needs: plan
    steps:
      - run: echo "Using plan: ${{ needs.plan.outputs.plan }}"

Contextes : GitHub vs vars vs env

Utilisez le contexte approprié à des fins appropriées :

  • github.* → les métadonnées d’événement et les décisions d’exécution (« qu’est-ce qui a déclenché cette exécution ? »)

  • vars.* → valeurs de configuration gérées de manière centralisée conçues pour être réutilisées

  • env.* → variables d’environnement au niveau du travail et configuration du runtime

Déclenchement sécurisé et filtrage défensif

Même lorsque les flux de travail sont conçus pour les pull requests, les référentiels ont souvent plusieurs déclencheurs. Ajoutez un contrôle de sécurité pour que le comportement réservé aux PR ne s'exécute pas accidentellement sans contexte de demande de tirage.

Modèle général à enseigner :

  • Utilisez des conditions au niveau de l'emploi pour garantir que les actions dépendantes des PR ne s'exécutent que lorsque l'exécution est liée à un événement de PR.

Gating défensif pour un comportement basé uniquement sur les pull requests

Même si un flux de travail est destiné à s'exécuter uniquement pour les pull requests, il peut toujours être déclenché par d'autres événements (par exemple, push, workflow_dispatch, ou schedule). Sans protection supplémentaire, les étapes spécifiques aux pull requests, tels que commenter une pull request ou évaluer les modifications, pourraient échouer ou avoir un comportement inattendu.

Vous pouvez éviter cela en ajoutant une condition au niveau de la tâche qui garantit que le flux de travail s’exécute uniquement lorsqu’il est associé à une pull request.

name: PR Validation

on:
  pull_request:
    branches: [ main ]
  workflow_dispatch: # allows manual runs, but still gated below

jobs:
  validate-pr:
    # Defensive gating: only run if this is actually a PR context
    if: github.event_name == 'pull_request'

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Run tests
        run: npm test

      - name: Comment on PR
        run: echo "Validation complete"

Clé à prendre en compte : la fiabilité du flux de travail s’améliore lorsque les plans et les signaux sont traités comme des sorties structurées et gardés par la logique prenant en charge les événements.

Ensuite, vous allez exploiter les agents en toute sécurité en rendant les exécutions auditables, en contrôlant les outils et les secrets, et en créant des garde-fous fondés sur des hooks et des modèles de fiabilité.