マッチを使用したGitHub Actionsによる自動iOSビルド
Setting up CI/CD for Capacitor apps can be complex and time-consuming. Here’s what you need to know:
新しいビルドの推奨:Capgo ビルドを使用
今後は__CAPGO_KEEP_0__ ビルドを使用することをおすすめします。 Capgo Capgo CLI Capacitor このFastlane Matchガイドは、既存のGitHub Actionsパイプラインを維持しているチーム向けに残されていますが、新しいiOSビルドにはCapgo CLIを使用してください。そうすると、Fastlane、Matchリポジトリ、Xcodeランナー、証明書、アップロードスクリプトを自分で維持する必要がなくなります。
Capgo Capgo
Fastlane Match、Xcodeランナー、証明書、プロビジョニングプロファイル、アップロードスクリプトの維持をスキップしてください。 Capgo __CAPGO_KEEP_0__ Buildは、既存のCI/CDパイプラインから実行される署名済みネイティブiOSビルドです:
- __CAPGO_KEEP_0__ Buildは、ワークフローと一緒に機能します。: Capgo BuildをGitHub Actions、GitLab CI、Jenkins、またはローカルスクリプトからトリガーしてください。ウェブビルド後に
npx cap sync. - __CAPGO_KEEP_0__ Buildから署名する: App Store Connectのキー、証明書、プロビジョニングプロファイル、パスワード、チームIDをCIシークレットに保持してください。
- ネイティブランナーの維持をせずに済みます: Capgo Build は、macOS ランナーの管理、Xcode イメージ、Fastlane、または Match リポジトリの管理を必要とせずに、維持された Apple ビルド環境を提供します。
- Artifacts and submission: Capgo CLI を使用して、QA のために署名されたアーティファクトをダウンロードしたり、リリースビルドを提出したりできます。
Pricing
- Capgo plans start at $12/month
- __CAPGO_KEEP_0__ プランでは、OTA の更新と約 15 のネイティブ ビルドが含まれます。
- __CAPGO_KEEP_0__ のプランでは、追加のビルド分数はクレジットを通じて 1 分あたり請求されます。
Manual Setup Guide
ここで、以下の手順を実行してください。
Continuous Delivery for iOS using Fastlane and GitHub Actions using match
Prerequisites
チュートリアルを続ける前に…
- Fastlaneがインストールされていることを確認してください 開発マシンに iOS開発者プログラムの会員資格
- 読みたい😆…
- 多くの開発者がいるチームの場合、よりシンプルなワークフローを実現するために
- fastlane certを使用することをお勧めします 価格についての重要な点 価格 {0} Action
https://{0}.com/features/actions

https://github.com/features/actions
料金は、選択したマシンに応じて、一定の制限まで無料です。
この記事では、 macOS マシンを使用します。スクリーンショットでは、その価格と制限を確認できます (このチュートリアルの作成時点での価格です。将来の変更が可能です)
🔴 要件と価格について注意した後、続きますか?
📣 この記事では、iTunes Connectでアプリを作成し、Appleのエコシステムの証明書を所有していることを前提としています。Fastlaneがすべてをコピーします!
始めましょう!
この記事で説明する手順
- App Store Connect APIを使用してFastlane Match
- 要件
- App Store Connect API キーを作成する
- App Store Connect API キーを使用する
- ファイルをコピー
- Fastlane matchを設定
1. App Store Connect APIとFastlane Matchを使用
2021年2月以降、すべてのユーザーがApp Store Connectにサインインするには、2要素認証または2段階認証が必要になります。Apple IDの追加セキュリティ層により、自分のアカウントにアクセスできるのはあなただけになります。
From Apple Support
matchを始めるには、既存の証明書を取り消す必要があります。心配はいりません、新しい証明書がすぐに手に入ります。
要件
App Store Connect APIを使用するには、Fastlaneには 3 ものが必要です。
- 発行者ID
- __CAPGO_KEEP_0__ ID.
- __CAPGO_KEEP_0__ ファイルまたは __CAPGO_KEEP_0__ 内容。
App Store Connect API キーの作成
App Store Connect の __CAPGO_KEEP_0__ キーを生成するには、Admin の権限が必要です。権限がない場合は、この記事を参照し、以下の手順に従ってください。
1 — App Store Connect にログインします。 App Store Connect.
2 — "ユーザーとアクセス" を選択します。 App Store Connect ユーザー アクセス.

App Store Connect __CAPGO_KEEP_0__ 統合

