Zum Inhalt springen

Eine Pipeline-Vorlage erstellen

Pipeline-Vorlagen entstehen in den Einstellungen des Arbeitsbereichs. Der Eintrag Pipelines in der Seitenleiste des Arbeitsbereichs ist die Warteschlange der Läufe. Die Vorlagenliste liegt woanders, und diese Ansicht hat keine Aktion „Vorlage erstellen“.

Was jede Schrittart, jeder Body-Schlüssel und jedes Konfigurationsfeld bedeutet, steht in den Pipeline-Schrittarten.

  1. Geh zu Einstellungen → Arbeitsbereich → Pipeline-Vorlagen (/workspaces/<workspace-id>/settings/pipelines).
  2. Drücke Neue Vorlage.

Einen Dialog für die ID gibt es nicht. Der Editor öffnet sich sofort auf einem angelegten Gerüst namens Neue Pipeline, mit einer automatisch vergebenen ID (pipeline_1, dann pipeline_2, …). Klicke auf den Titel in der Kopfzeile, um ihn umzubenennen.

Die Zeichenfläche ist nicht leer: ein Eingangsknoten Trigger, ein Prompt-Agenten-Knoten mit der Bezeichnung Step und eine Endmarke, die den Lauf abschließt. Die Endmarke wird nicht gezeichnet. Der Editor hängt dieses versteckte Ende an jede erreichbare Senke, sodass Arbeit, die du hinter Step anhängst, trotzdem läuft.

Die Seitenleiste Knotenbibliothek sitzt fest links im Editor. Filtere sie über das Feld Knoten suchen und ziehe einen Eintrag auf die Zeichenfläche. Der Knoten landet dort, wo du ihn loslässt, ohne eingehende Verbindung.

Palettenknoten Schrittart Wirkung
Bash script listen Führt ein Shell-Skript mit Ersetzung von {{state}} aus; es wird kein Agent losgeschickt
Open conversation listen Öffnet den einen sichtbaren Bereich des Laufs und seinen Checkout; Agentenknoten betreten diesen Bereich
Clone PR branch listen Ermittelt den Head-Branch des PR über gh pr view und klont ihn ins Laufverzeichnis
Post PR comment listen Schreibt die zusammengeführten Befunde als GitHub-Review-Kommentar an den PR
Reviewer (prompt) listen Schickt einen spezialisierten Reviewer-Agenten los; hält an, bis der Agent sein Ergebnis einreicht
Consolidate (join) join Wartet auf mehrere vorgelagerte Zweige und bittet dann einen Agenten, ihre Ausgaben zusammenzuführen
Custom prompt listen Allgemeiner, promptgesteuerter Knoten über den Body promptAgent
Post to space listen Sendet eine Nachricht an einen Bereich
Condition / switch (router) router Verzweigt den Ablauf nach einem Zustandswert
If file exists (router) router Routet "true", wenn ein Pfad unter dem Klon existiert, sonst "false"
Any file exists (OR router) router Routet "true", wenn irgendein aufgeführter Pfad existiert
All conditions (AND router) router Routet "true" nur, wenn jeder aufgeführte Pfad existiert
Team dispatch listen Schickt ein ganzes Team los und hält an, bis es fertig ist
Approval gate listen Hält für eine Freigabeentscheidung an
For each (map) forEach Rendert einen Prompt je Eintrag und schickt den Agenten dann einmal los, mit diesen Prompts aneinandergereiht
Call sub-pipeline listen Führt eine andere Vorlage als verschachtelten Schritt aus
Clean up worktrees listen Entfernt veraltete isolierte Worktrees; deterministisch, es wird kein Agent losgeschickt

Die Bibliothek gruppiert sie unter Ablauf und Logik, PR-Review, Agenten, Nachrichten und Code. Eine Gruppe Demo gibt es nicht.

Jeder Arbeitsknoten hat an der rechten Kante einen runden Ausgabeport. Ziehe von diesem Port auf einen anderen Knoten, um sie zu verbinden. Startauslöser funktionieren genauso: jeder hat seinen eigenen Port, sodass eine Leitung von Zeitplan nicht zugleich von Manueller Lauf ausgeht. Drücke Schritt hinzufügen (+) direkt hinter einem Knoten, um danach einen Typ einzufügen. Fahre den Mittelpunkt einer bestehenden Kante an und drücke ×, um sie zu trennen.

Verbindungen bearbeitest du auch am Knoten, der sie empfängt:

  1. Wähle den nachgelagerten Knoten. Sein Konfigurationspanel öffnet sich rechts.
  2. Scrolle zu Auslöser von und tippe den Chip jedes vorgelagerten Knotens an, auf den dieser hören soll. Ein Tipp auf einen ausgewählten Chip entfernt die Verbindung.
  3. Ist ein vorgelagerter Knoten ein Router, erscheint unter den Chips ein Block Routing-Schlüssel mit einem Feld Routing-Schlüssel von <Knoten> je Router-Kante. Trag den Schlüssel ein, auf den diese Kante feuert: true oder false bei den Datei-existiert-Routern, oder den Fallnamen bei einer Verzweigung.

