GitHub Actionsを使用した自動iOSビルド
Capacitor アプリのCI/CD設定は複雑で時間がかかることがあります。ここでは、必要なことを知っておくべきことを説明します。
新しいビルドの推奨: Capgo ビルドを使用する
現在、__CAPGO_KEEP_0__ ビルドを使用することをお勧めしています Capgo Build with the Capgo CLI native Capacitor builds 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
Capgo Capgo Build Fastlane Match
- Capgo Build: Trigger Capgo Build from GitHub Actions, GitLab CI, Jenkins, or local scripts after your web build and
npx cap sync. - Capgo BuildCapgo Build
- Capgo Build: Capgo Buildは、macOSランナーやXcodeイメージ、Fastlane、Matchリポジトリの管理を必要とせずに、維持されたAppleビルド環境を提供します。
- アーティファクトと提出: QA用に署名済みアーティファクトをダウンロードしたり、リリースビルドをCapgo CLI経由で提出することができます。
価格
- Capgo プランは月額$12で開始されます。
- OTA更新と約15件のネイティブビルドが含まれます。
- 追加のビルド分数はクレジットを通じて1分あたり料金で請求されます。
マニュアルセットアップガイド
ここで行う必要があります:
iOS向けの継続的デリバリーをFastlaneとGitHub アクションを使用して実行する
前提条件
チュートリアルを続ける前に…
- Fastlaneが開発環境にインストールされていることを確認してください。 インストール 開発マシン上に
- iOS開発者プログラムの会員資格
- 読むのが楽しみです…
- 多くの開発者がチームで働いている場合、より簡単なワークフローを実現するために fastlane cert を使用することをお勧めします。
価格についての重要な点

https://github.com/features/actions
サービスは ‘無料’ までの制限に応じて、選択したマシンに依存します。
次に、 macOS マシンを使用します。スクリーンショットに表示されている価格と制限(チュートリアルの作成時点での価格、将来の変更が可能です)を確認できます。
🔴 要件と価格について警告された後、好きなように続けます。
📣 この記事では、iTunes Connectでアプリを作成し、Appleのエコシステムの証明書を持っていることを前提としています。Fastlaneによってすべてがコピーされます。
では、始めましょう!
この記事で参照する手順
- App Store Connect API を使用してFastlane Match
- 要件
- App Store Connect API キーを作成する
- App Store Connect API キーを使用する
- ファイルをコピー
- Fastlane matchを設定
1. App Store Connect APIとFastlane Matchを使用する
2021年2月以降、すべてのユーザーがApp Store Connectにサインインするには、2要素認証または2段階認証が必要になります。Apple IDの追加セキュリティ層により、自分のアカウントにアクセスできるのはあなただけであることを保証します。
From Apple Support
matchを始めるには、既存の証明書を取り消す必要があります。心配する必要はありません。新しい証明書は直接取得できます。
要件
App Store Connect APIを使用するには、Fastlaneには 3 必要なもの
- 発行者ID
- Key ID.
- Key file or Key content.
App Store Connect API のキーを作成する
App Store Connect の Admin 権限が必要です。権限がない場合は、この記事を参照し、以下の手順に従ってください。
1 — App Store Connect にログインする App Store Connect.
2 — "ユーザーとアクセス"を選択する App Store Connect ユーザー アクセス.

App Store Connect __CAPGO_KEEP_0__ 統合

4 — API キーを生成するか、(+)ボタンをクリックする

5 — __CAPGO_KEEP_0__の名前を入力してください。__CAPGO_KEEP_0__はあなた自身の記録用であり、__CAPGO_KEEP_0__自体とは関係ありません。

6 — アクセスセクションで、__CAPGO_KEEP_0__のロールを選択してください。__CAPGO_KEEP_0__のロールは、チームのユーザーに適用されるロールと同じです。詳しくは role permissionsをご覧ください。__CAPGO_KEEP_0__のロールを App manager.
に設定することをお勧めします。
An API key’s access cannot be limited to specific apps.
__CAPGO_KEEP_0__のアクセスは特定のアプリに制限できません。

