iOS Certificates、Identifiers & Profiles とは何かと Fastlane Match による統一管理 証明書と CI/CD に関するメモ
Certificates、Identifiers、Profiles の関係と Fastlane Match を使った証明書の一元管理および CI/CD ワークフローへの統合についての記録。

Photo by marcos mayer
前書き
2025年中に、GitHub Actionsを使ってゼロからアプリのCI/CDの完全な構築プロセスを解説したシリーズ記事を書きました:
-
CI/CD 実践ガイド(1):CI/CD とは?CI/CD を使って安定かつ効率的な開発チームを作るには?ツールの選び方は?
-
CI/CD 実践ガイド(三):GitHub Actions を使ったアプリプロジェクトの CI と CD ワークフローの実装
-
CI/CD 実践ガイド(4):Google Apps Script Web App を使って GitHub Actions と連携し、無料で使いやすいパッケージングツールプラットフォームを構築する
最近新しい環境で再度実行しましたが、毎回新しいことを学んでいます。今回は iOS のコードサイニング:Certificates / Profiles / Devices の関係に焦点を当て、Fastlane Match を使って証明書管理と CI/CD を連携させる方法についてです。
Certificates, Identifiers & Profiles、Devicesとは何ですか?
Apple エコシステムでは、アプリ開発は証明書とプロビジョニングプロファイルの管理に基づいており、Android のように .apk ファイルがあればインストールして使えるわけではありません。Apple は厳格な証明書の対応管理を行っており、規則に合わないものはインストールや使用ができません。
主な項目の構成と機能:

Certificates: アプリ署名の身分 (Signing Identity)
-
Development — 開発段階で実機で使用(シミュレーターのみの場合は証明書不要)、所有者は個人またはAPIキー(数に制限あり)。
-
Distribution — App Store、TestFlight、または Ad Hoc 配布(登録済みデバイス限定)に使用、数に制限があり、所属はチーム。
-
Enterprise — 企業内アプリ用。
フォーマット :使用するには
Private Key(秘密鍵)とCertificate .cer(公開鍵証明書)が必要です。または、元の作成したパソコンの Keychain から.p12ファイルとしてエクスポートすると、両方が含まれます。