Jeder Auslöserknoten ist ein Einstiegspunkt. Ein Knoten darf auf mehrere Vorgänger hören (fan-in) und mehrere Nachfolger speisen (fan-out), und der Graph muss azyklisch bleiben. Der Editor hindert dich nicht daran, einen Zyklus zu verdrahten, also prüfe deine Arbeit.

Die Endmarke ist aus der Zeichenfläche herausgefiltert und lässt sich nicht auswählen. Der Editor verdrahtet sie bei jeder Änderung des Graphen neu auf jede erreichbare Senke, sodass Arbeit hinter dem angelegten Step trotzdem läuft. Ein leerer Graph (Auslöser ohne nachfolgende Arbeit) führt den Auslöser selbst auf, damit ein Lauf sofort endet.

Wähle einen Knoten, um sein Konfigurationspanel zu öffnen. Welche Felder erscheinen, hängt vom Body des Knotens ab.

Jeder Knoten hat Bezeichnung, Eingabeschlüssel (kommagetrennt) (Zustandsschlüssel, die zur Ausführung gelesen werden) und unter Erweitert die Felder Reduzierer, Zeitlimit (ms), Wiederholungsversuche, Fortfahren, wenn dieser Schritt fehlschlägt und Ausgabeschema (JSON). Knoten der Arten listen und join können ihre Art zwischen den beiden umschalten.

Ergänzt eine Auswahl Zu klonende Repositories (welche Repos des Arbeitsbereichs ausgecheckt werden; leer heißt keines), ein Feld Name des Raums und das Kontrollkästchen Darin eine Unterhaltung öffnen. Ist das Kontrollkästchen aktiv, benennt Name der Unterhaltung den Verlauf, mit dem der Bereich sich öffnet. Agentenknoten betreten diesen Bereich und öffnen keinen eigenen.

Ergänzt Agent (welcher Agent losgeschickt wird), Prompt-Vorlage (mit {{key}} verweist du auf Eingaben oder Ausgaben vorgelagerter Knoten) und Ausgabeschlüssel.

Zeitlimit (ms) ist in Millisekunden, nicht in Sekunden. 900000 sind 15 Minuten. 900 gibt dem Schritt 0,9 Sekunden.

Der Unterhaltungsmodus, in dem ein Prompt-Agenten-Knoten läuft, hat am Agentenknoten kein Feld im Editor. Er steckt in extras['mode'] (chat, plan oder review) am Knoten Open conversation, der den Bereich angelegt hat (Vorgabe review). Am Agentenschritt gesetzt, wird er ignoriert. Der Schlüssel wird exakt verglichen: jede andere Schreibweise wird still ignoriert.

Ergänzt Bash-Skript. Felder für das Arbeitsverzeichnis oder die Umgebung gibt es nicht, weil beides fest ist:

  • Jeder Bash-Schritt eines Laufs teilt sich das cwd <cc_root>/pipelines/<runId>/.
  • GITHUB_TOKEN kommt aus dem Zugangsdatenspeicher, deshalb funktionieren gh und git clone https://x-access-token:$GITHUB_TOKEN@… ohne weitere Einrichtung.
  • Das Skript wird als das ausführbare Programm bash gestartet, deshalb muss bash auf dem PATH des Server-Hosts liegen. Das gilt es unter Windows zu bedenken.

Ein Router wertet eine Bedingung aus und liefert einen Routing-Schlüssel. Die Engine feuert nur die nachgelagerte Kante, deren Routing-Schlüssel passt, und markiert die anderen Zweige als übersprungen.

Wählst du einen Router, ersetzt der Bedingungseditor das Feld Ausgabeschlüssel. Nimm einen der vier Modi:

  • Datei(en) vorhanden — beliebige — routet "true", wenn irgendein aufgeführter Pfad existiert.
  • Dateien vorhanden — alle — routet "true" nur, wenn jeder aufgeführte Pfad existiert.
  • Vergleich — vergleicht einen Zustandswert mit einem Literal.
  • Verzweigung — routet nach dem Wert eines Zustandsschlüssels, mit einem Standardfall.

Setze danach die passenden Routing-Schlüssel an den ausgehenden Kanten (siehe Knoten verbinden).

Boolesche Gruppen and / or / not unterstützt der Body, aus diesem Formular lassen sie sich aber nicht anlegen. Dafür brauchst du einen von Hand geschriebenen Prädikatbaum unter extras.predicate. Das vollständige Vokabular der Prädikate und Operatoren steht in den Pipeline-Schrittarten.

