GitHub Actionsを使用したiOSビルドの自動化
Capacitor アプリのCI/CD設定は複雑で時間がかかります。ここでは、必要なことを知っておくべきことを紹介します。
新規ビルドの推奨: Capgo ビルドを使用します。
__CAPGO_KEEP_0__ ビルドを使用することをおすすめします。 Capgo ビルドと Capgo CLIを使用します。 Capacitor ビルドのためのネイティブビルドを使用します。 This Fastlane Match guide is kept for teams maintaining existing GitHub Actions pipelines, but new iOS builds should use the Capgo CLI so you do not have to maintain Fastlane, Match repositories, Xcode runners, certificates, and upload scripts yourself.
Capgo Build for CI/CD by Capgo
Fastlane Match、Xcodeランナー、証明書、プロビジョニングプロファイル、アップロードスクリプトの管理をスキップ Capgo Build __CAPGO_KEEP_0__ Buildは、既存のCI/CDパイプラインから署名されたネイティブiOSビルドを実行します:
- CI/CDパイプラインと互換性があります: Capgo BuildをGitHub Actions、GitLab CI、Jenkins、またはローカルスクリプトからトリガーする
npx cap sync. - CIシークレットから署名: App Store Connectのキー、証明書、プロビジョニングプロファイル、パスワード、チームIDをCIシークレットに保持
- ランナー管理の負担がなく: Capgo BuildはAppleのビルド環境を維持しているので、macOSランナー、Xcodeイメージ、Fastlane、またはMatchリポジトリの管理が不要
- アーティファクトと提出: Download signed artifacts for QA or submit release builds through the Capgo CLI.
価格設定
- Capgoプランは1か月あたり$12から始まります
- __CAPGO_KEEP_0__のOTA更新と約15のネイティブビルドを含みます
- __CAPGO_KEEP_0__の追加ビルド分数はクレジット単位で1分あたり請求されます
手動セットアップガイド
ここで何が必要か
iOS向けの継続的な配信をFastlaneとGitHubアクションを使用してmatch
前提条件
チュートリアルを続ける前に
- Fastlaneがインストールされていることを確認してください インストール 開発用マシンにインストールしてください。
- iOS開発者プログラムの会員資格
- 読むことができる欲求…😆
- 多くの開発者がいるチームの場合、別の方法を検討することをお勧めします fastlane cert シンプルなワークフロー用に
価格に関する重要なこと

https://github.com/features/actions
サービスは、選択したマシンに応じて、限界まで無料です。
このサービスを使用する予定です macOS スクリーンショットで確認できるように、価格と制限 (価格はこのチュートリアルの作成時点のもので、将来の変更が可能) を確認できます。
🔴 要件と価格について注意した後、続ける場合はどうですか?
📣 この記事では、iTunes Connectでアプリを作成し、Appleのエコシステムの証明書を持っていることを前提としています。Fastlaneで全てをコピーすることができます。
では始めましょう!
この記事で説明する手順
- Fastlane MatchとApp Store Connect APIを使用する
- App Store Connect __CAPGO_KEEP_0__を作成する
- App Store Connect APIを使用する
- Using an App Store Connect API Key
- Fastlane matchを設定する
- Configure Fastlane match
1. App Store Connect API を使用して、Fastlane Match を使用します。
2021年2月以降、すべてのユーザーがApp Store Connectにサインインするには、2要素認証または2段階認証が必要になります。この追加のセキュリティ層は、Apple IDのセキュリティを確保するために役立ちます。
From Apple Support
matchを始めるには、既存の証明書を取り消す必要がありますが、心配はいりません。新しい証明書は直接取得できます。
Requirements
App Store Connect API を使用するには、Fastlaneには three の
- 必要な
- ものがあります。
- Issuer ID。
App Store Connect API キーを作成
App Store Connect の __CAPGO_KEEP_0__ キーを生成するには、App Store Connect での管理者権限が必要です。管理者権限がない場合は、この記事を参照し、以下の手順に従ってください。
1 — App Store Connect にログイン App Store Connect.
2 — "ユーザーとアクセス" を選択 App Store Connect ユーザー アクセス.

App Store Connect __CAPGO_KEEP_0__ インテグレーション

App Store Connect API キーを作成

6 — __CAPGO_KEEP_0__ キーを生成

6 — キーのロールを選択してください。キーに適用されるロールは、チームのユーザーに適用されるロールと同じです。詳しくは ロールの権限をご覧ください。 App Store Connect では、特定のアプリに制限することができません。.
新しいキーの名前、キーアイデンティファー、ダウンロードリンク、およびその他の情報がページに表示されます。
An API key’s access cannot be limited to specific apps.
ここで必要なすべての情報を取得できます。

2. キーアイデンティファー
7 — 生成をクリックしてください。
We recommend to select "App manager".
<3> Click “Download API Key” to download your API private key. The download link appears only if the private key has not yet been downloaded. Apple does not keep a copy of the private key. So, you can download it only once.
🔴 プライベート キーを安全な場所に保存してください。キーを共有しないでください。キーを code リポジトリに保存しないでください。クライアントサイドの code にキーを含めないでください。
App Store Connect API キーを使用する
API キー ファイル(ダウンロードした p8 ファイル)、キー ID、発行者 ID が JWT トークンを作成するために必要です。Fastlane に情報を入力する方法は複数ありますが、Fastlane の新しいアクションを使用して入力する方法は 1 つです。 app_store_connect_api_keyFastlane ドキュメントを参照してください。 Fastlane ドキュメントを参照してください。Fastlane を使用して CI で最も一般的な方法で __CAPGO_KEEP_0__ キーと連携することができます。
Now we can manage Fastlane with the App Store Connect API key, great!
Fastlane は、Android Studio を使用して実行することができる、モバイル開発タスクを自動化する Ruby ライブラリです。Fastlane を使用して、カスタムの「レーン」を設定できます。このレーンには、通常のタスクを実行するために使用される「アクション」が含まれます。Fastlane を使用して、Android Studio を使用して実行することができるタスクを実行できますが、このチュートリアルでは、Fastlane のコアアクションを使用するだけです。
プロジェクトのルートディレクトリに Fastlane フォルダーを作成し、次のファイルをコピーしてください: Fastfile
Appfile
default_platform(:ios)
DEVELOPER_APP_IDENTIFIER = ENV["DEVELOPER_APP_IDENTIFIER"]
DEVELOPER_APP_ID = ENV["DEVELOPER_APP_ID"]
PROVISIONING_PROFILE_SPECIFIER = ENV["PROVISIONING_PROFILE_SPECIFIER"]
TEMP_KEYCHAIN_USER = ENV["TEMP_KEYCHAIN_USER"]
TEMP_KEYCHAIN_PASSWORD = ENV["TEMP_KEYCHAIN_PASSWORD"]
APPLE_ISSUER_ID = ENV["APPLE_ISSUER_ID"]
APPLE_KEY_ID = ENV["APPLE_KEY_ID"]
APPLE_KEY_CONTENT = ENV["APPLE_KEY_CONTENT"]
GIT_USERNAME = ENV["GIT_USERNAME"]
GIT_TOKEN = ENV["GIT_TOKEN"]
def delete_temp_keychain(name)
delete_keychain(
name: name
) if File.exist? File.expand_path("~/Library/Keychains/#{name}-db")
end
def create_temp_keychain(name, password)
create_keychain(
name: name,
password: password,
unlock: false,
timeout: 0
)
end
def ensure_temp_keychain(name, password)
delete_temp_keychain(name)
create_temp_keychain(name, password)
end
platform :ios do
lane :build do
build_app(
configuration: "Release",
workspace: "./ios/App/App.xcworkspace",
scheme: "App",
export_method: "app-store",
export_options: {
provisioningProfiles: {
DEVELOPER_APP_ID => "#{PROVISIONING_PROFILE_SPECIFIER}"
}
}
)
end
lane :refresh_profiles do
match(
type: "development",
force: true)
match(
type: "adhoc",
force: true)
end
desc "Register new device"
lane :register_new_device do |options|
device_name = prompt(text: "Enter the device name: ")
device_udid = prompt(text: "Enter the device UDID: ")
device_hash = {}
device_hash[device_name] = device_udid
register_devices(
devices: device_hash
)
refresh_profiles
end
lane :closed_beta do
keychain_name = TEMP_KEYCHAIN_USER
keychain_password = TEMP_KEYCHAIN_PASSWORD
ensure_temp_keychain(keychain_name, keychain_password)
api_key = app_store_connect_api_key(
key_id: APPLE_KEY_ID,
issuer_id: APPLE_ISSUER_ID,
key_content: APPLE_KEY_CONTENT,
duration: 1200,
in_house: false
)
match(
type: 'appstore',
git_basic_authorization: Base64.strict_encode64("#{GIT_USERNAME}:#{GIT_TOKEN}"),
readonly: true,
keychain_name: keychain_name,
keychain_password: keychain_password,
api_key: api_key
)
gym(
configuration: "Release",
workspace: "./ios/App/App.xcworkspace",
scheme: "App",
export_method: "app-store",
export_options: {
provisioningProfiles: {
DEVELOPER_APP_ID => "#{PROVISIONING_PROFILE_SPECIFIER}"
}
}
)
pilot(
apple_id: "#{DEVELOPER_APP_ID}",
app_identifier: "#{DEVELOPER_APP_IDENTIFIER}",
skip_waiting_for_build_processing: true,
skip_submission: true,
distribute_external: false,
notify_external_testers: false,
ipa: "./App.ipa"
)
delete_temp_keychain(keychain_name)
end
lane :submit_review do
version = ''
Dir.chdir("..") do
file = File.read("package.json")
data = JSON.parse(file)
version = data["version"]
end
deliver(
app_version: version,
submit_for_review: true,
automatic_release: true,
force: true, # Skip HTMl report verification
skip_metadata: false,
skip_screenshots: false,
skip_binary_upload: true
)
end
end
__CAPGO_KEEP_0__
app_identifier(ENV["DEVELOPER_APP_IDENTIFIER"])
apple_id(ENV["FASTLANE_APPLE_ID"])
itc_team_id(ENV["APP_STORE_CONNECT_TEAM_ID"])
team_id(ENV["DEVELOPER_PORTAL_TEAM_ID"])
iOSの__CAPGO_KEEP_0__署名の新しいアプローチを設定
Fastlane match is a new approach to iOS’s code signing. Fastlane match makes it easy for teams to manage the required certificates and provisioning profiles for your iOS apps.
新しいプライベートリポジトリを作成する certificates例えば、GitHubの個人アカウントまたは組織で
iOSアプリのFastlane matchを初期化する
fastlane match init
オプション#1(Git Storage)を選択する
[01:00:00]: fastlane match supports multiple storage modes, please select the one you want to use:1. git2. google_cloud3. s3?
新しく作成したリポジトリのURLを割り当てる
[01:00:00]: Please create a new, private git repository to store the certificates and profiles there[01:00:00]: URL of the Git Repo: <YOUR_CERTIFICATES_REPO_URL>
Fastlaneフォルダ内にファイル名が Matchfile と
_git_url_HTTPSの証明書リポジトリのURLに設定する必要があります。オプションでSSHも使用できますが、実行するために別のステップが必要です。
# ios/Matchfilegit_url("https://github.com/gitusername/certificates")storage_mode("git")type("appstore")
次に、Fastlane Matchでクレデンシャルを入力するように求められます。
GitHubアクションが証明書リポジトリを復号化するために使用するパスフレーズを入力するように求められます。正しく覚えておいてください。
fastlane match appstore
すべてがうまくいった場合、以下のようなものが表示されます。
[01:40:52]: All required keys, certificates and provisioning profiles are installed 🙌
GitHubと必要な権限に関して問題が発生した場合、この post がgitの認証トークンを生成するのに役立ちます。
生成された証明書とプロビジョニングプロファイルは証明書リポジトリのリソースにアップロードされます。

最後に、Xcodeを開いてアプリのリリース構成のプロビジョニングプロファイルを更新してください。 project XCode証明書

注意事項があります 💡
MATCH
CI/CDが証明書とプロビジョニングプロファイルをインポートするには、証明書リポジトリにアクセスする必要があります。証明書リポジトリにアクセスするには、プライベートリポジトリにアクセスまたは読み取り専用のスコープを持つパーソナルアクセストークンを生成することができます。
次の手順で、GitHubに移動してください。 設定 → 開発者設定 → パーソナルアクセストークン → Generate New Token スコープを選択して、作成ボタンをクリック repo パーソナルアクセストークンを作成 Generate token.

環境変数 GIT_TOKEN.
Then replace your match file generated in Fastlane folder by Matchfile
CERTIFICATE_STORE_URL = ENV["CERTIFICATE_STORE_URL"]
GIT_USERNAME = ENV["GIT_USERNAME"]
GIT_TOKEN = ENV["GIT_TOKEN"]
FASTLANE_APPLE_ID = ENV["FASTLANE_APPLE_ID"]
git_url(CERTIFICATE_STORE_URL)
storage_mode("git")
type("appstore")
git_basic_authorization(Base64.strict_encode64("#{GIT_USERNAME}:#{GIT_TOKEN}"))
username(FASTLANE_APPLE_ID)
This will be used by GitHub Actions to import the certificates and provisioning profiles. And var will be set in GitHub Secrets, instead of hard-coding them in the file.
ビルド処理
In GitHub Actions, CapgoでCI/CDワークフローを実行するのにかかる分数に基づいて、料金が請求されます。実際には、App Store Connectでビルドが処理されるのに約10~15分かかります。 プライベートプロジェクトの場合、ビルドあたりの推定コストは$0.08/分×15分=$1.2
、またはそれ以上、プロジェクトの構成または依存関係に応じて。 料金について私も同様に懸念している場合は、プライベートプロジェクトの場合、ビルドコストを抑えるためにCapgoを使用できます。何が問題か?ビルドが処理された後、ユーザーにビルドを配布するには、App Store Connectでアプリの準拠性を手動で更新する必要があります。
to skip_waiting_for_build_processing to true.
Build Processing
このパラメータは、プライベートプロジェクトのビルド時間を節約したい場合は、更新する必要があります。フリープロジェクトの場合は、問題ありません。 料金.
3. GitHub アクションの設定
GitHub シークレットの設定
値の元の場所を知りたいですか? それも簡単です – それはあなたのプロジェクトのシークレットです。 ENV __CAPGO_KEEP_0__ シークレットの設定

