. التعرف على بنية GitHub Actions Repository Workflow Event Job Step Action Runner Artifact Environment Secret Variable مخطط العلاقات بينها جميعاً. اشرح بالتفصيل الممل جدا واشرح كخبير عالي المستوى للمبتدئين والمحترفين اشرح أدق وأبسط الامور الى اعقدها
الفصل الثالث: البنية الداخلية لـ GitHub Actions
هذه المرحلة هي أهم مرحلة في GitHub Actions بالكامل.
إذا فهمتها جيداً فلن تحتاج إلى حفظ ملفات YAML، بل ستفهمها تلقائياً.
معظم المبتدئيـن يرون ملفاً مثل:
name: Laravel CI
on:
push:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: composer install
- run: php artisan test
ويشعرون أنه سحر أو لغة جديدة.
لكن في الحقيقة GitHub Actions عبارة عن سلسلة بسيطة جداً:
Repository
↓
Event
↓
Workflow
↓
Job
↓
Step
↓
Action / Command
↓
Runner
↓
Artifacts
إذا فهمت هذا المخطط فقد فهمت 70% من GitHub Actions.
أولاً: Repository
ما هو Repository؟
هو المشروع نفسه.
مثلاً لديك مشروع Laravel:
laravel-shop
داخل GitHub.
مثال:
laravel-shop
│
├── app
├── routes
├── database
├── docker
├── .github
│ └── workflows
└── composer.json
هذا يسمى Repository.
لماذا هو مهم؟
لأن جميع GitHub Actions مرتبطة به.
كل شيء يبدأ من Repository.
بدون Repository لا يوجد:
- Workflow
- Actions
- Secrets
- Variables
- Deployments
مثال واقعي
لديك مشروع:
claudsoft-platform
كل Push يحدث عليه يمكن أن يشغل GitHub Actions.
ثانياً: Event
ما هو Event؟
الحدث الذي يؤدي إلى تشغيل Workflow.
بمعنى:
شيء حدث داخل GitHub.
أمثلة:
Push
أو:
Pull Request
أو:
Release
أو:
Tag
أو:
Manual Run
تشبيه بسيط
تخيل جرس الباب.
الجرس لا يعمل وحده.
يجب أن يضغط أحد عليه.
الضغط = Event
مثال
on:
push:
معناه:
“عند حدوث Push”
شغل Workflow.
أمثلة Events شائعة
Push
on:
push:
Pull Request
on:
pull_request:
Manual
on:
workflow_dispatch:
Schedule
on:
schedule:
Release
on:
release:
ثالثاً: Workflow
ما هو Workflow؟
Workflow هو خطة العمل الكاملة.
تخيل أنك مدير شركة.
عندما يصل طلب جديد:
تقول:
افحص الطلب
↓
راجع البيانات
↓
اصدر الفاتورة
↓
ارسل للعميل
هذه الخطة تسمى Workflow.
في GitHub:
Workflow عبارة عن ملف YAML.
مثال:
name: Laravel CI
ملف Workflow يوجد داخل:
.github/workflows
مثال:
.github/workflows/laravel.yml
Workflow يحتوي على
Events
Jobs
Steps
رابعاً: Job
ما هو Job؟
الـ Job عبارة عن مهمة كبيرة.
مثال:
Workflow يحتوي:
Test
Build
Deploy
كل واحدة تعتبر Job.
مثال حقيقي:
jobs:
test:
Job أخرى:
jobs:
build:
Job أخرى:
jobs:
deploy:
الشكل الكامل
Workflow
│
├── Test Job
├── Build Job
└── Deploy Job
لماذا نفصل Jobs؟
لأنها يمكن أن تعمل:
- بالتوازي
- أو بالتسلسل
مثال:
Test
↓
Build
↓
Deploy
خامساً: Step
ما هو Step؟
الـ Step هو أصغر وحدة عمل.
مثال:
داخل Job الاختبارات.
لدينا:
Install Dependencies
Run Tests
Run PHPStan
كل واحدة Step.
مثال:
steps:
داخلها:
- run: composer install
Step
- run: php artisan test
Step
- run: phpstan analyse
Step
العلاقة
Workflow
↓
Job
↓
Step
سادساً: Action
هذه نقطة يخطئ فيها معظم المبتدئين.
ما هو Action؟
Action عبارة عن وظيفة جاهزة قام شخص آخر ببنائها.
بدلاً من كتابة عشرات الأوامر.
تستخدم Action جاهزة.
مثال مشهور:
uses: actions/checkout@v4
ماذا تفعل؟
تقوم بتحميل المشروع إلى Runner.
بدونها ستحتاج أوامر كثيرة.
مثال آخر:
uses: actions/setup-node@v4
يقوم بتثبيت NodeJS.
مثال:
uses: docker/login-action@v3
يقوم بتسجيل الدخول إلى Docker Registry.
تشبيه
Action مثل Package في Laravel.
شخص آخر كتبها.
وأنت تعيد استخدامها.
سابعاً: Runner
هذه من أهم المفاهيم.
ما هو Runner؟
Runner هو الجهاز الذي ينفذ الأوامر فعلياً.
عندما تكتب:
run: php artisan test
أين يتم التنفيذ؟
على Runner.
GitHub Hosted Runner
GitHub يوفر لك جهازاً مؤقتاً.
مثلاً:
runs-on: ubuntu-latest
GitHub ينشئ:
Ubuntu VM
مؤقتة.
يشغل الأوامر.
ثم يحذفها.
ما الذي يحدث داخلياً؟
Push
↓
GitHub
↓
Create VM
↓
Execute Workflow
↓
Destroy VM
Self Hosted Runner
هنا أنت توفر الجهاز.
مثلاً:
VPS
أو:
Dedicated Server
أو:
Server داخل الشركة
ثم تربطه بـ GitHub.
متى نستخدم Self Hosted؟
عندما تحتاج:
- Docker سريع
- موارد أكبر
- الوصول للشبكة الداخلية
- Kubernetes خاص
ثامناً: Artifact
ما هو Artifact؟
ملف يتم حفظه بعد انتهاء Job.
مثال:
بعد Build.
ينتج:
app.zip
يمكن رفعه كـ Artifact.
مثال آخر:
coverage-report.html
أو:
build.tar.gz
لماذا نستخدمه؟
لنقل الملفات بين Jobs.
مثال:
Build Job
↓
Artifact
↓
Deploy Job
بدلاً من إعادة البناء.
تاسعاً: Environment
هذه نقطة مهمة جداً في الشركات.
ما هو Environment؟
بيئة تشغيل.
مثال:
Development
Staging
Production
لماذا؟
لأن كل بيئة لها:
- أسرار مختلفة
- قواعد مختلفة
- موافقات مختلفة
مثال:
environment: production
هنا GitHub يعلم أنك تنشر على Production.
يمكن طلب موافقة قبل النشر.
عاشراً: Secrets
من أخطر المواضيع.
ما هي Secrets؟
بيانات حساسة لا يجب ظهورها.
مثال:
SSH Key
أو:
Database Password
أو:
API Token
مثال
بدلاً من:
password: 123456
نكتب:
${{ secrets.DB_PASSWORD }}
فيظهر فقط أثناء التنفيذ.
ولا يراه أحد.
الحادي عشر: Variables
تشبه Secrets.
لكن ليست حساسة.
مثال:
APP_NAME
أو:
REGION
أو:
DOCKER_IMAGE
مثال:
${{ vars.APP_NAME }}
الفرق بين Variables و Secrets
Variable
يمكن للجميع رؤيتها.
Secret
مشفرة ومخفية.
العلاقة بين جميع المكونات
الآن دعنا نجمع الصورة كاملة.
مثال عملي Laravel + Docker + Coolify
Repository
│
├── Source Code
│
└── Workflow
│
▼
Event
(Push)
│
▼
Workflow
│
▼
┌────────────┐
│ Test Job │
└────────────┘
│
▼
Steps
│
├── Checkout Action
├── Composer Install
├── PHPUnit
└── PHPStan
│
▼
┌────────────┐
│ Build Job │
└────────────┘
│
▼
Steps
│
├── Docker Build
├── Docker Login
└── Docker Push
│
▼
Artifact
│
▼
┌────────────┐
│ Deploy Job │
└────────────┘
│
▼
Environment
Production
│
▼
Secrets
SSH Keys
│
▼
Runner
│
▼
Server
ملخص يجب حفظه
Repository
=
المشروع
Event
=
السبب الذي يبدأ التشغيل
Workflow
=
الخطة الكاملة
Job
=
مهمة كبيرة
Step
=
مهمة صغيرة
Action
=
وظيفة جاهزة
Runner
=
الجهاز الذي ينفذ
Artifact
=
ملفات محفوظة بين Jobs
Environment
=
بيئة التشغيل
Secret
=
بيانات حساسة مخفية
Variable
=
قيم عادية قابلة لإعادة الاستخدام
إذا فهمت هذا المخطط جيداً، فإن قراءة أي ملف GitHub Actions YAML لاحقاً ستصبح سهلة جداً، لأنك ستعرف بالضبط أين يقع كل عنصر داخل البنية الكاملة للنظام.