مقدمة: لماذا CI/CD ضروري لمشاريع JavaScript
تطوير الويب الحديث لا يمكن تصوره بدون أتمتة. كل يوم، يواجه مطورو JavaScript (Node.js) مهامًا روتينية: تشغيل الاختبارات، فحص الكود باستخدام linter، بناء ونشر التطبيق. التنفيذ اليدوي لهذه العمليات لا يستهلك الوقت فحسب، بل إنه محفوف بالأخطاء أيضًا. هنا يأتي دور CI/CD (Continuous Integration / Continuous Deployment) — وهي منهجية تتيح أتمتة جميع مراحل دورة حياة البرنامج.
GitHub Actions هي أداة أتمتة مدمجة على منصة GitHub، وهي مثالية لإعداد خطوط أنابيب CI/CD. في هذه المقالة، سنشرح بالتفصيل كيفية إعداد دورة أتمتة كاملة من الصفر لمشروع JavaScript (Node.js): بدءًا من تشغيل الاختبارات وصولاً إلى النشر على الخادم. ستتعلم كيفية إنشاء سير عمل، وكتابة ملفات التكوين، وتجنب الأخطاء الشائعة.
أساسيات GitHub Actions: الهيكل والمكونات
قبل كتابة الكود، دعنا نفهم المفاهيم الأساسية لـ GitHub Actions. يتم وصف خط الأنابيب بأكمله في ملفات YAML، والتي يتم تخزينها في دليل .github/workflows الخاص بمستودعك.
العناصر الأساسية لسير العمل (Workflow)
- Workflow — هو عملية آلية تتكون من مهمة واحدة أو أكثر من Job (المهام).
- Job — مجموعة من الخطوات (Step) التي يتم تنفيذها على Runner واحد (جهاز افتراضي).
- Step — أمر أو إجراء فردي (Action).
- Event — المشغل الذي يبدأ سير العمل (على سبيل المثال، push، pull request).
بالنسبة لمشاريع JavaScript، يبدو سير العمل القياسي كما يلي:
name: CI/CD لـ Node.js
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.x, 20.x]
steps:
- uses: actions/checkout@v4
- name: تثبيت Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: تثبيت التبعيات
run: npm ci
- name: فحص الكود (Linting)
run: npm run lint
- name: الاختبارات
run: npm test
لاحظ strategy.matrix — هذا يسمح باختبار الكود على إصدارات متعددة من Node.js في وقت واحد، وهو أمر بالغ الأهمية للمكتبات والحزم.
الإعداد التدريجي لـ CI/CD لمشروع Node.js
دعنا نلقي نظرة على مثال كامل لإعداد خط أنابيب لتطبيق ويب نموذجي يعمل بـ Express.js. سنبدأ بالملف الأساسي .github/workflows/node-ci.yml.
الخطوة 1: التحقق الأساسي من الكود
name: Node.js CI
on:
push:
branches: [ develop, main ]
pull_request:
branches: [ main ]
jobs:
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: إعداد Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: تثبيت التبعيات
run: npm ci
- name: فحص الكود (Lint)
run: npm run lint
- name: تشغيل اختبارات الوحدة
run: npm run test:unit
- name: بناء المشروع
run: npm run build
النقاط الرئيسية:
cache: 'npm'— يخبئnode_modules، مما يسرع عمليات التشغيل اللاحقة.npm ci— تثبيت نظيف للتبعيات، أسرع وأكثر موثوقية منnpm install.- فصل الاختبارات إلى وحدة (unit) وتكاملية (integration) (اختياري) يسمح بالحصول على ردود فعل أسرع.
الخطوة 2: اختبارات التكامل مع قاعدة البيانات
لاختبار مع قاعدة بيانات حقيقية، استخدم خدمات GitHub Actions:
jobs:
integration-tests:
runs-on: ubuntu-latest
```