Capacitor アプリのCI/CD設定は複雑で時間がかかることがあります。ここでは、必要なことを知っておくべきことを説明します。
新しいビルドの推奨: Capgo ビルドを使用
__CAPGO_KEEP_0__ ビルドを使用することをお勧めします。 Capgo ビルドと Capgo CLI ネイティブ Capacitor ビルドのために このFastlaneガイドは、既存の GitHub Actionsパイプラインを維持しているチーム向けに残されていますが、新しいiOSビルドの場合は、 Capgo CLI を使用するようにして、Fastlane、Xcodeランナー、証明書、アップロードスクリプトを自分で維持する必要がなくなります。
Capgo Build for CI/CD by Capgo
CI/CDの自動化をスキップする Capgo Build __CAPGO_KEEP_0__ Buildは、既存のCI/CDパイプラインからiOSの署名されたネイティブビルドを実行します。
- __CAPGO_KEEP_0__ Buildは、パイプラインと連携して動作します。: Capgo Buildは、Webビルド後にGitHub Actions、GitLab CI、Jenkins、またはローカルスクリプトからトリガーされます。
npx cap sync. - : CIシークレットから署名: App Store Connectのキー、証明書、プロビジョニングプロファイル、パスワード、チームIDをCIシークレットに保持します。
- : __CAPGO_KEEP_0__ Buildは、macOSランナー、Xcodeイメージ、Fastlaneのレーンの管理を提供するため、ネイティブランナーの管理をスキップできます。: Capgo Buildは、署名されたアーティファクトをダウンロードしたり、Capgo __CAPGO_KEEP_1__を通じてリリースビルドを提出できます。
- __CAPGO_KEEP_0__ __CAPGO_KEEP_1__Capgo CLI
料金
- Capgo プランは月額 12 ドルから
- __CAPGO_KEEP_0__ プランでは、月に約 15 回のネイティブ ビルドと OTA 更新が含まれます。
- __CAPGO_KEEP_0__ プランでは、余分なビルド分数はクレジットを通じて 1 分あたり請求されます。
手動セットアップガイド
ここでは、必要な手順を説明します。
GitHub アクションと証明書を使用して、Fastlane と iOS の継続的デリバリー
チュートリアルに進む前に、以下の事項を確認してください。
__CAPGO_KEEP_0__ をインストールしてください。
- Fastlane インストール済み 開発用マシン上で。
- iOS開発者プログラムのメンバーであることを確認してください。
価格に関する重要な情報

https://github.com/features/actions
サービスは「無料」 制限まで、選択したマシンに応じて。
このチュートリアルで使用するのは「 macOS 」マシンです。スクリーンショットに表示されている価格と制限(価格はチュートリアルの作成時点のもので、将来の変更が可能です)を確認してください。
要件と価格についての注意を与えられたら、続けてください。
注意: この記事では、App Store Connectでアプリを作成していることを前提としています。重要な情報はFastlaneによってコピーされます。
このチュートリアルで学ぶこと
この記事で従う手順
- Using App Store Connect API with Fastlane
- 要件:
- Creating an App Store Connect API Key
- Using an App Store Connect API Key
- 要件:
- Fastlaneのファイルのコピー
- Configure GitHub Actions
1. Using App Store Connect API with Fastlane
2021年2月以降、すべてのユーザーがApp Store Connectにサインインするために2要素認証または2段階の検証が必要になります。この追加のセキュリティ層は、Apple IDのセキュリティを確保するために役立ちます。
From Apple Support
Requirements
App Store Connect API を使用してアプリをアップロードできるようにするには、以下の情報を提供する必要があります。 three 必要なもの:
- エアストエア
- アイストエア
- アイストエアに反たらにを読しだ
Obtaining an App Store Connect API Key
エアストエアを为だらとアイストエアを为だらとアイストエアに反たらにを読しだ
-
エアストエアを読しだらとアイストエアを为だらとアイストエアに反たらにを読しだ Log in to App Store Connect.
-
選択 ユーザーとアクセス.

3 — インテグレーション タブを選択してください。

- 「Generate API Key」または「+」ボタンをクリックしてください。

- __CAPGO_KEEP_0__ キーの名前を入力してください。名前はあなたの参考用であり、キー自体の部分ではありません。

