Dokumentation
Arbeitsabläufe
Versionierte YAML-Prüfungen und Serviceschritte werden für genau den Projekt-Commit ausgeführt, der sie ausgelöst hat.
Automatisch aus dem Englischen übersetzt. Englisches Original ansehen
Was für ein Lauf wertet
Workflowdateien werden unter festgeschrieben .cadcamfun/workflows/ mit einem .yml oder .yaml verlängerung. Der Sidecar lädt sie von einer ausgewählten Commit-Referenz. Durch das Bearbeiten einer nicht festgeschriebenen Zeichnung oder eines Arbeitsablaufs werden die von einem vorhandenen Lauf angezeigten Dateien nicht geändert.
@cadcamfun/workflow analysiert die YAML, validiert Abhängigkeiten, gleicht Trigger ab und führt registrierte Funktionen aus. Es führt keine beliebigen Shell-Befehle, Container-Images oder heruntergeladenen Aktionen aus. Jede uses der Bezeichner muss in der aktuellen Registrierung des Läufers vorhanden sein, bevor ein Schritt gestartet wird.
Schreiben Sie einen Workflow
name: Project checks
on:
manual: true
jobs:
validate:
steps:
- id: structure
uses: project/validate
- uses: project/require-gcode
- uses: cam/sequence Ein Workflow hat einen Namen, on auslöser und nach Kennung verschlüsselte Jobs. Ein Job enthält mindestens einen Schritt und kann deklariert werden needs. Ein Schritt hat uses, fakultativ id und Name, optional with argumente, if, und continueOnError.
Bezeichner beginnen mit einem Buchstaben und enthalten höchstens 64 Buchstaben, Ziffern, Unterstriche oder Bindestriche. Schrittbezeichner sind im gesamten Workflow eindeutig. Das Parsen lehnt ungültiges YAML, Schemafehler, unbekannte Jobabhängigkeiten, zyklische Abhängigkeiten und doppelte Schrittbezeichner ab.
Integrierte Schecks
project/validateanalysiert festgeschriebene JSON-Dateien, vergleicht erkannte Zeichnungs-/Komponenten-/Werkzeugweg-Entitäts-IDs mit ihren Dateinamen und verifiziert deren Namen. Es gibt die Anzahl der Ressourcen zurück.project/require-gcodeschlägt fehl, wenn ein festgeschriebener Werkzeugweg leeren oder fehlenden G-Code hat. Es ist nicht erforderlich, dass das Projekt mindestens einen Werkzeugweg enthält.cam/verifyerstellt Wiederholungsanforderungen aus festgeschriebenem Werkzeugweg-G-Code undToolpath.data.request. Es schlägt bei Wiederholungsbefunden der Fehlerschwere fehl, oder auch bei Warnungen, wennwith.severityistwarning. Optionale Argumente sindtoolpathundtolerance.cam/gcoderegeneriert sich aus dem Begangenendata.requestund vergleicht seinen getrimmten NC mit dem festgeschriebenen Text. Es akzeptiert eine optionale Optiontoolpathwähler.cam/sequenceprüft gespeicherte Anfragen auf widersprüchliche Werkzeugnummernzuordnungen und Restbearbeitungsanfragen, deren Vorgängerwerkzeug nicht größer als das aktive Werkzeug ist.
Die CAM-Schritte lesen das gespeicherte Generatoranforderungsformat. Fehlende NC, fehlende Generierungsanfragen oder nicht unterstützte Verifizierungsanfragen werden in gemeldet skipped ggf. Ausgänge; Sie scheitern nicht automatisch am Schritt. Überprüfen Sie die überprüfte/abgeglichene Anzahl und die übersprungenen Gründe. Ein grüner Workflow, der nur übersprungene CAM-Arbeiten enthält, ist kein Beweis für ein verifiziertes Programm.
Servicegestützte Schritte
Der Live-Sidecar registriert sich vcs/commit, notify/push, und, nachdem der Assistenzdienst existiert, ai/prompt. Die Registrierung ist explizit: Ein Läufer, der ohne diese Dienste erstellt wurde, scheitert an einem Workflow, der einen nicht verfügbaren Schritt benennt.
vcs/commit erfordert eine Nachricht und akzeptiert eine files aufzeichnung des Textes unten .cadcamfun/ mit YAML, Markdown, JSON oder Texterweiterungen. Es fungiert als Konto des Laufs und befolgt die Richtlinie für geschützte Zweige. Das Extradatei-Argument kann CAD-Entitätspfade nicht direkt ersetzen. Die aktuelle Implementierung delegiert das Projekt-Commit, ohne nach einer sauberen Arbeitskopie zu suchen: Sie erstellt außerdem Snapshots aktueller Datenbankänderungen am ausgecheckten Zweig, der sich von der überprüften Referenz unterscheiden kann. Führen Sie diesen Schreibschritt nur aus, wenn der aktuelle Zweig und der aktuelle Arbeitsstatus festgeschrieben werden sollen.
notify/push erstellt eine Anwendungsbenachrichtigung für den Akteur des Laufs mit optionalem Titel, Text und Erfolgs-/Fehlerergebnis. Es handelt sich um einen dauerhaften Benachrichtigungsschritt. Es stellt nicht selbst die Zustellung über einen externen Push-Anbieter her.
ai/prompt erfordert eine Eingabeaufforderung und akzeptiert optional Systemtext und ein Modell. Es kann festgeschriebene Dateiinhalte ersetzen und gibt Antworttext und Modellidentität zurück. Fehlende Anmeldeinformationen oder ein Anbieterfehler schlagen diesen Schritt fehl; Eine Modellantwort ist eine Beratungsausgabe, die von deterministischen Geometrieprüfungen getrennt ist.
Die reinen Einbauschritte werden eingetragen builtinSteps (apps/sidecar/src/services/workflow-steps.ts): project/validate, project/require-gcode, cam/verify, cam/gcode, und cam/sequence. Sie benötigen nur die festgeschriebenen Dateien und @cadcamfun/core, sodass sie auch dann verfügbar sind, wenn der Assistent nicht ausgeführt wird.
Ausführung, Ausgaben und Bedingungen
Jobs werden in Abhängigkeitsebenen ausgeführt, wobei unabhängige Jobs in einer Ebene gleichzeitig ausgeführt werden. Schritte innerhalb eines Jobs werden nacheinander ausgeführt. Jobs, deren Abhängigkeiten nicht erfolgreich waren, werden übersprungen. Die Standardschrittbedingung ist success; always läuft nach einem der Ergebnisse und failure wird nach einem vorherigen nicht behandelten Schrittfehler in diesem Job ausgeführt.
continueOnError: true zeichnet ein fehlgeschlagenes Schrittereignis auf, ohne das Fehlerflag des Jobs zu setzen. Andernfalls überspringt ein fehlgeschlagener Schritt spätere, nur erfolgreiche Schritte und markiert den Job als fehlgeschlagen. Das Gesamtergebnis ist nur dann Erfolg, wenn jede Aufgabe erfolgreich ist.
Auf frühere Ausgaben benannter Schritte kann in verwiesen werden with werte mithilfe des unten gezeigten Ausdrucks berechnen. Ein Wert, der aus genau einem Ausdruck besteht, behält seinen Typ; Durch die Ersetzung innerhalb längerer Zeichenfolgen wird die Ausgabe in Text umgewandelt. Jobs sollten Abhängigkeiten deklarieren, wenn sie die Ausgaben eines anderen Jobs nutzen.
with:
body: "Checked drawings: ${{ steps.structure.outputs.drawings }}" Auslöser und Versand
on.push unterstützt Verzweigungs- und Pfadänderungs-Globfilter; on.pullRequest filtert den Basiszweig; on.manual ermöglicht den expliziten Versand. Ein einzelnes Sternchen entspricht einem Pfadsegment und ein doppeltes Sternchen kann sich über Segmente erstrecken.
Die HTTP-Commit/Push-Integration liefert derzeit eine leere Liste geänderter Pfade an den automatischen Push-Trigger. Folglich passt ein Workflow mit einem Push-Pfadfilter nicht zu diesen Ereignissen. Verwenden Sie für diese Integration Push-Filter nur für Verzweigungen oder den manuellen Versand, bis Daten zum geänderten Pfad bereitgestellt werden.
Lesen Sie Commit-Definitionen unter GET /api/projects/:id/actions/workflows, optional mit ref. Lesen Sie einen unter /workflows/:name. Eine fehlerhafte Datei wird mit ihrem Inhalt zurückgegeben und a problem damit es repariert werden kann. Um eine Definition zu bearbeiten, fügen Sie ihren sicheren Workflow-Pfad in ein Projekt-Commit ein.
POST /api/projects/:id/actions/dispatch akzeptiert eine optionale Referenz und sendet jeden passenden manuellen Workflow an dieser Referenz aus; Es handelt sich nicht um einen Selektor für einen einzelnen Workflownamen. Lesen Sie gespeicherte Ergebnisse aus GET /api/projects/:id/actions/runs.
Führen Sie Persistenz und Ereignisse aus
Der Runner zeichnet Workflow, Ereignis, Ref, Commit-SHA, Status, Zeitstempel und akkumulierte Ereignisse auf WorkflowRun. Jobereignisse markieren Beginn und Ende; Zu den Schrittereignissen gehören Index, Bezeichner, Status, optionale Ausgaben und Fehlertext. Ungültiges YAML wird als fehlgeschlagene Ausführung mit dem Ereignis „Ungültige Datei“ beibehalten.
Der aktuelle HTTP-Triggerpfad wartet darauf, dass Arbeitsabläufe abgeschlossen sind, und veröffentlicht dann gemeinsam gestartete und beendete Live-Ereignisse. Es wird nicht jeder laufende Schritt über diese HTTP-Anfrage gestreamt. Der Kernläufer legt ein frei onEvent rückruf für Integrationen, die einen schrittweisen Fortschritt erfordern.
Ergebnisse präzise interpretieren
Ein Workflow berichtet über seine erfassten Commit- und registrierten Schrittimplementierungen. Spätere Bearbeitungen der Arbeitskopie werden nicht zertifiziert und ein bereits aufgezeichneter Commit wird bei einem Fehler nicht entfernt. Überprüfen Sie übersprungene Prüfungen, Warnrichtlinien und relevante Werkzeugwegnachweise, bevor Sie einen erfolgreichen Lauf als Freigabetor verwenden.
Die Umsetzung ist aufgeteilt packages/workflow/src für Schema/Trigger/Ausführung und Sidecar workflow-runner.ts, workflow-steps.ts, und workflow-service-steps.ts für festgeschriebene Projektdaten, persistente Ausführungen und Anwendungsdienste.
Führen Sie ein Beispiel für eine isolierte Workflow-Engine aus
Ein Paketkonsument stellt die registrierten Funktionen und ihren typisierten Kontext bereit. In diesem Beispiel wird ein manueller Workflow analysiert, eine registrierte Prüfung ausgeführt und das Auftragsergebnis zurückgegeben, ohne SQLite zu öffnen oder AI aufzurufen.
import { Effect } from "effect"
import { parseWorkflow, runWorkflow } from "@cadcamfun/workflow"
const source = [
"name: Isolated check", "on:", " manual: true", "jobs:",
" inspect:", " steps:", " - id: checked", " uses: inspection/check"
].join("\n")
const result = await Effect.runPromise(Effect.gen(function* () {
const workflow = yield* parseWorkflow(source)
return yield* runWorkflow(workflow, {
ctx: { drawingCount: 2 },
registry: { "inspection/check": ({ ctx }) => Effect.succeed({ drawings: ctx.drawingCount }) }
})
}))
console.log(result) // { status: "success", jobs: { inspect: "success" } } Je nach Effekt und innerhalb eines Arbeitsbereichs ausführen @cadcamfun/workflow, wie zum Beispiel apps/sidecar. Der oben beschriebene benutzerdefinierte Schritt ist lokal für die bereitgestellte Registrierung. Wenn Sie es in einem Desktop-Workflow benennen, wird es nicht im Produktions-Sidecar installiert.
Quelle: packages/workflow/src/schema.ts und run.ts.
Passen Sie Filter an und nutzen Sie Ausgänge sicher
Ein Push-Trigger erfordert, dass sein Verzweigungsfilter übereinstimmt und, wenn eine Pfadliste vorhanden ist, mindestens ein bereitgestellter geänderter Pfad übereinstimmt. Ein weggelassener Filter ist uneingeschränkt; Eine explizit leere Liste entspricht nichts. Ein manuelles Ereignis erfordert on.manual anwesend sein. Der Pull-Request-Abgleich verwendet den Basiszweig und nicht den Namen des Hauptvorschlags.
Die Ausgabeersetzung durchläuft verschachtelte Arrays und Datensätze. Ein exakt fehlender Ausgabeausdruck wird als undefiniert ausgewertet; Eine fehlende Ausgabe, die in eine längere Zeichenfolge eingebettet ist, wird zu leerem Text. Verlassen Sie sich nicht darauf, dass ein übersprungener oder fehlgeschlagener Schritt zu einer Ausgabe geführt hat. Erklären needs für jobübergreifende Verbraucher, sodass die Abhängigkeitsplanung die Datenreihenfolge festlegt.
Schritt if ist einer von drei Literalmodi, keine allgemeine Ausdruckssprache. Workflow-Variablen, Shell-Interpolation, Matrix-Builds, beliebige JavaScript-Bedingungen und das Laden von Aktionen von Drittanbietern werden von dieser Engine nicht implementiert. Das Getrennte ai/prompt hundeführer ersetzt verpflichtet files.<path> verweise in der Eingabeaufforderung; Normale Schritte erhalten diese zusätzliche Ersetzung nicht.
Quelle: packages/workflow/src/trigger.ts, run.ts, und apps/sidecar/src/services/workflow-service-steps.ts.
Ein ausgelassener Zweig- oder Pfadfilter entspricht jedem Wert. Ein manueller Versand entspricht nur Workflows, die deklarieren on.manual, und ein Pull-Request-Ereignis entspricht dem des Workflows branches globs gegen den Basiszweig der Pull-Anfrage (packages/workflow/src/trigger.ts).
Diagnostizieren Sie Workflow-Ergebnisse
| Finden | Bedeutung und nächste Prüfung |
|---|---|
Die Workflowdatei wird mit zurückgegeben problem | Reparieren Sie YAML-/Schema- oder Abhängigkeitsfehler und übernehmen Sie die korrigierte Datei. Durch die Dateiauflistung bleiben ungültige Inhalte zur Bearbeitung erhalten. |
| Unbekannter Schritt vor der Ausführung | Vergleichen Sie alle uses mit registrierten Sidecar-Stufen-IDs. Die lokale Registrierung eines Paketbeispiels ist nicht die Produktionsregistrierung. |
| Kein Run nach Push | Stellen Sie sicher, dass der Workflow in der festgeschriebenen Referenz vorhanden ist, der Zweig übereinstimmt und kein nicht unterstützter HTTP-Filter für geänderte Pfade das Ereignis ausschließt. |
Run ist aber erfolgreich verified: 0 | Lesen skipped. Fehlende Generatoranforderungen oder nicht unterstützte Werkzeugwege können dazu führen, dass bei der Prüfung keine geometrischen Beweise vorliegen. |
| Abhängiger Job übersprungen | Überprüfen Sie jeweils das Ergebnis needs arbeit; Ein Abhängigkeitsfehler verhindert, dass der Job gestartet wird, einschließlich seiner immer bedingten Schritte. |
| Run bleibt nach Beendigung des Prozesses aktiv | Überprüfen Sie die Zeitstempel/Ereignisse und den genauen Commit. Der Läufer behält Start- und Endzustand getrennt bei und setzt einen unterbrochenen Lauf nicht automatisch fort. |
Der gespeicherte Ausführungsverlauf gibt standardmäßig die letzten 50 Ausführungen an der Dienstgrenze zurück. Live-Ereignisbenachrichtigungen sind Best-Effort-Nebenkanäle: Überprüfen Sie persistente Zeilen auf das dauerhafte Ausführungsergebnis, anstatt die Benachrichtigungszustellung als Ausführungsdatensatz zu behandeln.
Quelle: apps/sidecar/src/services/workflow-runner.ts, workflow-steps.ts, und http/vcs.ts.
Workflow-Dateiformat
Ein Workflow ist eine YAML-Datei unter .cadcamfun/workflows/<name>.yml im Projekt-Repository, versioniert mit dem überprüften Modell. Seine Form spiegelt GitHub Actions wider (on, jobs, needs, steps, uses, with), aber uses benennt immer einen registrierten CADCAMFUN-Schritt. Ein Workflow kann keinen Shell-Befehl oder ein Container-Image ausführen.
name: Release check
on:
push:
branches: [main, "release/*"]
paths: ["toolpaths/**"]
pullRequest:
branches: [main]
manual: {}
jobs:
validate:
steps:
- uses: project/validate
- uses: project/require-gcode
verify:
needs: [validate]
steps:
- id: verify
uses: cam/verify
with: { severity: warning }
gcode:
needs: [validate]
steps:
- uses: cam/gcode
- uses: cam/sequence
report:
needs: [verify, gcode]
steps:
- id: review
uses: ai/prompt
with:
prompt: "Summarise risks in this program: ${{ files.toolpaths/op1.json }}"
continueOnError: true
- uses: notify/push
if: always
with:
title: "Release check finished"
body: "${{ steps.review.outputs.text }}" needs gelungen; andernfalls wird es als gemeldet skipped.| Schlüssel | Regeln |
|---|---|
name | Erforderlich, 1–128 Zeichen. |
on.push | Optional branches und paths glob-Listen. Ein Push stimmt überein, wenn der Zweig übereinstimmt und mindestens ein geänderter Pfad übereinstimmt. |
on.pullRequest | Optional branches globs, die beim Öffnen mit dem Basiszweig der Pull-Anfrage abgeglichen werden. |
on.manual | Beliebiger Wert (z.B {}) ermöglicht den Versand vom Desktop oder dem mobilen Begleiter. |
jobs.<id> | Job-IDs beginnen mit einem Buchstaben und können Buchstaben, Ziffern usw. enthalten. _, und - (höchstens 64 Zeichen). Jeder Job benötigt mindestens einen Schritt. |
needs | Job-IDs, die zuerst erfolgreich sein müssen. Unbekannte IDs und Zyklen werden beim Parsen der Datei abgelehnt. |
steps[].uses | Eine Schrittkennung in Kleinbuchstaben mit mindestens einem Schrägstrich, z. B cam/verify. |
steps[].id | Optional; einzigartig im gesamten Workflow. Erforderlich für spätere Schritte zum Lesen der Ausgaben. |
steps[].with | Freiformparameter für den Schritt. Strings werden interpoliert. |
steps[].if | success (standard: nur ausführen, wenn bisher im Job kein Fehler aufgetreten ist), failure (nur nach einem Fehler ausführen), oder always. |
steps[].continueOnError | Bei „true“ markiert ein Fehlschlagen dieses Schritts den Job nicht als fehlgeschlagen. |
Verwendung von Globs * innerhalb eines Pfadsegments übereinstimmen und ** segmentübergreifend übereinstimmen. Eine weggelassene Filterliste passt zu allem. toolpaths/*.json streichhölzer toolpaths/a.json aber nicht toolpaths/x/a.json; toolpaths/** passt zu beiden.
Schrittreferenz
Reine Schritte lesen nur die Dateien des überprüften Commits, niemals die Live-Datenbank, sodass ein Lauf genau über den Baum berichtet, der gepusht wurde. Servicegestützte Schritte werden registriert, sobald ihr Service vorhanden ist. Bis dahin ist die Benennung eines Namens ein schwerwiegender Fehler und kein stilles No-Op.
| Schritt | mit | Ausgänge | Schlägt fehl, wenn |
|---|---|---|---|
project/validate | keiner | issues (0), drawings, workflows | Eine Entitäts-JSON-Datei ist ungültig, a drawings/, components/, oder toolpaths/ dateien id stimmt nicht mit dem Dateinamen überein, oder name fehlt. |
project/require-gcode | keiner | toolpaths | Jeder Werkzeugweg im Commit hat keinen G-Code. |
cam/verify | toolpath?, tolerance?, severity? (error standard, oder warning) | verified, toolpaths, skipped | Replay findet einen Fehler (oder eine Warnung mit severity: warning): schnitte ins Material, Furchen, Schaft- oder Vorrichtungskollisionen, Material bleibt zurück. Programme ohne G-Code oder eine hinterlegte Generierungsanforderung sind in aufgeführt skipped, wurde nie als bestanden gewertet. |
cam/gcode | toolpath? | matched, toolpaths, skipped | Bei der Neugenerierung aus der gespeicherten Anfrage wird der festgeschriebene G-Code nicht reproduziert (wobei der Header-Stempel und das umgebende Leerzeichen ignoriert werden). |
cam/sequence | toolpath? | toolpaths, tools | Eine Werkzeugnummer bezeichnet zwei verschiedene Werkzeuge oder eine Restbearbeitungsoperation restToolDiameter ist nicht größer als es toolDiameter. |
vcs/commit | message (erforderlich), files karte | commit, files | Die Arbeitskopie ist verschmutzt, ein Pfad liegt außerhalb .cadcamfun/oder eine Datei nicht .yml, .yaml, .md, .json, oder .txt. Ein KI-Schauspieler wird abgelehnt main. |
notify/push | title?, body?, outcome? (success standard, oder failure) | notified | Der Lauf scheitert nie. Erstellt eine WORKFLOW_PASSED oder WORKFLOW_FAILED benachrichtigung für das Versandkonto, verknüpft mit der Projekthistorie. |
ai/prompt | prompt (erforderlich), system?, model? | text, model | Es ist kein Modell verfügbar oder der Aufruf schlägt fehl. Nur dieser Schritt schlägt fehl; Das Geometrieurteil bleibt davon unberührt. |
Missgebildet with werte werden defensiv gelesen: Ein Nicht-String, bei dem ein String erwartet wird, oder eine nicht endliche Zahl wird ignoriert, anstatt dass der Lauf fehlschlägt. Überprüfen Sie die Ausgaben, um einen Filter zu bestätigen, z toolpath tatsächlich angewendet.
Ausgaben und Interpolation
Ein Schritt mit einem id speichert seine Ausgaben laufweit, sodass ein Job die Ausgaben der von ihm ausgeführten Jobs lesen kann needs. Innerhalb einer beliebigen Zeichenfolge in with, ${{ steps.<id>.outputs.<key> }} wird rekursiv durch Objekte und Arrays ersetzt. Wenn eine Zeichenfolge aus genau einem Ausdruck besteht, behält der Wert seinen Typ (eine Zahl bleibt eine Zahl). Eingebettet in anderen Text wird der Wert in eine Zeichenfolge umgewandelt und ein fehlender Wert wird zu einer leeren Zeichenfolge. ai/prompt erweitert sich zusätzlich ${{ files.<path> }} zum Text dieser Datei im Commit (leer, wenn die Datei nicht vorhanden ist).
| Ausdruck in mit | Ausgabewert | Ergebnis |
|---|---|---|
"${{ steps.verify.outputs.verified }}" | 3 | 3 (nummer) |
"Verified ${{ steps.verify.outputs.verified }} programs" | 3 | "Verified 3 programs" |
"${{ steps.missing.outputs.x }}" | keiner | undefined |
Lebenszyklus und Fehler ausführen
- Das Triggerereignis (Push, Pull Request oder manuell) wählt Workflows in der Struktur der Referenz aus, die aus dem Commit und nicht aus der Arbeitskopie gelesen werden.
- Jede Datei wird analysiert. YAML-Fehler (
yaml), schemafehler (schema), unbekanntneeds(needs), zyklen (cycle) und doppelte Schritt-IDs (duplicate-step-id) werden mit Angabe des Grundes als ungültiger Lauf gemeldet. - Jeder
useswird mit der Registrierung abgeglichen, bevor etwas ausgeführt wird. Ein unbekannter Schritt schlägt bei der Ausführung fehlUnknown step(s): ..., sodass ein Tippfehler niemals eine halbe Änderung bewirkt. - Jobs sind in Ebenen geordnet. Jedes Level läuft gleichzeitig; ein Job, dessen
needswar nicht alles erfolgreich wird übersprungen. - Fortschrittsereignisse (
job-start,stepmit Status und Ausgängen oder Meldung,job-end) auf den Desktop und den Begleiter streamen und der Lauf wird mit seinen Ereignissen beibehalten. - Der Lauf ist nur dann erfolgreich, wenn jeder Job erfolgreich war. Übersprungene Jobs gelten als nicht erfolgreich.
Live-Events workflow.started (mit dem auslösenden Ereignis) und workflow.finished (success, failure, oder cancelled) werden für jeden Lauf veröffentlicht.
Beweis, keine Dekoration
Nur von den eingebauten Stufen cam/verify spielt das Programm mit dem Rohteil und den Werkzeugen ab. Die anderen Prüfungen bestätigen die Konsistenz der festgeschriebenen Daten. Lesen skipped listen: Ein nicht überprüfbarer Werkzeugweg ist kein verifizierter.
Ein vollständiger Lauf, der Ereignis für Ereignis verfolgt wird
Dieser Workflow übt alle Regeln der Engine auf einmal aus: Ausgaben, die zwischen Jobs übergeben werden, ein Ganzwert und eine eingebettete Interpolation, continueOnError, if: failure, ein Job, der übersprungen wurde, weil seine Abhängigkeit fehlgeschlagen ist, und ein unabhängiger Job. Es wurde mit gelaufen runWorkflow und vier Testschritthandler: demo/measure kehrt zurück { volume: 7842.92, part }, demo/check druckt, was es empfangen hat, demo/fail scheitert mit StepError("tolerance exceeded") und demo/notify gibt nichts zurück.
name: Release check
on:
push: { branches: [main, "release/**"], paths: ["parts/**/*.json"] }
manual: {}
jobs:
measure:
steps:
- id: size
uses: demo/measure
with: { part: bracket }
verify:
needs: [measure]
steps:
- uses: demo/check
with: { volume: "${{ steps.size.outputs.volume }}", label: "vol=${{ steps.size.outputs.volume }} mm3" }
- uses: demo/fail
continueOnError: true
- uses: demo/fail
- uses: demo/notify
if: failure
- uses: demo/notify
publish:
needs: [verify]
steps:
- uses: demo/notify
lint:
steps:
- uses: demo/notify levels [["measure","lint"],["verify"],["publish"]]
{"type":"job-start","job":"measure"}
{"type":"step","job":"measure","index":0,"uses":"demo/measure","status":"success","outputs":{"volume":7842.92,"part":"bracket"}}
{"type":"job-end","job":"measure","status":"success"}
{"type":"job-start","job":"lint"}
{"type":"step","job":"lint","index":0,"uses":"demo/notify","status":"success","outputs":{}}
{"type":"job-end","job":"lint","status":"success"}
{"type":"job-start","job":"verify"}
check got {"volume":7842.92,"label":"vol=7842.92 mm3"}
{"type":"step","job":"verify","index":0,"uses":"demo/check","status":"success","outputs":{"ok":true}}
{"type":"step","job":"verify","index":1,"uses":"demo/fail","status":"failure","message":"Cause([Fail(StepError: tolerance exceeded)])"}
{"type":"step","job":"verify","index":2,"uses":"demo/fail","status":"failure","message":"Cause([Fail(StepError: tolerance exceeded)])"}
{"type":"step","job":"verify","index":3,"uses":"demo/notify","status":"success","outputs":{}}
{"type":"step","job":"verify","index":4,"uses":"demo/notify","status":"skipped"}
{"type":"job-end","job":"verify","status":"failure"}
{"type":"job-end","job":"publish","status":"skipped"}
result {"status":"failure","jobs":{"measure":"success","lint":"success","verify":"failure","publish":"skipped"}} | Beobachtung | Regel |
|---|---|
measure und lint im ersten Level laufen | Jobs ohne needs formularebene 0 und gleichzeitig ausführen |
volume kommt als Zahl 7842 an.92, label als String | Eine Zeichenfolge, die genau einen Ausdruck darstellt, behält den Typ der Ausgabe; Ein eingebetteter Ausdruck ist stringifiziert |
| Schritt 1 schlägt fehl, aber der Job wird normal fortgesetzt | continueOnError: true zeichnet den Fehler auf, ohne den Job als fehlgeschlagen zu markieren |
| Schritt 2 schlägt fehl und markiert den Job als fehlgeschlagen | Standardverhalten |
| Schritt 3 wird ausgeführt, Schritt 4 wird übersprungen | if: failure läuft nur nach einem Fehler; die Standardeinstellung if: success wird nach eins übersprungen |
publish wird übersprungen, nie gestartet | Ein Job, dessen needs es ist nicht allen gelungen, strahlt nur aus job-end mit skipped |
Gesamt failure | Der Lauf ist nur dann erfolgreich, wenn jeder Job erfolgreich ist success; ein übersprungener Job gilt als nicht erfolgreich |
Trigger-Matching, getestet
| Ereignis | Übereinstimmungen? | Warum |
|---|---|---|
schieben zu main, geändert parts/a/b.json | ja | Zweigspiele; Pfad stimmt überein parts/**/*.json |
schieben zu main, geändert README.md | nein | Keine Übereinstimmungen mit geändertem Pfad |
schieben zu release/6.1, geändert parts/x.json | nein | parts/**/*.json kompiliert zu ^parts\/.*\/[^/]*\.json$, das ein Verzeichnis dazwischen benötigt parts/ und die Datei |
schieben zu feature/x | nein | Zweig stimmt nicht überein |
| handbuch | ja | manual wird deklariert |
anfrage hineinziehen main | nein | NEIN pullRequest trigger deklariert |
** benötigt hier auf jeder Seite ein Segment
Weil ** wird .* zwischen zwei wörtlichen Schrägstrichen, parts/**/*.json stimmt nicht mit Dateien direkt in überein parts/. Listen Sie beide Muster auf, parts/*.json und parts/**/*.json, um beides abzudecken.
* übereinstimmungen innerhalb eines Pfadsegments; ** übereinstimmungen über Segmente hinweg. Weglassen branches oder paths bedeutet, dass jeder Wert übereinstimmt.
Jeder Analysefehler wird reproduziert
| code | Eingabeproblem | Nachricht |
|---|---|---|
yaml | Fehlerhaftes YAML wie z name: [x | Ungültiges YAML: SyntaxError: YAML-Analysefehler: Unerwartetes Token |
schema | uses: Shell (kein Kleinbuchstabe area/step ausweis) | SchemaError(Es wurde eine Zeichenfolge erwartet, die mit RegExp übereinstimmt …) mit dem Pfad ["jobs"]["a"]["steps"][0] |
needs | needs: [b] ohne Arbeit b | Job a benötigt unbekannten Job b |
cycle | a bedürfnisse b und b bedürfnisse a | Workflow-Jobs bilden einen Zyklus: a, b |
duplicate-step-id | Zwei Schritte mit id: s, auch in verschiedenen Berufen | Schritt-IDs müssen im gesamten Workflow eindeutig sein |
Zur Laufzeit beliebig uses ohne einen registrierten Handler schlägt der gesamte Lauf vor dem ersten Schritt fehl und listet alle unbekannten IDs auf: Unknown step(s): demo/measure, demo/check, …. Ein Tippfehler führt daher niemals zur halben Umsetzung eines Workflows.
| Feld | Regel |
|---|---|
name | 1–128 Zeichen |
| Job- und Schritt-IDs | Zuerst Buchstabe, dann Buchstaben, Ziffern, _ oder -; höchstens 64 Zeichen |
uses | Kleinbuchstabensegmente getrennt durch /, mindestens zwei Segmente |
steps | Mindestens eine pro Job |
if | success (standard), always, failure |