API

5 — __CAPGO_KEEP_0__ の名前を入力してください。名前はあなた自身の記録用であり、__CAPGO_KEEP_0__ の一部ではありません。

6 — アクセスセクションで、__CAPGO_KEEP_0__ のロールを選択してください。__CAPGO_KEEP_0__ のロールは、チームのユーザーに適用されるロールと同じです。詳しくは ロールの権限を参照してください。 App Store Connect でおすすめのロールは.
App manager
An API key’s access cannot be limited to specific apps.
__CAPGO_KEEP_0__ のアクセスは特定のアプリに制限できません。

App Store Connect で __CAPGO_KEEP_0__ をダウンロードするにはこちらから情報を取得できます。
1. 問題 ID.
2. キー 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が必要です。これらの情報を Fastlane に入力する方法は複数あります。 app_store_connect_api_keyFastlane ドキュメント Fastlane のドキュメントを参照してください。Fastlane を App Store Connect __CAPGO_KEEP_0__ キーで管理できるようになりました!
Now we can manage Fastlane with the App Store Connect API key, great!
Fastlane は、Android Studio を使用してモバイル開発タスクを自動化するための Ruby ライブラリです。Fastlane を使用すると、カスタムの「レーン」を構成できます。これらのレーンには、通常の Android Studio を使用して実行するタスクを実行する「アクション」が含まれます。Fastlane を使用すると、多くのタスクを実行できますが、このチュートリアルの目的では、主なアクションのみを使用します。
Fastlane は、Android Studio を使用してモバイル開発タスクを自動化するための Ruby ライブラリです。Fastlane を使用すると、カスタムの「レーン」を構成できます。これらのレーンには、通常の Android Studio を使用して実行するタスクを実行する「アクション」が含まれます。Fastlane を使用すると、多くのタスクを実行できますが、このチュートリアルの目的では、主なアクションのみを使用します。
プロジェクトのルートにFastlaneフォルダを作成し、以下のファイルをコピーしてください: Fastfile
default_platform(:ios)
DEVELOPER_APP_IDENTIFIER = ENV["DEVELOPER_APP_IDENTIFIER"]
DEVELOPER_APP_ID = ENV["DEVELOPER_APP_ID"]
PROVISIONING_PROFILE_SPECIFIER = ENV["PROVISIONING_PROFILE_SPECIFIER"]
TEMP_KEYCHAIN_USER = ENV["TEMP_KEYCHAIN_USER"]
TEMP_KEYCHAIN_PASSWORD = ENV["TEMP_KEYCHAIN_PASSWORD"]
APPLE_ISSUER_ID = ENV["APPLE_ISSUER_ID"]
APPLE_KEY_ID = ENV["APPLE_KEY_ID"]
APPLE_KEY_CONTENT = ENV["APPLE_KEY_CONTENT"]
GIT_USERNAME = ENV["GIT_USERNAME"]
GIT_TOKEN = ENV["GIT_TOKEN"]
def delete_temp_keychain(name)
delete_keychain(
name: name
) if File.exist? File.expand_path("~/Library/Keychains/#{name}-db")
end
def create_temp_keychain(name, password)
create_keychain(
name: name,
password: password,
unlock: false,
timeout: 0
)
end
def ensure_temp_keychain(name, password)
delete_temp_keychain(name)
create_temp_keychain(name, password)
end
platform :ios do
lane :build do
build_app(
configuration: "Release",
workspace: "./ios/App/App.xcworkspace",
scheme: "App",
export_method: "app-store",
export_options: {
provisioningProfiles: {
DEVELOPER_APP_ID => "#{PROVISIONING_PROFILE_SPECIFIER}"
}
}
)
end
lane :refresh_profiles do
match(
type: "development",
force: true)
match(
type: "adhoc",
force: true)
end
desc "Register new device"
lane :register_new_device do |options|
device_name = prompt(text: "Enter the device name: ")
device_udid = prompt(text: "Enter the device UDID: ")
device_hash = {}
device_hash[device_name] = device_udid
register_devices(
devices: device_hash
)
refresh_profiles
end
lane :closed_beta do
keychain_name = TEMP_KEYCHAIN_USER
keychain_password = TEMP_KEYCHAIN_PASSWORD
ensure_temp_keychain(keychain_name, keychain_password)
api_key = app_store_connect_api_key(
key_id: APPLE_KEY_ID,
issuer_id: APPLE_ISSUER_ID,
key_content: APPLE_KEY_CONTENT,
duration: 1200,
in_house: false
)
match(
type: 'appstore',
git_basic_authorization: Base64.strict_encode64("#{GIT_USERNAME}:#{GIT_TOKEN}"),
readonly: true,
keychain_name: keychain_name,
keychain_password: keychain_password,
api_key: api_key
)
gym(
configuration: "Release",
workspace: "./ios/App/App.xcworkspace",
scheme: "App",
export_method: "app-store",
export_options: {
provisioningProfiles: {
DEVELOPER_APP_ID => "#{PROVISIONING_PROFILE_SPECIFIER}"
}
}
)
pilot(
apple_id: "#{DEVELOPER_APP_ID}",
app_identifier: "#{DEVELOPER_APP_IDENTIFIER}",
skip_waiting_for_build_processing: true,
skip_submission: true,
distribute_external: false,
notify_external_testers: false,
ipa: "./App.ipa"
)
delete_temp_keychain(keychain_name)
end
lane :submit_review do
version = ''
Dir.chdir("..") do
file = File.read("package.json")
data = JSON.parse(file)
version = data["version"]
end
deliver(
app_version: version,
submit_for_review: true,
automatic_release: true,
force: true, # Skip HTMl report verification
skip_metadata: false,
skip_screenshots: false,
skip_binary_upload: true
)
end
end
Appfile
app_identifier(ENV["DEVELOPER_APP_IDENTIFIER"])
apple_id(ENV["FASTLANE_APPLE_ID"])
itc_team_id(ENV["APP_STORE_CONNECT_TEAM_ID"])
team_id(ENV["DEVELOPER_PORTAL_TEAM_ID"])
Fastlane matchを設定
Fastlane match iOSのcode署名の新しいアプローチです。Fastlane matchは、iOSアプリの必要な証明書とプロビジョニングプロファイルを管理するチームに簡単にできるようにします。
新しいプライベートリポジトリを作成し、 certificates例えば、GitHubの個人アカウントまたは組織で
iOSアプリのFastlane matchを初期化します。
fastlane match init
次に、オプション#1(Git Storage)を選択します。
[01:00:00]: fastlane match supports multiple storage modes, please select the one you want to use:1. git2. google_cloud3. s3?
新しく作成したリポジトリのURLを割り当てます。
[01:00:00]: Please create a new, private git repository to store the certificates and profiles there[01:00:00]: URL of the Git Repo: <YOUR_CERTIFICATES_REPO_URL>
Fastlaneフォルダ内にファイル名が Matchfile と
_git_url_httpsの証明書リポジトリのURLに設定する必要があります。オプションでSSHを使用することもできますが、別のステップで実行する必要があります。
# ios/Matchfilegit_url("https://github.com/gitusername/certificates")storage_mode("git")type("appstore")
次に、Fastlane Matchで証明書を生成し、パスフレーズを入力するときにクレデンシャルを入力します。
パスフレーズを正しく覚えておいてください。GitHub Actionsが後で証明書リポジトリを暗号化するために使用します。
fastlane match appstore
すべてがうまくいった場合、以下のような画面が表示されます。
[01:40:52]: All required keys, certificates and provisioning profiles are installed 🙌
問題が発生した場合は、GitHubと必要な権限に関するこの 投稿 gitの認証トークンを生成するのに役立ちます。
生成された証明書とプロビジョニングプロファイルは、証明書リポジトリのリソースにアップロードされます。

最後に、 project Xcodeで、リリース構成のアプリのプロビジョニングプロファイルを更新してください。

注意点が数点あります 💡
MATCH
CI/CDが証明書とプロビジョニングプロファイルをインポートするには、証明書リポジトリにアクセスする必要があります。 これを行うには、プライベートリポジトリにアクセスまたは読み取り可能なスコープを持つパーソナルアクセストークンを生成する必要があります。
GitHubに移動してください 設定 → 開発者設定 → パーソナルアクセストークン → クリック Generate New Token → スコープにチェックを入れてからクリック repo → Generate token.

パーソナル アクセス トークンのコピーを用意する GIT_TOKEN.
次に、Fastlane フォルダ内で生成されたマッチ ファイルを置き換える マッチファイル
CERTIFICATE_STORE_URL = ENV["CERTIFICATE_STORE_URL"]
GIT_USERNAME = ENV["GIT_USERNAME"]
GIT_TOKEN = ENV["GIT_TOKEN"]
FASTLANE_APPLE_ID = ENV["FASTLANE_APPLE_ID"]
git_url(CERTIFICATE_STORE_URL)
storage_mode("git")
type("appstore")
git_basic_authorization(Base64.strict_encode64("#{GIT_USERNAME}:#{GIT_TOKEN}"))
username(FASTLANE_APPLE_ID)
このファイルは、GitHub Actionsによって証明書とプロビジョニング プロファイルをインポートし、GitHub Secretsで変数を設定するのと同じです。ファイルにハードコードするのではなく。
ビルド処理
GitHub Actionsで 実行時間に基づいて課金されます。 CI/CD ワークフローを実行するのにかかる分数に基づいて課金されます。App Store Connectでビルドを処理するのに約10-15分かかります。
プライベート プロジェクトの場合、ビルドあたりの推定コストは 0.08$/分 x 15分 = $1.2, or more, depending on the configuration or dependencies of your project.
または、プロジェクトの構成や依存関係に応じて、より高くなる可能性があります。 skip_waiting_for_build_processing ~ true.
アプリをApp Store Connectにアップロードするには、ビルドが処理された後、手動でアプリの適合性を更新する必要があります。
このオプションは、ビルド時間を節約したい場合はオプションです。プライベートプロジェクトの場合、ビルド時間を節約したい場合はオプションです。フリープロジェクトの場合は、問題ありません。詳しくは 価格.
3. GitHub Actionsの設定
GitHub シークレットの設定
プロジェクトのシークレットから値がどのように取得されるのか、気になっていましたか? それはもう秘密ではありません – それはプロジェクトのシークレットからです。 ENV __CAPGO_KEEP_0__ シークレットの設定

1. APP_STORE_CONNECT_TEAM_ID - App Store Connectでアプリを選択し、
2. DEVELOPER_APP_ID アプリ情報 - App Store ConnectのチームID → アプリのセクションにスクロールし、 General Information アプリのバンドル識別子を探してください。 Apple ID.
3. DEVELOPER_APP_IDENTIFIER 開発者ポータルチームのIDを探してください。複数のチームに所属している場合。
4. DEVELOPER_PORTAL_TEAM_ID アプリを管理するために使用するApple IDまたは開発者メールアドレスを探してください。
5. FASTLANE_APPLE_ID 、
6. GIT_USERNAME Gitユーザー名とパーソナルアクセストークンを探してください。 GIT_TOKEN matchを初期化したときに割り当てたパスフレーズが、証明書とプロビジョニングプロファイルを暗号化するために使用されます。
7. MATCH_PASSWORD , 例えば。
8. PROVISIONING_PROFILE_SPECIFIER - match AppStore <YOUR_APP_BUNDLE_IDENTIFIER>、 match AppStore com.domain.blabla.demo.
9. TEMP_KEYCHAIN_USER ワークフロー用に一時的なキーチェーンユーザーとパスワードを割り当てることができます。 TEMP_KEYCHAIN_PASSWORD アプリストア接続__CAPGO_KEEP_0__キー 🔺キーID。
10. APPLE_KEY_ID — App Store Connect API Key 🔺Key ID.
11. APPLE_ISSUER_ID — App Store Connect API キー 🔺発行者ID。
12. APPLE_KEY_CONTENT — App Store Connect API キー 🔺 キーファイルまたはキー内容 .p8, 確認してみてください。
13. CERTIFICATE_STORE_URL — あなたの Match キーのリポジトリ URL (例: https://github.com/***/fastlane_match.git)
4. GitHub ワークフロー ファイルを設定します。
Create a GitHub workflow directory.
cd .github/workflows
内部 workflow folderにファイルを作成し、そのファイル名を 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: 2.7.2
- uses: maierj/fastlane-action@v2.3.0
env:
DEVELOPER_APP_IDENTIFIER: ${{ secrets.DEVELOPER_APP_IDENTIFIER }}
DEVELOPER_APP_ID: ${{ secrets.DEVELOPER_APP_ID }}
PROVISIONING_PROFILE_SPECIFIER: match AppStore ${{ secrets.DEVELOPER_APP_IDENTIFIER }}
TEMP_KEYCHAIN_USER: ${{ secrets.TEMP_KEYCHAIN_USER }}
TEMP_KEYCHAIN_PASSWORD: ${{ secrets.TEMP_KEYCHAIN_PASSWORD }}
APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }}
CERTIFICATE_STORE_URL: https://github.com/${{ secrets.CERTIFICATE_STORE_REPO }}.git
GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
GIT_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
FASTLANE_APPLE_ID: ${{ secrets.FASTLANE_APPLE_ID }}
MATCH_USERNAME: ${{ secrets.FASTLANE_APPLE_ID }}
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
APP_STORE_CONNECT_TEAM_ID: ${{ secrets.APP_STORE_CONNECT_TEAM_ID }}
DEVELOPER_PORTAL_TEAM_ID: ${{ secrets.DEVELOPER_PORTAL_TEAM_ID }}
with:
lane: closed_beta
- name: Upload release bundle
uses: actions/upload-artifact@v2
with:
name: ios-release
path: ./App.ipa
retention-days: 60
このワークフローは、各 GitHub の後にトリガーされるべきです。 タグ必要に応じてタグの自動化を行う場合は、 自動ビルドおよびリリースのためのGitHubアクション 最初にこのワークフローを実行してください。
次に、このワークフローはNode.jsの依存関係を取得し、インストールし、JavaScriptアプリをビルドします。
コミットを送信するたびに、テストフライトでリリースが作成されます。
アプリはIonicを使用する必要はありません。ただし、Capacitorベースが必須であり、古いCordovaモジュールを使用してもかまいませんが、CapacitorのJSプラグインを使用することを推奨します。
5. ワークフローをトリガーする
コミットを作成する
コミット コミットを作成し、リポジトリでアクティブなワークフローを確認してください。5. Trigger workflow
ワークフローをトリガーする
ブランチに新しいコミットをプッシュする main または development Capacitorライブアップデートの代替手段を比較するページ。

