Fastfileは、モバイルアプリケーションのビルド、テスト、配信のための自動化シナリオを定義するRubyで書かれたFastlane設定ファイルです。このファイルはプロジェクトルートのfastlaneディレクトリに配置され、lanes(名前付きアクションシーケンス)の宣言を含みます。Fastlane Docs, 2025によると、70%のモバイルプロジェクトがCI/CDプロセスにFastfileを使用しています。Fastfileは数十ものbashスクリプトを単一の宣言的パイプライン記述に置き換えます。
重要なポイント
FastfileはFastlaneのメイン設定ファイルであり、Rubyで記述され、プロジェクトルートのfastlaneディレクトリに配置されます。アプリケーションのビルド、テスト、コード署名、配信のためのすべての自動化シナリオ(lanes)を定義します。Fastfileは数十ものbashスクリプト、Makefile、手動手順を単一の宣言的CI/CDパイプライン記述に置き換えます。
Fastfileの必要性は、異なる開発者マシンやCI/CDサーバーで再現可能なビルドが必要なプロジェクトで生じます。各開発者が手動で環境を設定する代わりに、FastfileはGitでバージョン管理、レビュー、プロジェクト間での再利用が可能なコードですべての手順をキャプチャします。単一のFastfileにより、開発者のマシンでのビルドがCI/CDサーバーでのビルドと同一であることが保証されます。
Fastfileはdefault_platformディレクティブを通じてプラットフォームをサポートします。1つのFastfileでiOS、Android、macOSのシナリオを記述し、platform :iosおよびplatform :androidブロックにグループ化できます。これは、iOSとAndroidのビルドが共通のデプロイロジックを共有しつつ異なるビルドツールを使用するクロスプラットフォームプロジェクトに特に便利です。
Fastfileは3つの主要要素で構成されます:プラットフォーム宣言(default_platform)、lanes定義、ヘルパー関数設定。各laneはキーワードlaneで始まり、シナリオ名(Rubyシンボル)、アクションシーケンスのボディ、エラーハンドリングブロック(error、success、ensure)が続きます。
Fastfile内のActionsは、Hash形式のパラメータを持つ組み込みFastlane関数の呼び出しです。例えば、gym(scheme: 'App', export_method: 'app-store')は指定されたパラメータでiOSアプリのビルドを開始します。各actionは結果を返し、変数に格納して後続のactionsで使用できます。これにより、lane内で条件付きロジックが可能になります。
FastfileはRubyの標準ENVメカニズムを通じて環境変数をサポートします。機密データ(パスワード、トークン、キー)はFastfileに保存すべきではありません。CI/CDシステムの環境変数または.gitignoreに追加された.envファイルを使用してください。Fastlaneは起動時にfastlaneディレクトリから.envファイルを自動的に読み込みます。
Fastfileとともに、fastlaneディレクトリには追加の設定ファイルが配置されます。Appfileにはアプリケーション識別子(app_identifier)、Apple ID、Team IDが含まれます。これらのデータは自動的にすべてのactionsに代入され、各laneでの繰り返しを排除します。Matchfileはmatchの設定を保存します:GitリポジトリURL、プロファイルタイプ、暗号化キー。
設定を複数のファイルに分割することで、異なる環境を持つプロジェクトのメンテナンスが容易になります。例えば、ステージングと本番用にMatchfileリポジトリで別々のブランチを作成したり、CI/CDシステムの環境変数を通じてパラメータを上書きしたりできます。
# Fastfileの基本構造
default_platform(:ios)
lane :build_and_test do
cocoapods
scan(scheme: 'App', devices: ['iPhone 15'])
gym(scheme: 'App')
end
lane :deploy do
match(type: 'appstore')
build_and_test
pilot(skip_waiting_for_build_processing: true)
end
Fastfileの構文は、自動化シナリオの可読性のために特別に設計されたRuby DSL(ドメイン固有言語)に基づいています。Laneはlane :name do ... end構造で宣言され、nameはターミナルまたはCI/CDシステムから実行するためのfastlane nameコマンドになるRubyシンボルです。
Lane内では、ロジックの分岐のためにRubyの条件演算子:if、unless、caseを使用できます。値の配列を処理するためのループeachやwhileも利用可能です。Fastlaneはlaneのライフサイクルイベントを処理するための特別なメソッドbefore_all、after_all、errorブロックを提供します。
Laneパラメータはoptionsハッシュを通じて渡されます。fastlane build --option_name valueを実行すると、値はlane内のoptions[:option_name]に入ります。optional: trueと型検証を使用してデフォルト値を設定し、渡されるパラメータの型を制御できます。
# パラメータと条件付きロジックを持つLane
lane :build do |options|
scheme = options[:scheme] || 'App'
export_method = options[:export_method] || 'development'
match(type: export_method)
if export_method == 'appstore'
gym(scheme: scheme, export_method: 'app-store')
pilot(skip_waiting_for_build_processing: true)
else
gym(scheme: scheme, export_method: export_method)
end
end
iOSプロジェクトの完全なFastfileには、依存関係のインストール、テスト、ビルド、TestFlightおよびApp Storeへのデプロイのためのlanesが含まれます。コミットから内部テスト用のTestFlight公開までの典型的なCI/CDプロセスをカバーする例を見てみましょう。
# iOS CI/CD配信用Fastfile
default_platform(:ios)
before_all do
cocoapods(try_repo_update_on_error: true)
setup_travis if ENV['TRAVIS']
end
lane :tests do
scan(
scheme: 'App',
devices: ['iPhone 15', 'iPad Pro 12.9'],
output_directory: './test_reports'
)
end
lane :build_appstore do
match(type: 'appstore', readonly: true)
gym(
scheme: 'App',
export_method: 'app-store',
include_bitcode: true
)
end
lane :deploy_testflight do
build_appstore
pilot(
skip_waiting_for_build_processing: true,
distribute_external: false
)
slack(
message: '内部テスト用にTestFlightにビルドをアップロード'
)
end
この例では、before_allブロックが各laneの前に実行され、依存関係をインストールします。tests laneは2つのデバイスでUIテストとユニットテストを実行します。build_appstore laneはmatchでコード署名し、bitcode付きでIPAをビルドします。deploy_testflight laneは完全な配信のためにすべての手順を組み合わせます。
複数ターゲット(メインアプリ、watchOS、widget、Notification Service Extension)を持つプロジェクトでは、各ターゲットに個別のlanesが必要です。Fastfileでは、スキーマ名とビルドパスをパラメータとして受け取る汎用lane :deploy_targetを作成できます。これにより、fastlane deploy_target scheme:Widgetですべての拡張機能のデプロイを実行できます。
複数ターゲットを整理するには、スキーマの配列とlane内のeachループを使用します。Fastlaneはparallel: trueフラグを通じて複数スキーマの並列ビルドをサポートし、拡張機能を持つアプリのCI/CDパイプライン全体の時間を短縮します。
AndroidプロジェクトのFastfileは、Gradleタスクを実行するためのgradle actionとGoogle Playに公開するためのsupply actionを使用します。iOSとは異なり、Androidはmatchを必要としませんが、署名にKeystoreを使用し、これはリポジトリ外に保存され、環境変数を通じて渡されます。
# Android CI/CDビルド用Fastfile
default_platform(:android)
lane :build_release do
gradle(task: 'clean')
gradle(task: 'bundleRelease')
gradle(task: 'assembleRelease')
end
lane :deploy_internal do
build_release
supply(
track: 'internal',
aab: 'app/build/outputs/bundle/release/app-release.aab',
release_status: 'completed'
)
end
Androidアプリの署名については、build.gradleでsigningConfigsを設定し、環境変数を通じてKeystoreパラメータを渡します:ANDROID_KEYSTORE_PATH、ANDROID_KEYSTORE_PASSWORD、ANDROID_KEY_ALIAS、ANDROID_KEY_PASSWORD。Fastlaneは自動的にシステムのapksignerを使用してビルドされたAABまたはAPKに署名します。
FastfileでAndroid署名を設定するには、sign_androidアクションを使用するか、build.gradleのsigningConfigsに依存します。FastlaneはGradleを通じてapksignerと統合します。gradleタスクにSIGNING_CONFIGフラグを渡すと、環境変数のパラメータで署名が有効になります。これにより、Google Play Consoleにアップロードする前にAABファイルに署名できます。
CI/CDでのKeystoreの安全な保存には、Base64エンコーディングと環境変数を使用します。Fastlaneはsetup_keystoreアクションをサポートしており、変数からKeystoreをデコードし、before_allステージ中に一時ファイルに保存します。laneの完了後、証明書の漏洩を防ぐために一時ファイルは自動的に削除されます。
Private lanes(プライベートシナリオ)は、コマンドラインから直接呼び出すことはできませんが、Fastfile内の他のlanesから呼び出し可能なlanesです。Private laneはprivate_lane :name do ... end構造で宣言され、独立したシナリオとして意味をなさない繰り返し手順をカプセル化するために使用されます。
Private lanesは繰り返しロジックのグループ化に最適です:依存関係のインストール、環境設定、通知送信など。例えば、複数のデプロイlanesから呼び出されるprivate lane :setup_signingを作成できますが、エラーを避けるために開発者が直接実行できないようにする必要があります。
# Private laneとグループ化
default_platform(:ios)
private_lane :setup_signing do |options|
match(
type: options[:type],
readonly: true,
verbose: false
)
end
lane :beta do
setup_signing(type: 'adhoc')
gym(export_method: 'ad-hoc')
pilot(distribute_external: true)
end
lane :release do
setup_signing(type: 'appstore')
gym(export_method: 'app-store')
deliver(
force: true,
submit_for_review: true
)
end
platformブロックによるlanesのグループ化により、1つのFastfile内でiOSとAndroidのシナリオを分離できます。platform :ios do ... endおよびplatform :android do ... end構造は対応するプラットフォームのlanesを分離し、共通のprivate lanesは再利用のためにプラットフォームブロックの外側に配置できます。
Fastfileのパラメータメカニズムにより、lanesを柔軟で再利用可能にできます。パラメータは実行時にコマンドラインから渡されます:fastlane build scheme:App export_method:appstore。lane内では、optionsハッシュを通じて値にアクセスでき、これはlaneブロックに引数として渡されます。
FastlaneはOptionalHashによる検証付きの型付きパラメータをサポートします。値のタイプ(String、Boolean、Integer)、デフォルト値、ドキュメント自動生成用の説明を指定できます。環境変数もパラメータを渡す代替方法として利用可能であり、CI/CDシステムに便利です。
# 型検証付きパラメータ
lane :build do |options|
gym(
scheme: options[:scheme],
export_method: options[:export_method] || 'development',
include_bitcode: options[:include_bitcode] || false,
output_name: options[:output_name]
)
slack(message: "ビルド #{options[:scheme]} が完了しました")
end
# 実行:fastlane build scheme:MyApp export_method:appstore
すべてのオプションパラメータにデフォルト値を使用することをお勧めします。これにより、各引数を明示的に指定しなくてもlaneを実行できます。必須パラメータについては、laneの先頭で存在を確認し、UI.user_error!で明確なエラーメッセージを表示して実行を中断します。
よくある質問
Fastfileは、iOSおよびAndroidアプリケーションのビルド、テスト、配信のための自動化シナリオを定義するRubyのFastlane設定ファイルです。ファイルはfastlaneディレクトリに配置され、CI/CDプロセスのためのlanes(名前付きアクションシーケンス)を含みます。
プロジェクトルートにfastlaneディレクトリとFastfileファイルを作成します。default_platform(:ios)を追加し、:buildという名前のlaneを宣言し、内部で依存関係をインストールするcocoapodsとビルド用のgymを呼び出します。プロジェクトルートのターミナルからfastlane buildで実行します。
Private laneはlaneの代わりにprivate_laneで宣言され、コマンドラインから直接呼び出すことはできません。Fastfile内の他のlanesからのみ呼び出し可能です。独立したシナリオとして意味をなさない繰り返し手順をカプセル化するために使用されます。
パラメータはコマンドラインfastlane build scheme:Appを通じて渡され、lane内でoptionsハッシュを通じてアクセスできます。||演算子でデフォルト値を設定でき、必須パラメータについてはlaneの先頭でraiseまたはUI.user_error!で存在を確認します。
Fastfileはプロジェクトルートのfastlaneディレクトリに配置する必要があります。例:/Users/user/projects/MyApp/fastlane/Fastfile。Fastlaneはプロジェクトルートから実行するときに自動的にファイルを見つけます。同じディレクトリにAppfile、Matchfileなどの設定ファイルも配置できます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。