workflow_call
Workflow قابل لإعادة الاستخدام workflow_call
workflow_call يحوّل workflow عادياً إلى workflow قابل للاستدعاء من workflows أخرى بدل تكرار نفس الـ jobs في كل مستودع أو ملف.
أي ملف workflow يحتوي workflow_call ضمن on يصبح قابلاً للاستدعاء من workflow آخر عبر uses على مستوى job كامل، بدل تعريفه كـ push أو pull_request فقط. هذا يحل مشكلة تكرار jobs متطابقة (بناء، اختبار، نشر) بين عدة مستودعات أو عدة workflows في نفس المستودع، دون النزول لمستوى الخطوات الفردية كما تفعل composite actions.
يُعرَّف workflow_call بمدخلات (inputs) وأسرار (secrets) اختيارية يمررها الـ caller، ويمكنه أيضاً إرجاع outputs من jobs داخله تُقرأ لاحقاً في الـ caller عبر needs.<job>.outputs. secrets: inherit في الاستدعاء يمرر كل أسرار الـ caller تلقائياً بدل تعدادها واحداً واحداً.
الصياغة
on:
workflow_call:
inputs:
<اسم>:
type: string
secrets:
<اسم السر>:
required: false📄 مثال
# .github/workflows/reusable-test.yml
on:
workflow_call:
inputs:
node-version:
type: string
default: "20"
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
- run: npm test
# استدعاؤه من workflow آخر:
# jobs:
# call-tests:
# uses: ./.github/workflows/reusable-test.yml
# with:
# node-version: "22"أهم النقاط
| العنصر | الوظيفة |
|---|---|
| inputs | مدخلات يمررها الـ caller بـ with، بأنواع string/boolean/number |
| secrets | أسرار يعلن الـ workflow حاجته لها؛ يمررها الـ caller صراحة أو عبر secrets: inherit |
| outputs | قيم يُرجعها الـ workflow القابل للاستدعاء، مبنية من outputs جوب داخلي |
| uses (في الـ caller) | يستدعي الـ workflow على مستوى job كامل بدل runs-on عادي |
💡 نصائح عملية
- استخدم workflow_call فقط إذا كان التكرار على مستوى jobs متعددة أو runners مختلفة — composite action أبسط لتكرار خطوات فقط
- المرجع {ref} عند الاستدعاء من مستودع مختلف يقبل SHA أو tag أو اسم فرع؛ الـ tag يُفضَّل للاستقرار عبر الوقت
⚠️ أخطاء شائعة
- الخلط بين workflow_call (يُستدعى كـ job) وworkflow_dispatch (تشغيل يدوي من واجهة GitHub) — تشغيلان مختلفان تماماً رغم تشابه الاسم
- نسيان تعريف secrets المطلوبة صراحة في الـ workflow القابل للاستدعاء، فتصل فارغة رغم وجودها في الـ caller
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DEVOPS الكامل بالعربي.
📚 للتعمق التقني الكامل بالإنجليزية: MDN Web Docs