Capawesomeの比較ページ。

コンサルティングサービスページ。
Appflowの比較/移行マーケティングコピー。
Appflowの比較/移行マーケティングコピー。
Appflowプラグインまたは
ワークフローをトリガーする。 my_project_path/fastlane path a file called ファイル名 そのファイルが Fastfile 同じファイルパスで secret properties found in our _GitHub, a_s below:
.envファイル
ローカルマシンからデプロイするために 環境変数 ターミナル Fastlane マシンから:
fastlane closed_beta
❌ 重要なのは .env ファイルについての説明は避けたいので、.gitignoreに追加する必要があります。 , 例えば:❌
fastlane/*.env
It should work the same as it happens from GitHub Actions on the remote machine but in our local machine. 🍻

ターミナル実行: $ Fastlane closed_beta
ここまで来たら、恭喜恭喜! これでiOSアプリの自動化プロセスができました。FastlaneとGitHub Actionsを使用して。
毎回コミットを送ると、Google Playコンソールのベータチャンネルでリリースが作成されます。 このブログを改善するために、ご意見や質問がありましたら、メールでご連絡ください。 martin@capgo.app
デバイスでビルド
デバイスでビルドする必要がある場合は、手動でプロビジョニングに追加する必要があります。
Macにデバイスを接続し、デバイスメニューを開きます
次に、識別子をコピーします
次に、以下のコマンドを実行します:
fastlane register_new_device
デバイス名と識別子を設定するよう求められます

問題が発生した場合
開発用デバイスで問題が発生したり、テストができない場合は、通常、以下のコマンドで解決できます。
デバイスでビルドするためのマジックコマンドがあります
fastlane match nuke development
fastlane match development
次に: プロジェクトをクリーンするには、Shift(⇧)+Command(⌘)+Kを押すか、Product > Clean(Clean Build Folderとラベル付けされている場合もあります)を選択します。
再度アプリをデバイス上で実行してみてください。
感謝します。
このブログは以下の記事に基づいています。
継続的デリバリーの自動化を進めていきましょう。Automatic Capacitor IOS ビルドとGitHubアクションを使用してMatchを実行します。
あなたが使用している Automatic Capacitor IOS ビルドとGitHubアクションを使用してMatchを実行している場合 CI/CDの自動化を計画するには、__CAPGO_KEEP_0__ CI/CDと接続する必要があります。 Capgo CI/CD Capgoの製品ワークフローにおけるCapgo CI/CDのために Capgoネイティブビルド Capgoの製品ワークフローにおけるCapgoネイティブビルドのために Capgo統合 Capgoの製品ワークフローにおけるCapgo統合のために CI/CD統合 Capgoの製品ワークフローの実装詳細はCI/CD統合にあります GitHubアクション統合 Capgoの製品ワークフローの実装詳細はGitHubアクション統合にあります