🪶

プロジェクトにfastlaneを導入する

に公開

リリースを自動化する

自動化といっても完全な自動化ではないですね。コマンドを実行して、Xcodeを操作せずに、AppStoreやTestFlightにipaファイルをuploadする作業をCLIだけで行いGUIでボタンぽちぽちする作業から解放されます。

fastlaneとは?

公式を翻訳すると...
アプリの自動化を適切に実行

モバイルアプリの構築とリリースを最も簡単にする方法
fastlaneが面倒なタスクを処理するため、開発者の負担を軽減します。

節約できた開発時間
49億286万2878時間

開発とリリースプロセスを自動化
fastlaneは、AndroidとiOSのデプロイメントを簡素化することを目的としたオープンソースプラットフォームです。
fastlaneを使用すると、開発およびリリースワークフローのあらゆる側面を自動化できます。

https://fastlane.tools/

わかりやすく言うと、リリースする時間を短縮して自動化するツールですね。ローカルだけでも実行できるので、CI/CD無しでもできる。ありにするなら設定が大変(^_^;)

私の場合だと最初は、Flutterで試したのでそのときは、iOSディレクトリに作成しますが、SwiftUIの場合だとプロジェクト直下のディレクトリに配置します。

SpeechStorage/                    ← ここでfastlane init
├── SpeechStorage.xcodeproj      ← このファイルがある場所
├── SpeechStorage/               ← あなたが今いる場所(ソースコード)
│   ├── ContentView.swift
│   └── ...
└── fastlane/                   ← 初期化後に作成される
    ├── Appfile
    └── Fastfile

導入してみる

公式サイトを参考に、homebrewでインストールしましょう。Rubyが必要なのでインストールしておこう。バージョン管理もしておいた方がいいので、rbenvを使うといいでしょう。

https://docs.fastlane.tools/

Homebrew (macOS)

この方法では、Rubyを別途インストールする必要がなく、代わりにHomebrewがfastlaneに適したRubyバージョンをインストールします。詳細はこのページをご覧ください。

brew install fastlane

システムRuby + RubyGems (macOS/Linux/Windows)

ローカル環境では推奨されませんが、システムRubyの環境にfastlaneをインストールすることも可能です。sudoを使用すると、後でファイルの権限が原因で予期せぬ結果が発生したり、環境の管理が困難になったりすることがよくあります。

sudo gem install fastlane

fastlaneのセットアップ

iOSまたはAndroidアプリのディレクトリに移動し、以下を実行します。

fastlane init

SwiftUIアプリの初回セットアップでは、4. 🛠 Manual setup を選ぶことをおすすめします。

理由:

柔軟性: 必要な機能を段階的に追加できる
学習: fastlaneの仕組みを理解しながら構築できる
カスタマイズ: プロジェクト固有の要件に合わせて設定可能
Manual setupを選ぶと、基本的なAppfileとFastfileが作成され、後から以下のような機能を追加できます:

# 例:Fastfileに後から追加する内容
lane :screenshots do
  capture_screenshots
end

lane :beta do
  build_app
  upload_to_testflight
end

lane :release do
  build_app
  upload_to_app_store
end

この後はずっとEnter押した。

この後fastlen/配下のファイルを編集する。.gitignoreしてないとゴミみたいにファイルが生成されてGitの差分で読み込まれるので対策が必要。

App Store Connect APIキーなるものと、Appleのアカウントであるメールアドレスと、パスワードが必要なので用意しておきましょう。fastlenにパスワード設定するのですが、以前失敗した設定が残っていたので、一度削除して設定をやり直しました😅
ちなみにパスワードは、123456の6けたでやりましたwww

ここのサイトが参考になった。UI古いので変わってますが!
https://manual.click.dev/50f881d2db6f42cfb8c9daf56aa13d58#block-60d279ad3d0f459ea111809855d7391b

  1. すべてのところを選択して、統合をクリック。

  2. チームキーのタブのページでAPIキーを作る。Issuer IDも使用するのでコピーしておく。

  1. プラスボタンを押して新規でAPI KEYを作成。これは一度しかダウンロードできないので、GoogleDriveなどに保存しておこう。

