مقدمة: لماذا نحتاج إلى CI/CD متقدم لـ TypeScript؟
خط أنابيب CI/CD الأساسي الذي يقوم ببساطة بتشغيل npm test و npm build يتوقف عن كونه فعالاً بمجرد أن يبدأ مشروع TypeScript في النمو. يزداد وقت البناء، وتستغرق الاختبارات ساعات، ويؤدي الإدارة اليدوية للإصدارات إلى أخطاء. يسمح المستوى المتقدم من إعداد GitHub Actions بحل هذه المشكلات: تسريع خط الأنابيب من خلال التخزين المؤقت، وتنفيذ الاختبارات بالتوازي لإصدارات مختلفة من Node.js وأنظمة التشغيل، بالإضافة إلى أتمتة النشر إلى الإنتاج.
في هذه المقالة، سنناقش ثلاث تقنيات رئيسية لمشاريع TypeScript: التخزين المؤقت الذكي لـ node_modules، والبناء المصفوفي للتحقق من التوافق، والنشر التلقائي باستخدام actions/upload-pages-artifact. جميع الأمثلة مكتوبة بلغة TypeScript وجاهزة للتكامل مع مستودعك.
1. التخزين المؤقت الذكي للتبعيات والترجمة
المشكلة الأولى في مشاريع TypeScript الكبيرة هي الوقت الطويل لتثبيت التبعيات والترجمة. يوفر GitHub Actions آلية للتخزين المؤقت، ولكن يجب تكوينها بشكل صحيح. بدلاً من تخزين المجلد node_modules بالكامل مؤقتاً (مما قد يؤدي إلى إصدارات قديمة)، من الأفضل تخزين package-lock.json ومجلد .cache الخاص بالمترجم مؤقتاً.
مثال على التخزين المؤقت المتقدم لـ TypeScript:
name: TypeScript CI (Advanced)on: [push, pull_request]
jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Cache TypeScript cache uses: actions/cache@v4 with: path: | **/node_modules **/.tsbuildinfo key: ${{ runner.os }}-ts-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-ts- - run: npm ci - run: npm run build --if-present - run: npm testالتحسين الرئيسي هنا هو استخدام hashFiles('**/package-lock.json') لتوليد مفتاح فريد للذاكرة المؤقتة. إذا لم يتغير package-lock.json، يتم استعادة الذاكرة المؤقتة في ثوانٍ. يسمح العلم --if-present بتخطي سكريبت البناء إذا لم يكن محدداً.
2. البناء المصفوفي: الاختبار على إصدارات مختلفة من Node.js وأنظمة التشغيل
يتم ترجمة TypeScript إلى JavaScript، ولكن سلوك الكود قد يختلف في بيئات التشغيل المختلفة. تسمح استراتيجية المصفوفة في GitHub Actions بتشغيل نفس خط الأنابيب على مجموعات متعددة من أنظمة التشغيل وإصدارات Node.js. هذا أمر بالغ الأهمية للمكتبات وتطبيقات الخادم.
مثال على إعداد مصفوفة لمشروع TypeScript:
jobs: test: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] node-version: [18, 20, 22] exclude: - os: windows-latest node-version: 22 fail-fast: false
steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'npm' - run: npm ci - run: npx tsc --noEmit - run: npm test - name: Upload coverage uses: actions/upload-artifact@v4 with: name: coverage-${{ matrix.os }}-${{ matrix.node-version }} path: coverage/النقاط الرئيسية:
fail-fast: false— لا يوقف المهام الأخرى عند حدوث خطأ في إحداها. يسمح برؤية جميع المشكلات في وقت واحد.exclude— يسمح باستبعاد المجموعات المعروفة بأنها غير عاملة (مثل Node 22 على Windows، إذا كانت هناك مشكلة معروفة).المدونات
توصيات الكتب
اقرأ أيضًا