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

https://github.com/features/actions
__CAPGO_KEEP_0__は「無料」です制限値に応じて、選択したマシンに応じて料金が発生します CapgoではmacOSを使用します
__CAPGO_KEEP_0__は無料です __CAPGO_KEEP_0__は無料です スクリーンショットで確認できる価格と制限 (価格はこのチュートリアルの作成時点のものであり、将来の変更が可能です)
警告された要件と価格については、次に進みます。
注意: この投稿では、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
要件
FastlaneがApp Store Connect APIでアプリをアップロードできるようにするには、以下の情報を提供する必要があります。 3つの もの:
- 発行者ID
- キーID
- キーファイルまたはキー内容
App Store Connect API キーの取得
キーを生成するには、App Store ConnectでAdminの権限が必要です。権限がない場合は、この記事を参照してください。
-
Log in to App Store Connect.
-
Select ユーザーとアクセス.

3 — インテグレーションタブを選択します。

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

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

6 — アクセス下で、キーに対してロールを選択してください。キーに対するロールは、チームのユーザーに対するロールと同じです。 ロールの権限. 以下の選択を推奨します アプリマネージャ.
- Generate をクリックしてください。
特定のアプリにアクセスを制限することはできない API キーの場合
ページに表示されるのは、新しいキーの名前、キーアイデンティティ、ダウンロードリンク、その他の情報です

必要なすべての情報をここから取得できます
<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、発行者 ID が JWT トークンを作成するために必要です。Fastlane に情報を渡す方法は複数ありますが、Fastlane の新しいアクションを使用しました。 app_store_connect_api_keyFastlane ドキュメントを参照してください。 Fastlane ドキュメントを参照してください。CI で最も多く使用できる方法を使用するため、環境変数を設定する方法が最も簡単だと思います。
ダウンロードした p8 ファイルを Base64 に変換して、シークレットとして保存してください。APPLE_KEY_CONTENT).
base64 -i APPLE_KEY_CONTENT.p8 | pbcopy
Fastlane を使用して App Store Connect を管理することができます。API キーを使用して素晴らしいことになります!
2. 証明書
XCode を開いて、 設定 > アカウント > Apple ID > チーム チームを選択してください。

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

すると、キーチェーンにアクセスして証明書をダウンロードする必要があります。 .p12 ファイルとして。
証明書をダウンロードするには、キーチェーンにアクセスし、ログイン キーチェーンに切り替え、次にタブ My Certificates My Certificates.

と右クリックして証明書のプライベートキーを選択します。
select エクスポート.
ファイル形式を選択してください パーソナル情報交換 (.p12).
ファイルとしての証明書をダウンロードします。 .p12 ファイルを開いて、以下のコマンドを使用してBase64に変換してください。
これがあなたの
base64 -i BUILD_CERTIFICATE.p12 | pbcopy
シークレットです。 また、証明書のパスワードを尋ねられた場合、パスワードをあなたの BUILD_CERTIFICATE_BASE64 シークレットとして提供してください。 P12_PASSWORD 3. プロビジョニング プロファイル
開く
Apple Developer Apple Developer と適切なチームを選択してください。
次に、プロファイルを作成するには、 +

と選択 App Store Connect.

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

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

最後に、プロファイルの名前を入力してください 生成.
この名前は、Fastlaneのプロファイルの識別に使用されます。
APPLE_PROFILE_NAME.

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

