CI/CD لمشاريع Swift: GitHub Actions مستوى متقدم

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

CI/CD متقدم لمشاريع Swift: تحسين خطوط الأنابيب باستخدام GitHub Actions



أتمتة البناء والاختبار والنشر هي جزء لا يتجزأ من تطوير iOS و macOS الحديث. خطوط أنابيب CI/CD الأساسية تحل المهام البسيطة، ولكن في المشاريع الحقيقية مع Swift و Swift Package Manager (SPM) وأهداف متعددة وتبعيات معقدة، هناك حاجة إلى نهج متقدم. في هذه المقالة، سنشرح كيفية الارتقاء بعملية CI/CD الخاصة بك إلى المستوى التالي باستخدام GitHub Actions، باستخدام البناء المصفوفي، وتحسين التخزين المؤقت، والاختبار المتوازي، والنشر التلقائي إلى TestFlight / App Store.



1. البناء المصفوفي (Matrix Builds) لتعدد المنصات



إحدى الميزات الرئيسية لـ GitHub Actions هي استراتيجية المصفوفة. تتيح لك تشغيل نفس سير العمل بمعلمات مختلفة (إصدار Xcode، مخطط البناء، المنصة). هذا مفيد بشكل خاص لمشاريع Swift التي تدعم iOS و macOS و tvOS و watchOS.



مثال على تكوين مصفوفة لمشروع Swift:



jobs:  build:    strategy:      matrix:        platform: [iOS, macOS, tvOS]        xcode-version: ['15.0', '15.2']        exclude:          - platform: tvOS            xcode-version: '15.0'  # استبعاد التركيبة غير المتوافقة    runs-on: macos-14    steps:      - uses: actions/checkout@v4      - name: تحديد Xcode ${{ matrix.xcode-version }}        run: sudo xcode-select -s /Applications/Xcode_${{ matrix.xcode-version }}.app      - name: بناء لـ ${{ matrix.platform }}        run: |          xcodebuild clean build \            -scheme MyApp \            -destination "platform=${{ matrix.platform }}" \            CODE_SIGN_IDENTITY="" \            CODE_SIGNING_REQUIRED=NO


يسمح هذا النهج، مع دفعة واحدة، بالتحقق من البناء على جميع المنصات المدعومة وإصدارات Xcode، مما يوفر وقت المطور.



2. التخزين المؤقت المتقدم: تسريع البناء بمقدار 2-3 مرات



بناء مشاريع Swift هو عملية كثيفة الاستخدام للموارد. يمكن أن يؤدي التخزين المؤقت لتبعيات SPM و DerivedData إلى تقليل وقت خط الأنابيب بنسبة 50-70%. بدلاً من التخزين المؤقت الأساسي، استخدم مفاتيح مخصصة مع مراعاة إصدارات التبعيات.



ذاكرة تخزين مؤقت محسّنة لـ SPM و Xcode:



- name: تخزين SPM مؤقت  uses: actions/cache@v3  with:    path: |      .build      SourcePackages    key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}    restore-keys: |      ${{ runner.os }}-spm-

- name: تخزين DerivedData مؤقت uses: actions/cache@v3 with: path: ~/Library/Developer/Xcode/DerivedData key: ${{ runner.os }}-derived-${{ hashFiles('**/*.swift') }} restore-keys: | ${{ runner.os }}-derived-


هام: استخدم hashFiles('**/Package.resolved') لإبطال التخزين المؤقت بدقة عند تغيير التبعيات. بالنسبة لـ DerivedData، يمكن أن يكون المفتاح هو تجزئة جميع ملفات Swift - وهذا يضمن تحديث التخزين المؤقت فقط عند حدوث تغييرات حقيقية في الكود.



3. الاختبار المتوازي وإعداد التقارير



بالنسبة لمشاريع Swift الكبيرة التي تحتوي على مئات اختبارات الوحدة، يمكن أن يستغرق التشغيل المتسلسل 20-30 دقيقة. الحل هو تقسيم الاختبارات إلى مجموعات وتشغيلها بالتوازي على عدة عدائين.



تنفيذ الاختبار المتوازي:



test:  strategy:    matrix:      test-group: [1, 2, 3, 4]  runs-on: macos-14  steps:    - uses: actions/checkout@v4    - name: تشغيل الاختبارات (المجموعة ${{ matrix.test-group }})      run: |        xcodebuild test \          -scheme MyApp \          -destination "platform=iOS Simulator,name=iPhone 15 Pro" \          -only-testing:MyAppTests/TestGroup${{ matrix.test-group }} \          CODE_SIGN_IDENTITY="" \          CODE_SIGNING_REQUIRED=NO    - name: رفع نتائج الاختبار      if: always()      uses: actions/upload-artifact@v4      with:                

المدونات

توصيات الكتب