1. APP_STORE_CONNECT_TEAM_ID - App Store Connect にアクセスし、
2. DEVELOPER_APP_ID アプリ情報 → 下部の セクションに移動し、 General Information アプリの Apple ID.
3. DEVELOPER_APP_IDENTIFIER - アプリのバンドルIDです。
4. DEVELOPER_PORTAL_TEAM_ID - 複数のチームに所属している場合の、開発者ポータルチームのIDです。
5. FASTLANE_APPLE_ID - アプリを管理するために使用するApple IDまたは開発者メールアドレスです。
6. GIT_USERNAME & GIT_TOKEN - Gitのユーザー名とパーソナルアクセストークンを入力してください。
7. MATCH_PASSWORD - matchを初期化したときに割り当てたパスフレーズが、証明書とプロビジョニングプロファイルの暗号化に使用されます。
8. PROVISIONING_PROFILE_SPECIFIER - match AppStore <YOUR_APP_BUNDLE_IDENTIFIER>例えば match AppStore com.domain.blabla.demo.
9. TEMP_KEYCHAIN_USER & TEMP_KEYCHAIN_PASSWORD - ワークフロー用に一時的なキーチェーンユーザーとパスワードを割り当ててください。
10. APPLE_KEY_ID — App Store Connect API キー 🔺キーID。
11. APPLE_ISSUER_ID — App Store Connect API キー 🔺発行者ID。
12. APPLE_KEY_CONTENT — App Store Connect API キー 🔺キーファイルまたはキー内容。 .p8, それを確認してください
13. CERTIFICATE_STORE_URL — そのMatchキー用のリポジトリURL (例: https://github.com/***/fastlane_match.git)
4. GitHubワークフローファイルを設定する
GitHubワークフローディレクトリを作成します。
cd .github/workflows
そのフォルダの中で、ファイルを workflow 作成し、以下の内容を追加してください。 build-upload-ios.yml__CAPGO_KEEP_0__タグの後でこのワークフローがトリガーされるように設定してください。
name: Build source code on ios
on:
push:
tags:
- '*'
jobs:
build_ios:
runs-on: macOS-latest
steps:
- uses: actions/checkout@v6
- name: set Node.js
uses: actions/setup-node@v6
with:
node-version: '24'
cache: npm
- name: Install dependencies
id: install_code
run: npm ci
- name: Build
id: build_code
run: npm run build
- uses: actions/cache@v5
with:
path: ios/App/Pods
key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-pods-
- name: Sync
id: sync_code
run: npx cap sync
- uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7.2
- uses: maierj/fastlane-action@v2.3.0
env:
DEVELOPER_APP_IDENTIFIER: ${{ secrets.DEVELOPER_APP_IDENTIFIER }}
DEVELOPER_APP_ID: ${{ secrets.DEVELOPER_APP_ID }}
PROVISIONING_PROFILE_SPECIFIER: match AppStore ${{ secrets.DEVELOPER_APP_IDENTIFIER }}
TEMP_KEYCHAIN_USER: ${{ secrets.TEMP_KEYCHAIN_USER }}
TEMP_KEYCHAIN_PASSWORD: ${{ secrets.TEMP_KEYCHAIN_PASSWORD }}
APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }}
CERTIFICATE_STORE_URL: https://github.com/${{ secrets.CERTIFICATE_STORE_REPO }}.git
GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
GIT_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
FASTLANE_APPLE_ID: ${{ secrets.FASTLANE_APPLE_ID }}
MATCH_USERNAME: ${{ secrets.FASTLANE_APPLE_ID }}
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
APP_STORE_CONNECT_TEAM_ID: ${{ secrets.APP_STORE_CONNECT_TEAM_ID }}
DEVELOPER_PORTAL_TEAM_ID: ${{ secrets.DEVELOPER_PORTAL_TEAM_ID }}
with:
lane: closed_beta
- name: Upload release bundle
uses: actions/upload-artifact@v2
with:
name: ios-release
path: ./App.ipa
retention-days: 60
This workflow should be triggered after each GitHub 以下のリンクを参照してください。, if you need to automatize tag please, refer to 自動ビルドとリリースとGitHubアクション 最初に。
そのワークフローは、NodeJSの依存関係を取得し、インストールし、JavaScriptアプリケーションをビルドします。
毎回、新しいコミットを送信すると、テストフライトでリリースが作成されます。
アプリはIonicを使用する必要はありません。ただし、Capacitorベースは必須です。古いCordovaモジュールを含めることができますが、CapacitorJSプラグインを推奨します。
5. ワークフローをトリガーする
コミットを作成する
コミットを作成する コミットを作成します、リポジトリでアクティブなワークフローを確認できます。ワークフローをトリガーする
ブランチに新しいコミットをプッシュすると、ワークフローがアクティブになります。
Push the new commits to the branch main または development ワークフローをトリガーするには。