6 — アクセス下で、キーに対するロールを選択してください。キーに対するロールは、チームのユーザーに対するロールと同じです。詳しくは ロールの権限をご覧ください。ロールを「」で選択することをお勧めします App manager.
- Click Generate.
APIのアクセスは特定のアプリに制限できません。
__CAPGO_KEEP_1__の名前、キーID、ダウンロードリンク、他情報がページに表示されます。

必要な3つの情報をすべてここから取得できます。
<1> Issue ID. (APPLE_ISSUER_ID secret)
<2> Key ID. (APPLE_KEY_ID secret)
<3> APIキーをダウンロードするには、「ダウンロードAPIキー」をクリックしてください。ダウンロードリンクは、プライベートキーがまだダウンロードされていない場合にのみ表示されます。Appleはプライベートキーを保管していないため、ダウンロードすることができます。
🔴 プライベートキーを安全な場所に保存してください。キーを共有しないでください、codeリポジトリにキーを保存しないでください、またはクライアントサイドのcodeにキーを含めないでください。
App Store ConnectのAPIキーを使用します。
API キー ファイル(ダウンロードしたp8ファイル)、キーアイデンティティ、発行者IDは、認証用のJWTトークンを作成するために必要です。この情報をFastlaneに渡す方法は複数あります。私はFastlaneの新しいアクションを使用しました。 app_store_connect_api_keyCIで最も多く使用されている方法を紹介します。Fastlaneのドキュメントを参照してください。 Fastlaneのドキュメントを参照してください。CIで最も多く使用されている方法を紹介します。Fastlaneのドキュメントを参照してください。
CIで最も多く使用されている方法を紹介します。Fastlaneのドキュメントを参照してください。APPLE_KEY_CONTENT).
base64 -i APPLE_KEY_CONTENT.p8 | pbcopy
Now we can manage the App Store Connect with Fastlane using the API key, great!
Fastlaneを使用してApp Store Connectを管理することができます。__CAPGO_KEEP_0__ キーを使用して、素晴らしいことです!
2. 証明書 XCodeを開き、設定>アカウント>Apple IDを選択してください。 > 設定 > アカウント > チーム とチームを選択してください。

Click on 証明書を管理.
証明書を作成していない場合は、証明書を作成できます。
Click on + と選択 Apple Distribution

次に、キーチェーンに移動して証明書をファイルとしてダウンロードする必要があります。 .p12 Then you need to go to keychain to download the certificate as a file.
To do so, you need to go to __CAPGO_KEEP_0__ and switch to the __CAPGO_KEEP_1__ login __CAPGO_KEEP_0__ My Certificates.

Then you can select the certificate you want to download. (Look by the date of the certificate)
And then right-click on the private key on the certificate and select Export.
Choose the file format Personal Information Exchange (.p12).
That will download the certificate as a __CAPGO_KEEP_2__. .p12 __CAPGO_KEEP_0__
端末でファイルを開いて、次のコマンドを使用してBase64に変換してください。
base64 -i BUILD_CERTIFICATE.p12 | pbcopy
これはあなたの BUILD_CERTIFICATE_BASE64 秘密です。 また、質問されたときは、証明書のパスワードをご提供ください。このパスワードはあなたの P12_PASSWORD 秘密です。
3. プロビジョニング プロファイル
開く Apple Developer と、適切なチームを選択してください。
次に、新しいプロファイルを作成するには、 +

をクリックしてください。 と、.

正しいアプリを選択してください。ワイルドカードを使用すると署名が失敗する可能性があるため、注意してください。

前に作成した正しい証明書を選択してください(有効期限の日付を確認してください。今日の日付と月と同じでなければなりません)そして Continue.

最後にプロファイルの名前を入力してくださいそして Generate.
プロファイルの名前はFastlaneの値の下でプロファイルを識別するために使用されます。
APPLE_PROFILE_NAME.

プロファイルをファイルとしてダウンロードすることができます。 .mobileprovision ファイル.