App Store Connect download keys
<1> 問題 ID.
<2> キー ID.
<3> “API キーをダウンロード” をクリックして、API プライベート キーをダウンロードしてください。ダウンロード リンクは、プライベート キーがまだダウンロードされていない場合にのみ表示されます。Apple はプライベート キーを保持していないため、ダウンロードすることができます。
🔴 プライベート キーを安全な場所に保存してください。キーを共有しないでください、キーを code リポジトリに保存しないでください、またはクライアントサイドの code にキーを含めないでください。
App Store Connect API キーを使用する
API キー ファイル(ダウンロードした p8 ファイル)、キー ID、発行者 IDが必要です。これらの情報を Fastlane に入力する方法は複数あります。 app_store_connect_api_keyFastlane ドキュメントを参照してください。 この方法を紹介するのは、CI で最も多くの場合に簡単に動作するように思えるためです。Fastlane を App Store Connect __CAPGO_KEEP_0__ キーで管理できるようになりました!
Now we can manage Fastlane with the App Store Connect API key, great!
Fastlane は、Android Studio を使用してモバイル開発タスクを自動化するための Ruby ライブラリです。Fastlane を使用すると、カスタムの「レーン」を構成できます。これらのレーンには、通常 Android Studio を使用して実行する「アクション」が含まれます。Fastlane を使用すると、Android Studio を使用して実行するタスクの多くを実行できますが、このチュートリアルでは、Fastlane のコアアクションの少数を使用します。
Fastlane は、Android Studio を使用してモバイル開発タスクを自動化するための Ruby ライブラリです。Fastlane を使用すると、カスタムの「レーン」を構成できます。これらのレーンには、通常 Android Studio を使用して実行する「アクション」が含まれます。Fastlane を使用すると、Android Studio を使用して実行するタスクの多くを実行できますが、このチュートリアルでは、Fastlane のコアアクションの少数を使用します。
プロジェクトのルートにFastlaneフォルダを作成し、以下のファイルをコピーしてください: Fastfile
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
Appfile
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"])
Fastlaneを設定する
Fastlane match iOSのcode署名の新しいアプローチです。Fastlane matchは、iOSアプリの必要な証明書とプロビジョニングプロファイルをチームが管理するのを簡単にします。
iOSアプリ用のプライベートリポジトリを作成する certificates例えば、GitHubの個人アカウントまたは組織で
iOSアプリ用のFastlane matchを初期化する
fastlane match init
次に、Git Storageのオプション#1を選択する
[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___CAPGO_KEEP_0__の証明書リポジトリの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と必要な権限で問題が発生した場合、 この 投稿
でgitの認証トークンを生成するのに役立ちます。

App Store Connect証明書 project Xcodeで、リリース構成のアプリのプロビジョニングプロファイルを更新してください。

注意事項をいくつか 💡
MATCH
CI/CDが証明書とプロビジョニングプロファイルをインポートするには、証明書リポジトリにアクセスする必要があります。 これを行うには、プライベートリポジトリにアクセスまたは読み取り可能なスコープを持つ個人アクセストークンを生成する必要があります (これは使用する前に生成する必要があります)。
GitHubに移動してください 設定 → 開発者設定 → 個人アクセストークン →クリック Generate New Token →プライベートリポジトリにアクセスまたは読み取り可能なスコープを選択してください → すると、 repo スコープ → すると、 Generate token.

__CAPGO_KEEP_0__で生成されたパーソナル アクセス トークンのコピーを用意してください。後で環境変数として使用します。 GIT_TOKEN.
次に、Fastlaneフォルダ内の生成されたマッチファイルを置き換えます 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)
GitHub Actionsで証明書とプロビジョニング プロファイルをインポートするのに使用されます。 また、GitHub Secretsでvarが設定され、ファイルにハードコードされないようにします。
ビルド処理
GitHub Actionsで 実行時間に基づいて課金されます。CI/CD ワークフローを実行するのにかかる分数に基づいて課金されます。App Store Connectでビルドが処理されるまでに約10-15分かかります。 プライベート プロジェクトの場合、ビルドあたりの推定コストは
$0.08/分 x 15分 = $1.2 、または、プロジェクトの構成または依存関係に応じて、より多くかかります。プライベート プロジェクトの価格設定に関する懸念を共有する場合は、コストを抑えるために
を維持できます。 skip_waiting_for_build_processing to true.
What's the catch? You have to manually update the compliance of your app in App Store Connect after the build has been processed, for you to distribute the build to your users.
This is just an optional parameter to update if you want to save on the build minutes for private projects. For free projects, this shouldn't be a problem at all. See pricing.
3. Setup GitHub Actions
Configure GitHub secrets
Ever wonder where the values of the ENV are coming from? Well, it's not a secret anymore – it's from your project's secret.

