डेडिकेटेड Mac बिल्ड सर्वर पर fastlane सेट करना
Mac बिल्ड सर्वर पर fastlane को Bundler से इंस्टॉल करें, जिसे fastlane पसंद करता है, या Homebrew से। साइनिंग match में रखें, CI पर इसे readonly चलाएँ, और App Store Connect API key से Apple में लॉग-इन करें। CI lanes की शुरुआत setup_ci से करें, ताकि fastlane एक अस्थायी keychain इस्तेमाल करे। फिर आपका CI जॉब एक ही कमांड चलाता है: bundle exec fastlane beta।
पहले क्या चाहिए
- Xcode, एडमिन एक्सेस और Homebrew वाला Mac।
- उस Mac पर एक CI एजेंट: GitHub Actions, GitLab, Buildkite, Jenkins या CircleCI।
- एक App Store Connect अकाउंट, जिसमें API keys बनाने का अधिकार हो।
- match के लिए एक प्राइवेट Git रिपो, या Google Cloud या S3 bucket।
1. fastlane इंस्टॉल करें
अक्टूबर 2026 में पढ़े गए fastlane के डॉक्स Bundler को पसंद करते हैं। वे Ruby 3.2 या नया सपोर्ट करते हैं, और 3.3 या नया पसंद करते हैं। वे macOS की सिस्टम Ruby से बचने की सलाह देते हैं। rbenv जैसे version manager से नई Ruby इंस्टॉल करें। फिर प्रोजेक्ट में एक Gemfile जोड़ें:
source "https://rubygems.org" gem "fastlane"
gem install bundler bundle update git add Gemfile Gemfile.lock
Bundler, Gemfile.lock में fastlane का वर्ज़न पिन करता है। हर मशीन और हर CI रन को वही वर्ज़न मिलता है। इसे bundle exec fastlane के रूप में चलाएँ।
एक ही बिल्ड सर्वर पर आसान रास्ता Homebrew है। यह अपनी Ruby साथ लाता है:
brew install fastlane
हर प्रोजेक्ट के लिए एक रास्ता चुनें। दोनों मिलाने से ही एक मशीन पर fastlane के दो वर्ज़न आ जाते हैं।
2. App Store Connect API key बनाएँ
fastlane, Apple ID लॉग-इन की जगह API keys सुझाता है: कोई टू-फ़ैक्टर प्रॉम्प्ट नहीं, बेहतर स्पीड, ज़्यादा भरोसा। App Store Connect में Users and Access खोलें, फिर Integrations, फिर App Store Connect API। एक Team Key बनाएँ। fastlane बताता है कि provisioning कॉल के लिए team key चाहिए। इसे सबसे छोटा रोल दें, जो काम कर जाए। Issuer ID और Key ID नोट करें। .p8 फ़ाइल तुरंत डाउनलोड करें, क्योंकि Apple इसे सिर्फ़ एक बार डाउनलोड करने देता है।
mkdir -p ~/.appstoreconnect mv ~/Downloads/AuthKey_ABC123XYZ.p8 ~/.appstoreconnect/ chmod 600 ~/.appstoreconnect/AuthKey_ABC123XYZ.p8
key को बिल्ड Mac पर या अपने CI के secret store में रखें। इसे कभी कमिट न करें।
3. match को एक बार, डेवलपर मशीन से सेट करें
bundle exec fastlane match init bundle exec fastlane match development bundle exec fastlane match appstore
match init पूछता है कि सर्टिफ़िकेट कहाँ रखें, और एक Matchfile लिखता है। अगले दो कमांड सर्टिफ़िकेट और प्रोफ़ाइल बनाते हैं और उन्हें एन्क्रिप्ट करके उस स्टोरेज में सेव करते हैं। मज़बूत passphrase चुनें। CI इसे MATCH_PASSWORD वेरिएबल से पढ़ता है।
fastlane हर CI सिस्टम पर readonly मोड सुझाता है। तब CI सिर्फ़ मौजूदा चीज़ें डाउनलोड करता है, और कभी कुछ बनाता या रद्द नहीं करता।
4. lanes लिखें
default_platform(:ios)
platform :ios do
lane :test do
run_tests(
scheme: "MyApp",
devices: ["iPhone 17"],
result_bundle: true
)
end
lane :beta do
setup_ci
api_key = app_store_connect_api_key(
key_id: ENV["ASC_KEY_ID"],
issuer_id: ENV["ASC_ISSUER_ID"],
key_filepath: ENV["ASC_KEY_PATH"]
)
match(type: "appstore", readonly: is_ci, api_key: api_key)
increment_build_number(
build_number: latest_testflight_build_number(api_key: api_key) + 1
)
build_app(scheme: "MyApp")
upload_to_testflight(api_key: api_key, skip_waiting_for_build_processing: true)
end
endsetup_ci एक अस्थायी keychain बनाता है, match को readonly पर करता है, और लॉग और टेस्ट रिज़ल्ट के पाथ सेट करता है। यह तभी काम करता है, जब fastlane को CI रन का पता चले। अगर आपका रन पहचाना न जाए, तो force: true दें। build processing छोड़ने से जॉब जल्दी खत्म होता है। पर fastlane बताता है कि इससे बाहरी टेस्टर्स को डिस्ट्रिब्यूशन भी छूट जाता है।
5. इसे CI से चलाएँ
हर CI सिस्टम वही shell लाइनें चलाता है। secrets अपने CI में रखें, रिपो में नहीं।
export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 bundle install bundle exec fastlane beta # needs MATCH_PASSWORD, ASC_KEY_ID, ASC_ISSUER_ID and ASC_KEY_PATH set as CI secrets
GitHub Actions पर ये लाइनें एक run स्टेप में जाती हैं, और secrets env के रूप में दिए जाते हैं। MacRun Mac पर GitHub Actions रनर सॉफ़्टवेयर पहले से इंस्टॉल आता है। हमारी GitHub Actions iOS सेटअप गाइड पूरा वर्कफ़्लो दिखाती है। GitLab, Buildkite या CircleCI पर यही लाइनें जॉब की script में डालें। Jenkins पर sh स्टेप इस्तेमाल करें।
यह रीबूट के बाद कैसे चलता रहता है
fastlane सर्विस नहीं है। यह आपके CI एजेंट के जॉब के अंदर चलता है। रीबूट के बाद जिसे लौटना है, वह एजेंट और उसका लॉग-इन सेशन है। एजेंट को ऑटोमैटिक लॉग-इन के साथ LaunchAgent के रूप में सेट करें, जैसा हमारी GitLab Runner और Buildkite गाइड में है। setup_ci वाला अस्थायी keychain हर रन पर फिर बनता है। रीस्टार्ट के बाद लॉक हुआ लॉग-इन keychain इसे रोक नहीं सकता।
आम एरर और उनके हल
ये fastlane के डॉक्स में दर्ज हैं।
- CI में अजीब encoding एरर या क्रैश। fastlane को UTF-8 locale चाहिए।
LANGऔरLC_ALLकोen_US.UTF-8पर सेट करें। - जॉब टू-फ़ैक्टर प्रॉम्प्ट पर अटक जाता है। API key इस्तेमाल करें। Apple ID के साथ
SPACESHIP_ONLY_ALLOW_INTERACTIVE_2FAसेट करें, ताकि यह अटकने की जगह जल्दी फ़ेल हो। - match, CI पर नए सर्टिफ़िकेट बनाने की कोशिश करता है।
readonlyइस्तेमाल करें, या पहलेsetup_ciचलाएँ। - match अपना रिपो clone नहीं कर पाता। GitHub एक deploy key को दो रिपो पर स्वीकार नहीं करता। read-only मशीन अकाउंट,
git_private_key, याMATCH_GIT_BASIC_AUTHORIZATIONइस्तेमाल करें। - प्रोफ़ाइल इंस्टॉल हैं पर Xcode उन्हें नहीं देखता। Xcode 16 ने प्रोफ़ाइल फ़ोल्डर बदल दिया। fastlane चुने हुए Xcode के हिसाब से चलता है, इसलिए दो Xcode वाली मशीन पर match से पहले
xcode_selectचलाएँ।
डेडिकेटेड Mac क्यों मदद करता है
build_app और run_tests Xcode बिल्ड हैं। जो मशीन DerivedData और इंस्टॉल gems रखती है, उस पर ये कहीं तेज़ चलते हैं। Xcode 26.6 के साथ Wikipedia iOS ऐप पर हमारे बेंचमार्क में M6 पर क्लीन बिल्ड 86 सेकंड का था। GitHub-होस्टेड macos-26 रनर पर यह 183 सेकंड का था। छोटे बदलाव के बाद जॉब वॉर्म मशीन पर 27 सेकंड का था, और नई मशीन पर 269।
कब बिल्ड सर्वर की ज़रूरत नहीं
अगर आप हफ़्ते में एक बार TestFlight पर शिप करते हैं, तो होस्टेड रनर या Xcode Cloud कम काम है। इस सौदे के लिए हमारी Xcode Cloud विकल्प गाइड देखें। यह भी जान लें कि MacRun क्या नहीं करता। हम आपकी कोड साइनिंग मैनेज नहीं करते। match आप खुद चलाते हैं, जैसा इस पेज पर है। हम कोई SLA भी नहीं देते।
बिल्ड सर्वर के लिए तैयार हैं? प्राइसिंग पर हर टियर है, और सेटअप डॉक्स बताते हैं कि कैसे जुड़ें।
अक्सर पूछे जाने वाले सवाल
बिल्ड सर्वर पर fastlane को Homebrew से इंस्टॉल करूँ या Bundler से?
+
fastlane, Bundler पसंद करता है, क्योंकि Gemfile.lock वर्ज़न पिन करता है। एक मशीन पर Homebrew आसान है और अपनी Ruby साथ लाता है।
fastlane setup_ci क्या करता है?
+
यह एक अस्थायी keychain बनाता है, match को readonly पर करता है, और लॉग और टेस्ट रिज़ल्ट के पाथ सेट करता है। यह सिर्फ़ CI पर काम करता है, जब तक आप force: true न दें।
fastlane के साथ App Store Connect API key क्यों इस्तेमाल करें?
+
इसमें टू-फ़ैक्टर प्रॉम्प्ट नहीं आता, और fastlane इसे Apple ID सेशन से तेज़ और ज़्यादा भरोसेमंद बताता है। provisioning एक्सेस के लिए Team Key बनाएँ।
क्या CI पर match को readonly मोड में चलाना चाहिए?
+
हाँ। fastlane यही सुझाता है, ताकि CI सिर्फ़ मौजूदा सर्टिफ़िकेट और प्रोफ़ाइल डाउनलोड करे, और उन्हें कभी बनाए या रद्द न करे।