CI/CDの設定はCapacitorアプリケーションに複雑で時間のかかる作業です。ここでは、必要な情報をご紹介します。
推奨設定: Capgo ビルドを使用します。
__CAPGO_KEEP_0__ ビルドを使用することをお勧めします。 Capgo ビルドとCapgo CLIを使用します。 既存のCapacitorアクションパイプラインを維持するチーム向けに、この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__ ビルドは、既存のCI/CDパイプラインから署名されたネイティブiOSビルドを実行します。 Capgo Build : __CAPGO_KEEP_0__ ビルドを__CAPGO_KEEP_1__アクション、GitLab CI、Jenkins、またはローカルスクリプトから、Webビルド後にトリガーしてください。
- __CAPGO_KEEP_0__: 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__ ビルドは管理されたAppleビルド環境を提供するため、macOSランナー、Xcodeイメージ、Fastlaneレーンの管理は不要です。: 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で設定
- 手動設定ガイド
__CAPGO_KEEP_0__
ここでは、行う必要のあることを説明します。
FastlaneとGitHubアクション、証明書を使用したiOSの継続的デリバリー
前提条件
このチュートリアルに進む前に
- Fastlaneが開発環境にインストールされていることを確認してください。 iOS開発者プログラムのメンバーであることを確認してください。 価格に関する重要な情報
- 価格: __CAPGO_KEEP_0__アクション
https://__CAPGO_KEEP_0__.com/features/actions

__CAPGO_KEEP_0__無料 制限まで、選択したマシンに応じて。
使用するのは 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のセキュリティの追加レイヤーは、自分のアカウントにアクセスできるのはあなただけであることを保証するため、Apple IDのセキュリティを強化します。
From Apple Support
要件
ファストレーンがApp Store Connect API を使用してアプリをアップロードできるようにするには、以下の3つの情報を提供する必要があります。 3 things:
- 発行者ID
- __CAPGO_KEEP_0__ ID
- __CAPGO_KEEP_0__ ファイルまたは __CAPGO_KEEP_0__ 内容
App Store Connect の API を取得する
App Store Connect の __CAPGO_KEEP_0__ を生成するには、Admin の権限が必要です。権限がない場合は、この記事を参照してもらうことをお勧めします。
-
ログイン App Store Connect.
-
選択 ユーザーとアクセス.

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

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

- キー名を入力してください。キー名はあなた自身の記録用であり、キー自体の構成には関係ありません。

6 — キーのアクセス権を設定するには、右側のメニューから "アクセス" を選択してください。ユーザーと同じロールが適用されます。詳しくは ロールの権限をご覧ください。 あなたのチームの管理者として推奨します。.
- 「生成」をクリックしてください。
An API key’s access cannot be limited to specific apps.
新しいキー名、キーID、ダウンロードリンク、その他の情報が表示されます。

ここから必要な3つの情報をすべて取得できます。
1. 問題 ID。 (APPLE_ISSUER_ID 秘密)
2. キー ID。 (APPLE_KEY_ID 秘密)
3. "ダウンロード API キー" をクリックして、API プライベート キーをダウンロードしてください。 プライベート キーはダウンロードした後、ダウンロード リンクは表示されなくなります。 Apple はプライベート キーを保持していないため、プライベート キーを一度だけダウンロードできます。
🔴 プライベート キーを安全な場所に保存してください。 キーを共有しないでください、キーを code リポジトリに保存しないでください、またはクライアントサイドの code に含めないでください。
App Store Connect API キーを使用する
API キー ファイル (ダウンロードした p8 ファイル)、キー ID、発行者 IDは、承認用 JWT トークンを作成するために必要です。この情報を Fastlane に渡す方法は複数あります。私は、CI で環境変数を設定できるため、Fastlane の新しいアクションを使用しました。 app_store_connect_api_keyFastlane ドキュメントを参照してください。 環境変数を設定する方法を示します。CI で環境変数を設定できるため、環境変数を設定する方法が最も簡単です。ダウンロードした p8 ファイルを Base64 に変換して、秘密 (
secret)APPLE_KEY_CONTENT).
base64 -i APPLE_KEY_CONTENT.p8 | pbcopy
今、App Store ConnectをFastlaneで管理することができます。APIキーを使用して、素晴らしいことです!
2. 証明書
XCodeを開き、 設定 > アカウント > Apple ID > チーム >

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

