GitHub Actions पर iOS CI/CD शुरू से सेट करना
यह GitHub Actions पर iOS ऐप की पूरी पाइपलाइन है, उसी क्रम में जिसमें आप इसे बनाते हैं। पहले कंपाइल और टेस्ट। फिर साइनिंग। फिर आर्काइव और अपलोड। हर स्टेप छोटा है और YAML कॉपी करने को तैयार है। यह GitHub-होस्टेड रनर पर भी चलती है और डेडिकेटेड Mac पर भी। बदलती सिर्फ़ एक लाइन है, runs-on।
1. ढाँचा
name: ios
on:
pull_request:
push:
branches: [main]
concurrency:
group: ios-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: macos-latest # or [self-hosted, macOS, your-label]
timeout-minutes: 30
steps:
- uses: actions/checkout@v42. Xcode चुनें
होस्टेड इमेज में कई Xcode वर्ज़न होते हैं। एक को साफ़ तौर पर चुनें, ताकि इमेज अपडेट होने पर आपका बिल्ड चुपचाप न बदले:
- run: sudo xcode-select -s /Applications/Xcode_26.6.app
- run: xcodebuild -versionडेडिकेटेड Mac पर वर्ज़न मशीन पर एक बार पिन होता है, और यह स्टेप हट जाता है।
3. डिपेंडेंसी
- uses: actions/cache@v4
with:
path: |
~/Library/Caches/org.swift.swiftpm
Pods
key: ${{ runner.os }}-deps-${{ hashFiles('**/Package.resolved', '**/Podfile.lock') }}
- run: pod install --repo-update # CocoaPods projects only4. सिम्युलेटर पर बिल्ड और टेस्ट
- run: |
xcodebuild test \
-scheme MyApp \
-destination 'platform=iOS Simulator,name=iPhone 17' \
-resultBundlePath TestResults \
| xcpretty
- uses: actions/upload-artifact@v4
if: failure()
with: { name: test-results, path: TestResults }पुल रिक्वेस्ट के लिए यहीं रुकें। नीचे का सब रिलीज़ का काम है और सिर्फ़ main पर होना चाहिए।
5. शेयर्ड Mac लॉग-इन के बिना कोड साइनिंग
Apple ID की जगह App Store Connect API key इस्तेमाल करें। key ID, issuer ID और .p8 का कंटेंट रिपॉज़िटरी सीक्रेट में रखें। फिर xcodebuild को क्लाउड-मैनेज्ड प्रोफ़ाइल से साइन करने दें:
- run: echo "${{ secrets.ASC_KEY_P8 }}" > AuthKey.p8
- run: |
xcodebuild archive \
-scheme MyApp -configuration Release \
-archivePath build/MyApp.xcarchive \
-allowProvisioningUpdates \
-authenticationKeyPath "$PWD/AuthKey.p8" \
-authenticationKeyID "${{ secrets.ASC_KEY_ID }}" \
-authenticationKeyIssuerID "${{ secrets.ASC_ISSUER_ID }}"6. एक्सपोर्ट करें और TestFlight पर अपलोड करें
- run: |
xcodebuild -exportArchive \
-archivePath build/MyApp.xcarchive \
-exportPath build/export \
-exportOptionsPlist ExportOptions.plist \
-allowProvisioningUpdates \
-authenticationKeyPath "$PWD/AuthKey.p8" \
-authenticationKeyID "${{ secrets.ASC_KEY_ID }}" \
-authenticationKeyIssuerID "${{ secrets.ASC_ISSUER_ID }}"
- run: |
xcrun altool --upload-app -f build/export/MyApp.ipa -t ios \
--apiKey "${{ secrets.ASC_KEY_ID }}" --apiIssuer "${{ secrets.ASC_ISSUER_ID }}"कई टीमें स्टेप 5 और 6 को fastlane में लपेटती हैं। अंदर के कमांड वही रहते हैं।
7. मिनट कहाँ जाते हैं, और रनर का चुनाव
होस्टेड रनर पर स्टेप 2 और 3 हर जॉब में दोहराए जाते हैं और लगभग $0.062 से $0.102 प्रति मिनट बिल होते हैं। डेडिकेटेड Mac पर ये एक बार होते हैं और कैश वॉर्म रहते हैं। इसीलिए जो टीमें महीने में लगभग 2,242 मिनट पार कर लेती हैं, वे पूरी पाइपलाइन फ़्लैट कीमत वाली मशीन पर ले जाती हैं। वे सिर्फ़ runs-on लाइन बदलती हैं। डेडिकेटेड हार्डवेयर पर पाइपलाइन वाली गाइड उस पहलू को समझाती है।
अक्सर पूछे जाने वाले सवाल
क्या GitHub Actions पर iOS CI चलाने के लिए Mac चाहिए?
+
हाँ। iOS ऐप बिल्ड और साइन करने के लिए Xcode चाहिए, जो सिर्फ़ macOS पर चलता है। इसलिए बिल्ड जॉब को macOS रनर चाहिए, चाहे GitHub-होस्टेड हो या आपके कंट्रोल वाला Mac।
अपने Apple ID के बिना CI में iOS ऐप कैसे साइन करूँ?
+
App Store Connect API key बनाएँ। उसका ID, issuer ID और .p8 कंटेंट सीक्रेट में रखें, और उन्हें -allowProvisioningUpdates के साथ xcodebuild को दें। रनर पर न Apple ID चाहिए, न keychain पासवर्ड।
क्या हर पुल रिक्वेस्ट पर टेस्ट चलने चाहिए?
+
हर पुल रिक्वेस्ट पर एक सिम्युलेटर पर बिल्ड और टेस्ट करें। आर्काइव, साइनिंग और TestFlight अपलोड सिर्फ़ main पर रखें। ये धीमे और महंगे स्टेप हैं।
यह पाइपलाइन डेडिकेटेड Mac पर ले जाने से क्या बदलता है?
+
runs-on लाइन। Xcode चुनना और डिपेंडेंसी कैश करना गैर-ज़रूरी हो जाता है, क्योंकि मशीन इन्हें जॉब के बीच रखती है। और बिल्ड के आगे कोई कतार नहीं होती।