Identifiers: どの App/Extension (Bundle ID)
App の Bundle ID 登録と有効にする必要がある Capabilities(例:Push Notifications、App Groups の有効化など)、および App Services。
Extension も独自の Identifier を持ちます。
Devices: 登録済みデバイス (iPhone/iPadなど)
Development は実機で動作し、Distribution Ad Hoc の内測は登録されたデバイスのみ使用可能です。
上限:100個;キャンセルを含め、毎年の支払いサイクルまでリリース枠はリセットされません。
Provisioning Profile(以下、Profile):プロビジョニングプロファイル
Certificates+Identifiers+Devices の関係のまとめ。
-
Development — 開発段階で使用するプロビジョニングプロファイルで、実機テストに必須です。プロファイルは Certificates、Identifiers、Devices の関係を含みます。
-
Ad Hoc — 内部テスト用にパッケージングされたプロビジョニングプロファイル(例:Firebase App Distributionへのデプロイ)で、プロファイルは Certificates、Identifiers、Devices の関係を含みます。
-
App Store — App Store / TestFlight にアップロードするためのパッケージに使用するプロビジョニングプロファイルで、プロファイルは Certificates と Identifiers の関係を含みます。
フォーマット:
.mobileprovision
注意:Profile はあくまで記述ファイルであり、関係性を示すもので、証明書自体は含みません。
小結
総合すると、クリーンなマシンで Xcode の Apple アカウントにログインせずに実機ビルド(Development Certificate)やアーカイブビルド(Distribution Certificate)を行うには、2つのファイルが必要です:
-
.mobileprovisionプロビジョニングプロファイル:証明書、識別子、デバイスの関係を記述。 -
.p12証明書:証明書の実体(元の作成者のコンピュータからエクスポートされたもの)。
また macOS 15以降の Keychain は以下に移動しました:
open /System/Library/CoreServices/Applications/Keychain\ Access.app
ずっと探していた..
よくあるエラー
⚠️⚠️⚠️ 証明書やプロファイルが正しいのにエラーが出る場合:
ほとんどの場合、以前の証明書や複数の証明書が残っているため、Xcodeが混乱します。
この問題はよく発生します!
-
Xcode を閉じる
-
macOS キーチェーンを開く:
open /System/Library/CoreServices/Applications/Keychain\ Access.app -
login キーチェーン -> すべての項目 -> 「apple development」を検索 -> すべての証明書を削除
-
Finder -> 移動 -> フォルダへ移動 ->
~/Library/MobileDevice/Provisioning\ Profiles-> すべてのプロファイルを削除する -
証明書を再取得する
-
Xcode を再起動すれば正常に動作するはずです。
署名証明書 “iOS Distribution” が見つかりません / 署名証明書 “iOS Development” が見つかりません:
チームID "" に一致するプライベートキー付きの「iOS Distribution」署名証明書が見つかりませんでした。
チームID "" に一致するプライベートキー付きの「iOS Development」署名証明書が見つかりませんでした。
理由:
-
iOS Distribution/iOS Development Certificate の証明書が不足しています
-
iOS Distribution/iOS Development Certificate の証明書はあるが、対応するプライベートキーがありません
解決方法:
-
Keychain 内のすべての古い Certificates 証明書と Profiles プロビジョニングプロファイルを削除する
-
最初に Certificate を作成したコンピュータの Keychain で該当の証明書を見つけ、
.p12形式でエクスポートし、問題のあるコンピュータにインストールします。 -
Certificates, Identifiers & Profiles にアクセスし、古い証明書を取り消して再生成します。
(ご安心ください。これはオンライン版のアプリには影響せず、開発およびビルド段階にのみ影響します)
プロビジョニングプロファイル “” に署名証明書 “Apple Development: XXX” が含まれていません。 / プロビジョニングプロファイル “” に署名証明書 “Apple Distribution: XXX” が含まれていません。:
理由:
- 現在選択されているプロビジョニングプロファイルは、現在の証明書と一致していません。
解決方法:
-
Keychain 内のすべての古い Certificates 証明書と Profiles プロビジョニングプロファイルを削除する
-
Certificates, Identifiers & Profiles で、プロビジョニングプロファイルが対応する証明書にチェックされているか、またはプロファイルを再生成して使用してください。
チーム ‘’ に対応する ‘’ のプロファイルが見つかりませんでした: Xcode は ‘’ に一致するプロビジョニングプロファイルを見つけられませんでした。:
理由:
- 指定された Provisioning profile が見つかりません。
解決方法:
-
Keychain 内のすべての古い Certificates 証明書と Profiles プロビジョニングプロファイルを削除する
-
Certificates, Identifiers & Profiles から該当するプロファイルをダウンロードして使用する
プロビジョニングプロファイル “” のアプリID “” は、バンドルID “” と一致しません。 / プロビジョニングプロファイルがバンドル識別子と一致しません:
理由:
- Provisioning profile に現在の Bundle Identifier が含まれていません
解決方法:
-
Keychain 内のすべての古い Certificates 証明書と Profiles プロビジョニングプロファイルを削除する
-
Certificates, Identifiers & Profiles にアクセスし、IdentifiersでBundle Identifierが登録されていることを確認してください。
-
Certificates, Identifiers & Profiles で対応するプロファイルをダウンロードして使用します
プロビジョニングプロファイル “” に現在選択されているデバイス “”(識別子 )が含まれていません。:
理由:
- Provisioning profile に選択した実機の Device Identifier が含まれていません
解決方法:
-
Certificates, Identifiers & Profiles の Devices で実機の識別子が登録されていることを確認する
-
Certificates, Identifiers & Profiles の Profiles に対応するプロファイルが実機で有効になっていることを確認してください。
-
プロファイルの再ダウンロードに使用する
別の開発/配布証明書を作成できません。利用可能な開発/配布証明書の最大数に達しました。 :
理由:
作成済みの Development/Distribution 証明書が上限数に達しています。
解決方法:
- Certificates, Identifiers & Profiles にアクセスして、使っていない証明書を削除してください。
Xcodeの証明書は正しくて正常にビルドできるが、CLI(Fastlane)でビルドコマンドを実行すると署名エラーが発生する:
理由:
ここでもう一つの落とし穴にハマりました。プロジェクトをうっかり iCloud の同期フォルダに置いてしまい、なぜか Fastlane がずっと証明書の問題を起こしていました(キー チェーンのアクセスに問題がある疑いです)。
解決方法:
iCloud 同期フォルダから移動するだけです。
日常使用の問題シーン
Development Certificate (開発用証明書)

-
Match を導入して証明書を一元管理する前は、各開発者が自分の
Development CertificateとDevelopment Profileを作成していました。組織内に 1,000 人以上の開発者がいる場合、Certificates, Identifiers & Profiles, Devices の管理画面は非常に混乱し、恐ろしい状態になります。 -
もし外部の開発チームが開発のみを担当する場合でも、Apple Developer Program の管理画面にそのチームを追加し、彼ら自身の開発用証明書とプロファイルを作成させる必要があります。
Distribution Certificate (配布用証明書)

-
Distribution Certificate はチーム単位で作成されるため、各開発者プログラムのチームは作成できる配布証明書の数が限られています。
-
一般的な方法としては、1人のエンジニアが Distribution Certificate を作成し、.p12 ファイルをエクスポートして、他のリリース担当の開発者や CI/CD マシンで使用します。
-
チームが大きく、アプリの数が多いと、やり取りが非常に面倒になります。しかも 毎年必ず更新が必要です。
-
Ad Hoc 配布時に新しいデバイスが登録されると、全員および CI/CD は新しいデバイスを有効にするためにプロファイルを再ダウンロードする必要があります。
Fastlane Match
以上の問題を踏まえ、すべての証明書関連の管理を代行してくれるプラットフォームが欲しいと考えています。すべての開発者と CI/CD サービスはこのプラットフォームから統一してデータを取得・更新します。このプラットフォームのストレージは安全でなければなりません。それが — Fastlane Match です。
チーム全体で証明書とプロファイルを簡単に同期
iOS と macOS のコード署名に新しいアプローチ:開発チーム全体で1つのコード署名IDを共有し、コード署名の設定を簡素化し、コード署名の問題を防ぎます。
matchはcodesigning.guideのコンセプトを実装したものです。matchは必要なすべての証明書とプロビジョニングプロファイルを作成し、それらを別のGitリポジトリ、Google Cloud、またはAmazon S3に保存します。選択したストレージにアクセスできるチームメンバーは、これらの認証情報をコード署名に使用できます。matchは壊れた証明書や期限切れの証明書も自動で修復します。チーム間で署名用の認証情報を共有する最も簡単な方法です

Fastlane Match:
-
App Store Connect と連携し(App Store Connect API または Apple Developer ログインセッションを通じて)、証明書を作成または更新します。
-
証明書の成果物(
.mobileprovisionプロファイル、.p12証明書、.cer証明書)の3つのファイルを暗号化してGitリポジトリにアップロードします(他のストレージを使うことも可能です)。
.cer証明書は独立して保存します。これは証明書の有効性を確認するためです。 -
権限を細かく分けたい場合は、2つのリポジトリに分けることができます。1つは Development 証明書を管理し、もう1つは Distribution 証明書を管理します。
-
certsフォルダには、すべての証明書とその秘密鍵が含まれています。 -
profilesフォルダには、すべてのプロビジョニングプロファイルが含まれています。

https://docs.fastlane.tools/actions/match/
暗号化アルゴリズム: AES-256-GCM
開発者、CI/CD サービス:
-
Fastlane match コマンドを使って証明書を一元管理する。
-
Fastlane Match はまず Git リポジトリから証明書ファイルを取得し、復号して使用します。期限切れや使用不可の場合、Create/Write 権限があれば自動で再生成しリポジトリに Push します。Read 権限のみの場合はエラーを報告します。
作成/書き込み:
-
証明書の管理を担当している人だけが、証明書の作成・更新およびPushアップロードを行うことができます。
-
重要な Distribution Certificate は独立したリポジトリに保管し、CI/CD サービスや管理者のみが使用できるようにするのが望ましい
読む:
-
他の開発者やCI/CDサービスは 読み取り専用 のPull証明書権限のみ持っています
-
CI/CDサービスは、タスクを実行するたびに最新の証明書を取得します
-
全員が同じDevelopment & Distribution証明書を共有します
-
人員異動後はMatch Repoの権限を失いますが、古い証明書をRevokeして再生成すれば、他のメンバーは再度Pullするだけで済みます(make projectスクリプトに統合していればさらに楽です)。
Fastlane Match 設定と使用方法
Git Storage を例に、すべての証明書。
1. 空の証明書保存用GitプライベートMatchリポジトリを作成する
すべてのCertificatesやProfilesは暗号化して保存されますが、そのリポジトリのアクセス権限はきちんと設定する必要があります。
- ローカルで Git の SSH アクセス権限が設定されていることを確認します。
git clone [email protected]:xxx/certificates.gitを使用できます。
ここでは SSH Git Clone Repo を統一して使用することを推奨します。なぜなら CI/CD でも同じ方法を使うからです。
もし fastlane match の実行がずっと
If cloning the repo takes too long, you can use theclone_branch_directlyoption in match.で止まる場合、多くは SSH の権限設定の問題です。
- プロジェクトディレクトリで
bundle exec fastlane match initを実行して設定を完了する
[21:54:32]: fastlane match は複数のストレージモードをサポートしています。使用したいものを選択してください:
1. git
2. google_cloud
3. s3
4. gitlab_secure_files
# git を使う場合は 1 を入力
? 1
[22:04:40]: 証明書とプロファイルを保存するための新しいプライベート git リポジトリを作成してください
[22:04:40]: Git リポジトリの URL: git@github.com:xxx/certificates.git
# 作成した Git プライベート Match リポジトリの SSH URL を入力
[22:04:47]: './fastlane/Matchfile' の作成に成功しました。コードエディタでファイルを開けます。
[22:04:47]: これで `fastlane match development`、`fastlane match adhoc`、`fastlane match enterprise`、`fastlane match appstore` を実行できます
[22:04:47]: 各環境で初回実行時にプロビジョニングプロファイルと
[22:04:47]: 証明書が作成されます。それ以降は既存のプロファイルを自動的にインポートします。
[22:04:47]: 詳細は https://docs.fastlane.tools/actions/match/ をご覧ください
- 完了すると
fastlane/Matchfile: が生成されます。
# あなたの Git プライベート Match リポジトリの SSH URL
git_url("[email protected]:xxxx/certificates.git")
storage_mode("git")
type("development") # デフォルトのタイプ、appstore、adhoc、enterprise、development が指定可能
# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"])
# username("[email protected]") # あなたの Apple Developer Portal のユーザー名
# 利用可能なオプションは `fastlane match --help` で確認できます
# 他のオプションを有効にするには行頭の # を外してください
# ドキュメントは https://docs.fastlane.tools/actions/match にあります
5. App Store Connect API .p8 Key を作成し、APIキーを使って証明書を一元管理する:

⚠️️️️ App Store Connect API .p8 キー の権限は非常に強力 ため、証明書管理だけでなく、アプリのリリースや審査申請、バックエンドのユーザー管理やレビュー、財務レポートの管理も可能です。
チームの .git に入れて全員がアクセスできるようにするかは、チームの状況に応じて決めてください。
より高いリスク管理の方法は、管理者だけがアクセスでき、CI/CDで使用する際に暗号化して保存することです(本文後半で紹介します)。
ここではデモのために fastlane ディレクトリ内に直接配置しています。
また、本記事の Fastlane スクリプトは説明を簡単にするため、重複コードやプログラム構造は考慮していません。
証明書管理
platform :ios do
lane :match_development do \\|options\\|
# あなたのApp Identifier IDに変更してください
app_identifier = "li.zhgchg.myApp"
type = options.fetch(:type, "development")
isRead = options.fetch(:isRead, true)
if isRead
readonly = true
force = false
else
readonly = false
force = true
# App Store Connect APIキーが必要で、Appleの管理画面で証明書を操作する権限があります
# App Store Connect APIの.p8キーが ./fastlane/ ディレクトリにあると仮定します
app_store_connect_api_key(
key_id: "XXXXXX",
issuer_id: "XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX",
key_filepath: "./fastlane/AuthKey_XXXXXX.p8",
)
end
# app_identifierのDevelopment証明書を取得
match(
type: type,
app_identifier: app_identifier,
readonly: readonly, # 必要に応じてcert/profileを更新・アップロードできるかどうか
force: force # 無条件にプロビジョニングプロファイルを再作成するかどうか
)
end
end
Development Certificate と Profile を作成し、Match リポジトリにアップロードする:
bundle exec fastlane match_development type:development isRead:false
[22:22:38]: 'li.zhgchg.myApp' のために 'match Development li.zhgchg.myApp' という名前の新しいプロビジョニングプロファイルを 'ios' プラットフォーム用に作成しています
[22:22:39]: プロビジョニングプロファイルをダウンロード中...
[22:22:39]: プロビジョニングプロファイルのダウンロードに成功しました...
[22:22:39]: プロビジョニングプロファイルをインストール中...
/var/folders/pk/978f3gws7ml0bkmrw245cg_c0000gn/T/d20260103-5010-v6r6w2/profiles/development/Development_li.zhgchg.myApp.mobileprovision
[22:22:39]: プロビジョニングプロファイルをインストール中...
[22:22:39]: 🔒 証明書リポジトリの暗号化に成功しました
[22:22:39]: リモートGitリポジトリへ変更をプッシュしています...
[22:22:42]: Gitリポジトリへのファイルアップロードが完了しました [[email protected]:xxxx/certificates.git]
- エラーがなければ、Development Certificate と Profile の生成、インストールが成功し、Match リポジトリへの同期プッシュも成功したことを意味します。
初回作成時に Passphrase の設定が必要です:
[23:29:12]: 証明書を暗号化/復号化するために使用するパスフレーズを入力してください
[23:29:12]: このパスフレーズはリポジトリごとに固有で、ローカルキーチェーンに保存されます
[23:29:12]: 別のマシンで match を実行する際に必要になるため、パスワードを忘れないようにしてください
[23:29:12]: Match ストレージのパスフレーズ:
-
この値は、あなたのすべての Match リポジトリ上のファイルを暗号化する際に必要となる参照(パスフレーズ + ランダムソルト)です。
-
ランダムな文字列を生成し、設定して記録することをおすすめします。隨機字串
-
将来の更新や他の人が Match リポの証明書を取得する際には、この文字列を入力して元のファイルを復号化する必要があります。
チームの他のメンバーは Match リポジトリから Development Certificate と Profile を一括で Pull する:
bundle exec fastlane match_development type:development
(コード部分のため翻訳不要)
初めて使用する際にログインキーチェーンのパスワードを尋ねられます。これは証明書をキーチェーンにインストールするためで、2回入力して確認してください:
[16:52:59]: 証明書をインストールしています...
[16:53:00]: ローカルのコード署名IDが見つかりません。
security find-identity -v -p codesigning を実行するとこの出力が得られます。
このStack Overflowのスレッドに詳細があります:https://stackoverflow.com/q/35390072/774。
(Keychain Accessで期限切れのWWDR証明書を確認してください:https://stackoverflow.com/a/35409835/774 に詳細があります。)
[16:53:00]: /Users/zhgchgli/Library/Keychains/login.keychain-db のパスワードを入力してください
[16:53:00]: このパスフレーズは fastlane_keychain_login という名前でローカルキーチェーンに保存され、今後の実行で使用されます
[16:53:00]: このプロンプトは 'keychain_password' オプションまたは 'MATCH_KEYCHAIN_PASSWORD' 環境変数を指定することで回避できます
[16:53:00]: ログインキーチェーンのパスワード:********
[16:53:24]: ログインキーチェーンのパスワードをもう一度入力してください:********
もし Match Development で証明書を取得した後も、Xcode がエラーや無効と表示し続ける場合:
前述のよくあるエラーを参考にすると、多くの場合は古い不要な証明書が原因です。すべての証明書を削除してから再度取得すれば解決するはずです。
—
AdHoc Distribution Certificate と Profile の作成および Match リポジトリへのアップロード:
bundle exec fastlane match_development type:adhoc isRead:false
(コード内のコメントはありませんので、そのまま保持しています。)
AppStore Distribution 証明書とプロファイルの作成および Match リポジトリへのアップロード:
bundle exec fastlane match_development type:appstore isRead:false
CI/CD サービスは統一して Match リポジトリから Distribution Certificate と Profile (isRead:true) をプルし、その後ビルドと配布タスクを実行します。
新しいデバイスの登録
platform :ios do
desc "新しいデバイスを登録し、プロファイルを更新する"
lane :registerDevice do \\|options\\|
# あなたの App Identifier ID に変更してください
app_identifier = "li.zhgchg.myApp"
# Appleの管理画面で証明書を操作するにはApp Store Connect APIキーが必要です
# ここでは App Store Connect API の .p8 キーが ./fastlane/ ディレクトリにあると仮定します
app_store_connect_api_key(
key_id: "XXXXXX",
issuer_id: "XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX",
key_filepath: "./fastlane/AuthKey_XXXXXX.p8",
)
# 入力: UDID とデバイス名
udid = options[:udid] \\|\\| UI.input("デバイスのUDIDを入力してください:")
device_name = options[:name] \\|\\| UI.input("デバイス名を入力してください:")
UI.message("📱 デバイスを登録中 #{device_name} (#{udid})")
register_device(
name: device_name,
udid: udid,
platform: 'ios'
)
# app_identifier の Development 証明書を更新
match(
type: "development",
app_identifier: app_identifier,
readonly: false, # 必要に応じて証明書・プロファイルを更新・アップロード
force_for_new_devices: true # 新しいデバイスの場合はプロビジョニングプロファイルを再作成
)
# app_identifier の AdHoc 証明書を更新
match(
type: "adhoc",
app_identifier: app_identifier,
readonly: false, # 必要に応じて証明書・プロファイルを更新・アップロード
force_for_new_devices: true # 新しいデバイスの場合はプロビジョニングプロファイルを再作成
)
end
end
登録が完了した後、他の開発者や CI/CD サービスが Match リポジトリから Profile(Development または AdHoc)を取得すると、新しいデバイスが含まれます。
Fastlane Match x CI/CD ワークフロー統合
Fastlane MatchでPush/Pullの証明書を生成・取得する方法を大まかに説明した後は、次にそれをCI/CDプロセスに統合する方法について説明します。
問題1 — Private Match リポジトリのクローン方法
最もよくある問題の一つは、CI/CDでプライベートなMatchリポジトリをどうやってCloneするかです。ローカル開発では、統一してsshでgit cloneを使い、自分のアカウントのsshキーを使っているため問題ありません。しかし、CI/CDにはこのキーがなく、個人のキーを使うこともできますが、安全とは言えません。
GitHub — リポジトリデプロイキー:
-
まずローカルでプライベートキーとパブリックキーを生成します:
ssh-keygen -t rsa -b 4096 -f ./id_rsa( パスフレーズは入力しないでください ) -
Match Private Repo -> Settings -> Security -> Deploy keys -> Add deploy key に移動します:

- テキストエディタで「
id_rsa.pub」を開き、内容をコピーして Key ->「Add key」に貼り付けます

- メインのリポジトリに戻り、Settings -> Security -> Secrets and variables に移動します。

- SSHプライベートキーの内容をSecretに追加:

- 名前:
MATCH_REPO_DEPLOY_PRIVATE_KEY
- メインリポジトリの GitHub Actions に SSH キーを設定する:
name: CI - デプロイ
on:
push:
branches: [ main ]
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 現在のリポジトリをチェックアウト (リポジトリA)
uses: actions/checkout@v4
- name: デプロイキーのためのSSH設定
run: \\|
mkdir -p ~/.ssh
echo "${{ secrets.MATCH_REPO_DEPLOY_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh-keyscan github.com >> ~/.ssh/known_hosts
- name: クローンのテスト
run: \\|
git clone [email protected]:xxxx/match-certificates.git
# 成功!
# .. デプロイジョブを実行...
- 設定成功!
問題2— App Store Connect API .p8 キーの安全な保管と使用
GitHub Actions はファイルを直接保存できないため、まず文字列として保存し、その後ファイルに書き込みます。
-
同じ問題のステップ1と同様に、メインのリポジトリに
APP_STORE_CONNECT_API_KEY_CONTENTシークレットを追加します。 -
テキストエディタで
AuthKey_XXXXXX.p8を開き、内容をコピーして貼り付けてください。 -
メインリポジトリの GitHub Actions に内容を読み取りファイルに書き込むステップを追加:
name: CI - Deploy
on:
push:
branches: [ main ]
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 現在のリポジトリをチェックアウト (Repo A)
uses: actions/checkout@v4
- name: デプロイキー用のSSH設定
run: \\|
mkdir -p ~/.ssh
echo "${{ secrets.MATCH_REPO_DEPLOY_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh-keyscan github.com >> ~/.ssh/known_hosts
- name: シークレットキーをファイルに書き込む
env:
APP_STORE_CONNECT_API_KEY_CONTENT: ${{ secrets.APP_STORE_CONNECT_API_KEY_CONTENT }}
run: \\|
# fastlaneディレクトリが存在することを確認
mkdir -p ./fastlane
# ファイルパスを作成
APP_STORE_CONNECT_API_KEY_PATH=./fastlane/AuthKey_XXXXXX.p8
# 内容を書き込む(改行を保持)
echo "$APP_STORE_CONNECT_API_KEY_CONTENT" > "$APP_STORE_CONNECT_API_KEY_PATH"
# (任意)パーミッションを制限
chmod 600 "$APP_STORE_CONNECT_API_KEY_PATH"
- name: Firebaseへデプロイ
env:
MATCH_PASSWORD: "${{ secrets.MATCH_PASSWORD }}"
run: bundle exec fastlane deploy_to_firebase
問題3 — Private Match Repo の Passphrase を設定し、Match 時のプロンプト中断を防ぐ
-
同じ手順1で、メインリポジトリに
MATCH_PASSWORDを Secret として追加してください。 -
Fastlane Match リポジトリに設定した
Passphraseを入力してください -
メインリポジトリの GitHub Actions に
env: secret.MATCH_PASSWORDを追加:
name: CI - Deploy
on:
push:
branches: [ main ]
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 現在のリポジトリをチェックアウト (Repo A)
uses: actions/checkout@v4
- name: デプロイキー用のSSH設定
run: \\|
mkdir -p ~/.ssh
echo "${{ secrets.MATCH_REPO_DEPLOY_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh-keyscan github.com >> ~/.ssh/known_hosts
- name: シークレットキーをファイルに書き込む
env:
APP_STORE_CONNECT_API_KEY_CONTENT: ${{ secrets.APP_STORE_CONNECT_API_KEY_CONTENT }}
run: \\|
# fastlaneディレクトリが存在することを確認
mkdir -p ./fastlane
# ファイルパスを作成
APP_STORE_CONNECT_API_KEY_PATH=./fastlane/AuthKey_XXXXXX.p8
# 内容を書き込む(改行を保持)
echo "$APP_STORE_CONNECT_API_KEY_CONTENT" > "$APP_STORE_CONNECT_API_KEY_PATH"
# (任意)パーミッションを制限
chmod 600 "$APP_STORE_CONNECT_API_KEY_PATH"
- name: Firebaseへデプロイ
env:
MATCH_PASSWORD: "${{ secrets.MATCH_PASSWORD }}"
run: bundle exec fastlane deploy_to_firebase
問題4 — Self-hosted Runner 上の Keychain 処理
クラウドマシンは毎回クリーンで全く新しい環境ですが、Self-hosted Runner を使う場合、Fastlane で derived_data_path、output_directory、buildlog_path、reinstall_app を指定して、毎回実行環境をクリーンにできます。しかし、Certificates や Profiles はシステムの Keychain にインストールされるため、これをどう扱うべきでしょうか?
実は Fastlane は私たちのために、Match の前にクリーンな Keychain を作成することも考慮しています:
name: CI - デプロイ
on:
push:
branches: [ main ]
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 現在のリポジトリをチェックアウト (Repo A)
uses: actions/checkout@v4
- name: デプロイキー用のSSH設定
run: \\|
mkdir -p ~/.ssh
echo "${{ secrets.MATCH_REPO_DEPLOY_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh-keyscan github.com >> ~/.ssh/known_hosts
- name: シークレットキーをファイルに書き込み
env:
APP_STORE_CONNECT_API_KEY_CONTENT: ${{ secrets.APP_STORE_CONNECT_API_KEY_CONTENT }}
run: \\|
# fastlaneディレクトリが存在することを確認
mkdir -p ./fastlane
# ファイルパスを作成
APP_STORE_CONNECT_API_KEY_PATH=./fastlane/AuthKey_XXXXXX.p8
# 内容を書き込み(改行を保持)
echo "$APP_STORE_CONNECT_API_KEY_CONTENT" > "$APP_STORE_CONNECT_API_KEY_PATH"
# (任意)パーミッションを制限
chmod 600 "$APP_STORE_CONNECT_API_KEY_PATH"
- name: fastlaneキーチェーンを作成
env:
KEYCHAIN_NAME: "${{ runner.name }}"
MATCH_PASSWORD: "${{ secrets.MATCH_PASSWORD }}"
run: \\|
bundle exec fastlane run create_keychain \
name:"$KEYCHAIN_NAME" \
password:"$MATCH_PASSWORD" \
unlock:true \
timeout:0 \
lock_when_sleeps:false
- name: Firebaseへデプロイ
env:
MATCH_PASSWORD: "${{ secrets.MATCH_PASSWORD }}"
KEYCHAIN_NAME: "${{ runner.name }}"
run: bundle exec fastlane deploy_to_firebase
# 🔥 成功・失敗に関わらず必ず実行
- name: fastlaneキーチェーンを削除
if: always()
env:
KEYCHAIN_NAME: ${{ runner.name }}
run: \\|
bundle exec fastlane run delete_keychain \
name:"$KEYCHAIN_NAME"
-
各Runnerは同時に1つだけ実行されるため、Runner NameをKeychain Nameとして使用し、各Runnerはそれぞれ独自のKeychainを持ちます。
-
実行完了後、成功・失敗に関わらず削除されます。
-
keychain_passwordは特に別途設定せず、統一してMATCH_PASSWORDを使用しました。
Fastlane/Fastfile の match メソッドに keychain パラメータを追加する:
#...
match(
type: "adhoc",
app_identifier: app_identifier,
readonly: false, # 必要に応じて cert / profile を更新・アップロードする
force_for_new_devices: true, # 新しいデバイスがある場合、プロビジョニングプロファイルを再作成する
keychain_name: ENV['KEYCHAIN_NAME'], # デフォルト値: nil
keychain_password: ENV['MATCH_PASSWORD'] # デフォルト値: nil
)
#...
こうすることで、Match が証明書を取得するときに共用の login キーチェーンではなく、指定したキーチェーンに保存されます。
結語
Fastlane の範囲は非常に広いため、ここでは Fastlane Match の使用手順のみを記録します。Fastlane を使ったテスト実行やビルド・リリースなどの他の Lane については、機会があれば別の記事で補足します。Match に関する他の問題や事例があれば、また追記しますので、コメントでの質問も歓迎します!
関連記事
-
CI/CD 実践ガイド(1):CI/CD とは?CI/CD を使って安定かつ効率的な開発チームを作るには?ツールの選び方は?
-
CI/CD 実践ガイド(三):GitHub Actions を使ったアプリプロジェクトの CI と CD ワークフローの実装
-
CI/CD 実践ガイド(4):Google Apps Script Web App を使って GitHub Actions と連携し、無料で使いやすいパッケージングツールプラットフォームを構築する
ぜひご覧ください。🤞🏻
Post Medium から ZMediumToMarkdown によって変換されました。



コメント