次に、キーチェーンに移動して証明書をダウンロードするためのファイルをダウンロードする必要があります。 .p12 これを行うには、キーチェーンに移動し、ログイン
キーチェーンに切り替え、タブ __CAPGO_KEEP_1__ __CAPGO_KEEP_2__ マイ証明書.

次に、ダウンロードしたい証明書を選択してください。 (証明書の日付で検索してください)
そして、証明書のプライベートキーに右クリックして選択 エクスポート.
ファイル形式を選択 パーソナル情報交換(.p12).
これが証明書をファイルとしてダウンロードします。 .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を使用できますが、このチュートリアルの目的のために、このチュートリアルでは、通常のAndroid Studioを使用して実行するタスクを実行するために使用するアクションの少数のコアのみを使用します。
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 next to the 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
section. The is the value you need to set in the secret. app-store-connect-team-id Getting the BUNDLE_IDENTIFIER
- Open Xcode
- Double click on the
Appin the project navigator - Then click on the tab
Signing and Capabilities - Copy the value of the
Bundle identifier. This is the value you need to set in theBUNDLE_IDENTIFIERsecret.
6. Build Processing
In GitHub Actions, you are billed based on the minutes you have used for running your CI/CD workflow. From my experience, it takes about 10–15 minutes before a build can be processed in App Store Connect.
プライベートプロジェクトの場合、ビルドの予想コストは1分あたり$0.08 x 15分 = $1.2、またはそれ以上になります。 1分あたり$0.08 x 15分 = $1.2、またはプロジェクトの構成と依存関係に応じて、さらに多くかかります。
コストの懸念がある場合は、プライベートプロジェクトの場合にビルド時間を節約するために、App Store Connectの処理を待たずにビルドを実行できます。 skip_waiting_for_build_processing to trueビルド時間を節約するには、App Store Connectの処理を待たずにビルドを実行できます。この設定を有効にすることで、ビルド時間を節約できます。
しかし、代わりにアプリの適合性情報を手動でアップデートする必要があります。
この最適化は、ビルド時間がコストがかかるプライベートプロジェクト向けに主に役立ちます。無料のプロジェクトの場合、ビルド時間は無料なので、この設定を有効にする必要はありません。GitHubの 料金表 を参照してください。
7. GitHubの設定
GitHubのシークレットを設定
秘密をコピーして .env GitHub からファイルを
__CAPGO_KEEP_0__ へのリポジトリのシークレットに貼り付けてください。 をクリックしてください。 設定 > シークレットと変数 > アクション >
2. BUILD_CERTIFICATE_BASE64 __CAPGO_KEEP_0__-secrets - 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 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 アプリをインストールしてビルドします。
各コミットを送信するたびに、TestFlight でリリースが作成されます。
アプリは Ionic を使用する必要はありません。ただし、Capacitor ベースは必須です。古い Cordova モジュールを含むことができますが、Capacitor JS プラグインを使用することを推奨します。
8. ワークフローをトリガーする
コミットを作成する
コミットを作成する Make a、リポジトリ内でアクティブなワークフローを確認します。
ワークフローをトリガーします。
新しいコミットをブランチにプッシュします。 main または development ワークフローをトリガーするには

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

9. ローカルマシンからデプロイすることはできますか?
はい、できます。簡単です。
Xcode を使用してアプリをビルドおよび署名できます。いつもと同じです。
関連記事
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 - 環境の管理
- Capacitor の自動 Capacitor iOS ビルド - Fastlane Match を使用した代替
代替 CI/CD プラットフォーム
- GitLab CI でビルド - GitLab の代替
- CodeMagicでビルド - CodeMagicの設定ガイド
ライブ更新とデプロイ
- Capgo ライブ更新ドキュメント - アプリにOTA更新を追加する
- CI/CD統合 with Capgo - パイプラインにライブ更新を統合する
感謝
このブログは以下の記事に基づいています:
- FastlaneとGitHubアクションを使用したIOSの継続的デリバリー
- Fastlaneドキュメント
- このGitHubメッセージは@mrogunlanaからです
- This GitHub documentation
Keep going from Automatic Capacitor IOS build with GitHub actions with certificate
Capgoの自動iOSビルドを使用している場合 Automatic Capacitor IOS build with GitHub actions with certificate CI/CDの自動化を計画するには、Capgoの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統合 CI/CD統合の実装詳細についてのGitHub Actions統合