Q3 — CI/CD Pipeline على غيمة
يشرح هذا الملف workflow.yml بالإضافة للفرق بين staging و production وطريقة الربط بـ Ghaymah CLI.
1. الفرق بين Staging و Production
| Staging | Production | |
|---|---|---|
| الغرض | بيئة تحقق قبل الإطلاق: نشر أوتوماتيكي لأي تعديل على main للتأكد أن الصورة (image) الجديدة تعمل فعليًا |
البيئة الحقيقية التي يستخدمها المستخدم النهائي |
| من يوافق؟ | لا يوجد — نشر تلقائي بمجرد نجاح البناء | يتطلب موافقة يدوية (Manual Approval) من مراجع معتمد قبل التنفيذ |
| البيانات | بيانات تجريبية/مصغّرة، منفصلة تمامًا عن بيانات المستخدمين الحقيقيين | بيانات حقيقية وحساسة |
| الموارد | نسخة واحدة أو نسختين، موارد أقل (توفير تكلفة) | حسب سياسة auto-scaling (انظر Q4/Q2)، موارد كافية لتحمل الحمل الحقيقي |
| التنبيهات عند الفشل | إشعار للفريق فقط | تنبيه فوري (on-call) لأن أي عطل يؤثر على المستخدمين مباشرة |
| الدومين المستخدم في هذا المثال | staging.ghaymah-exam-app.ghaymah.systems |
ghaymah-exam-app.ghaymah.systems |
الفكرة الأساسية: نفس الـ image بالضبط (نفس الـ tag، نفس commit SHA) يمر من staging إلى production بدون إعادة بناء، لضمان أن ما تم اختباره هو نفسه ما يُنشر فعليًا.
2. كيف تعمل بوابة الموافقة اليدوية (Manual Approval)
الموافقة اليدوية لا تُكتب كخطوة داخل الـ workflow نفسه، بل تُفعَّل من إعدادات المستودع:
Settings→Environments→ إنشاء بيئة اسمهاproduction- تفعيل
Required reviewersواختيار الأشخاص المسموح لهم بالموافقة (مثلاً: قائد الفريق أو مهندس SRE أول) - أي job في الـ workflow يستخدم
environment: name: production(كما فيdeploy-productionأعلاه) سيتوقف تلقائيًا وينتظر ضغط "Approve" من أحد المراجعين المحددين قبل أن يبدأ التنفيذ فعليًا.
3. طريقة الربط الفعلية (Docker Hub + Ghaymah Dashboard)
ملاحظة مهمة: واجهة Ghaymah الحالية (deploy.ghaymah.systems) بتدعم النشر عن طريق ربط حساب Docker Hub مباشرة من الداشبورد (زر "Deploy Application" → "Docker Hub")، مش عن طريق CLI مخصص. لذلك التدفق الفعلي للـ pipeline هو:
# 1. بناء الصورة محليًا أو عبر GitHub Actions (خطوة build-and-push في workflow.yml)
docker build -t mohamedadel777/ghaymah-exam-app:latest .
# 2. تسجيل الدخول لـ Docker Hub
docker login
# 3. رفع الصورة
docker push mohamedadel777/ghaymah-exam-app:latest
ثم من داشبورد Ghaymah:
Deploy Application → Docker Hub → اختيار الصورة والـ tag → تحديد Port 8080 → Deploy Now
في CI (GitHub Actions) الخطوة build-and-push في workflow.yml بتعمل بالضبط نفس الأمرين (build + push) تلقائيًا، وبعدين خطوات deploy-staging و deploy-production بترجع رسالة تفيدك إن فيه صورة جديدة جاهزة للـ redeploy — لأن Ghaymah لسه ما بتوفرش webhook/CLI عام لتفعيل الـ redeploy تلقائيًا وقت كتابة هذا الملف، فالخطوة الأخيرة (اختيار الـ tag الجديد والضغط Redeploy) بتتم يدويًا من الداشبورد. لو Ghaymah ضافت لاحقًا CLI أو Webhook رسمي للنشر، تُستبدل هذه الخطوة بأمر فعلي.
الـ Secrets المطلوبة في إعدادات المستودع (Settings → Secrets and variables → Actions):
| الاسم | القيمة |
|---|---|
DOCKERHUB_USERNAME |
يوزر Docker Hub (mohamedadel777) |
DOCKERHUB_TOKEN |
Access Token من Docker Hub (Account Settings → Security → New Access Token) |
🔗 مستودع تشغيلي فعلي (يوضح الـ pipeline يعمل بنجاح): https://github.com/mohamedadel29/ghaymah-exam-app/actions