プロファイルをBase64に変換し、シークレットとして保存してください(BUILD_PROVISION_PROFILE_BASE64).
base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy
4. Fastlaneファイルをコピーする
Fastlaneは、Android開発の一般的なタスクを自動化するために作成されたRubyライブラリです。Fastlaneを使用すると、カスタムの「レーン」を構成できます。これらの「レーン」には、「アクション」が含まれます。これらの「アクション」は、通常Android Studioを使用して実行するタスクを実行します。Fastlaneを使用できますが、このチュートリアルの目的のために、このチュートリアルでは、Fastlaneのコアアクションのいくつかを使用します。
Create the Fastlane folder at the root of your Capacitor/Ionic project and add the Fastfile there:
- フォルダ:
<project-root>/fastlane/ - ファイル:
<project-root>/fastlane/Fastfile
このレベルは package.json, capacitor.config.*、と同じレベルです。 ios/ フォルダを作成しないでください。 ios/App/.
platform :ios do
desc 'Export ipa and submit to TestFlight'
lane :beta do
keychain_info = { keychain_name: "ios-build-#{Time.now.to_i}.keychain", keychain_password: SecureRandom.uuid }
begin
setup_signing(keychain_info)
bump_build_number
build_app_with_signing(keychain_info)
submit_to_testflight
ensure
cleanup_keychain(keychain_info)
end
end
private_lane :setup_signing do |options|
create_keychain(
name: options[:keychain_name],
password: options[:keychain_password],
unlock: true,
timeout: 0,
lock_when_sleeps: false,
add_to_search_list: true
)
import_cert(options)
install_profile
update_project_settings
end
lane :bump_build_number do
file = File.read('../package.json')
data_hash = JSON.parse(file)
api_key = app_store_connect_api_key(
key_id: ENV['APPLE_KEY_ID'],
issuer_id: ENV['APPLE_ISSUER_ID'],
key_content: ENV['APPLE_KEY_CONTENT'],
is_key_content_base64: true,
duration: 1200,
in_house: false
)
build_num = app_store_build_number(
api_key: api_key,
app_identifier: ENV['BUNDLE_IDENTIFIER'],
live: false
)
build_num = build_num + 1
UI.message("Bumped build number to #{build_num}")
increment_build_number(
build_number: build_num,
xcodeproj: "./ios/App/App.xcodeproj",
skip_info_plist: true
)
end
private_lane :import_cert do |options|
cert_path = "#{Dir.tmpdir}/build_certificate.p12"
File.write(cert_path, Base64.decode64(ENV['BUILD_CERTIFICATE_BASE64']))
import_certificate(
certificate_path: cert_path,
certificate_password: ENV['P12_PASSWORD'] || "",
keychain_name: options[:keychain_name],
keychain_password: options[:keychain_password],
log_output: true
)
File.delete(cert_path)
end
private_lane :cleanup_keychain do |options|
delete_keychain(
name: options[:keychain_name]
)
end
private_lane :install_profile do
profile_path = "#{Dir.tmpdir}/build_pp.mobileprovision"
File.write(profile_path, Base64.decode64(ENV['BUILD_PROVISION_PROFILE_BASE64']))
UI.user_error!("Failed to create provisioning profile at #{profile_path}") unless File.exist?(profile_path)
ENV['PROVISIONING_PROFILE_PATH'] = profile_path
install_provisioning_profile(path: profile_path)
File.delete(profile_path)
end
private_lane :update_project_settings do
update_code_signing_settings(
use_automatic_signing: false,
path: "./ios/App/App.xcodeproj",
code_sign_identity: "iPhone Distribution",
profile_name: ENV['APPLE_PROFILE_NAME'],
bundle_identifier: ENV['BUNDLE_IDENTIFIER'],
team_id: ENV['APP_STORE_CONNECT_TEAM_ID']
)
update_project_team(
path: "./ios/App/App.xcodeproj",
teamid: ENV['APP_STORE_CONNECT_TEAM_ID']
)
end
private_lane :build_app_with_signing do |options|
unlock_keychain(
path: options[:keychain_name],
password: options[:keychain_password],
set_default: false
)
build_app(
workspace: "./ios/App/App.xcworkspace",
scheme: "App",
configuration: "Release",
export_method: "app-store",
output_name: "App.ipa",
export_options: {
provisioningProfiles: {
ENV['BUNDLE_IDENTIFIER'] => ENV['APPLE_PROFILE_NAME']
}
},
xcargs: "-verbose",
buildlog_path: "./build_logs",
export_xcargs: "-allowProvisioningUpdates",
)
end
private_lane :submit_to_testflight do
api_key = app_store_connect_api_key(
key_id: ENV['APPLE_KEY_ID'],
issuer_id: ENV['APPLE_ISSUER_ID'],
key_content: ENV['APPLE_KEY_CONTENT'],
is_key_content_base64: true,
duration: 1200,
in_house: false
)
pilot(
api_key: api_key,
skip_waiting_for_build_processing: true,
skip_submission: true,
distribute_external: false,
notify_external_testers: false,
ipa: "./App.ipa"
)
end
end
5. シークレットの設定
GitHub Actions uses the repository secrets you configure in the next step. You only need a local .env ファイルをローカルマシン上で実行したい場合は、ファイルを作成してください。
ローカルテストの場合、 <project-root>/fastlane/.env ファイルを作成してください。ファイルはローカルマシン上で実行したい場合は、ファイルを作成してください。 Fastfileファイルを作成してください。ファイルはローカルマシン上で実行したい場合は、ファイルを作成してください。 fastlane/.env ファイルを作成してください。ファイルはローカルマシン上で実行したい場合は、ファイルを作成してください。 .gitignore ファイルを作成してください。ファイルはローカルマシン上で実行したい場合は、ファイルを作成してください。
APP_STORE_CONNECT_TEAM_ID=UVTJ336J2D
BUNDLE_IDENTIFIER=ee.forgr.testfastlane
# See previous section for these secrets
BUILD_CERTIFICATE_BASE64=
BUILD_PROVISION_PROFILE_BASE64=
APPLE_KEY_ID=
APPLE_ISSUER_ID=
APPLE_KEY_CONTENT=
P12_PASSWORD=
APPLE_PROFILE_NAME=
ファイルを作成してください。ファイルはローカルマシン上で実行したい場合は、ファイルを作成してください。
APP_STORE_CONNECT_TEAM_IDを取得する Developer Center セクションまでスクロールしてください。 Membership details 値は、以下のようになります。 Team ID ファイルを作成してください。ファイルはローカルマシン上で実行したい場合は、ファイルを作成してください。 APP_STORE_CONNECT_TEAM_ID 秘密。
アプリストア接続チームIDを取得する
- Xcodeを開く
- プロジェクトナビゲータでダブルクリック
Appプロジェクトナビゲータで - タブをクリック
Signing and Capabilities - プロジェクトナビゲータで
Bundle identifier値をコピーする。 この値は、BUNDLE_IDENTIFIER秘密。
6. ビルド処理
In GitHub Actions、 あなたはCI/CDワークフローの実行に費やした分数に基づいて請求されます。 私の経験によると、App Store Connectでビルドが処理されるまでに約10~15分かかります。 プライベートプロジェクトの場合、ビルドあたりの推定コストは$0.08/分×15分=$1.2、またはそれ以上になります。 依存関係やプロジェクトの構成に応じて、
コストの懸念がある場合は、を設定できます。 これにより、App Store Connectがビルドを処理するのを待たずにビルド分数を節約できます。 ただし、代償として、App Store Connectでアプリの法的情報を手動で更新する必要があります。 これにより、ユーザーにビルドを配布できるようになります。この最適化は、ビルド分数がコストがかかるプライベートプロジェクト向けに主に役立ちます。 公開/無料プロジェクトの場合、ビルド分数は無料なので、この設定を有効にする必要はありません。 __CAPGO_KEEP_0__の
価格設定ページを参照してください skip_waiting_for_build_processing pricing page trueIn __CAPGO_KEEP_0__ Actions、
you are billed based on the minutes
This optimization is mainly useful for private projects where build minutes cost money. For public/free projects, the build minutes are free so there’s no need to enable this setting. See GitHub’s For private projects, 詳細についてはこちらを参照してください。
7. GitHub の設定
GitHub のシークレットを設定
シークレットをファイルからコピーし、__CAPGO_KEEP_0__ リポジトリのシークレットに貼り付けます。 .env file and paste them into the GitHub repository secrets.
設定 シークレットと変数 > アクション > 新しいリポジトリシークレット > __CAPGO_KEEP_0__-シークレット
2. BUILD_CERTIFICATE_BASE64 __CAPGO_KEEP_0__-secrets
3. BUILD_PROVISION_PROFILE_BASE64 - Base64 エンコードされたプロビジョニング プロファイル。
4. BUNDLE_IDENTIFIER - アプリのバンドル ID。
5. APPLE_KEY_ID — App Store Connect API キー 🔺キー ID。
6. APPLE_ISSUER_ID — App Store Connect API キー 🔺発行者 ID。
7. APPLE_KEY_CONTENT — App Store Connect API キー 🔺キー コンテンツ。 .p8, 確認してください。
8. GitHub ワークフロー ファイルを構成します。
GitHub ワークフロー ディレクトリを作成します。
cd .github/workflows
フォルダの中に、ファイルを作成し、次の内容を追加してください。 workflow texts build-upload-ios.ymltexts
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: '3.0'
bundler-cache: true
- uses: maierj/fastlane-action@v3.1.0
env:
APP_STORE_CONNECT_TEAM_ID: ${{ secrets.APP_STORE_CONNECT_TEAM_ID }}
BUNDLE_IDENTIFIER: ${{ secrets.BUNDLE_IDENTIFIER }}
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }}
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
APPLE_PROFILE_NAME: ${{ secrets.APPLE_PROFILE_NAME }}
with:
lane: ios beta
- name: Upload release bundle
uses: actions/upload-artifact@v6
with:
name: ios-release
path: ./App.ipa
retention-days: 10
このワークフローは、各GitHubの後でトリガーされるべきです。 タグタグを自動化する必要がある場合は、 自動ビルドとリリースにGitHubアクションを使用します。 最初に。
このワークフローは、NodeJSの依存関係を取得し、JavaScriptアプリをインストールしてビルドします。
各コミットを送信するたびに、テストフライトでリリースが作成されます。
アプリはIonicを使用する必要はありません。ただし、Capacitorベースは必須です。古いCordovaモジュールを含むことができますが、Capacitor JS プラグインが推奨されます。
8. ワークフローをトリガーする
コミットを作成する
コミットを作成する 8. ワークフローをトリガーするリポジトリ内でアクティブなワークフローを確認できます。
ワークフローをトリガーする
ブランチに新しいコミットをプッシュする main または development ワークフローをトリガーするには

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

9. ローカルマシンからデプロイすることはできますか?
はい、できます。簡単です。
Xcode を使用してアプリをビルドおよび署名できます。いつもと同じです。
関連記事
CI/CD セットアップ ガイド
- 自動 Capacitor Android ビルドと GitHub Actions - Android CI/CD セットアップの完了
- 自動ビルドとリリースと GitHub Actions - CI/CD パイプラインのフルチュートリアル
- GitHub Actions で Dev と Prod ビルドを管理 - 環境管理
- 自動 Capacitor iOS ビルドと Match - Fastlane Match を使用した代替
代替 CI/CD プラットフォーム
- GitLab CI でビルド - GitLab の代替
- CodeMagicでビルド - CodeMagic設定ガイド
ライブ更新とデプロイ
- Capgoライブ更新ドキュメント - アプリにOTA更新を追加
- CI/CD統合とCapgo - パイプラインにライブ更新を統合
感謝
このブログは以下の記事に基づいています
自動 Capacitor IOS ビルドから、GitHub アクションと証明書で続けます。
自動 __CAPGO_KEEP_0__ IOS ビルドと __CAPGO_KEEP_1__ アクションと証明書を使用している場合 自動 Capacitor IOS ビルドと GitHub アクションと証明書を使用している場合 CI/CD オートメーションを計画するには、__CAPGO_KEEP_0__ CI/CD に接続します。 Capgo CI/CD の製品ワークフローで Capgo ネイティブ ビルドの製品ワークフローで Capgo インテグレーションの製品ワークフローで Capgo インテグレーションの製品ワークフローで Capgo Integrations CI/CD オートメーションを計画するには、Capgo CI/CD に接続します。 __CAPGO_KEEP_0__ CI/CD の製品ワークフローで CI/CD統合の実装詳細について GitHub アクション統合 for the implementation detail in GitHub Actions Integration.