गाइड

डेडिकेटेड 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
end

setup_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 सिर्फ़ मौजूदा सर्टिफ़िकेट और प्रोफ़ाइल डाउनलोड करे, और उन्हें कभी बनाए या रद्द न करे।

संबंधित गाइड