CI/CD المتقدم لمشاريع جافا سكريبت باستخدام GitHub Actions
أتمتة البناء والاختبار والنشر (CI/CD) هي جزء لا يتجزأ من التطوير الحديث بلغة جافا سكريبت. إذا كنت قد أتقنت بالفعل خطوط أنابيب GitHub Actions الأساسية، فقد حان الوقت للانتقال إلى المستوى التالي. في هذه المقالة، سنستعرض التقنيات المتقدمة: التخزين المؤقت للتبعيات، البناء المصفوفي، التنفيذ المتوازي للمهام، العمل الآمن مع الأسرار، والنشر التلقائي على VPS و Docker. جميع الأمثلة موجهة لمشاريع Node.js.
1. تحسين وقت البناء: التخزين المؤقت والتشغيل الشرطي
إحدى المشكلات الرئيسية في خطوط الأنابيب الأساسية هي التثبيت الطويل لـ node_modules في كل مرة يتم تشغيلها. يسمح GitHub Actions بتخزين التبعيات مؤقتًا، مما يقلل وقت التنفيذ بمقدار 2-4 مرات.
استخدم الإجراء actions/cache لتخزين node_modules أو ~/.npm مؤقتًا:
name: CI Pipelineon: [push, pull_request]
jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20'
- name: Cache node_modules uses: actions/cache@v3 id: npm-cache with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }} restore-keys: | ${{ runner.os }}-node-
- name: Install dependencies if: steps.npm-cache.outputs.cache-hit != 'true' run: npm ciنصائح متقدمة:
- استخدم
hashFiles('package-lock.json')لإبطال التخزين المؤقت بدقة عند تغيير التبعيات. - بالنسبة للمستودعات المتعددة (monorepos)، قم بتخزين كل حزمة على حدة باستخدام
path: packages/*/node_modules. - أضف عمليات تشغيل شرطية (
if: github.ref == 'refs/heads/main') بحيث يتم تنفيذ المهام الثقيلة (مثل بناء نسخة الإنتاج) فقط عند الدفع إلى الفرع main.
2. البناء المصفوفي والمهام المتوازية
تتيح استراتيجية المصفوفة تشغيل نفس سير العمل بمعايير مختلفة. هذا لا غنى عنه لاختبار إصدارات متعددة من Node.js أو أنظمة التشغيل.
jobs: test: strategy: matrix: node-version: [18, 20, 22] os: [ubuntu-latest, windows-latest] runs-on: ${{ matrix.os }} 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لتنفيذ المهام المستقلة بالتوازي (مثل الفحص، اختبارات الوحدة، اختبارات التكامل)، استخدم وظائف (jobs) منفصلة. يتم تنفيذها في وقت واحد ولا تمنع بعضها البعض:
jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci - run: npm run lint
unit-tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci - run: npm run test:unit
integration-tests: needs: [lint, unit-tests] # انتظر حتى اكتمال lint و unit runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci - run: npm run test:integrationهام: استخدم needs لتحديد ترتيب تنفيذ المهام التابعة. هذا يوفر الوقت والموارد.
3. النشر المتقدم: Docker و VPS باستخدام القطع الأثرية
بعد الاختبار الناجح، يجب نشر التطبيق. سننظر في سيناريوهين شائعين: النشر في صورة Docker وعلى VPS.
3.1. بناء ونشر صورة Docker
jobs: build-and-push: needs: [test] runs-on: ub