Base64に変換し、シークレットとして保存してください (BUILD_PROVISION_PROFILE_BASE64).
base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy
4. Fastlaneファイルをコピー
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.*、および 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 APP_STORE_CONNECT_TEAM_IDを取得します .gitignore ローカルファイルは必要ありません。ローカルでFastlaneを実行したりテストしたりする場合にのみ必要です。
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=
ローカルテストの場合、
Go to 開発者センター と下にスクロールして Membership details セクションまで。
Team ID は APP_STORE_CONNECT_TEAM_ID に設定する必要がある値です。
app-store-connect-team-id
- BUNDLE_IDENTIFIERを取得する
- Open Xcode
Appダブルクリックして - プロジェクトナビゲータで表示される
Signing and Capabilities - 値をコピーしてください。
Bundle identifierこの値は、BUNDLE_IDENTIFIERシークレット。
6. ビルド処理
In GitHub Actions, CI/CDワークフローを実行するのにかかる分数に基づいて請求されます。私の経験によると、App Store Connectでビルドが処理されるまでに約10~15分かかります。 プライベートプロジェクトのビルドの予定コストは、
$0.08/分 x 15 分 = $1.2 、またはそれ以上、プロジェクトの構成と依存関係に応じて、コストに心配な場合は、プライベートプロジェクトの場合、
コストを設定できます。 skip_waiting_for_build_processing を true. この設定を有効にすることで、App Store Connect のビルド処理を待つ時間を節約できます。
ただし、代わりにアプリの適合性情報を App Store Connect に手動で更新する必要があります。そうすることで、ユーザーにビルドを配布することができます。
この最適化は、ビルド時間が金銭的コストを掛けるプライベートプロジェクト向けに主に有効です。ビルド時間が無料のパブリック/フリープロジェクトでは、この設定を有効にする必要はありません。詳しくは GitHub の "料金" ページを参照してください。 7. __CAPGO_KEEP_0__ の設定 __CAPGO_KEEP_0__ の設定を構成する
GitHub のシークレットをコピーし、GitHub リポジトリのシークレットに貼り付けます。
Configure GitHub secrets
設定 .env GitHub
__CAPGO_KEEP_0__ __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 🔺Key ID.
6. APPLE_ISSUER_ID — App Store Connect API Key 🔺Issuer ID.
7. APPLE_KEY_CONTENT — App Store Connect API Key 🔺 Key content of .p8, check it
8. GitHub workflowファイルを設定する
GitHubワークフローディレクトリを作成する
cd .github/workflows
Inside the 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タグ後にトリガーされる必要がある 自動化されたタグの設定については、Automatic build and release with __CAPGO_KEEP_0__ actionsを参照してください。 Automatic build and release with GitHub actionsを参照してください。 first.
Then this workflow will pull your NodeJS deps, install them and build your JavaScript app.
Each time you send a new commit, a release will be built in TestFlight.
Your App doesn’t need to use Ionic, only Capacitor base is mandatory., it can have old Cordova module, but Capacitor JS plugin should be preferred.
8.
Create a Commit
Make a commit, you should see the active workflow in the repository.
Trigger the workflow
Push the new commits to the branch main or development ワークフローをトリガーする。

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

9. ローカルマシンからデプロイすることはできますか?
はい、簡単です。
Xcodeを使用してアプリをビルドおよび署名することができます。
関連記事
CI/CD設定ガイド
- 自動Capacitor Android ビルドとGitHub Actions - Android CI/CD設定の完了
- 自動ビルドおよびリリースとGitHub Actions - CI/CD_PIPELINE_TUTORIAL
- GitHub DevProd Buildsを管理する - 環境管理
- Capacitor iOS自動ビルド - Fastlane Matchを使用した代替
CI/CDプラットフォームの代替
- GitLab CIでビルド - GitLabの代替
- CodeMagicでビルド - CodeMagicのセットアップガイド
ライブ更新とデプロイ
- Capgo ライブ更新ドキュメント - アプリにOTA更新を追加する
- CI/CD統合 with Capgo - パイプラインにリアルタイム更新を統合する
ありがとうございます
このブログは以下の記事に基づいています:
自動Capacitor IOS ビルドからGitHubアクションと証明書を使用して続行する
あなたが使用している場合 自動Capacitor IOS ビルドからGitHubアクションと証明書を使用して続行する CI/CD自動化の計画を行うには、 Capgo CI/CD Capgo CI/CDの製品ワークフロー Capgoネイティブビルド Capgoネイティブビルドの製品ワークフロー Capgo統合 Capgo統合の製品ワークフロー CI/CD統合 CI/CD統合の実装詳細 GitHubアクション統合 GitHubアクション統合の実装詳細