Keine eigene Konfiguration: er wartet auf alle seine vorgelagerten Schritte.

Das Tor schickt den Genehmiger-Agenten mit dem Prompt des Tors in eine versteckte Unterhaltung und hält an. Der Genehmiger holt deine Entscheidung in der Unterhaltung ein und reicht sie mit submit_output als { "decision": "approved" | "rejected", "reason": "..." } ein. Die Entscheidung landet unter dem Ausgabeschlüssel (Vorgabe approval_decision), sodass ein nachgelagerter Router im Modus Verzweigung darauf verzweigen kann.

Setze Agent auf den Genehmiger und Prompt-Vorlage auf die Frage des Tors. Das Tor löst sich über submit_output als { "decision": "approved" | "rejected", "reason": "..." } auf. Knoten Reviewer (prompt) reichen auf demselben Weg ein.

Ergänzt Team-ID und Verteilungsmodus. Die Auswahl bietet genau zwei Modi:

  • allParallel — eine Aufgabe je Mitglied, hält an, bis alle fertig sind.
  • manager — schickt die Leitung los, die delegiert.

Jeder andere gespeicherte Wert verhält sich wie allParallel. Setze Reduzierer auf append, um das Ergebnis jedes Mitglieds als Liste unter dem Ausgabeschlüssel zu sammeln.

For each bildet standardmäßig über den Zustandsschlüssel items ab (extras.iterableKey / extras.itemKey am Knoten). Es rendert seinen Prompt einmal je Eintrag ({{item}} als Vorgabe) und schickt den Agenten einmal los, mit diesen Prompts aneinandergereiht. Eine leere Sammlung endet sofort mit einer leeren Liste. Es ist kein paralleler Versand je Eintrag.

Call sub-pipeline hält an, bis der Kindlauf einen Endzustand erreicht, und legt dann den Endzustand des Kindes unter dem Ausgabeschlüssel ab (Vorgabe subflow_result). Zeige mit extras.templateId auf ein Kind. Eine Vorlage kann sich nicht selbst aufrufen. Ein fehlgeschlagener oder abgebrochener Kindlauf lässt den Elternschritt fehlschlagen, und der folgt dann der Wiederholungs- und Fortsetzen-Regel dieses Schritts.

Beides liegt hinter Manuelle Ausführung in der Kopfzeile des Editors.

  1. Drücke Manuelle Ausführung.
  2. Schalte Manuelle Ausführung zulassen ein. Dieser Schalter speichert sofort: er legt die Trigger-Zeile manual an oder löscht sie, und genau dadurch erscheint die Vorlage auf der Ausführungsseite.
  3. Setze Max. parallele Läufe, wenn du eine Obergrenze willst (leer lassen heißt unbegrenzt). Weitere Starts warten im Zustand queued, bis ein Platz frei wird.
  4. Drücke Eingabe hinzufügen für jedes Formularfeld, das ein manueller Lauf abfragen soll:
Feld Beschreibung
Schlüssel Zustandsschlüssel, unter dem der Wert liegt; verweise darauf mit {{key}}
Bezeichnung Anzeigetext (Vorgabe ist der Schlüssel)
Typ Text, Mehrzeiliger Text, Zahl, Schalter, Auswahl, Repository
Optionen (durch Kommas getrennt) Kommagetrennte Auswahlmöglichkeiten, nur bei Auswahl
Standardwert Vorausgefüllter Wert
Platzhalter Hinweistext im leeren Feld
Hilfetext Hilfetext unter dem Feld
Erforderlich Ob das Formular des Laufs bei einem leeren Wert blockiert

Eine Eingabe Repository zeigt eine Auswahl über die Repos des Arbeitsbereichs und schreibt repo_id, repo_local_path, repo_full_name und, wenn das Repo ein GitHub-Remote hat, repo_owner und repo_name in die Nutzlast des Laufs.

  1. Drücke Speichern im Dialog. Änderungen an den Eingaben gehen in den Entwurf ein und bleiben erhalten, wenn du die Vorlage speicherst.
  1. Drücke Speichern in der Kopfzeile des Editors. Bis dahin zeigt die Kopfzeile „Nicht gespeicherte Änderungen“.
  2. Geh zurück zu Einstellungen → Arbeitsbereich → Pipeline-Vorlagen und prüfe, dass der Schalter in der Zeile der Vorlage an ist. Die Engine startet eine deaktivierte Vorlage nicht, und eine deaktivierte Vorlage erscheint nie auf der Ausführungsseite.
  3. Damit sie automatisch startet, ziehe einen Auslöser aus der Knotenbibliothek auf die Zeichenfläche. Siehe Pipeline-Trigger einrichten.