Lane — è uno scenario di automazione nominato in Fastlane che unisce una sequenza di azioni (actions) per la compilazione, il test o la distribuzione di un'applicazione mobile. Ogni lane viene definito in un Fastfile in linguaggio Ruby e può essere avviato con un singolo comando dal terminale o da un sistema CI/CD. Secondo Fastlane Docs, 2025, il 85% dei Fastfile contiene più di tre lane per diverse fasi del CI/CD. Un lane può accettare parametri, chiamare altri lane e gestire gli errori di esecuzione.
Punti chiave
Lane — è il blocco di costruzione fondamentale di Fastlane, che definisce uno scenario di automazione nominato. Ogni lane descrive una sequenza di azioni (actions) da eseguire per raggiungere un obiettivo specifico: compilare un'applicazione, eseguire test, caricare un build nello store o configurare l'ambiente. Un lane viene dichiarato in Fastfile ed eseguito con il comando fastlane [nome_lane] dalla radice del progetto.
Il concetto di lane è preso in prestito dal Ruby DSL e garantisce la leggibilità degli scenari. Lo sviluppatore vede l'intero processo CI/CD come una sequenza di chiamate ad actions con nomi e parametri comprensibili. Un lane può essere semplice (un singolo comando) o complesso (ramificazioni, cicli, chiamate ad altri lane).
Ogni lane dopo l'esecuzione restituisce un risultato — un oggetto contenente lo stato di esecuzione e i dati dalle actions. Il risultato può essere utilizzato in altri lane o trasmesso al sistema CI/CD per prendere decisioni. Se un'azione in un lane termina con un errore, l'esecuzione del lane si ferma e viene chiamato il blocco error.
La sintassi di dichiarazione di un lane segue un semplice schema del Ruby DSL: la parola chiave lane, il nome dello scenario come simbolo Ruby (symbol), il blocco do ... end con il corpo dello scenario. Il nome del lane deve essere unico all'interno della piattaforma ed essere composto da lettere, cifre e trattini bassi.
L'esecuzione del lane avviene tramite riga di comando: fastlane build (per il lane chiamato :build) o bundle exec fastlane build (se Fastlane è installato tramite Bundler). Per i lane di piattaforma, utilizzare fastlane ios build o fastlane android build.
# Dichiarazione di un lane semplice
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
# Esecuzione: fastlane build_and_deploy
Un lane può contenere logica condizionale basata su parametri o variabili d'ambiente. Utilizzare if/unless per saltare passaggi in determinate condizioni. Sono anche disponibili cicli each per elaborare array, utile per compilare più target o scheme di applicazione in un unico lane.
Lane può restituire un valore accessibile al codice chiamante. Per restituire un valore, utilizzare il return standard di Ruby o l'ultima espressione nel blocco lane. Il valore restituito può essere una stringa, un numero, un hash o il risultato di un'azione. Ciò consente di utilizzare il risultato di un lane in un altro lane per prendere decisioni.
Ad esempio, il lane :get_version può restituire la versione corrente dell'applicazione da Info.plist, e il lane :deploy utilizzarla per formattare un messaggio in Slack. I valori di ritorno sono particolarmente utili nei private lane, dove il risultato è necessario per l'elaborazione successiva nel lane chiamante.
I parametri di un lane rendono gli scenari flessibili e riutilizzabili. Un lane accetta parametri tramite l'hash options, passati all'esecuzione dalla riga di comando: fastlane deploy scheme:AppStore version:2.1.0. All'interno del lane, i parametri sono accessibili come options[:scheme] e options[:version].
Per i parametri obbligatori, verificare la presenza del valore all'inizio del lane e chiamare UI.user_error! con un messaggio chiaro. Per i parametri opzionali, impostare valori predefiniti tramite l'operatore ||. Fastlane supporta anche parametri tipizzati tramite il metodo options con indicazione del tipo, valore predefinito e descrizione.
# Lane con gestione parametri
lane :deploy do |options|
scheme = options[:scheme]
version = options[:version] || '1.0.0'
beta = options[:beta] || false
UI.user_error!("Scheme non specificato") 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
# Esecuzione: fastlane deploy scheme:MyApp beta:true version:2.1.0
Per lavorare con variabili d'ambiente all'interno di un lane, utilizzare ENV['VARIABLE_NAME']. Fastlane carica automaticamente i file .env dalla directory fastlane. Questo è il metodo standard per trasmettere dati sensibili — chiavi API, password e token — nell'ambiente CI/CD senza memorizzarli nel Fastfile.
Per un funzionamento affidabile del lane, è necessaria la validazione dei parametri in ingresso. Utilizzare UI.user_error! con una descrizione del problema se un parametro obbligatorio è assente o ha un tipo errato. Fastlane fornisce il metodo options, che consente di impostare il tipo (String, Boolean, Integer, Array), il valore predefinito e la descrizione per ogni parametro — la validazione viene eseguita automaticamente all'avvio del lane.
È inoltre possibile utilizzare controlli tramite il blocco verify: verify do |value| value.length > 0 end per parametri stringa. In caso di formato errato, Fastlane visualizza un messaggio chiaro con il formato atteso e il valore fornito, semplificando il debug nell'ambiente CI/CD.
Fastlane fornisce hook del ciclo di vita per eseguire codice prima e dopo ogni lane. Il blocco before_all viene eseguito prima di ogni lane su una piattaforma specifica o globalmente. Il blocco after_all viene eseguito dopo il completamento con successo di un lane. Il blocco error viene eseguito in caso di errore all'interno di un lane.
Gli hook consentono di centralizzare la logica ripetitiva: installazione delle dipendenze in before_all, invio di notifiche in after_all, pulizia dei file temporanei e notifica degli errori nel blocco error. Ciò riduce la duplicazione del codice e rende i lane più puliti.
# Hook del ciclo di vita dei lane
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} completata con successo")
end
error do |lane, exception|
slack(
message: "Lane #{lane} fallita con errore: #{exception}",
success: false
)
end
lane :deploy do
match(type: 'appstore')
gym(export_method: 'app-store')
deliver
end
Il blocco error riceve due argomenti: il nome del lane (symbol) e l'oggetto eccezione. All'interno del blocco, è possibile inviare una notifica in Slack, scrivere un log in un file o avviare uno scenario di ripristino alternativo. Se il blocco error termina con successo, Fastlane non considera il build fallito a livello CI/CD.
Private lane — è un lane dichiarato tramite private_lane invece di lane, che non appare nell'elenco dei comandi disponibili e non può essere avviato direttamente dal terminale. I private lane sono progettati per incapsulare passaggi ripetitivi chiamati da più lane pubblici.
I private lane sono particolarmente utili per sequenze complesse di azioni che devono essere eseguite in un ordine rigorosamente definito. Ad esempio, un private lane :setup_signing può essere chiamato dai lane :build_dev, :build_staging e :build_production con parametri diversi, ma di per sé non ha senso come comando separato.
# Private lanes per il riutilizzo
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
I private lane possono chiamare altri private lane, formando una gerarchia di astrazioni. Si consiglia di limitare la profondità di annidamento a 2–3 livelli per mantenere la leggibilità del Fastfile. Documentare ogni private lane con un commento che descrive il suo scopo e i parametri attesi.
Esaminiamo esempi pratici di lane per progetti iOS e Android. I lane iOS utilizzano tipicamente scan per i test, match per i certificati, gym per la compilazione e pilot o deliver per la distribuzione. I lane Android utilizzano gradle per la compilazione, supply per la pubblicazione e firebase_test_lab per i test nel cloud.
// Lane per CI/CD completo di app 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: 'CI/CD iOS completato con successo')
end
/* Lane per CI/CD completo di app Android */
lane :ci_full_android do
gradle(task: 'testReleaseUnitTest')
gradle(task: 'bundleRelease')
supply(track: 'internal')
end
Combinando i lane per iOS e Android, è possibile creare un processo CI/CD unificato per un'applicazione multipiattaforma. Utilizzare i blocchi di piattaforma platform :ios e platform :android per raggruppare i lane specifici di ciascuna piattaforma e chiamarli da un lane orchestrator comune che gestisce l'ordine di esecuzione.
Nella scrittura di lane, si consiglia di seguire un insieme di pratiche che garantiscono leggibilità, manutenibilità e affidabilità degli scenari. La prima regola — ogni lane deve svolgere un unico compito. Se un lane fa troppe cose, suddividerlo in più lane e private lane.
Seconda regola — la denominazione dei lane deve essere un verbo o una frase verbale: build, deploy, test, upload_screenshots. Evitare nomi astratti come process o do_all. Utilizzare trattini bassi per separare le parole nel nome del lane.
Terza regola — gestire gli errori esplicitamente. Utilizzare UI.user_error! per messaggi comprensibili sui problemi. Non affidarsi ai messaggi di errore standard di Fastlane — fornire allo sviluppatore il contesto: “File GoogleService-Info.plist non trovato — aggiungerlo al progetto” invece di “File not found”.
| Pratica | Descrizione | Esempio |
|---|---|---|
| Un compito | Un lane esegue una singola operazione logica | lane :run_tests, lane :build_ipa |
| Parametri | Tutte le impostazioni tramite options o ENV | options[:scheme] || default |
| Hook | before_all/after_all per codice comune | cocoapods in before_all |
| Commenti | Documentare le parti complesse | # Compilazione con bitcode |
| Errori | Messaggi di errore comprensibili | UI.user_error!(“...”) |
Quarta regola — testare i lane localmente prima di eseguirli sul CI/CD. Fastlane supporta la modalità dry-run tramite il flag --dry-run, che mostra quali azioni verranno eseguite senza lanciarle realmente. Utilizzare fastlane run_test per testare isolatamente i singoli lane prima dell'integrazione.
La documentazione di ogni lane è una pratica importante per lo sviluppo di squadra. Fastlane supporta la generazione automatica di documentazione dal blocco desc posizionato prima della dichiarazione del lane. Il testo di desc viene visualizzato all'esecuzione di fastlane lanes e fastlane list, aiutando gli sviluppatori a comprendere lo scopo di ogni scenario senza leggere il codice sorgente del Fastfile.
Per documentare i parametri, utilizzare commenti Ruby con la descrizione dei valori attesi. Fastlane può generare un README.md con l'elenco completo dei lane e la loro descrizione tramite il comando fastlane generate_docs, facilitando l'adattamento dei nuovi membri del team ai processi CI/CD del progetto.
Domande frequenti
Lane — è uno scenario di automazione nominato in Fastlane, dichiarato in un Fastfile in Ruby. Un lane unisce una sequenza di actions per eseguire un compito specifico: compilare un'applicazione, eseguire test o distribuire. Viene eseguito tramite fastlane [nome_lane] dal terminale o da un sistema CI/CD.
Utilizzare la costruzione lane :nome do ... end in Fastfile. All'interno del blocco, aggiungere chiamate ad actions con parametri. Un lane può chiamare altri lane per nome. Per eseguirlo, lanciare fastlane nome nel terminale dalla radice del progetto, dove si trova la directory fastlane contenente il Fastfile.
I parametri vengono passati tramite riga di comando: fastlane build scheme:App version:2.0. All'interno del lane, i parametri sono accessibili tramite options[:scheme] e options[:version]. Per i parametri obbligatori, verificare la presenza del valore all'inizio del lane, per quelli opzionali impostare valori predefiniti.
Private lane — un lane dichiarato tramite private_lane invece di lane. Non può essere avviato direttamente dalla riga di comando e serve per incapsulare passaggi ripetitivi chiamati da altri lane. Ciò riduce la duplicazione del codice e semplifica la manutenzione del Fastfile.
Utilizzare il blocco error globalmente o all'interno di un lane specifico per intercettare le eccezioni. Fastlane passa al blocco il nome del lane e l'oggetto exception. All'interno del blocco, è possibile inviare una notifica, scrivere un log o eseguire una pulizia. Utilizzare UI.user_error! per generare messaggi di errore comprensibili.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche