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

https://github.com/features/actions
macOSを使用します。開発用マシン インストール
メンバー プログラム スクリーンショットで確認できる価格と制限 (価格はこのチュートリアルの作成時点のものであり、将来の変更が可能)
要件と価格について注意した後、続きましょう。
注: この投稿では、App Store Connectでアプリを作成していることを前提としています。重要な情報はFastlaneによってコピーされます。
このチュートリアルで学ぶこと
この投稿で従う手順
- App Store Connect APIとFastlaneの使用
- 要件:
- App Store Connect API キーの作成
- App Store Connect API キーの使用
- 要件:
- Fastlaneファイルのコピー
- GitHub アクションの設定
1. App Store Connect APIとFastlaneの使用
2021年2月以降、すべてのユーザーはApp Store Connectにサインインするために2要素認証または2段階認証が必要です。このApple IDの追加セキュリティ層により、自分のアカウントにアクセスできるのはあなただけであることを保証します。
From Apple Support
Requirements
In order for Fastlane to be able to use App Store Connect API to upload your app, you need to provide the following three things:
- Issuer ID
- Key ID
- Key file or Key content
App Store ConnectのAPIキーを取得する
キーを生成するには、App Store ConnectでAdminの権限が必要です。権限がなければ、この記事を参照してください。
-
ログイン App Store Connect.
-
選択 ユーザーとアクセス.

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

- Click Generate API Key or the Add (+) button.

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

6 — アクセス下で、キーに対してロールを選択してください。キーに対するロールは、チームのユーザーに対するロールと同じです。 役割の権限選択することをお勧めします。 アプリケーション管理者.
- 「生成」をクリックしてください。
API キーのアクセスは、特定のアプリに制限できません。
新しいキーの名前、キーアイデンティティ、ダウンロードリンク、他に関する情報がページに表示されます。

ここから、必要な3つの情報をすべて取得できます。
<1> Issue ID. (APPLE_ISSUER_ID 秘密
<2> Key ID. (APPLE_KEY_ID 秘密
<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 は、承認用 JWT トークンを作成するために必要です。この情報を Fastlane に渡す方法は複数あります。私は、Fastlane の新しいアクションを使用することを選択しました。 app_store_connect_api_keyFastlane のドキュメントを参照してください。 この方法を紹介したのは、CI で最もよく使用できるようにするためです。環境変数を設定できます。ダウンロードした p8 ファイルを Base64 に変換して、シークレットとして保存してください。
Fastlane を使用して App Store Connect を管理することができます。__CAPGO_KEEP_0__ キーはすごいですね!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!
XCode を開き、設定を参照してください。
__CAPGO_KEEP_0__ __CAPGO_KEEP_1__ > アカウント > Apple ID > チーム チームを選択してください。

クリックしてください 証明書を管理.
証明書を作成していない場合は、新しい証明書を作成できます。
クリックしてください + と選択 Apple Distribution

次に、キーチェーンに移動して証明書をダウンロードする必要があります。 .p12 __CAPGO_KEEP_0__。
これを行うには、キーチェーンに移動し、ログインキーチェーンに切り替え、次にタブ My Certificates My Certificates 次に、ダウンロードしたい証明書を選択できます。(証明書の日付で検索してください).

Export
ファイル形式を選択してください Personal Information Exchange (.p12).
Choose the file format Personal Information Exchange (.p12).
ファイルとしてダウンロードされます。 .p12 ファイル。
このコマンドを使用して、Base64に変換します。
base64 -i BUILD_CERTIFICATE.p12 | pbcopy
__CAPGO_KEEP_0__ BUILD_CERTIFICATE_BASE64 秘密のことです。 また、証明書のパスワードを尋ねられた場合、パスワードを提供してください。このパスワードは__CAPGO_KEEP_0__です。 P12_PASSWORD __CAPGO_KEEP_1__
3. プロビジョニング プロファイル
Open Apple Developer 適切なチームを選択してください。
新しいプロファイルを作成するには、 +

と選択 App Store Connect.

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

前に作成した証明書を選択してください (有効期限の日付を確認してください。今日の日付と月を同じにする必要があります) そして 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は、次のステップで設定するリポジトリシークレットを使用します。ローカルファイルは必要ありませんが、ローカルマシンからFastlaneを実行したりテストしたりしたい場合は必要になります。 .env ローカルテストの場合、
ローカルファイルの <project-root>/fastlane/.env に作成してください。コミットしないでください。 Fastfileに追加してください。最初のファイル (または既に無視されていることを確認)。 fastlane/.env ローカルファイルの例: .gitignore APP_STORE_CONNECT_TEAM_IDの取得
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=
Developer Center
にアクセスし、下部までスクロールしてください。 Getting the APP_STORE_CONNECT_TEAM_ID Go to Membership details セクション。
Team ID は、設定する必要がある値です。 APP_STORE_CONNECT_TEAM_ID シークレット。
BUNDLE_IDENTIFIERを取得する
- 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がビルドを処理するのを待たずに、ビルドの分数を節約できます。
ただし、代償として、 skip_waiting_for_build_processing を手動で更新する必要があります。 true__CAPGO_KEEP_0__
__CAPGO_KEEP_0__
この最適化は、ビルド時間のコストが発生するプライベートプロジェクトで主に役立ちます。 公開/無料プロジェクトの場合、ビルド時間は無料なので、この設定を有効にする必要はありません。 GitHubの 料金ページ を参照してください。
7. GitHubアクションの設定
GitHubシークレットの設定
ファイルからシークレットをコピーし、__CAPGO_KEEP_0__リポジトリのシークレットに貼り付けます。 .env file and paste them into the GitHub repository secrets.
設定 シークレットと変数 > アクション > 新しいリポジトリシークレット > pricing page
2. BUILD_CERTIFICATE_BASE64 - Base64でエンコードされた証明書。
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 ワークフロー ファイルを設定する
Create a GitHub workflow directory.
cd .github/workflows
その内部 workflow フォルダを作成し、ファイル名を build-upload-ios.yml以下を追加してください。
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モジュールを含めることができますが、CapacitorJSプラグインを優先することをお勧めします。
8. ワークフローをトリガーする
コミットを作成する
アプリを コミット、リポジトリ内でアクティブなワークフローを確認できます。
ワークフローをトリガー
ブランチに新しいコミットをプッシュ main または development ワークフローをトリガー

数分後、アプリストアコネクトダッシュボードにビルドが利用可能になります。

9. ローカルマシンからデプロイすることはできますか?
はい、簡単です。
Xcodeを使用してアプリをビルドおよび署名することができます。
関連記事
CI/CDセットアップガイド
- 自動Capacitor AndroidビルドとGitHubアクション - Android CI/CDセットアップの完了
- 自動ビルドとリリースとGitHubアクション - CI/CDパイプラインのフルチュートリアル
- GitHubアクションを使用して開発とプロダクションビルドを管理する - 環境管理
- 自動Capacitor iOSビルドとMatch - Fastlane Matchを使用した代替
代替CI/CDプラットフォーム
- GitLab CIでビルド - GitLab代替
- CodeMagicでビルド - CodeMagic設定ガイド
ライブ更新とデプロイ
- Capgo ライブ更新ドキュメント - アプリにOTA更新を追加
- CI/CD統合 with Capgo - パイプラインにライブ更新を統合
感謝
このブログは以下の記事に基づいています: