مقدمة في CI/CD لمشاريع Swift
\nتطوير التطبيقات الحديثة للهواتف المحمولة وأجهزة سطح المكتب بلغة Swift لا يتطلب فقط كودًا عالي الجودة، بل أيضًا عملية موثوقة لتكامل وتسليم التغييرات. التكامل المستمر (CI) والتسليم المستمر (CD) هما ممارستان تسمحان بأتمتة بناء التطبيقات واختبارها ونشرها. GitHub Actions هي أداة مدمجة في GitHub، وهي مثالية لمشاريع Swift التي تعمل على iOS و macOS.
\nفي هذه المقالة، سنستعرض الدورة الكاملة لإعداد CI/CD لـ Swift: من التكوين الأساسي إلى النشر في App Store و TestFlight. ستتعلم كيفية تسريع التطوير، وتجنب "العامل البشري"، وضمان استقرار تطبيقك.
\n\nالمكونات الأساسية لـ CI/CD لـ Swift
\nقبل الانتقال إلى الإعداد، من المهم فهم المراحل التي يتكون منها خط الأنابيب لمشاريع Swift:
\n- \n
- البناء (Build) — ترجمة المشروع باستخدام Xcode أو xcodebuild. \n
- الاختبار (Test) — تشغيل اختبارات الوحدة واختبارات واجهة المستخدم. \n
- التدقيق اللغوي (Lint) — التحقق من نمط الكود (على سبيل المثال، باستخدام SwiftLint). \n
- الأرشفة (Archive) — إنشاء ملف .ipa أو .app للنشر. \n
- النشر (Deploy) — إرسال البناء إلى TestFlight أو App Store. \n
يسمح GitHub Actions بدمج كل هذه الخطوات في ملف YAML واحد يتم تخزينه في المستودع.
\n\nإعداد GitHub Actions لـ Swift: دليل خطوة بخطوة
\n\n1. إنشاء ملف سير العمل
\nأنشئ مجلد .github/workflows في جذر المستودع وأضف ملفًا باسم ci.yml:
name: Swift CI/CD\n\non:\n push:\n branches: [ main, develop ]\n pull_request:\n branches: [ main ]\n\njobs:\n build-and-test:\n runs-on: macos-latest\n\n steps:\n - uses: actions/checkout@v4\n\n - name: Select Xcode version\n run: sudo xcode-select -s /Applications/Xcode_15.0.app/Contents/Developer\n\n - name: Build and test\n run: |\n xcodebuild clean test \\\n -project YourApp.xcodeproj \\\n -scheme YourApp \\\n -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.0' \\\n -resultBundlePath TestResults \\\n CODE_SIGNING_ALLOWED=NO\n - name: Upload test results\n uses: actions/upload-artifact@v4\n with:\n name: test-results\n path: TestResults.xcresult\nيتم تشغيل سير العمل هذا مع كل دفعة إلى main و develop، وكذلك على طلبات السحب. يقوم بتنفيذ بناء نظيف وتشغيل جميع الاختبارات على محاكي iPhone 15 بنظام iOS 17.
\n\n2. إضافة التدقيق اللغوي والتحليل الثابت
\nللحفاظ على نمط كود موحد، أضف خطوة باستخدام SwiftLint:
\n- name: Run SwiftLint\n run: |\n brew install swiftlint\n swiftlint --strict\nإذا كنت تستخدم SPM (Swift Package Manager)، يمكنك إضافة تحليل ثابت باستخدام swift analyze (متاح في Swift 5.9+):
- name: Static analysis\n run: swift analyze --strict\n\n3. إعداد CD: النشر إلى TestFlight
\nلتسليم البناءات تلقائيًا إلى TestFlight، ستحتاج إلى شهادات وملفات تعريف التوقيع. الطريقة الأكثر أمانًا هي استخدام GitHub Secrets لتخزين المفاتيح:
\njobs:\n deploy:\n needs: build-and-test\n runs-on: macos-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - uses: actions/checkout@v4\n\n - name: Install provisioning profile\n env:\n PROVISIONING_PROFILE: ${{ secrets.PROVISIONING_PROFILE_BASE64 }}\n run: |\n echo "$PROVISIONING_PROFILE" | base64 --decode > ~/Library/MobileDevice/Provisioning\\ Profiles/profile.mobileprovision\n\n - name: Build and archive\n run: |\n xcodebuild archive \\\n -project YourApp.xcodeproj \\\n -scheme YourApp \\\n -archivePath $