CI/CDの設定は、Capacitorアプリケーションに複雑で時間のかかる作業です。ここでは、必要な情報をご紹介します。
推奨設定: Capgo ビルドを使用します。
__CAPGO_KEEP_0__ ビルドを使用することをお勧めします。 Capgo ビルドと Capgo CLI を使用します。 既存のCapacitor Actionsパイプラインを維持しているチーム向けに、このFastlaneガイドを残していますが、新しいiOSビルドの場合は、__CAPGO_KEEP_1__ __CAPGO_KEEP_2__ を使用することをお勧めします。これにより、Fastlane、Xcodeランナー、証明書、アップロードスクリプトの維持を自分で行う必要がなくなります。 This Fastlane 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, Xcode runners, certificates, and upload scripts yourself.
Capgo Build for CI/CD by Capgo
__CAPGO_KEEP_0__ ビルド Capgo ビルドは、既存のCI/CDパイプラインから署名されたネイティブiOSビルドを実行します。 既存のパイプラインと互換性があります。
- : __CAPGO_KEEP_0__ ビルドを __CAPGO_KEEP_1__ Actions、GitLab CI、Jenkins、またはローカルスクリプトから、Webビルド後にトリガーします。: Trigger Capgo Build from GitHub Actions, GitLab CI, Jenkins, or local scripts after your web build and
npx cap sync. - CIシークレットから署名: App Store Connectのキー、証明書、プロビジョニングプロファイル、パスワード、チームIDをCIシークレットに保存してください。
- : __CAPGO_KEEP_0__ ビルドは、macOSランナーやXcodeイメージ、Fastlaneのレーンの管理を必要とせず、維持されたAppleビルド環境を提供します。: Capgo __CAPGO_KEEP_1__ を使用して、署名済みアーティファクトをQAでダウンロードしたり、リリースビルドを提出したりできます。
- 価格: Download signed artifacts for QA or submit release builds through the Capgo CLI.
: OTA更新と約15回のネイティブビルドを含みます。
- Capgo plans start at $12/month
- __CAPGO_KEEP_0__ ビルドをCI/CDに設定
- 手動設定ガイド
ネイティブビルドの数は約15回/月です。
ここでは、実行する必要のあるものを紹介します。
FastlaneとGitHubアクション、証明書を使用したiOSの継続的デリバリー
前提条件
このチュートリアルに進む前に
- 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 Keyの作成
- App Store Connect API キーを使用する
- 要件:
- ファストレーンのファイルをコピーする
- GitHub アクションを設定する
1. App Store Connect API をファストレーンで使用する
2021年2月以降、すべてのユーザーがApp Store Connectにサインインするには、2要素認証または2段階認証が必要になります。Apple IDのセキュリティの追加レイヤーは、自分のアカウントにアクセスできるのは自分だけであることを保証するのに役立ちます。
From Apple Support
要件
ファストレーンがApp Store Connect API を使用してアプリをアップロードできるようにするには、以下のものが必要です。 3 もの:
- 発行者ID
- __CAPGO_KEEP_0__ ID
- __CAPGO_KEEP_0__ ファイルまたは __CAPGO_KEEP_0__ 内容
App Store Connect API キーの取得
App Store Connect __CAPGO_KEEP_0__ キーを生成するには、App Store Connect での Admin 権限が必要です。権限がない場合は、この記事を参照してもらうことをお勧めします。
-
ログイン App Store Connect.
-
選択 ユーザーとアクセス.

3 — インテグレーション タブの選択

- API キーを生成するか、または (+) ボタンをクリックしてください。

- キーを作成する際の名前を入力してください。名前はあなた自身の記録用であり、キー自体には含まれません。

6 — キーにアクセスする権限を選択してください。チームのメンバーに与えられる権限と同じ権限がキーに適用されます。詳しくは 役割の権限をご覧ください。 App Store Connect __CAPGO_KEEP_0__ keys create name.
- 権限を付与することをおすすめします。
An API key’s access cannot be limited to specific apps.
生成をクリックしてください。

新しいキー名、キーID、ダウンロードリンク、他に必要な情報が表示されます。
1. Issue ID. (APPLE_ISSUER_ID 秘密)
2. Key ID. (APPLE_KEY_ID 秘密)
3. "Download API Key" をクリックして、API プライベート キーをダウンロードします。プライベート キーがダウンロードされていない場合のみダウンロード リンクが表示されます。Apple はプライベート キーを保持していないため、ダウンロードは一度だけ行えます。
🔴 プライベート キーを安全な場所に保存してください。キーの共有は避け、code リポジトリにキーや、クライアントサイドの code にキーや含めることは避けましょう。
App Store Connect API Key の使用
API Key ファイル (ダウンロードした p8 ファイル)、キーアイデンティティ、発行者 ID は、承認用 JWT トークンの作成に必要です。この情報を Fastlane に渡す方法は複数あります。私は、環境変数を設定できる CI で最も簡単に動作する方法である Fastlane の新しいアクションを使用しました。 app_store_connect_api_keyFastlane ドキュメント を参照してください。 Fastlane のドキュメントを参照してください。ダウンロードした p8 ファイルを Base64 に変換して、秘密 (
secret)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!
2. 証明書
XCodeを開いて 設定 > アカウント > Apple ID > チーム とチームを選択してください。

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

次に、キーチェーンに移動して証明書をダウンロードするためのファイルを取得する必要があります。 .p12 これを行うには、キーチェーンに移動し、ログイン
キーチェーンに切り替え、次にタブ を選択してください してください My Certificates.

次に、ダウンロードしたい証明書を選択してください。 (証明書の日付で検索してください)
右クリックして証明書の秘密鍵を選択し、 エクスポート.
ファイル形式を選択 パーソナル インフォメーション エクスポート (.p12).
証明書をBase64形式の .p12 ファイルとしてダウンロードします。
ファイルを開いて、以下のコマンドを使用してBase64形式に変換してください。
base64 -i BUILD_CERTIFICATE.p12 | pbcopy
これがあなたの BUILD_CERTIFICATE_BASE64 シークレットになります。 また、証明書のパスワードを求められた場合、証明書のパスワードを入力してください。このパスワードはあなたの P12_PASSWORD 秘密。
3. 設定プロファイル
開く Apple Developer そして、適切なチームを選択してください。
次に、新しいプロファイルを作成するには、 +

そして、 App Store Connect.

次に、適切なアプリを選択する必要があります。注意してください。ワイルドカードを使用すると署名が失敗する可能性があります。

適切な証明書を選択してください (有効期限の日付は今日と同じ日と月でなければなりません)。 続行.

最後にプロファイルの名前を入力し、 生成.
プロファイルの名前はFastlaneの値の下でプロファイルを識別するために使用されます。
APPLE_PROFILE_NAME.

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

4. FastlaneファイルをコピーBUILD_PROVISION_PROFILE_BASE64).
base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy
4. Copy Fastlane files
Fastlaneは、Rubyライブラリで、モバイル開発の一般的なタスクを自動化するために作成されました。Fastlaneを使用すると、カスタムの「レーン」を構成できます。これは、Android Studioを使用してタスクを実行する代わりに、「アクション」シリーズをバンドルするものです。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.*、と同じです。フォルダを作成してください。CapgoプロジェクトのルートディレクトリにFastlaneフォルダを作成し、そこにFastfileを追加してください。 ios/ 5. シークレットの設定 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
Capgo Actionsは、次のステップで設定したリポジトリシークレットを使用します。ローカルファイルは必要ありません。ローカルでFastlaneを実行したりテストしたい場合は、ローカルファイルを作成してください。
GitHub Actions uses the repository secrets you configure in the next step. You only need a local .env フォルダ:
ファイル: <project-root>/fastlane/.env このレベルは Fastfile. Do not commit this file. Add fastlane/.env に追加しないでください .gitignore to your
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=
に追加する
first (or verify it is already ignored). Here is an example: 最初の (またはすでに無視されていることを確認してください)。 以下の例を参照してください。 Getting the APP_STORE_CONNECT_TEAM_ID Membership details APP_STORE_CONNECT_TEAM_IDを取得する Team ID Go to APP_STORE_CONNECT_TEAM_ID Developer Center
and scroll down to section. The is the value you need to set in the secret. app-store-connect-team-id Getting the BUNDLE_IDENTIFIER
- Xcodeを開く
- プロジェクトナビゲータでダブルクリック
Appプロジェクトナビゲータの - タブをクリック
Signing and Capabilities - 値をコピーする
Bundle identifierプロジェクトのBUNDLE_IDENTIFIERこの値を
bundle-identifier-xcode
In GitHub Actions, Actions 実行時間に基づいて課金されます。CI/CD ワークフローを実行するのに使用した分数に基づいて課金されます。私の経験によると、App Store Connectでビルドが処理されるまでに約10-15分かかります。
プライベートプロジェクトの場合、ビルドの予想コストは1分あたり$0.08 x 15分 = $1.2、またはそれ以上になります。 1分あたり$0.08 x 15分 = $1.2、または、プロジェクトの構成と依存関係に応じて、さらに多くかかります。
コストの懸念がある場合は、プライベートプロジェクトの場合にビルドのコストを節約できます。 skip_waiting_for_build_processing to true(Live Update Dynamic Label To)
ビルド時間を節約するには、App Store Connectの処理が完了するのを待たずにビルドを実行できます。
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 この最適化は、ビルド時間がコストのかかるプライベートプロジェクト向けに主に有効です。無料のプロジェクトの場合、ビルド時間は無料なので、この設定を有効にする必要はありません。詳しくは__CAPGO_KEEP_0__の (Native Build Builder Build Minutes)
7. Setup GitHub Actions
7. GitHubの設定
秘密をコピーして .env GitHubからファイルを
以下の__CAPGO_KEEP_0__ 設定 >> シークレットと変数 >> アクション >> 新しいリポジトリシークレット
2. BUILD_CERTIFICATE_BASE64 Base64エンコードされた証明書
3. BUILD_PROVISION_PROFILE_BASE64 - Base64 エンコードされたプロビジョニング プロファイル。
4. BUNDLE_IDENTIFIER - アプリのバンドル ID。
5. APPLE_KEY_ID — App Store Connect API キー 🔺Key ID。
6. APPLE_ISSUER_ID — App Store Connect API キー 🔺Issuer ID。
7. APPLE_KEY_CONTENT — App Store Connect API キー 🔺 キーの内容。 .p8, 確認してください。
8. GitHub ワークフロー ファイルを設定します。
GitHub ワークフロー ディレクトリを作成します。
cd .github/workflows
フォルダの中に、ファイルを作成し、以下を追加します。 workflow check it build-upload-ios.yml8. Configure __CAPGO_KEEP_0__ workflow file
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の後でトリガーされるべきです。 タグタグを自動化する必要がある場合は、 Automatic build and release with GitHub actions 最初に参照してください。
次に、このワークフローは、NodeJSの依存関係を取得し、インストールし、JavaScriptアプリをビルドします。
各コミットを送信するたびに、テストフライトでリリースが作成されます。
アプリはIonicを使用する必要はありません。ただし、Capacitorベースは必須です。古いCordovaモジュールを含めることができますが、Capacitor JS プラグインを推奨します。
8. ワークフローをトリガーする
コミットを作成する
コミットする 変更、リポジトリ内でアクティブなワークフローを確認します。
ワークフローをトリガーします。
ブランチに新しいコミットをプッシュします。 main または development Capacitorライブアップデートの代替手段を比較するページ。Capacitorライブアップデートの代替手段を比較するページ。

Capawesomeの比較ページ。Capawesomeの比較ページ。

Appflowの比較/移行マーケティングコピー。
ワークフローをトリガーします。
コミットで始めました。
数分後、App Store Connect ダッシュボードでビルドが利用可能になります。
CI/CD セットアップ ガイド
- Automatic Capacitor Android Build with GitHub Actions - Android CI/CD セットアップの完了
- Automatic Build and Release with GitHub Actions - CI/CD パイプラインの完全なチュートリアル
- Manage Dev and Prod Builds with GitHub Actions - 環境管理
- Capgo Actions を使用した自動 Capacitor iOS ビルド - Fastlane Match を使用した代替
代替 CI/CD プラットフォーム
- GitLab CI でビルド - GitLab の代替
- Capgoでビルド - CodeMagicの設定ガイド
ライブ更新 & デプロイ
- Capgo ライブ更新ドキュメント - アプリにOTA更新を追加する
- CI/CD統合 with Capgo - パイプラインにライブ更新を統合する
感謝
このブログは以下の記事に基づいています。
- Continuous delivery for IOS using Fastlane and GitHub actions
- Fastlaneドキュメント
- This GitHub message from @mrogunlana
- This GitHub documentation
Keep going from Automatic Capacitor IOS build with GitHub actions with certificate
あなたが使用している場合 Automatic Capacitor IOS build with GitHub actions with certificate CI/CD オートメーションを計画するには、__CAPGO_KEEP_0__ CI/CD Capgo CI/CD for the product workflow in Capgo CI/CD, Capgo Native Builds for the product workflow in Capgo Native Builds, Capgo Integrations for the product workflow in Capgo Integrations, CI/CD統合 CI/CD統合の実装詳細について GitHub Actions統合 for the implementation detail in GitHub Actions Integration.