Lane, Fastlane में एक नामित ऑटोमेशन स्क्रिप्ट है जो मोबाइल एप्लिकेशन को बनाने, परीक्षण करने या वितरित करने के लिए क्रियाओं (actions) के अनुक्रम को संयोजित करती है। प्रत्येक lane को Fastfile में Ruby भाषा में परिभाषित किया जाता है और इसे टर्मिनल या CI/CD सिस्टम से एक कमांड से चलाया जा सकता है। Fastlane Docs, 2025 के अनुसार, 85% Fastfiles में CI/CD के विभिन्न चरणों के लिए तीन से अधिक lanes होते हैं। Lane पैरामीटर स्वीकार कर सकता है, अन्य lanes को कॉल कर सकता है और निष्पादन त्रुटियों को संभाल सकता है।
मुख्य बिंदु
Lane Fastlane का मूलभूत निर्माण खंड है जो एक नामित ऑटोमेशन स्क्रिप्ट को परिभाषित करता है। प्रत्येक lane क्रियाओं के अनुक्रम का वर्णन करता है जो एक विशिष्ट लक्ष्य प्राप्त करने के लिए निष्पादित की जाती हैं: एप्लिकेशन बनाना, परीक्षण चलाना, बिल्ड को स्टोर में अपलोड करना या वातावरण सेट करना। Lane को Fastfile में घोषित किया जाता है और प्रोजेक्ट रूट से fastlane [lane_name] कमांड से चलाया जाता है।
Lane की अवधारणा Ruby DSL से ली गई है और स्क्रिप्ट की पठनीयता सुनिश्चित करती है। डेवलपर पूरी CI/CD प्रक्रिया को स्पष्ट नामों और पैरामीटर के साथ क्रिया कॉल के अनुक्रम के रूप में देखता है। Lane सरल (एक कमांड) या जटिल (शाखाएं, लूप, अन्य lanes को कॉल करना) हो सकता है।
निष्पादन के बाद, प्रत्येक lane एक परिणाम लौटाता है — एक ऑब्जेक्ट जिसमें निष्पादन स्थिति और क्रियाओं से डेटा होता है। परिणाम का उपयोग अन्य lanes में या निर्णय लेने के लिए CI/CD सिस्टम को भेजा जा सकता है। यदि lane में कोई क्रिया विफल होती है, तो lane का निष्पादन रुक जाता है और error ब्लॉक कॉल किया जाता है।
Lane घोषणा सिंटैक्स एक सरल Ruby DSL पैटर्न का अनुसरण करता है: lane कीवर्ड, Ruby प्रतीक (symbol) के रूप में स्क्रिप्ट का नाम, और do ... end ब्लॉक स्क्रिप्ट के मुख्य भाग के साथ। Lane का नाम प्लेटफ़ॉर्म के भीतर अद्वितीय होना चाहिए और इसमें अक्षर, अंक और अंडरस्कोर शामिल हो सकते हैं।
Lane को कमांड लाइन के माध्यम से चलाया जाता है: fastlane build (:build नाम वाले lane के लिए) या bundle exec fastlane build (यदि Fastlane Bundler के माध्यम से स्थापित है)। प्लेटफ़ॉर्म-विशिष्ट lanes के लिए, fastlane ios build या fastlane android build का उपयोग करें।
# एक सरल lane की घोषणा
lane :test do
scan(scheme: 'App', devices: ['iPhone 15'])
end
lane :build_and_deploy do
cocoapods
test
gym(scheme: 'App', export_method: 'app-store')
pilot(skip_waiting_for_build_processing: true)
end
# चलाएं: fastlane build_and_deploy
Lane में पैरामीटर या वातावरण चर के आधार पर सशर्त तर्क हो सकता है। कुछ शर्तों के तहत चरणों को छोड़ने के लिए if/unless का उपयोग करें। सरणियों को संसाधित करने के लिए लूप (each) भी उपलब्ध हैं, जो एक ही lane में कई लक्ष्यों या एप्लिकेशन स्कीम को बनाने के लिए सुविधाजनक है।
Lane एक मान लौटा सकता है जो कॉल करने वाले कोड के लिए उपलब्ध होगा। मान लौटाने के लिए मानक Ruby return या lane ब्लॉक में अंतिम अभिव्यक्ति का उपयोग करें। लौटाया गया मान स्ट्रिंग, संख्या, हैश या क्रिया का परिणाम हो सकता है। यह निर्णय लेने के लिए एक lane के परिणाम को दूसरे lane में उपयोग करने की अनुमति देता है।
उदाहरण के लिए, :get_version lane Info.plist से एप्लिकेशन का वर्तमान संस्करण लौटा सकता है, और :deploy lane इसका उपयोग Slack संदेश बनाने के लिए कर सकता है। लौटाए गए मान विशेष रूप से private lanes में उपयोगी होते हैं जहाँ कॉल करने वाले lane में आगे की प्रक्रिया के लिए परिणाम की आवश्यकता होती है।
Lane पैरामीटर स्क्रिप्ट को लचीला और पुन: प्रयोज्य बनाते हैं। Lane options हैश के माध्यम से पैरामीटर स्वीकार करता है, जो कमांड लाइन से चलाते समय पास किया जाता है: fastlane deploy scheme:AppStore version:2.1.0। Lane के अंदर, पैरामीटर options[:scheme] और options[:version] के रूप में उपलब्ध होते हैं।
अनिवार्य पैरामीटर के लिए, lane की शुरुआत में मान की जाँच करें और स्पष्ट संदेश के साथ UI.user_error! को कॉल करें। वैकल्पिक पैरामीटर के लिए, || ऑपरेटर के माध्यम से डिफ़ॉल्ट मान सेट करें। Fastlane प्रकार, डिफ़ॉल्ट मान और विवरण के साथ options विधि के माध्यम से टाइप किए गए पैरामीटर का भी समर्थन करता है।
# पैरामीटर प्रबंधन के साथ Lane
lane :deploy do |options|
scheme = options[:scheme]
version = options[:version] || '1.0.0'
beta = options[:beta] || false
UI.user_error!("scheme निर्दिष्ट नहीं है") unless scheme
match(type: beta ? 'adhoc' : 'appstore')
gym(scheme: scheme, export_method: beta ? 'ad-hoc' : 'app-store')
if beta
pilot(distribute_external: true)
else
deliver(submit_for_review: true)
end
end
# चलाएं: fastlane deploy scheme:MyApp beta:true version:2.1.0
Lane के अंदर वातावरण चर के साथ काम करने के लिए, ENV['VARIABLE_NAME'] का उपयोग करें। Fastlane स्वचालित रूप से fastlane निर्देशिका से .env फ़ाइलें लोड करता है। यह CI/CD वातावरण में Fastfile में संग्रहीत किए बिना संवेदनशील डेटा — API कुंजी, पासवर्ड और टोकन — पास करने का मानक तरीका है।
विश्वसनीय lane संचालन के लिए, इनपुट पर पैरामीटर सत्यापन आवश्यक है। यदि अनिवार्य पैरामीटर गायब है या उसका प्रकार गलत है, तो समस्या विवरण के साथ UI.user_error! का उपयोग करें। Fastlane options विधि प्रदान करता है, जो प्रत्येक पैरामीटर के लिए प्रकार (String, Boolean, Integer, Array), डिफ़ॉल्ट मान और विवरण निर्दिष्ट करने की अनुमति देता है — lane शुरू होने पर सत्यापन स्वचालित रूप से किया जाता है।
इसके अतिरिक्त, आप स्ट्रिंग पैरामीटर के लिए verify ब्लॉक के माध्यम से जाँच का उपयोग कर सकते हैं: verify do |value| value.length > 0 end। यदि प्रारूप गलत है, तो Fastlane अपेक्षित प्रारूप और पास किए गए मान को इंगित करने वाला एक स्पष्ट संदेश आउटपुट करता है, जो CI/CD वातावरण में डिबगिंग को सरल बनाता है।
Fastlane प्रत्येक lane से पहले और बाद में कोड निष्पादित करने के लिए जीवनचक्र हुक प्रदान करता है। before_all ब्लॉक किसी दिए गए प्लेटफ़ॉर्म में या वैश्विक रूप से प्रत्येक lane से पहले निष्पादित होता है। after_all ब्लॉक lane के सफलतापूर्वक पूर्ण होने के बाद निष्पादित होता है। error ब्लॉक lane के अंदर किसी भी त्रुटि पर निष्पादित होता है।
हुक दोहराए जाने वाले तर्क को केंद्रीकृत करने की अनुमति देते हैं: before_all में निर्भरता सेटअप, after_all में सूचनाएं भेजना, अस्थायी फ़ाइलों की सफाई और error ब्लॉक में त्रुटि अधिसूचना। यह कोड दोहराव को कम करता है और lanes को साफ रखता है।
# Lanes के जीवनचक्र हुक
default_platform(:ios)
before_all do
cocoapods(try_repo_update_on_error: true)
ensure_git_status_clean
end
after_all do |lane|
slack(message: "Lane #{lane} सफलतापूर्वक पूर्ण हुआ")
end
error do |lane, exception|
slack(
message: "Lane #{lane} त्रुटि के साथ विफल हुआ: #{exception}",
success: false
)
end
lane :deploy do
match(type: 'appstore')
gym(export_method: 'app-store')
deliver
end
Error ब्लॉक दो तर्क प्राप्त करता है: lane का नाम (symbol) और अपवाद ऑब्जेक्ट। ब्लॉक के अंदर, आप Slack सूचना भेज सकते हैं, फ़ाइल में लॉग लिख सकते हैं या वैकल्पिक पुनर्प्राप्ति स्क्रिप्ट चला सकते हैं। यदि error ब्लॉक सफलतापूर्वक पूर्ण होता है, तो Fastlane CI/CD स्तर पर बिल्ड को विफल नहीं मानता है।
Private lane एक lane है जिसे lane के बजाय private_lane के माध्यम से घोषित किया जाता है, जो उपलब्ध कमांड की सूची में प्रदर्शित नहीं होता है और सीधे टर्मिनल से नहीं चलाया जा सकता है। Private lanes कई सार्वजनिक lanes से कॉल किए जाने वाले दोहराए जाने वाले चरणों को एनकैप्सुलेट करने के लिए डिज़ाइन किए गए हैं।
Private lanes विशेष रूप से क्रियाओं के जटिल अनुक्रमों के लिए उपयोगी होते हैं जिन्हें सख्ती से परिभाषित क्रम में निष्पादित किया जाना चाहिए। उदाहरण के लिए, एक private lane :setup_signing को विभिन्न पैरामीटर के साथ lanes :build_dev, :build_staging और :build_production से कॉल किया जा सकता है, लेकिन स्वयं एक अलग कमांड के रूप में इसका कोई अर्थ नहीं है।
# पुन: उपयोग के लिए Private lanes
private_lane :setup_environment do |options|
cocoapods(try_repo_update_on_error: true)
match(type: options[:type], readonly: true)
increment_build_number
end
lane :dev_build do
setup_environment(type: 'development')
gym(export_method: 'development')
end
lane :appstore_build do
setup_environment(type: 'appstore')
gym(export_method: 'app-store')
deliver
end
Private lanes अन्य private lanes को कॉल कर सकते हैं, एक अमूर्त पदानुक्रम बनाते हुए। Fastfile की पठनीयता बनाए रखने के लिए नेस्टिंग गहराई को 2–3 स्तरों तक सीमित करने की अनुशंसा की जाती है। प्रत्येक private lane को उसके उद्देश्य और अपेक्षित पैरामीटर का वर्णन करने वाली टिप्पणी के साथ दस्तावेज़ित करें।
आइए iOS और Android प्रोजेक्ट के लिए lanes के व्यावहारिक उदाहरण देखें। iOS lanes आमतौर पर परीक्षण के लिए scan, प्रमाणपत्र के लिए match, बिल्ड के लिए gym और वितरण के लिए pilot या deliver का उपयोग करते हैं। Android lanes बिल्ड के लिए gradle, प्रकाशन के लिए supply और क्लाउड परीक्षण के लिए firebase_test_lab का उपयोग करते हैं।
// पूर्ण CI/CD iOS ऐप के लिए Lane
lane :ci_full_ios do
scan(scheme: 'App', code_coverage: true)
gym(scheme: 'App', export_method: 'app-store')
pilot(distribute_external: true)
slack(message: 'iOS CI/CD सफलतापूर्वक पूर्ण हुआ')
end
/* पूर्ण CI/CD Android ऐप के लिए Lane */
lane :ci_full_android do
gradle(task: 'testReleaseUnitTest')
gradle(task: 'bundleRelease')
supply(track: 'internal')
end
iOS और Android के लिए lanes को संयोजित करके, आप क्रॉस-प्लेटफ़ॉर्म एप्लिकेशन के लिए एक एकीकृत CI/CD प्रक्रिया बना सकते हैं। प्लेटफ़ॉर्म-विशिष्ट lanes को समूहित करने के लिए प्लेटफ़ॉर्म ब्लॉक platform :ios और platform :android का उपयोग करें, और उन्हें एक सामान्य ऑर्केस्ट्रेटर lane से कॉल करें जो निष्पादन क्रम का प्रबंधन करता है।
Lanes लिखते समय, अभ्यासों के एक सेट का पालन करने की अनुशंसा की जाती है जो स्क्रिप्ट की पठनीयता, रखरखाव और विश्वसनीयता सुनिश्चित करते हैं। पहला नियम यह है कि प्रत्येक lane को एक कार्य करना चाहिए। यदि कोई lane बहुत अधिक करता है, तो इसे कई lanes और private lanes में विभाजित करें।
दूसरा नियम है कि lane का नामकरण एक क्रिया या क्रिया वाक्यांश होना चाहिए: build, deploy, test, upload_screenshots। process या do_all जैसे अमूर्त नामों से बचें। Lane के नाम में शब्दों को अलग करने के लिए अंडरस्कोर का उपयोग करें।
तीसरा नियम है त्रुटियों को स्पष्ट रूप से संभालना। स्पष्ट समस्या संदेशों के लिए UI.user_error! का उपयोग करें। Fastlane के डिफ़ॉल्ट त्रुटि संदेशों पर निर्भर न रहें — डेवलपर को संदर्भ दें: “GoogleService-Info.plist फ़ाइल नहीं मिली — इसे प्रोजेक्ट में जोड़ें” “फ़ाइल नहीं मिली” के बजाय।
| अभ्यास | विवरण | उदाहरण |
|---|---|---|
| एक कार्य | Lane एक तार्किक संचालन करता है | lane :run_tests, lane :build_ipa |
| पैरामीटर | सभी सेटिंग्स options या ENV के माध्यम से | options[:scheme] || default |
| हुक | सामान्य कोड के लिए before_all/after_all | cocoapods in before_all |
| टिप्पणियाँ | जटिल अनुभागों का दस्तावेज़ीकरण करें | # बिल्ड bitcode के साथ |
| त्रुटियाँ | स्पष्ट त्रुटि संदेश | UI.user_error!(“...”) |
चौथा नियम है CI/CD पर चलाने से पहले lanes का स्थानीय परीक्षण करना। Fastlane --dry-run फ़्लैग के माध्यम से dry-run मोड का समर्थन करता है, जो दिखाता है कि वास्तव में चलाए बिना कौन सी क्रियाएं निष्पादित की जाएंगी। एकीकरण से पहले व्यक्तिगत lanes के पृथक परीक्षण के लिए fastlane run_test का उपयोग करें।
प्रत्येक lane का दस्तावेज़ीकरण टीम विकास के लिए एक महत्वपूर्ण अभ्यास है। Fastlane lane घोषणा से पहले रखे गए desc ब्लॉक से स्वचालित दस्तावेज़ीकरण उत्पादन का समर्थन करता है। fastlane lanes और fastlane list चलाने पर desc टेक्स्ट प्रदर्शित होता है, जो डेवलपर्स को Fastfile का स्रोत कोड पढ़े बिना प्रत्येक स्क्रिप्ट के उद्देश्य को समझने में मदद करता है।
पैरामीटर का दस्तावेज़ीकरण करने के लिए, अपेक्षित मानों का वर्णन करने वाली Ruby टिप्पणियों का उपयोग करें। Fastlane fastlane generate_docs कमांड के माध्यम से lanes और उनके विवरण की पूरी सूची के साथ README.md उत्पन्न कर सकता है, जो प्रोजेक्ट की CI/CD प्रक्रियाओं में नए टीम सदस्यों को शामिल करने के लिए सुविधाजनक है।
अक्सर पूछे जाने वाले प्रश्न
Lane Fastlane में एक नामित ऑटोमेशन स्क्रिप्ट है, जिसे Ruby में Fastfile में घोषित किया जाता है। Lane एक विशिष्ट कार्य करने के लिए क्रियाओं के अनुक्रम को संयोजित करता है: एप्लिकेशन बनाना, परीक्षण चलाना या डिप्लॉय करना। इसे टर्मिनल या CI/CD सिस्टम से fastlane [lane_name] के माध्यम से चलाया जाता है।
Fastfile में lane :name do ... end निर्माण का उपयोग करें। ब्लॉक के अंदर, पैरामीटर के साथ क्रिया कॉल जोड़ें। Lane नाम से अन्य lanes को कॉल कर सकता है। इसे चलाने के लिए, प्रोजेक्ट रूट से टर्मिनल में fastlane name निष्पादित करें, जहाँ Fastfile के साथ fastlane निर्देशिका स्थित है।
पैरामीटर कमांड लाइन के माध्यम से पास किए जाते हैं: fastlane build scheme:App version:2.0। Lane के अंदर, पैरामीटर options[:scheme] और options[:version] के माध्यम से उपलब्ध होते हैं। अनिवार्य पैरामीटर के लिए, lane की शुरुआत में मान की जाँच करें; वैकल्पिक पैरामीटर के लिए, डिफ़ॉल्ट मान सेट करें।
Private lane एक lane है जिसे lane के बजाय private_lane के माध्यम से घोषित किया जाता है। इसे सीधे कमांड लाइन से नहीं चलाया जा सकता है और यह अन्य lanes से कॉल किए जाने वाले दोहराए जाने वाले चरणों को एनकैप्सुलेट करने का काम करता है। यह कोड दोहराव को कम करता है और Fastfile के रखरखाव को सरल बनाता है।
अपवादों को पकड़ने के लिए वैश्विक रूप से या किसी विशिष्ट lane के अंदर error ब्लॉक का उपयोग करें। Fastlane ब्लॉक में lane का नाम और exception ऑब्जेक्ट पास करता है। ब्लॉक के अंदर, आप सूचना भेज सकते हैं, लॉग लिख सकते हैं या सफाई कर सकते हैं। स्पष्ट त्रुटि संदेश उत्पन्न करने के लिए UI.user_error! का उपयोग करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें