Lane — је именовани сценариј аутоматизације у Fastlane који обједињује секвенцу акција (actions) за изградњу, тестирање или испоруку мобилне апликације. Сваки lane се дефинише у Fastfile на језику Ruby и може се покренути једном командом из терминала или CI/CD система. Према Fastlane Docs, 2025, 85% Fastfile-ова садржи више од три lanes за различите фазе CI/CD. Lane може прихватати параметре, позивати друге lanes и обрађивати грешке извршења.
Главне тачке
Lane — је основни градивни блок Fastlane, који дефинише именовани сценариј аутоматизације. Сваки lane описује секвенцу акција (actions) које се извршавају за постизање одређеног циља: изградња апликације, покретање тестова, отпремање build-а у продавницу или подешавање окружења. Lane се декларише у Fastfile и покреће командом fastlane [име_lane] из корена пројекта.
Концепт lane је преузет из Ruby DSL и обезбеђује читљивост сценарија. Програмер види цео CI/CD процес као секвенцу позива actions са разумљивим именима и параметрима. Lane може бити једноставан (једна команда) или сложен (гранање, петље, позивање других lanes).
Сваки lane након извршења враћа резултат — објекат који садржи статус извршења и податке од actions. Резултат се може користити у другим lanes или проследити CI/CD систему за доношење одлука. Ако се било која action у lane заврши грешком, извршење lane се зауставља и позива се error блок.
Синтакса декларације lane прати једноставан образац Ruby DSL: кључна реч lane, име сценарија у облику Ruby симбола (symbol), блок do ... end са телом сценарија. Име lane мора бити јединствено у оквиру платформе и састојати се од слова, бројева и доњих црта.
Покретање lane се врши командном линијом: fastlane build (за lane са именом :build) или 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 за обраду низова, што је згодно за изградњу више target-а или шема апликације у једном lane.
Lane може вратити вредност која ће бити доступна коду који га позива. За враћање се користи стандардни Ruby return или последњи израз у блоку lane. Враћена вредност може бити стринг, број, hash или резултат action. Ово омогућава коришћење резултата једног lane у другом lane за доношење одлука.
На пример, lane :get_version може вратити тренутну верзију апликације из Info.plist, а lane :deploy је користити за формирање поруке у Slack-у. Враћене вредности су посебно корисне у private lanes, где је резултат потребан за даљу обраду у lane-у који позива.
Параметри lane чине сценарије флексибилним и вишекратно употребљивим. Lane прихвата параметре кроз options hash, који се прослеђује при покретању из командне линије: 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 аутоматски учитава .env датотеке из директоријума fastlane. Ово је стандардни начин преноса осетљивих података — API кључева, лозинки и токена — у CI/CD окружењу без чувања у Fastfile.
За поуздан рад lane потребна је валидација параметара на улазу. Користите UI.user_error! са описом проблема ако обавезни параметар недостаје или има нетачан тип. Fastlane пружа метод options који омогућава задавање типа (String, Boolean, Integer, Array), подразумеване вредности и описа за сваки параметар — валидација се врши аутоматски при покретању lane.
Додатно, могу се користити провере кроз verify блок: verify do |value| value.length > 0 end за стринг параметре. При нетачном формату, Fastlane приказује читљиву поруку са очекиваним форматом и прослеђеном вредношћу, што олакшава отклањање грешака у CI/CD окружењу.
Fastlane пружа hook-ове животног циклуса за извршење кода пре и после сваког lane. Блок before_all се извршава пре сваког lane у датој платформи или глобално. Блок after_all се извршава након успешног завршетка lane. Блок error се извршава при било којој грешци унутар lane.
Hook-ови омогућавају централизацију понављајуће логике: инсталација зависности у before_all, слање обавештења у after_all, чишћење привремених датотека и обавештавање о грешкама у error блоку. Ово смањује дуплирање кода и чини lanes чистијим.
# Hook-ови животног циклуса 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 декларисан кроз private_lane уместо 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, формирајући хијерархију апстракције. Препоручује се ограничавање дубине угњежђења на 2-3 нивоа ради очувања читљивости Fastfile. Документујте сваки private lane коментаром са описом његове намене и очекиваних параметара.
Размотримо практичне примере lanes за iOS и Android пројекте. iOS lanes обично користе scan за тестове, match за сертификате, gym за изградњу и pilot или deliver за испоруку. Android lanes користе gradle за изградњу, supply за објављивање и firebase_test_lab за облачно тестирање.
// Lane за потпуни CI/CD iOS апликације
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
/* Lane за потпуни CI/CD Android апликације */
lane :ci_full_android do
gradle(task: 'testReleaseUnitTest')
gradle(task: 'bundleRelease')
supply(track: 'internal')
end
Комбиновањем lanes за iOS и Android можете створити јединствени CI/CD процес за вишеплатформску апликацију. Користите платформске блокове platform :ios и platform :android за груписање lane-ова специфичних за платформу и позивајте их из општег orchestrator lane-а који управља редоследом извршења.
При писању lanes препоручује се придржавање скупа пракси које обезбеђују читљивост, одржавање и поузданост сценарија. Прво правило — сваки lane треба да обавља један задатак. Ако lane ради превише, поделите га на више lanes и private lanes.
Друго правило — именовање lanes треба да буде глагол или глаголска фраза: build, deploy, test, upload_screenshots. Избегавајте апстрактна имена типа process или do_all. Користите доње црте за раздвајање речи у имену lane.
Треће правило — обрађујте грешке експлицитно. Користите UI.user_error! за јасне поруке о проблемима. Не ослањајте се на стандардне Fastlane поруке о грешкама — дајте програмеру контекст: „Датотека GoogleService-Info.plist није пронађена — додајте је у пројекат” уместо „File not found”.
| Пракса | Опис | Пример |
|---|---|---|
| Један задатак | Lane обавља једну логичку операцију | lane :run_tests, lane :build_ipa |
| Параметри | Сва подешавања кроз options или ENV | options[:scheme] || default |
| Hook-ови | before_all/after_all за заједнички код | cocoapods у before_all |
| Коментари | Документујте сложене делове | # Изградња са bitcode |
| Грешке | Разумљиве поруке о грешкама | UI.user_error!("...") |
Четврто правило — тестирајте lanes локално пре покретања на CI/CD. Fastlane подржава dry-run режим кроз флаг --dry-run, који показује које actions ће бити извршене, без стварног покретања. Користите fastlane run_test за изоловано тестирање појединачних lanes пре интеграције.
Документовање сваког lane је важна пракса за тимски рад. Fastlane подржава аутоматско генерисање документације из desc блока, постављеног пре декларације lane. Текст desc се приказује при покретању fastlane lanes и fastlane list, помажући програмерима да разумеју намену сваког сценарија без читања изворног кода Fastfile.
За документовање параметара користите Ruby коментаре са описом очекиваних вредности. Fastlane може генерисати README.md датотеку са комплетним списком lanes и њиховим описом кроз команду fastlane generate_docs, што је згодно за адаптацију нових чланова тима на CI/CD процесе пројекта.
Често постављана питања
Lane — је именовани сценариј аутоматизације у Fastlane, декларисан у Fastfile на Ruby. Lane обједињује секвенцу actions за извршење одређеног задатка: изградње апликације, покретања тестова или имплементације. Покреће се кроз fastlane [име_lane] из терминала или CI/CD система.
Користите конструкцију lane :name do ... end у Fastfile. Унутар блока додајте позиве actions са параметрима. Lane може позивати друге lanes по имену. За покретање извршите fastlane name у терминалу из корена пројекта где се налази директоријум fastlane са Fastfile.
Параметри се преносе кроз командну линију: fastlane build scheme:App version:2.0. Унутар lane, параметри су доступни кроз options[:scheme] и options[:version]. За обавезне параметре проверите присуство вредности на почетку lane, за опционе поставите подразумеване вредности.
Private lane — lane декларисан кроз private_lane уместо lane. Не може се покренути директно из командне линије и служи за инкапсулацију понављајућих корака који се позивају из других lanes. Ово смањује дуплирање кода и поједностављује одржавање Fastfile.
Користите error блок глобално или унутар одређеног lane за хватање изузетака. Fastlane прослеђује блоку име lane и exception објекат. Унутар блока можете послати обавештење, сачувати дневник или извршити чишћење. Користите UI.user_error! за генерисање разумљивих порука о грешкама.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође