दस्तावेज़
वर्कफ़्लो
संस्करणबद्ध YAML जाँच और सेवा चरण सटीक प्रोजेक्ट प्रतिबद्धता के विरुद्ध चलते हैं जिसने उन्हें ट्रिगर किया।
अंग्रेज़ी से स्वचालित रूप से अनुवादित। अंग्रेज़ी मूल देखें
एक रन का क्या मूल्यांकन होता है
वर्कफ़्लो फ़ाइलें इसके अंतर्गत प्रतिबद्ध हैं .cadcamfun/workflows/ के साथ .yml या .yaml विस्तार। साइडकार उन्हें चयनित प्रतिबद्ध रेफरी से लोड करता है। किसी अप्रतिबद्ध ड्राइंग या वर्कफ़्लो को संपादित करने से मौजूदा रन द्वारा देखी गई फ़ाइलें नहीं बदलती हैं।
@cadcamfun/workflow yAML को पार्स करता है, निर्भरता को मान्य करता है, ट्रिगर्स से मेल खाता है, और पंजीकृत कार्यों को निष्पादित करता है। यह मनमाने शेल कमांड, कंटेनर इमेज या डाउनलोड की गई क्रियाओं को निष्पादित नहीं करता है। प्रत्येक uses किसी भी चरण के शुरू होने से पहले पहचानकर्ता को धावक की वर्तमान रजिस्ट्री में मौजूद होना चाहिए।
वर्कफ़्लो लिखें
name: Project checks
on:
manual: true
jobs:
validate:
steps:
- id: structure
uses: project/validate
- uses: project/require-gcode
- uses: cam/sequence वर्कफ़्लो का एक नाम होता है, on ट्रिगर, और नौकरियां पहचानकर्ता द्वारा कुंजीबद्ध। किसी नौकरी में कम से कम एक चरण होता है और वह घोषित हो सकता है needs. एक कदम है uses, वैकल्पिक id और नाम, वैकल्पिक with तर्क, if, और continueOnError.
पहचानकर्ता एक अक्षर से शुरू होते हैं और उनमें अधिकतम 64 अक्षर, अंक, अंडरस्कोर या हाइफ़न होते हैं। चरण पहचानकर्ता संपूर्ण वर्कफ़्लो में अद्वितीय हैं। पार्सिंग अमान्य YAML, स्कीमा विफलताओं, अज्ञात कार्य निर्भरता, चक्रीय निर्भरता और डुप्लिकेट चरण पहचानकर्ताओं को अस्वीकार करता है।
अंतर्निहित जांचें
project/validateप्रतिबद्ध JSON फ़ाइलों को पार्स करता है और उनके फ़ाइल नामों के विरुद्ध मान्यता प्राप्त ड्राइंग/घटक/टूलपाथ इकाई आईडी की जाँच करता है और उनके नामों को सत्यापित करता है। यह संसाधन गणना लौटाता है।project/require-gcodeयदि प्रतिबद्ध टूलपाथ में जी-कोड खाली या अनुपलब्ध है तो विफल हो जाता है। इसके लिए आवश्यक नहीं है कि प्रोजेक्ट में कम से कम एक टूलपाथ हो।cam/verifyप्रतिबद्ध टूलपाथ जी-कोड से रीप्ले अनुरोध बनाता है औरToolpath.data.request. यह त्रुटि-गंभीरता रीप्ले निष्कर्षों, या चेतावनियों पर भी विफल रहता हैwith.severityहैwarning. वैकल्पिक तर्क हैंtoolpathऔरtolerance.cam/gcodeप्रतिबद्ध से पुनर्जीवित होता हैdata.requestऔर इसकी छंटनी की गई एनसी की तुलना प्रतिबद्ध पाठ से करता है। यह एक वैकल्पिक स्वीकार करता हैtoolpathचयनकर्ता.cam/sequenceपरस्पर विरोधी टूल-नंबर असाइनमेंट और रेस्ट-मशीनिंग अनुरोधों के लिए संग्रहीत अनुरोधों की जाँच करता है जिनका पिछला टूल सक्रिय टूल से बड़ा नहीं है।
सीएएम चरण संग्रहीत जनरेटर अनुरोध प्रारूप को पढ़ते हैं। गुम एनसी, गुम जनरेशन अनुरोध, या असमर्थित सत्यापन अनुरोध की सूचना दी जाती है skipped आउटपुट जहां लागू हो; वे चरण को स्वचालित रूप से विफल नहीं करते हैं. सत्यापित/मिलान की गई गणना और छोड़े गए कारणों का निरीक्षण करें। केवल छोड़े गए CAM कार्य वाला हरा वर्कफ़्लो सत्यापित प्रोग्राम का प्रमाण नहीं है।
सेवा समर्थित कदम
लाइव साइडकार रजिस्टर करता है vcs/commit, notify/push, और, सहायक सेवा मौजूद होने के बाद, ai/prompt. पंजीकरण स्पष्ट है: इन सेवाओं के बिना बनाया गया एक रनर एक अनुपलब्ध चरण का नामकरण करते हुए वर्कफ़्लो को विफल कर देता है।
vcs/commit एक संदेश की आवश्यकता है और एक स्वीकार करता है files के अंतर्गत पाठ का रिकॉर्ड .cadcamfun/ yAML, मार्कडाउन, JSON, या टेक्स्ट एक्सटेंशन के साथ। यह रन के खाते के रूप में कार्य करता है और संरक्षित-शाखा नीति का पालन करता है। अतिरिक्त-फ़ाइल तर्क सीधे CAD इकाई पथों को प्रतिस्थापित नहीं कर सकता है। वर्तमान कार्यान्वयन एक साफ कामकाजी प्रतिलिपि की जांच किए बिना परियोजना को प्रतिबद्ध करता है: यह चेक-आउट शाखा पर वर्तमान डेटाबेस संपादनों को भी स्नैपशॉट देता है, जो चेक किए जा रहे रेफरी से भिन्न हो सकता है। इस लेखन चरण को केवल तभी चलाएँ जब उस वर्तमान शाखा और कार्यशील स्थिति को प्रतिबद्ध करने का इरादा हो।
notify/push वैकल्पिक शीर्षक, मुख्य भाग और सफलता/असफलता परिणाम के साथ, रन के अभिनेता के लिए एक एप्लिकेशन अधिसूचना बनाता है। यह एक निरंतर अधिसूचना चरण है; यह स्वयं किसी बाहरी पुश प्रदाता के माध्यम से डिलीवरी स्थापित नहीं करता है।
ai/prompt एक संकेत की आवश्यकता है और वैकल्पिक रूप से सिस्टम टेक्स्ट और एक मॉडल स्वीकार करता है। यह प्रतिबद्ध फ़ाइल सामग्री को प्रतिस्थापित कर सकता है और उत्तर पाठ और मॉडल पहचान लौटा सकता है। गुम क्रेडेंशियल या प्रदाता त्रुटि इस चरण में विफल हो जाती है; एक मॉडल उत्तर सलाहकार आउटपुट है, जो नियतात्मक ज्यामिति जांच से अलग है।
शुद्ध अंतर्निर्मित चरण पंजीकृत हैं builtinSteps (apps/sidecar/src/services/workflow-steps.ts): project/validate, project/require-gcode, cam/verify, cam/gcode, और cam/sequence. उन्हें केवल प्रतिबद्ध फाइलों की आवश्यकता है @cadcamfun/core, इसलिए वे तब भी उपलब्ध रहते हैं जब सहायक नहीं चल रहा हो।
निष्पादन, आउटपुट और शर्तें
नौकरियाँ निर्भरता स्तरों में चलती हैं, एक स्तर में स्वतंत्र नौकरियाँ समवर्ती रूप से चलती हैं। किसी कार्य के चरण क्रमिक रूप से चलते हैं। वे नौकरियाँ जिनकी निर्भरताएँ सफल नहीं हुईं, छोड़ दी जाती हैं। डिफ़ॉल्ट चरण शर्त है success; always किसी भी परिणाम के बाद चलता है और failure उस कार्य में पहले से न संभाले गए चरण की विफलता के बाद चलता है।
continueOnError: true कार्य की विफलता ध्वज को सेट किए बिना एक असफल चरण की घटना को रिकॉर्ड करता है। अन्यथा एक असफल कदम बाद में केवल सफलता वाले चरणों को छोड़ देता है और कार्य को विफल घोषित कर देता है। समग्र परिणाम तभी सफलता है जब प्रत्येक कार्य सफल हो।
पहले नामित-चरण आउटपुट को संदर्भित किया जा सकता है with नीचे दिखाए गए अभिव्यक्ति का उपयोग करके मान। ठीक एक अभिव्यक्ति से युक्त मान अपना प्रकार बरकरार रखता है; लंबी स्ट्रिंग्स के अंदर प्रतिस्थापन आउटपुट को टेक्स्ट में परिवर्तित करता है। जब नौकरियां किसी अन्य नौकरी के आउटपुट का उपभोग करती हैं तो उन्हें निर्भरता की घोषणा करनी चाहिए।
with:
body: "Checked drawings: ${{ steps.structure.outputs.drawings }}" ट्रिगर और प्रेषण
on.push शाखा और परिवर्तित-पथ ग्लोब फ़िल्टर का समर्थन करता है; on.pullRequest आधार शाखा को फ़िल्टर करता है; on.manual स्पष्ट प्रेषण सक्षम बनाता है। एक एकल तारांकन पथ खंड के भीतर मेल खाता है और एक दोहरा तारांकन खंडों को फैला सकता है।
HTTP कमिट/पुश एकीकरण वर्तमान में स्वचालित पुश ट्रिगर को एक खाली परिवर्तित-पथ सूची प्रदान करता है। परिणामस्वरूप पुश पथ फ़िल्टर वाला वर्कफ़्लो उन घटनाओं से मेल नहीं खाता है। इस एकीकरण के लिए केवल शाखा-पुश फ़िल्टर या मैन्युअल प्रेषण का उपयोग करें जब तक कि परिवर्तित-पथ डेटा प्रदान नहीं किया जाता है।
प्रतिबद्ध परिभाषाएँ यहाँ पढ़ें GET /api/projects/:id/actions/workflows, वैकल्पिक रूप से साथ ref. पर एक पढ़ें /workflows/:name. एक विकृत फ़ाइल अपनी सामग्री के साथ लौटा दी जाती है और a problem ताकि इसकी मरम्मत की जा सके. किसी परिभाषा को संपादित करने के लिए, प्रोजेक्ट कमिट में उसका सुरक्षित वर्कफ़्लो पथ शामिल करें।
POST /api/projects/:id/actions/dispatch एक वैकल्पिक रेफरी स्वीकार करता है और उस रेफरी पर प्रत्येक मेल खाने वाले मैनुअल वर्कफ़्लो को भेजता है; यह एक वर्कफ़्लो नाम के लिए चयनकर्ता नहीं है. यहां से सहेजे गए परिणाम पढ़ें GET /api/projects/:id/actions/runs.
दृढ़ता और घटनाएँ चलाएँ
रनर वर्कफ़्लो, इवेंट, रेफरी, कमिट SHA, स्टेटस, टाइमस्टैम्प और संचित इवेंट को रिकॉर्ड करता है WorkflowRun. नौकरी की घटनाएँ प्रारंभ और समाप्ति को चिह्नित करती हैं; चरण घटनाओं में सूचकांक, पहचानकर्ता, स्थिति, वैकल्पिक आउटपुट और विफलता पाठ शामिल हैं। अमान्य YAML को अमान्य-फ़ाइल ईवेंट के साथ विफल रन के रूप में बनाए रखा जाता है।
वर्तमान HTTP ट्रिगर पथ वर्कफ़्लो के व्यवस्थित होने की प्रतीक्षा करता है और फिर रन-स्टार्ट और रन-समाप्त लाइव इवेंट को एक साथ प्रकाशित करता है। यह उस HTTP अनुरोध के माध्यम से प्रत्येक चल रहे चरण को स्ट्रीम नहीं करता है। कोर धावक एक को उजागर करता है onEvent उन एकीकरणों के लिए कॉलबैक जिनके लिए चरणबद्ध प्रगति की आवश्यकता है।
परिणामों की सटीक व्याख्या करें
एक वर्कफ़्लो अपनी कैप्चर की गई प्रतिबद्धता और पंजीकृत चरण कार्यान्वयन पर रिपोर्ट करता है। यह बाद के वर्किंग-कॉपी संपादनों को प्रमाणित नहीं करता है या विफलता पर पहले से रिकॉर्ड की गई प्रतिबद्धता को हटा नहीं देता है। रिलीज़ गेट के रूप में सफल रन का उपयोग करने से पहले छोड़े गए चेक, चेतावनी नीति और प्रासंगिक टूलपाथ साक्ष्य का निरीक्षण करें।
कार्यान्वयन को बीच में विभाजित किया गया है packages/workflow/src स्कीमा/ट्रिगर/निष्पादन और साइडकार के लिए workflow-runner.ts, workflow-steps.ts, और workflow-service-steps.ts प्रतिबद्ध प्रोजेक्ट डेटा, निरंतर रन और एप्लिकेशन सेवाओं के लिए।
एक पृथक वर्कफ़्लो इंजन उदाहरण चलाएँ
एक पैकेज उपभोक्ता पंजीकृत कार्यों और उनके टाइप किए गए संदर्भ की आपूर्ति करता है। यह उदाहरण मैन्युअल वर्कफ़्लो को पार्स करता है, एक पंजीकृत चेक निष्पादित करता है, और SQLite को खोले बिना या AI को लागू किए बिना अपना कार्य परिणाम देता है।
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" } } प्रभाव और के आधार पर कार्यस्थान के भीतर चलाएँ @cadcamfun/workflow, जैसे कि apps/sidecar. उपरोक्त कस्टम चरण आपूर्ति की गई रजिस्ट्री के लिए स्थानीय है; डेस्कटॉप वर्कफ़्लो में इसका नामकरण इसे उत्पादन साइडकार में स्थापित नहीं करता है।
स्रोत: packages/workflow/src/schema.ts और run.ts.
फ़िल्टर का मिलान करें और आउटपुट का सुरक्षित रूप से उपभोग करें
एक पुश ट्रिगर के लिए उसके शाखा फ़िल्टर का मिलान आवश्यक है और, जब पथ सूची मौजूद होती है, तो मिलान के लिए कम से कम एक आपूर्ति किए गए परिवर्तित पथ की आवश्यकता होती है। छोड़ा गया फ़िल्टर अप्रतिबंधित है; स्पष्ट रूप से खाली सूची किसी भी चीज़ से मेल नहीं खाती। एक मैन्युअल ईवेंट की आवश्यकता है on.manual मौजूद रहने के लिए। पुल-अनुरोध मिलान प्रमुख प्रस्ताव नाम के बजाय आधार शाखा का उपयोग करता है।
आउटपुट प्रतिस्थापन नेस्टेड सरणियों और रिकॉर्ड्स का पता लगाता है। एक सटीक अनुपलब्ध आउटपुट अभिव्यक्ति अपरिभाषित का मूल्यांकन करती है; एक लंबी स्ट्रिंग में एम्बेडेड अनुपस्थित आउटपुट खाली टेक्स्ट बन जाता है। आउटपुट प्राप्त करने के लिए किसी छोड़े गए या विफल चरण पर भरोसा न करें। प्रचार needs क्रॉस-जॉब उपभोक्ताओं के लिए निर्भरता शेड्यूलिंग डेटा ऑर्डर स्थापित करती है।
कदम if तीन शाब्दिक विधाओं में से एक है, सामान्य अभिव्यक्ति भाषा नहीं। वर्कफ़्लो वैरिएबल, शेल इंटरपोलेशन, मैट्रिक्स बिल्ड, मनमानी जावास्क्रिप्ट स्थितियां और तृतीय-पक्ष एक्शन लोडिंग इस इंजन द्वारा कार्यान्वित नहीं की जाती हैं। अलग ai/prompt हैंडलर स्थानापन्न प्रतिबद्ध files.<path> इसके संकेत में संदर्भ; सामान्य कदमों को वह अतिरिक्त प्रतिस्थापन नहीं मिलता है।
स्रोत: packages/workflow/src/trigger.ts, run.ts, और apps/sidecar/src/services/workflow-service-steps.ts.
एक छोड़ी गई शाखा या पथ फ़िल्टर प्रत्येक मान से मेल खाता है। मैन्युअल प्रेषण केवल घोषित किए गए वर्कफ़्लो से मेल खाता है on.manual, और एक पुल-अनुरोध ईवेंट वर्कफ़्लो से मेल खाता है branches पुल अनुरोध की आधार शाखा के विरुद्ध ग्लब्स (packages/workflow/src/trigger.ts).
वर्कफ़्लो परिणामों का निदान करें
| खोज | मतलब और अगली जांच |
|---|---|
वर्कफ़्लो फ़ाइल के साथ लौटाया जाता है problem | YAML/स्कीमा या निर्भरता त्रुटियों को सुधारें और निश्चित फ़ाइल को प्रतिबद्ध करें। फ़ाइल सूची संपादन के लिए अमान्य सामग्री को सुरक्षित रखती है। |
| निष्पादन से पहले अज्ञात चरण | प्रत्येक की तुलना करें uses पंजीकृत साइडकार स्टेप आईडी के साथ। पैकेज उदाहरण की स्थानीय रजिस्ट्री उत्पादन रजिस्ट्री नहीं है। |
| धक्के के बाद भागना नहीं | पुष्टि करें कि वर्कफ़्लो प्रतिबद्ध रेफरी में मौजूद है, शाखा मेल खाती है, और कोई भी असमर्थित HTTP परिवर्तित-पथ फ़िल्टर ईवेंट को बाहर नहीं कर रहा है। |
भागो सफल है लेकिन verified: 0 | पढ़ना skipped. गुम जनरेटर अनुरोध या असमर्थित टूलपाथ चेक को ज्यामितीय साक्ष्य के बिना छोड़ सकते हैं। |
| आश्रित नौकरी छूट गई | प्रत्येक के परिणाम का निरीक्षण करें needs काम; निर्भरता विफलता कार्य को प्रारंभ होने से रोकती है, जिसमें इसके हमेशा-वातानुकूलित चरण भी शामिल हैं। |
| प्रक्रिया समाप्ति के बाद भी रन चालू रहता है | इसके टाइमस्टैम्प/घटनाओं और सटीक प्रतिबद्धता का निरीक्षण करें। धावक प्रारंभ और अंतिम स्थिति को अलग-अलग बनाए रखता है और बाधित दौड़ को स्वचालित रूप से फिर से शुरू नहीं करता है। |
सहेजा गया रन इतिहास सेवा सीमा पर डिफ़ॉल्ट रूप से नवीनतम 50 रन लौटाता है। लाइव इवेंट सूचनाएं सर्वोत्तम प्रयास वाले साइड चैनल हैं: अधिसूचना वितरण को निष्पादन रिकॉर्ड के रूप में मानने के बजाय टिकाऊ रन परिणाम के लिए निरंतर पंक्तियों का निरीक्षण करें।
स्रोत: apps/sidecar/src/services/workflow-runner.ts, workflow-steps.ts, और http/vcs.ts.
वर्कफ़्लो फ़ाइल स्वरूप
वर्कफ़्लो एक YAML फ़ाइल है .cadcamfun/workflows/<name>.yml प्रोजेक्ट रिपॉजिटरी में, उसके द्वारा जाँचे गए मॉडल के साथ संस्करणित। इसका आकार GitHub क्रियाओं को प्रतिबिंबित करता है (on, jobs, needs, steps, uses, with), लेकिन uses हमेशा एक पंजीकृत CADCAMFUN चरण का नाम देता है। वर्कफ़्लो शेल कमांड या कंटेनर छवि नहीं चला सकता।
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 सफल हुए; अन्यथा इसकी सूचना दी जाती है skipped.| चाबी | नियम |
|---|---|
name | आवश्यक, 1–128 अक्षर। |
on.push | वैकल्पिक branches और paths ग्लोब सूचियाँ। जब शाखा मेल खाती है और कम से कम एक परिवर्तित पथ मेल खाता है तो एक पुश मेल खाता है। |
on.pullRequest | वैकल्पिक branches ग्लब्स, खोले जाने पर पुल अनुरोध की आधार शाखा से मेल खाता है। |
on.manual | कोई भी मान (उदाहरण के लिए {}) डेस्कटॉप या मोबाइल साथी से प्रेषण सक्षम बनाता है। |
jobs.<id> | जॉब आईडी एक अक्षर से शुरू होती है और इसमें अक्षर, अंक, _, और - (अधिकतम 64 अक्षर)। प्रत्येक कार्य के लिए कम से कम एक कदम की आवश्यकता होती है। |
needs | जॉब आईडी जो पहले सफल होनी चाहिए। फ़ाइल को पार्स करते समय अज्ञात आईडी और चक्र अस्वीकार कर दिए जाते हैं। |
steps[].uses | कम से कम एक स्लैश के साथ एक लोअरकेस चरण पहचानकर्ता, जैसे cam/verify. |
steps[].id | वैकल्पिक; संपूर्ण कार्यप्रवाह में अद्वितीय. इसके आउटपुट को पढ़ने के लिए बाद के चरणों के लिए आवश्यक है। |
steps[].with | चरण के लिए फ़्री-फ़ॉर्म पैरामीटर. तार प्रक्षेपित हैं। |
steps[].if | success (डिफ़ॉल्ट: केवल तभी चलाएं जब कार्य में अब तक कुछ भी विफल न हुआ हो), failure (केवल विफलता के बाद चलाएँ), या always. |
steps[].continueOnError | सत्य होने पर, इस चरण की विफलता कार्य को विफल के रूप में चिह्नित नहीं करती है। |
ग्लब्स का उपयोग * एक पथ खंड के भीतर मिलान करने के लिए और ** सभी खंडों से मिलान करने के लिए। छोड़ी गई फ़िल्टर सूची हर चीज़ से मेल खाती है। toolpaths/*.json माचिस toolpaths/a.json लेकिन नहीं toolpaths/x/a.json; toolpaths/** दोनों से मेल खाता है.
चरण संदर्भ
प्योर स्टेप्स केवल चेक की जा रही कमिट की फाइलों को पढ़ते हैं, लाइव डेटाबेस को कभी नहीं, इसलिए रन बिल्कुल उसी पेड़ पर रिपोर्ट करता है जिसे पुश किया गया था। सेवा-समर्थित चरण उनकी सेवा मौजूद होते ही पंजीकृत हो जाते हैं। तब तक, किसी का नाम लेना एक कठिन त्रुटि है, कोई मौन मनाही नहीं।
| कदम | साथ | आउटपुट | जब विफल हो जाता है |
|---|---|---|---|
project/validate | कोई नहीं | issues (0), drawings, workflows | एक इकाई JSON फ़ाइल अमान्य है, a drawings/, components/, या toolpaths/ फ़ाइल का id इसके फ़ाइल नाम से मेल नहीं खाता, या name लापता है। |
project/require-gcode | कोई नहीं | toolpaths | कमिट में किसी भी टूलपाथ का कोई G-कोड नहीं है। |
cam/verify | toolpath?, tolerance?, severity? (error डिफ़ॉल्ट, या warning) | verified, toolpaths, skipped | रीप्ले में एक त्रुटि (या एक चेतावनी) मिलती है severity: warning): स्टॉक में रैपिड्स, गॉज, शैंक या फिक्स्चर टकराव, सामग्री बची हुई। जी-कोड या संग्रहीत पीढ़ी अनुरोध के बिना प्रोग्राम सूचीबद्ध हैं skipped, कभी भी उत्तीर्ण के रूप में नहीं गिना गया। |
cam/gcode | toolpath? | matched, toolpaths, skipped | संग्रहीत अनुरोध से पुन: उत्पन्न करने से प्रतिबद्ध जी-कोड (हेडर स्टैम्प और आसपास के रिक्त स्थान को अनदेखा करते हुए) पुन: उत्पन्न नहीं होता है। |
cam/sequence | toolpath? | toolpaths, tools | एक टूल नंबर दो अलग-अलग टूल, या एक रेस्ट-मशीनिंग ऑपरेशन का नाम देता है restToolDiameter उससे बड़ा नहीं है toolDiameter. |
vcs/commit | message (आवश्यक), files नक्शा | commit, files | वर्किंग कॉपी गंदी है, एक रास्ता बाहर है .cadcamfun/, या कोई फ़ाइल नहीं है .yml, .yaml, .md, .json, या .txt. एक एआई अभिनेता को मना कर दिया जाता है main. |
notify/push | title?, body?, outcome? (success डिफ़ॉल्ट, या failure) | notified | दौड़ने में कभी असफल नहीं होता. एक बनाता है WORKFLOW_PASSED या WORKFLOW_FAILED प्रेषण खाते के लिए अधिसूचना, परियोजना इतिहास से जुड़ी हुई। |
ai/prompt | prompt (आवश्यक), system?, model? | text, model | कोई मॉडल उपलब्ध नहीं है या कॉल विफल हो जाती है. केवल यह चरण विफल रहता है; ज्यामिति का निर्णय अप्रभावित है। |
विकृत with मानों को रक्षात्मक रूप से पढ़ा जाता है: एक गैर-स्ट्रिंग जहां एक स्ट्रिंग अपेक्षित है, या एक गैर-परिमित संख्या, रन को विफल करने के बजाय अनदेखा कर दी जाती है। फ़िल्टर की पुष्टि करने के लिए आउटपुट की जाँच करें जैसे कि toolpath वास्तव में लागू किया गया।
आउटपुट और इंटरपोलेशन
एक कदम एक के साथ id अपने आउटपुट को रन-वाइड संग्रहीत करता है, ताकि कोई जॉब जॉब के आउटपुट को पढ़ सके needs. किसी भी स्ट्रिंग के अंदर with, ${{ steps.<id>.outputs.<key> }} वस्तुओं और सरणियों के माध्यम से पुनरावर्ती रूप से प्रतिस्थापित किया जाता है। जब एक स्ट्रिंग में बिल्कुल एक अभिव्यक्ति होती है, तो मान अपना प्रकार बनाए रखता है (एक संख्या एक संख्या ही रहती है)। अन्य पाठ में एंबेडेड, मान एक स्ट्रिंग में परिवर्तित हो जाता है, और एक गायब मान एक खाली स्ट्रिंग बन जाता है। ai/prompt अतिरिक्त विस्तार करता है ${{ files.<path> }} कमिट में उस फ़ाइल के टेक्स्ट को (यदि फ़ाइल अनुपस्थित है तो खाली करें)।
| साथ में अभिव्यक्ति | आउटपुट मान | परिणाम |
|---|---|---|
"${{ steps.verify.outputs.verified }}" | 3 | 3 (संख्या) |
"Verified ${{ steps.verify.outputs.verified }} programs" | 3 | "Verified 3 programs" |
"${{ steps.missing.outputs.x }}" | कोई नहीं | undefined |
जीवनचक्र और त्रुटियाँ चलाएँ
- ट्रिगर इवेंट (पुश, पुल रिक्वेस्ट, या मैनुअल) रेफरी के पेड़ में वर्कफ़्लो का चयन करता है, वर्किंग कॉपी के बजाय कमिट से पढ़ा जाता है।
- प्रत्येक फ़ाइल को पार्स किया गया है. YAML त्रुटियाँ (
yaml), स्कीमा त्रुटियाँ (schema), अज्ञातneeds(needs), चक्र (cycle), और डुप्लिकेट चरण आईडी (duplicate-step-id) को कारण सहित अमान्य रन के रूप में रिपोर्ट किया जाता है। - प्रत्येक
usesकुछ भी चलने से पहले रजिस्ट्री के विरुद्ध जाँच की जाती है। एक अज्ञात कदम से रन विफल हो जाता हैUnknown step(s): ..., इसलिए कोई टाइपो त्रुटि कभी भी आधे-अधूरे परिवर्तन को लागू नहीं करती है। - नौकरियों को स्तरों में क्रमबद्ध किया गया है। प्रत्येक स्तर समवर्ती रूप से चलता है; एक नौकरी जिसका
needsक्या सब सफल नहीं हुआ छोड़ दिया गया है। - प्रगति घटनाएँ (
job-start,stepस्थिति और आउटपुट या संदेश के साथ,job-end) डेस्कटॉप और साथी पर स्ट्रीम करें, और रन इसके ईवेंट के साथ जारी रहता है। - दौड़ तभी सफल होती है जब प्रत्येक कार्य सफल हो। छोड़ी गई नौकरियाँ सफल नहीं मानी जातीं।
लाइव इवेंट workflow.started (ट्रिगरिंग इवेंट के साथ) और workflow.finished (success, failure, या cancelled) प्रत्येक रन के लिए प्रकाशित किए जाते हैं।
साक्ष्य, सजावट नहीं
केवल अंतर्निहित चरणों में से cam/verify स्टॉक और टूल्स के विरुद्ध प्रोग्राम को दोबारा चलाता है। अन्य जाँचें जो किया गया था उसकी निरंतरता की पुष्टि करती हैं। पढ़ना skipped सूचियाँ: एक असत्यापित टूलपथ सत्यापित नहीं है।
एक पूर्ण संचालन, प्रत्येक घटना का पता लगाया गया
यह वर्कफ़्लो इंजन के हर नियम का एक साथ अभ्यास करता है: नौकरियों के बीच पारित आउटपुट, एक संपूर्ण-मूल्य और एक एम्बेडेड इंटरपोलेशन, continueOnError, if: failure, एक नौकरी छोड़ दी गई क्योंकि उसकी निर्भरता विफल हो गई, और एक स्वतंत्र नौकरी। इसके साथ चलाया गया runWorkflow और चार परीक्षण चरण संचालक: demo/measure रिटर्न { volume: 7842.92, part }, demo/check जो प्राप्त हुआ उसे प्रिंट करता है, demo/fail के साथ विफल रहता है StepError("tolerance exceeded") और demo/notify कुछ भी नहीं लौटाता.
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"}} | अवलोकन | नियम |
|---|---|
measure और lint प्रथम स्तर में चलाएँ | बिना नौकरियाँ needs स्तर 0 बनाएँ और समवर्ती रूप से चलाएँ |
volume संख्या 7842 के रूप में आती है।92, label एक स्ट्रिंग के रूप में | एक स्ट्रिंग जो बिल्कुल एक अभिव्यक्ति है आउटपुट का प्रकार रखती है; एक एम्बेडेड अभिव्यक्ति तारबद्ध है |
| चरण 1 विफल रहता है लेकिन कार्य सामान्य रूप से जारी रहता है | continueOnError: true कार्य को विफल चिह्नित किए बिना विफलता को रिकॉर्ड करता है |
| चरण 2 विफल हो जाता है और कार्य विफल हो जाता है | डिफ़ॉल्ट व्यवहार |
| चरण 3 चलता है, चरण 4 छोड़ दिया जाता है | if: failure असफलता के बाद ही चलता है; डिफ़ॉल्ट if: success एक के बाद एक छोड़ दिया जाता है |
publish छोड़ दिया गया है, कभी प्रारंभ नहीं किया गया | एक नौकरी जिसका needs क्या सभी केवल उत्सर्जन में सफल नहीं हुए? job-end साथ skipped |
कुल मिलाकर failure | रन तभी सफल होता है जब प्रत्येक कार्य सफल हो success; छोड़ा गया कार्य सफल नहीं माना जाता है |
ट्रिगर मिलान, परीक्षण किया गया
| आयोजन | माचिस? | क्यों |
|---|---|---|
की ओर धकेलें main, बदल गया parts/a/b.json | हाँ | शाखा मिलान; पथ मेल खाता है parts/**/*.json |
की ओर धकेलें main, बदल गया README.md | नहीं | कोई बदला हुआ पथ मेल नहीं खाता |
की ओर धकेलें release/6.1, बदल गया parts/x.json | नहीं | parts/**/*.json को संकलित करता है ^parts\/.*\/[^/]*\.json$, जिसके बीच एक निर्देशिका की आवश्यकता है parts/ और फ़ाइल |
की ओर धकेलें feature/x | नहीं | शाखा मेल नहीं खाती |
| नियमावली | हाँ | manual घोषित किया गया है |
अनुरोध को अंदर खींचें main | नहीं | नहीं pullRequest ट्रिगर घोषित |
** यहां प्रत्येक तरफ एक खंड की आवश्यकता है
क्योंकि ** बन जाता है .* दो शाब्दिक स्लैश के बीच, parts/**/*.json फ़ाइलों से सीधे मेल नहीं खाता parts/. दोनों पैटर्न सूचीबद्ध करें, parts/*.json और parts/**/*.json, दोनों को कवर करने के लिए।
* एक पथ खंड के भीतर मेल खाता है; ** सभी खंडों से मेल खाता है। को छोड़ते हुए branches या paths मतलब कोई भी मान मेल खाता है।
प्रत्येक पार्स त्रुटि, पुनरुत्पादित
| कोड | इनपुट समस्या | संदेश |
|---|---|---|
yaml | विकृत YAML जैसे name: [x | अमान्य YAML: सिंटेक्स त्रुटि: YAML पार्स त्रुटि: अनपेक्षित टोकन |
schema | uses: Shell (लोअर-केस नहीं area/step पहचान) | स्कीमएरर (पथ के साथ रेगएक्सपी से मेल खाने वाली एक स्ट्रिंग की उम्मीद) ["jobs"]["a"]["steps"][0] |
needs | needs: [b] बिना नौकरी के b | नौकरी ए को अज्ञात नौकरी बी की जरूरत है |
cycle | a आवश्यकताओं b और b आवश्यकताओं a | वर्कफ़्लो नौकरियां एक चक्र बनाती हैं: ए, बी |
duplicate-step-id | दो कदम साथ id: s, यहां तक कि विभिन्न नौकरियों में भी | चरण आईडी पूरे वर्कफ़्लो में अद्वितीय होनी चाहिए |
रन टाइम पर, कोई भी uses पंजीकृत हैंडलर के बिना, प्रत्येक अज्ञात आईडी को सूचीबद्ध करते हुए, पहले चरण से पहले पूरा रन विफल हो जाता है: Unknown step(s): demo/measure, demo/check, …. इसलिए कोई टाइपो त्रुटि कभी भी वर्कफ़्लो को आधा-अधूरा लागू नहीं करती है।
| मैदान | नियम |
|---|---|
name | 1–128 अक्षर |
| कार्य और चरण आईडी | पहले अक्षर, फिर अक्षर, अंक, _ या -; अधिकतम 64 अक्षर |
uses | लोअर-केस खंडों को अलग किया गया /, कम से कम दो खंड |
steps | प्रति कार्य कम से कम एक |
if | success (गलती करना), always, failure |