adminで作成しておく。


ダウンロードしたファイルは、fastlen/配下に配置する。

Appfileを編集

私の場合はここに、BundleIDやapp idのところに、 メールアドレスを書いてます。多分良くない😅

app_identifier("com.junichi.myShoppingCameraApp") # The bundle identifier of your app
apple_id("blu***********@******.com") # Your Apple Developer Portal username

itc_team_id("*****3608") # App Store Connect Team ID
team_id("*****2****") # Developer Portal Team ID

# For more information about the Appfile, see:
#     https://docs.fastlane.tools/advanced/#appfile

Gitに証明書用のリポジトリを作成しておく。

GitHubで新しいプライベートリポジトリを作成
名前: ios-certificates-new (ここは毎回変えた方がいい)
可視性: Private
READMEなどは追加しない(空のリポジトリ)

ターミナルでこのリポジトリのURL貼り付けるとファイルなどが、pushされていた。

証明書の設定をやっていく

  1. matchの初期化
bundle exec fastlane match init

1のgitを選びましょう。

[23:02:11]: URL of the Git Repo: と表示されたら、照明商用に作成したREADME.mdなしのリポジトリのURLをコピーして貼り付けましょう。

ちなみにリポジトリはこんな名前にした。

IDについては、AppDeveloperとAppStore Connectを見て確認してください。
https://developer.apple.com/jp/

https://developer.apple.com/jp/help/app-store-connect/manage-your-team/view-and-edit-your-profile/

https://developer.apple.com/jp/help/app-store-connect/manage-your-team/view-and-edit-your-profile/

  1. 証明書の生成(ここの設定で詰まった。あまり覚えていない)
# App Store用証明書
bundle exec fastlane match appstore

# 開発用証明書(必要に応じて)
bundle exec fastlane match development

bundle exec fastlane match appstoreを実行後に、パスワード入力してとログが出ます。8文字以上のパスワードが望ましいでしょうね。

こんなエラーが出た??? 

このエラーはDistribution証明書(App Store用)の上限に達していることを示しています。

解決方法:

  1. Apple Developer Portalで既存の証明書を確認・削除

developer.apple.com → Certificates, Identifiers & Profiles
Certificates → Distribution → 不要な証明書を削除
2. 既存の証明書を再利用する場合

これはダメだった!

# 既存の証明書を強制的に使用
fastlane match appstore --readonly

証明書をリセットして新規作成

# 既存の証明書とプロファイルを削除して再作成
fastlane match nuke distribution
fastlane match appstore

この後エラーで詰まる😅
どうやら証明書を作りすぎたらしい?
上限があるそうだ。。。
不要なものを削除する。古い日付のは消した。

and 9 more at: https://github.com/fastlane/fastlane/search?q=No%20code%20signing%20identity%20found%20and%20cannot%20create%20a%20new%20one%20because%20you%20enabled%20%60readonly%60&type=Issues&utf8=