数分後、App Store Connect ダッシュボードでビルドが利用可能になります。

ローカルマシンからデプロイできる?
できます。簡単です。
プライベートリポジトリがあり、無料プランの分数を使用済みで、新しいリリースのために支払いたくない場合、またはアプリケーションを手動で提出したい場合など
それでは行きましょう
まず、ファイルを作成する必要があります。 my_project_path/fastlane ファイル名は .env, ローカルマシンからデプロイするための Fastfile, 同じ環境を作るために 秘密 _GitHub の中にある、以下のプロパティを取得します。
ローカルマシンからデプロイするための .env ファイル
今、 ターミナル から Fastlane を起動してください。
fastlane closed_beta
❌ 必要な情報について .env ファイルを、データを公開しないため、.gitignore , 例えば: ❌ローカルマシンで、リモートマシンで実行される__CAPGO_KEEP_0__ Actionsと同じように動作するようにする必要があります。
fastlane/*.env
It should work the same as it happens from GitHub Actions on the remote machine but in our local machine. 🍻

ここまで来たら、congratulations、Fastlaneと__CAPGO_KEEP_0__ Actionsを使用してiOSアプリの完全自動化プロセスを持っていることになります。
If you have come this far, my congratulations, now you have a fully automated process for your iOS apps with Fastlane and GitHub Actions.
このブログを改善するために、ご意見や質問がありましたら、メールでご連絡ください。 martin@capgo.app
デバイスでビルド
あなたのデバイスでビルドする必要がある場合は、手動でプロビジョニングに追加する必要があります。
デバイスをMacに接続し、デバイスメニューを開きます
次に、識別子をコピーします
そして、以下のコマンドを実行してください
fastlane register_new_device
デバイス名と識別子を設定するように求められます

問題が発生した場合
開発用デバイスでテストできないなど問題が発生した場合、通常はこれで解決します。
問題が発生した場合の魔法のコマンドがあります
fastlane match nuke development
fastlane match development
次に: Shift(⇧)+Command(⌘)を押しながらプロジェクトをクリーンするか、Product > Clean(クリーンビルドフォルダとラベル付けされている場合もあります)を選択します
次に、再びアプリをデバイスで実行してください
感謝
このブログは以下の記事に基づいています:
自動Capacitor IOSビルドからGitHubアクションを使用してマッチ
あなたがCI/CD自動化を計画し、接続している場合 自動Capacitor IOSビルドからGitHubアクションを使用してマッチ __CAPGO_KEEP_0__ CI/CD Capgo CI/CDの製品ワークフロー Capgoネイティブビルド Capgo Native Builds 製品ワークフローにおけるCapgoネイティブビルドの Capgo統合 製品ワークフローにおけるCapgo統合の CI/CD統合 CI/CD統合の実装詳細、および GitHubアクション統合 実装詳細におけるGitHubアクション統合の