مقدمة في CI/CD لمشاريع TypeScript
تطوير البرمجيات الحديث لا يمكن تصوره بدون أتمتة. CI/CD (Continuous Integration / Continuous Delivery) هي ممارسة تسمح لفرق التطوير بتسليم التغييرات إلى الإنتاج بسرعة وأمان. بالنسبة لمشاريع TypeScript، خاصة في نظام Node.js البيئي، يصبح إعداد خط أنابيب CI/CD مهمة بالغة الأهمية.
في هذه المقالة، سنشرح كيفية إعداد خط أنابيب CI/CD كامل لمشروع TypeScript باستخدام GitHub Actions. ستتعلم كيفية أتمتة تشغيل الاختبارات، بناء المشروع، والنشر على الاستضافة. المادة موجهة للمطورين الذين هم على دراية بالفعل بـ TypeScript ويريدون تطبيق ممارسات DevOps الحديثة.
ما هو GitHub Actions ولماذا هو مناسب لـ TypeScript
GitHub Actions هو نظام CI/CD مدمج يسمح بإنشاء سير عمل آلية (workflows) مباشرة في مستودع GitHub. المزايا الرئيسية:
- حد مجاني — 2000 دقيقة بناء شهرياً للمستودعات العامة.
- التكامل مع GitHub — لا حاجة لإعداد خدمات خارجية.
- المرونة — يدعم أي لغة، بما في ذلك TypeScript، من خلال تشغيل أوامر shell.
- نظام بيئي كبير — إجراءات جاهزة للنشر على AWS، Vercel، Netlify ومنصات أخرى.
لمشاريع TypeScript، يعتبر GitHub Actions مثالياً لأنه يسمح بتشغيل أوامر npm أو yarn بسهولة، واستخدام التخزين المؤقت للتبعيات والمهام المتوازية.
الهيكل الأساسي لملف workflow
يتم وصف Workflow في GitHub Actions في ملفات YAML، والتي يتم تخزينها في دليل .github/workflows/. دعنا نلقي نظرة على الحد الأدنى من التكوين لمشروع TypeScript.
قم بإنشاء ملف .github/workflows/ci.yml:
name: CI Pipeline
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: build-and-test: runs-on: ubuntu-latest
strategy: matrix: node-version: [18.x, 20.x]
steps: - name: Checkout repository uses: actions/checkout@v4
- name: Setup Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }}
- name: Install dependencies run: npm ci
- name: Lint check run: npm run lint
- name: Type check run: npx tsc --noEmit
- name: Run tests run: npm test
- name: Build project run: npm run buildتحليل العناصر الأساسية:
on— مشغلات التشغيل (push إلى main/develop، pull request).runs-on— نظام التشغيل للتنفيذ (ubuntu-latest).matrix— تشغيل متوازي على إصدارات مختلفة من Node.js (18 و 20).actions/checkout— إجراء قياسي لاستنساخ المستودع.actions/setup-node— تثبيت الإصدار المحدد من Node.js.npm ci— تثبيت نظيف للتبعيات من ملف lock (أسرع وأكثر موثوقية من npm install).
إضافة التخزين المؤقت لتسريع البناء
لتجنب تنزيل التبعيات في كل مرة، أضف التخزين المؤقت:
- name: Cache Node.js modules uses: actions/cache@v3 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node-هذه الخطوة تخزن ~/.npm مؤقتاً بناءً على تجزئة package-lock.json. عند التشغيل المتكرر، إذا لم تتغير التبعيات، سيتم استعادة التخزين المؤقت، مما يوفر 30-60 ثانية.