🔗  You can + double-click on links to open them directly in your browser.
/Users/hashimotojunichi/.rbenv/versions/3.3.5/lib/ruby/gems/3.3.0/gems/fastlane-2.228.0/fastlane_core/lib/fastlane_core/ui/interface.rb:129:in `crash!': [!] No code signing identity found and cannot create a new one because you enabled `readonly` (FastlaneCore::Interface::FastlaneCrash)
        from /Users/hashimotojunichi/.rbenv/versions/3.3.5/lib/ruby/gems/3.3.0/gems/fastlane-2.228.0/fastlane_core/lib/fastlane_core/ui/ui.rb:17:in `method_missing'
        from /Users/hashimotojunichi/.rbenv/versions/3.3.5/lib/ruby/gems/3.3.0/gems/fastlane-2.228.0/match/lib/match/runner.rb:202:in `fetch_certificate'
        from /Users/hashimotojunichi

AIにどれ残すか聞く

安全な手順:

期限が近いものから削除

Distribution Managed (2025/12/20)
重複している古いDistribution証明書を削除

Distribution (2026/05/23)
iOS Distribution (2026/07/05)
古いDevelopment証明書を削除

Development (2026/05/24)
Development (2026/10/21)
残す証明書:

Development (2026/11/02) - 最新
Distribution (2026/11/02) - 最新
iOS Development (Created via API) - Flutter用

まだ上限があった😅

さらに削除が必要:

Distribution Managed (2025/12/20) - 期限が近い
iOS Distribution (2026/07/05) - Distributionが重複している
これらを削除してから再実行してください:

でもやはり無理だった😅
どうやら制限があるようだ。。。

最後に

参考までにですが、証明書の制限がかかっていないときは、Flutterだとできていた手順をご紹介しておきます。

長いので、折りたたんでおこう。。。

多分やり方は変わらないと思われます。

Flutter iOSでやった場合

Flutter iOS fastlane導入完全ガイド

📋 概要

FlutterアプリのiOS版にfastlaneを導入し、TestFlight自動配布とApp Storeリリースプロセスを自動化するための完全ガイドです。

🛠️ 前提条件

必要なツール

  • Xcode(最新版)
  • Xcode Command Line Tools
  • Ruby 2.6以上
  • Bundler

Xcode Command Line Toolsのインストール

xcode-select --install

Bundlerのインストール

gem install bundler

🚀 セットアップ手順

1. fastlane環境構築

Step 1: Gemfileの初期化

cd ios
bundle init

Step 2: fastlaneの追加

bundle add fastlane

Step 3: fastlaneの初期化

bundle exec fastlane init

2. 証明書管理(fastlane match)

Step 1: 証明書保存用リポジトリの作成

  1. GitHubで新しいプライベートリポジトリを作成
    • 名前: ios-certificates-new
    • 可視性: Private
    • READMEなどは追加しない(空のリポジトリ)

こちらは作成したリポジトリ

Step 2: matchの初期化

bundle exec fastlane match init

Step 3: 証明書の生成

# App Store用証明書
bundle exec fastlane match appstore

# 開発用証明書(必要に応じて)
bundle exec fastlane match development

3. App Store Connect API Key設定

Step 1: API Keyの作成

  1. App Store Connectにアクセス
  2. ユーザとアクセスキーApp Store Connect API
  3. **+**ボタンをクリック
  4. 以下の設定で作成:
    • 名前: fastlane
    • アクセス: App Manager または Developer
  5. 生成をクリック
  6. .p8ファイルをダウンロード

Step 2: API Keyファイルの配置

# fastlaneディレクトリに配置
cp ~/Downloads/AuthKey_XXXXXXXXXX.p8 ./fastlane/

Step 3: 環境変数ファイルの作成

ios/fastlane/.envファイルを作成:

APP_STORE_CONNECT_API_KEY_ID=XXXXXXXXXX
APP_STORE_CONNECT_ISSUER_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
APP_STORE_CONNECT_API_KEY_PATH=fastlane/AuthKey_XXXXXXXXXX.p8

4. Xcodeプロジェクト設定

Step 1: ワークスペースを開く

open Runner.xcworkspace

Step 2: 署名設定の変更

  1. Runnerプロジェクトを選択
  2. Signing & Capabilitiesタブをクリック
  3. Release設定で:
    • Automatically manage signing: ❌ OFF
    • Provisioning Profile: match AppStore com.junichi.myShoppingCameraAppを選択
    • Signing Certificate: Apple Distributionを確認

5. .gitignoreの更新

プロジェクトルートの.gitignoreに以下を追加:

# fastlane関連
ios/fastlane/report.xml
ios/fastlane/Preview.html
ios/fastlane/.env
ios/fastlane/AuthKey_*.p8

# Xcode関連
ios/build/
ios/*.ipa
ios/*.app.dSYM.zip
ios/Runner.xcarchive
ios/DerivedData/

# Ruby/Bundler関連
ios/vendor/
ios/.bundle/

🔧 トラブルシューティング

よくある問題と解決方法

証明書が見つからないエラー

# 証明書を強制的に再取得
bundle exec fastlane match appstore --force

API Keyが見つからないエラー

  • .envファイルのパスが正しいか確認
  • .p8ファイルが存在するか確認
ls -la fastlane/AuthKey_*.p8

プロビジョニングプロファイルの不一致

# 証明書とプロファイルを再生成
bundle exec fastlane match nuke distribution
bundle exec fastlane match appstore

🎯 利用可能なコマンド

TestFlight配布(推奨)

cd ios
bundle exec fastlane ios beta

機能:

  • バージョン・ビルド番号自動インクリメント
  • App Store証明書でビルド
  • TestFlightに自動アップロード
  • 内部・外部テスター向け配布

App Store本番リリース

cd ios
bundle exec fastlane ios release

機能:

  • App Store Connectへ直接アップロード
  • 本番環境リリース準備
  • App Store審査提出

ビルドテスト(アップロードなし)

cd ios
bundle exec fastlane ios test_build

機能:

  • 署名・ビルドの確認のみ
  • IPAファイル作成をスキップ
  • CI/CDでのテスト用

🔐 セキュリティ管理

機密情報の取り扱い

  • .envファイル: 環境変数(Git除外対象)
  • .p8ファイル: API Key(Git除外対象)
  • 証明書: 暗号化されたプライベートリポジトリで管理
  • パスワード: fastlane matchで暗号化保存

権限設定

  • API Key: 必要最小限の権限(App Manager推奨)
  • 証明書リポジトリ: プライベート設定必須
  • チームメンバー: 適切な権限レベルを設定

📱 日常的な運用

通常のTestFlight配布

cd ios
bundle exec fastlane ios beta

緊急時の手動アップロード

cd ios
bundle exec fastlane ios test_build
open Runner.ipa  # Transporterアプリで手動アップロード

バージョン管理

  • メジャーアップデート: pubspec.yamlでバージョン変更
  • マイナーアップデート: fastlaneが自動でビルド番号をインクリメント

✅ チェックリスト

初回セットアップ完了確認

  • fastlane環境構築完了
  • 証明書管理(match)設定完了
  • App Store Connect API Key設定完了
  • Xcode署名設定変更完了
  • .gitignore更新完了
  • TestFlight配布テスト完了

リリース前確認項目

  • ビルドが正常に完了する
  • 署名が正しく設定されている
  • バージョン番号が適切
  • TestFlightでのテストが完了
  • App Store Connect審査準備完了

🚨 エラー対応

よくあるエラーと対処法

Could not find API key エラー

# ファイルパスを確認
ls -la fastlane/.env
ls -la fastlane/AuthKey_*.p8

Certificate not found エラー

# 証明書を再生成
bundle exec fastlane match appstore --force

Upload timeout エラー

# 手動アップロードに切り替え
bundle exec fastlane ios test_build
open Runner.ipa

📋 まとめ

この設定により、iOS版アプリのリリースプロセスが以下のように改善されます:

  • 作業時間短縮: 手動30分 → 自動5分
  • エラー削減: 手動作業によるミスを防止
  • 標準化: 一貫したビルド・リリースプロセス
  • セキュリティ: 証明書とAPI Keyの適切な管理

参考リンク


注意: このREADMEは手動で更新されています。fastlane実行時に自動上書きされることはありません。

Screen Shot

Xcodeの設定を変更する必要もある。久しぶりにM2 Mac mini起動すると、アカウントのログインも必要だった。

Discussion