Erstellen von zuverlässigen Workflows – Ausgaben, Kontexte, Trigger und Übergaben zwischen Aufgaben

Abgeschlossen

In dieser Lektion lernen Sie Folgendes:

  • Übergeben von Daten über Workflows mithilfe von Schritt- und Auftragsausgaben

  • Verwenden von GitHub Kontexten für Konfiguration und Steuerung

  • So entwerfen Sie Workflows mit sicheren Triggern und defensivem Gating

  • Sicherstellen, dass Workflows nur im richtigen Kontext ausgeführt werden

  • So erstellen Sie zuverlässige Workflows mithilfe strukturierter Daten und Ereignislogik

Autonomie muss entworfen werden, nicht angenommen

Unterschiedliche Aufgaben tragen unterschiedliche Risiken. Eine gute Agentarchitektur verwendet Richtlinien, um unterschiedliche Autonomiestufen auszudrücken, anstatt überall dieselben Regeln anzuwenden.

Ein einfaches risikobasiertes Autonomiemodell könnte wie folgt aussehen:

Vorgangsart Beispielpfade Risikostufe Autonomiedesign
Niedrig docs/, formatieren Niedrig Die Zusammenführung kann mithilfe von GitHub automerge nach erforderlichen Prüfungen (und Überprüfungen, falls konfiguriert) automatisiert werden.
Medium src/, Abhängigkeitsaktualisierungen Medium PR erforderlich + Prüfungen + mindestens ein Review
Hoch infra/, .github/workflows/ Hoch CODEOWNERS + mehrere Rezensionen + strengere Rulesets
Kritisch Die Produktionsumgebung stellt Einstellungen und Geheiminformationen bereit. Kritisch Umweltgenehmigungen; der Agent bereitet vor, kann jedoch nicht ausführen

Implementierung: Umgebungsgenehmigungen für die Ausführung mit hohem Risiko

Umgebungen bieten einen starken Kontrollpunkt für riskante Aktionen wie Bereitstellungen und Zugriff auf geschützte geheime Daten. Wenn eine Umgebung mit den erforderlichen Prüfern konfiguriert ist, wird ein Auftrag für diese Umgebung angehalten, bis die Genehmigung erteilt wird.

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

Mit diesem Entwurf kann der Agent Änderungen vorbereiten und gleichzeitig verhindern, dass Aktionen, die sich auf die Produktion auswirken, unabhängig ausgeführt werden.

Ausgaben sind Workflow-Verträge (Step Outputs vs Job Outputs vs Env)

Wenn ein Workflow Informationen generiert, die nachgelagerte Schritte oder Aufträge nutzen müssen, diese Daten als explizite Ausgabe und nicht als „nur Protokolle” behandeln.

Lehren und Anwenden dieser Prinzipien:

  • Schrittausgaben übergeben Werte zwischen Schritten in demselben Auftrag.

  • Auftragsausgaben übergeben Werte über Aufträge hinweg (über Auftragsabhängigkeiten).

  • Umgebungsvariablen konfigurieren das Laufzeitverhalten, sollten jedoch keine Ausgaben für strukturierten Datenfluss ersetzen.

Veranschaulichungsmuster (Mechanik wird dargestellt, aber nicht in Prüfungsform):

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

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

Für die funktionsübergreifende Freigabe eine Auftragsausgabe veröffentlichen und von einem abhängigen Auftrag darauf verweisen:

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 }}"

Kontexte: GitHub vs vars vs env

Verwenden Sie den richtigen Kontext für den richtigen Zweck:

  • github.* → Ereignismetadaten und Laufzeitentscheidungen ("Was hat diese Ausführung ausgelöst?")

  • vars.* → zentral verwaltete Konfigurationswerte, die wiederverwendet werden sollen

  • env.* → Umgebungsvariablen auf Auftragsebene und Laufzeitkonfiguration

Sicheres Auslösen und defensives Gating

Selbst wenn Workflows für PRs entwickelt wurden, verfügen Repositorien häufig über mehrere Trigger. Defensive Gating-Mechanismen hinzufügen, sodass das „PR-only”-Verhalten nicht versehentlich ohne PR-Kontext ausgeführt wird.

Allgemeines Muster zum Lehren:

  • Verwenden Sie Bedingungen auf Auftragsebene, um sicherzustellen, dass PR-abhängige Aktionen nur ausgeführt werden, wenn die Ausführung an ein PR-Ereignis gebunden ist.

Defensives Gating für das Verhalten von nur-Pull-Anfragen

Auch wenn ein Workflow nur für Pullanforderungen ausgeführt werden soll, kann er auch von anderen Ereignissen (z. B. Push, workflow_dispatch oder Zeitplan) ausgelöst werden. Ohne zusätzliche Schutzmaßnahmen können PR-spezifische Schritte, wie z. B. das Schreiben eines Kommentars zu einer Pull-Request oder das Bewerten von Änderungen, fehlschlagen oder sich unerwartet verhalten.

Sie können dies verhindern, indem Sie eine Bedingung auf Auftragsebene hinzufügen, die sicherstellt, dass der Workflow nur ausgeführt wird, wenn er einer Pullanforderung zugeordnet ist.

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"

Wichtige Erkenntnis: Die Zuverlässigkeit von Workflows verbessert sich, wenn Pläne und Signale als strukturierte Ausgaben behandelt und durch ereignisfähige Logik geschützt werden.

Als Nächstes Agenten sicher betreiben. Dazu Läufe auditierbar machen, Tools und Geheimnisse kontrollieren und auf Hooks basierende Schutzmechanismen und Zuverlässigkeitsmuster erstellen.