شرح خطوط أنابيب CI/CD مع GitHub Actions
لقد قمت للتو بدفع commit والآن تقوم يدويًا بتشغيل الاختبارات وبناء التطبيق ورفع الملفات إلى الخادم. هذا يعمل، لكنه بطيء وعرضة للخطأ ولا يتوسع. هنا يأتي دور خطوط أنابيب CI/CD.
في هذا الدليل، سنشرح مفاهيم CI/CD ونوضح لك كيفية بناء خط أنابيب حقيقي باستخدام GitHub Actions. في النهاية، ستفهم كيفية أتمتة الاختبار والبناء والنشر لأي مشروع.
ما هو CI/CD؟
CI (التكامل المستمر) هو ممارسة اختبار ودمج تغييرات الكود تلقائيًا في فرع مشترك. كل عملية دفع (push) تؤدي إلى تشغيل عملية بناء واختبار، مما يكتشف مشكلات التكامل مبكرًا.
CD (التسليم/النشر المستمر) يوسع CI من خلال تحضير تطبيقك تلقائيًا (ونشره اختياريًا) إلى الإنتاج. التسليم المستمر يعني أن الكود جاهز دائمًا للنشر؛ النشر المستمر يعني أنه يتم نشره تلقائيًا.
معًا، يشكل CI/CD خط أنابيب: سلسلة من الخطوات الآلية التي تنقل الكود من الـ commit إلى الإنتاج.
لماذا استخدام GitHub Actions لـ CI/CD؟
GitHub Actions هي منصة CI/CD مدمجة في GitHub. إنها مجانية للمستودعات العامة وتقدم دقائق سخية للمستودعات الخاصة. الفوائد الرئيسية:
- مدمجة: لا حاجة لخدمة خارجية؛ سير العمل موجود في مستودعك.
- مدفوعة بالأحداث: قم بتشغيل سير العمل عند الدفع، أو طلب السحب، أو الجدولة، أو التشغيل اليدوي.
- قابلة للتوسيع: آلاف الإجراءات الجاهزة في GitHub Marketplace.
- بناء المصفوفة: اختبار عبر أنظمة تشغيل متعددة وإصدارات لغات بسهولة.
المفاهيم الأساسية لـ GitHub Actions
قبل كتابة أول سير عمل لك، افهم هذه المصطلحات:
| المصطلح | الوصف |
|---|---|
| Workflow | عملية آلية محددة في ملف YAML تحت .github/workflows/. |
| Event | محفز يبدأ سير العمل (مثل push، pull_request). |
| Job | مجموعة من الخطوات التي تعمل على نفس runner. تعمل المهام بالتوازي افتراضيًا. |
| Step | مهمة واحدة داخل المهمة. يمكنها تشغيل أمر أو استخدام إجراء. |
| Action | وحدة كود قابلة لإعادة الاستخدام (مثل actions/checkout) يمكن تضمينها في خطوة. |
| Runner | جهاز افتراضي ينفذ المهام (Ubuntu، Windows، macOS). |
بناء أول خط أنابيب CI لك
لنقم بإنشاء سير عمل CI أساسي لمشروع Node.js. سيقوم بتشغيل الاختبارات عند كل عملية دفع وطلب سحب إلى الفرع الرئيسي.
أنشئ .github/workflows/ci.yml:
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.x, 20.x]
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm test
سير العمل هذا:
- يتم تشغيله عند عمليات الدفع وطلبات السحب إلى
main. - يشغل مهمة تسمى
testعلى أحدث runner Ubuntu. - يستخدم مصفوفة للاختبار ضد Node.js 18 و 20.
- يقوم بسحب الكود، وإعداد Node، وتثبيت التبعيات، وتشغيل الاختبارات.
قم بدفع هذا الملف وراقب علامة تبويب Actions. سترى مهمتين متوازيتين (واحدة لكل إصدار Node). إذا فشل أي اختبار، يفشل سير العمل ويقوم GitHub بإخطارك.
إضافة النشر المستمر
CI رائع، لكن CD هو حيث تتألق الأتمتة. لنقم بتوسيع سير العمل للنشر إلى خادم بعد نجاح الاختبارات على الفرع الرئيسي.
سنضيف مهمة deploy تعتمد على test وتعمل فقط عند عمليات الدفع إلى main.
deploy:
needs: test
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy to server
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
cd /var/www/myapp
git pull origin main
npm ci --production
pm2 restart myapp
النقاط الرئيسية:
needs: testيضمن تشغيل النشر فقط إذا نجحت الاختبارات.- شرط
ifيحد من النشر لعمليات الدفع علىmain. - الأسرار (
SSH_HOST،SSH_USER،SSH_KEY) مخزنة في إعدادات مستودع GitHub ويتم حقنها بشكل آمن.
هذا النمط يعمل مع العديد من أهداف النشر: SSH، سجلات Docker، المنصات السحابية (AWS، Vercel، Netlify)، أو Kubernetes.
أفضل الممارسات لـ CI/CD مع GitHub Actions
- اجعل سير العمل سريعًا: قم بتخزين التبعيات مؤقتًا (مثل
actions/cache) لتقليل أوقات البناء. - الفشل السريع: قم بتشغيل الفحوصات السريعة (linting) قبل الاختبارات الأبطأ.
- استخدم البيئات: قم بتكوين قواعد الحماية لعمليات النشر إلى الإنتاج.
- أمّن الأسرار: لا تقم أبدًا بتضمين بيانات الاعتماد في الكود؛ استخدم GitHub Secrets.
- المراقبة والتنبيه: قم بإعداد إشعارات لسير العمل الفاشل.
تصحيح أخطاء سير العمل الفاشل
عندما يفشل سير العمل، يعرض GitHub السجلات لكل خطوة. تشمل المشكلات الشائعة:
- التبعيات المفقودة: تأكد من تشغيل
npm ciأو ما يعادله قبل الاختبارات. - الأسرار غير الصحيحة: تحقق مرة أخرى من الأسماء والقيم.
- أخطاء الأذونات: تحقق من أذونات runner ومفاتيح SSH.
يمكنك أيضًا تمكين تسجيل التصحيح عن طريق تعيين أسرار المستودع ACTIONS_STEP_DEBUG إلى true.
الأسئلة الشائعة
ما الفرق بين CI و CD؟
CI يؤتمت اختبار ودمج تغييرات الكود. CD يؤتمت تسليم أو نشر تلك التغييرات إلى بيئة. CI يضمن جودة الكود؛ CD يضمن وصوله إلى المستخدمين بسرعة وموثوقية.
هل GitHub Actions مجاني؟
GitHub Actions مجاني للمستودعات العامة. للمستودعات الخاصة، تحصل على بدل شهري من الدقائق المجانية (مثل 2,000 دقيقة للحسابات المجانية) وتدفع مقابل الاستخدام الإضافي. كما أن runners المستضافة ذاتيًا خيار أيضًا.
هل يمكنني استخدام GitHub Actions لمشاريع غير GitHub؟
نعم، يمكن لـ GitHub Actions تشغيل أي أدوات سطر أوامر. يمكنك استخدامه لبناء ونشر المشاريع المستضافة في مكان آخر، طالما أن الكود على GitHub أو تستخدم إجراءات لجلبها.
هل أنت مستعد لتبسيط CI/CD الخاص بك؟ ابدأ بأتمتة اختباراتك باستخدام GitHub Actions. للحصول على طريقة سريعة لتحليل سجلات النشر، جرب محلل سجلات Nginx لاكتشاف الأخطاء ومشكلات الأداء بعد كل عملية نشر.