مقدمة إلى CI/CD لمشاريع Swift
تطوير التطبيقات الحديثة للهواتف المحمولة وأجهزة الكمبيوتر المكتبية باستخدام Swift لا يتطلب فقط كودًا عالي الجودة، بل أيضًا عملية موثوقة للتكامل والتسليم. CI/CD (Continuous Integration / Continuous Deployment) هي ممارسة تتيح أتمتة بناء التطبيقات واختبارها ونشرها. بالنسبة لمشاريع Swift، خاصة تحت iOS و macOS، يُعد GitHub Actions واحدًا من أكثر الأدوات ملاءمة وشيوعًا.
في هذه المقالة، سنشرح كيفية إعداد خط أنابيب CI/CD كامل لمشاريع Swift باستخدام GitHub Actions. ستتعلم كيفية أتمتة البناء، تشغيل اختبارات الوحدة، وحتى إرسال التطبيق إلى TestFlight أو Mac App Store.
لماذا GitHub Actions لـ Swift؟
يوفر GitHub Actions إمكانيات مدمجة للعمل مع نظام Apple البيئي. على عكس الخدمات الخارجية، فهو متكامل تمامًا مع المستودع ولا يتطلب إعداد إضافي للإضافات. المزايا الرئيسية:
- دقائق مجانية للمستودعات العامة (حتى 2000 دقيقة شهريًا)
- إجراءات جاهزة لـ Xcode و SwiftLint و CocoaPods و SPM
- دعم مشغلات macOS مع Xcode المثبت مسبقًا
- إعداد مرن عبر ملفات YAML
الإعداد الأساسي لـ CI لمشروع Swift
لنبدأ بخط أنابيب بسيط يقوم ببناء المشروع وتشغيل الاختبارات عند كل دفع إلى فرع main أو عند إنشاء Pull Request.
أنشئ ملف .github/workflows/swift-ci.yml في جذر المستودع:
name: Swift CI
on: push: branches: [ main ] pull_request: branches: [ main ]
jobs: build-and-test: runs-on: macos-latest steps: - uses: actions/checkout@v4 - name: Select Xcode version run: sudo xcode-select -s /Applications/Xcode_15.2.app - name: Build run: xcodebuild build -scheme MyApp -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.2' | xcpretty - name: Run tests run: xcodebuild test -scheme MyApp -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.2' | xcprettyيقوم هذا الـ workflow بتنفيذ خطوتين رئيسيتين: بناء المشروع وتشغيل الاختبارات. لاحظ استخدام xcpretty — وهي أداة تقوم بتنسيق مخرجات Xcodebuild إلى شكل قابل للقراءة.
فحص إضافي لجودة الكود
دعنا نضيف تحليلًا ثابتًا باستخدام SwiftLint. سيساعد هذا في الحفاظ على نمط موحد للكود داخل الفريق:
jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: SwiftLint uses: norio-nomura/action-swiftlint@3.2.1 with: args: --strictالآن، عند كل commit، سيتم التحقق من امتثال الكود لقواعد SwiftLint. إذا تم العثور على مخالفات، سينتهي الـ workflow بخطأ.
CI/CD متقدم: الاختبار والنشر
بعد الإعداد الأساسي، يمكننا الانتقال إلى سيناريوهات أكثر تعقيدًا. دعنا ننظر إلى خط أنابيب يتضمن:
- البناء لعدة محاكيات
- الاختبار مع تغطية الكود
- النشر التلقائي إلى TestFlight (لـ iOS) أو Mac App Store
البناء والاختبار مع التغطية
لجمع بيانات تغطية الاختبارات، استخدم العلم -enableCodeCoverage YES:
jobs: test-coverage: runs-on: macos-latest steps: - uses: actions/checkout@v4 - name: Test with coverage run: | xcodebuild test \ -scheme MyApp \ -sdk iphonesimulator \ -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.2' \ -enableCodeCoverage YES \ -derivedDataPath Build/DerivedData | xcpretty - name: Upload coverage to Codecov uses: codecov/cod