Laneとは、Fastlaneにおける名前付き自動化スクリプトであり、モバイルアプリケーションのビルド、テスト、配信のための一連のアクション(actions)を結合します。各laneはFastfileでRuby言語で定義され、ターミナルまたはCI/CDシステムから1つのコマンドで実行できます。Fastlane Docs, 2025によると、85%のFastfileにはCI/CDのさまざまな段階に対応する3つ以上のlaneが含まれています。Laneはパラメータを受け入れ、他のlaneを呼び出し、実行エラーを処理できます。
重要なポイント
LaneはFastlaneの基本的な構成要素であり、名前付き自動化スクリプトを定義します。各laneは、アプリケーションのビルド、テストの実行、ストアへのビルドアップロード、環境設定など、特定の目標を達成するために実行される一連のアクションを記述します。LaneはFastfileで宣言され、プロジェクトルートからfastlane [lane_name]コマンドで実行されます。
Laneの概念はRuby DSLから借用されており、スクリプトの可読性を確保します。開発者はCI/CDプロセス全体を、明確な名前とパラメータを持つアクション呼び出しのシーケンスとして見ることができます。Laneは単純(1つのコマンド)にも複雑(分岐、ループ、他のlaneの呼び出し)にもなります。
実行後、各laneは結果を返します。これには実行ステータスとアクションからのデータを含むオブジェクトが含まれます。結果は他のlaneで使用したり、意思決定のためにCI/CDシステムに渡したりできます。lane内のアクションが失敗すると、laneの実行は停止し、errorブロックが呼び出されます。
Lane宣言の構文はシンプルなRuby DSLパターンに従います:laneキーワード、Rubyのシンボルとしてのスクリプト名、およびdo ... endブロックによるスクリプト本体です。lane名はプラットフォーム内で一意である必要があり、文字、数字、アンダースコアで構成できます。
Laneはコマンドラインから実行されます:fastlane build(:buildという名前のlaneの場合)またはbundle exec fastlane build(Bundler経由でFastlaneがインストールされている場合)。プラットフォーム固有のlaneの場合は、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メッセージを作成できます。戻り値は、呼び出し元のlaneでのさらなる処理に結果が必要なprivate laneで特に役立ちます。
Laneパラメータにより、スクリプトは柔軟で再利用可能になります。Laneはコマンドラインから実行する際に渡されるオプションハッシュを介してパラメータを受け入れます: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環境でAPIキー、パスワード、トークンなどの機密データをFastfileに保存せずに渡す標準的な方法です。
信頼性の高い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ブロックでのエラー通知。これによりコードの重複が減り、laneがクリーンになります。
# 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ブロックは2つの引数を受け取ります:lane名(シンボル)と例外オブジェクトです。ブロック内では、Slack通知の送信、ファイルへのログ書き込み、代替復旧スクリプトの実行が可能です。errorブロックが正常に完了した場合、FastlaneはCI/CDレベルでビルドが失敗したとは見なしません。
Private laneは、laneの代わりにprivate_laneで宣言されたlaneであり、利用可能なコマンドのリストに表示されず、ターミナルから直接実行できません。Private lanesは複数のパブリックlaneから呼び出される繰り返しステップをカプセル化するために設計されています。
Private lanesは、厳密に定義された順序で実行する必要があるアクションの複雑なシーケンスに特に役立ちます。たとえば、private lane :setup_signingは、異なるパラメータで:build_dev、:build_staging、:build_productionの各laneから呼び出せますが、それ自体は独立したコマンドとしては意味を持ちません。
# 再利用のための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プロジェクトの実用的な例を見てみましょう。iOSのlaneは通常、テストにscan、証明書にmatch、ビルドにgym、配信にpilotまたはdeliverを使用します。Androidのlaneはビルドに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のlaneを組み合わせることで、クロスプラットフォームアプリケーションの統合CI/CDプロセスを作成できます。プラットフォームブロックのplatform :iosとplatform :androidを使用してプラットフォーム固有のlaneをグループ化し、実行順序を管理する共通のオーケストレーターlaneからそれらを呼び出します。
Lanesを作成する際は、スクリプトの可読性、保守性、信頼性を確保するための一連のプラクティスに従うことをお勧めします。最初のルールは、各laneが1つのタスクを実行することです。laneが多くのことを行いすぎる場合は、複数のlaneとprivate laneに分割します。
2番目のルールは、laneの命名は動詞または動詞句(build、deploy、test、upload_screenshots)にすることです。processやdo_allのような抽象的な名前は避けてください。lane名の単語区切りにはアンダースコアを使用します。
3番目のルールは、エラーを明示的に処理することです。明確な問題メッセージにはUI.user_error!を使用します。Fastlaneのデフォルトのエラーメッセージに頼らず、開発者にコンテキストを提供してください:“GoogleService-Info.plistファイルが見つかりません — プロジェクトに追加してください”(“ファイルが見つかりません”ではなく)。
| プラクティス | 説明 | 例 |
|---|---|---|
| 1つのタスク | Laneは1つの論理操作を実行 | lane :run_tests, lane :build_ipa |
| パラメータ | すべての設定はoptionsまたはENV経由 | options[:scheme] || default |
| フック | 共通コードにはbefore_all/after_all | before_all内のcocoapods |
| コメント | 複雑なセクションを文書化 | # bitcodeでビルド |
| エラー | 明確なエラーメッセージ | UI.user_error!(“...”) |
4番目のルールは、CI/CDで実行する前にローカルでlaneをテストすることです。Fastlaneは--dry-runフラグによるドライランモードをサポートしており、実際に実行せずにどのアクションが実行されるかを表示します。統合前に個別のlaneを分離テストするにはfastlane run_testを使用します。
各laneの文書化はチーム開発にとって重要なプラクティスです。Fastlaneはlane宣言の前に配置されたdescブロックからの自動ドキュメント生成をサポートしています。fastlane lanesやfastlane listを実行するとdescテキストが表示され、開発者はFastfileのソースコードを読まなくても各スクリプトの目的を理解できます。
パラメータを文書化するには、期待される値を説明するRubyコメントを使用します。Fastlaneはfastlane generate_docsコマンドを介して、laneの完全なリストとその説明を含むREADME.mdを生成できます。これは、プロジェクトのCI/CDプロセスに新しいチームメンバーをオンボーディングするのに便利です。
よくある質問
LaneはFastlaneにおける名前付き自動化スクリプトで、RubyでFastfileに宣言されます。Laneは特定のタスク(アプリケーションのビルド、テストの実行、デプロイなど)を実行するためのアクションのシーケンスを結合します。ターミナルまたはCI/CDシステムからfastlane [lane_name]で実行されます。
Fastfileでlane :name do ... end構文を使用します。ブロック内にパラメータ付きのアクション呼び出しを追加します。Laneは名前で他のlaneを呼び出すことができます。実行するには、Fastfileがあるfastlaneディレクトリが存在するプロジェクトルートからターミナルでfastlane nameを実行します。
パラメータはコマンドラインから渡されます:fastlane build scheme:App version:2.0。lane内部では、パラメータはoptions[:scheme]およびoptions[:version]で利用できます。必須パラメータの場合はlaneの先頭で値を確認し、オプションパラメータの場合はデフォルト値を設定します。
Private laneは、laneの代わりにprivate_laneで宣言されたlaneです。コマンドラインから直接実行できず、他のlaneから呼び出される繰り返しステップをカプセル化します。これによりコードの重複が減り、Fastfileのメンテナンスが簡素化されます。
例外をキャッチするには、グローバルまたは特定のlane内でerrorブロックを使用します。Fastlaneはlane名と例外オブジェクトをブロックに渡します。ブロック内で通知の送信、ログの書き込み、クリーンアップを実行できます。明確なエラーメッセージを生成するにはUI.user_error!を使用します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。