1. APP_STORE_CONNECT_TEAM_ID - App Store Connect チームのID
2. DEVELOPER_APP_ID - App Store Connect からアプリを選択し、 App Information → アプリの General Information セクションにスクロールし、 Apple ID.
3. DEVELOPER_APP_IDENTIFIER - アプリのバンドル識別子を探してください。
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 Key
12. APPLE_KEY_CONTENT — App Store Connect API Key — App Store Connect , —
13. CERTIFICATE_STORE_URL — https://github.com/***/fastlane_match.git)
4. Configure GitHub workflow file
Create a GitHub workflow directory.
cd .github/workflows
Inside the workflow folder, create a file named build-upload-ios.ymlThis workflow should be triggered after each
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 タグ, 自動化されたタグ作成が必要な場合は、 自動ビルドとリリースのための GitHub アクション 最初に。
その後、このワークフローはNode.jsの依存関係を取得し、JavaScriptアプリをビルドします。
毎回コミットを送信すると、テストフライトでリリースが作成されます。
アプリはIonicを使用する必要はありません。ただし、Capacitor ベースは必須です。古いCordovaモジュールを使用することもできますが、Capacitor JS プラグインを使用することを推奨します。
5. ワークフローをトリガーする
コミットを作成する
コミットを作成する , リポジトリでアクティブなワークフローを確認できます。5. Trigger workflow
ワークフローをトリガーする
新しいコミットをブランチにプッシュする main または development ワークフローをトリガーする。

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

ローカルマシンからデプロイできる?
はい、簡単です。
想像してみてください。プライベート リポジトリがあり、無料プランの分数を使用済みで、新しいリリースのために支払いたくない、またはアプリケーションを手動で提出したいと考えています。
それでは行きましょう
はい、まずCapgoでプロジェクトを作成する必要があります my_project_path/fastlane path a file called .env、 just in the same path as Fastfile、 to be able to create the same 秘密 プロパティが_GitHubのa_sに記載されているように
.envファイルをローカルマシンからデプロイするために
Now, you can go to the ターミナル と実行する Fastlane __CAPGO_KEEP_0__からマシン:
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. 🍻

ここまで来たら、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(⌘) を押しながら K を押すか、Product > Clean (Clean Build Folder とラベル付けされている場合) を選択します。
次に、デバイス上でアプリを再度実行してみてください。
ありがとうございます。
このブログは以下の記事に基づいています:
- Continuous delivery for IOS using Fastlane and GitHub actions
- Fastlane ドキュメント
- This GitHub message from @mrogunlana
Keep going from Automatic Capacitor IOS build with GitHub actions using match
CI/CD 自動化を計画している場合は、CI/CD に接続してください。 Automatic Capacitor IOS build with GitHub actions using match CI/CD 自動化を計画している場合は、CI/CD に接続してください。 Capgo CI/CD 製品ワークフローにおけるCapgo CI/CDのために Capgoネイティブビルド 製品ワークフローにおけるCapgoネイティブビルドのために Capgo統合 製品ワークフローにおけるCapgo統合のために CI/CD統合 CI/CD統合の実装詳細について GitHubアクション統合の実装詳細 for the implementation detail in GitHub Actions Integration.