自動iOSビルドにGitHubアクションを使用してマッチ
CapacitorアプリのCI/CD設定は複雑で時間がかかることがあります。ここでは、必要なことを知っておくべきことを紹介します。
Capgoビルドの推奨事項: Capgoビルドを使用
現在、__CAPGO_KEEP_0__を使用することをお勧めしています Capgo Capgo CLIで構築 Capacitor __CAPGO_KEEP_1__ __CAPGO_KEEP_2__でネイティブビルド このFastlane Matchガイドは、既存のGitHub Actionsパイプラインを維持しているチーム向けに残されていますが、新しいiOSビルドにはCapgo CLIを使用するようにしてください。そうすると、Fastlane、Matchリポジトリ、Xcodeランナー、証明書、アップロードスクリプトを自分で維持する必要がなくなります。
前提条件
開始する前に、次の設定が必要です。
- GitHubアカウントの管理者権限
- iOS開発者プログラムの会員
- App Store ConnectにAPIアクセスするための適切な権限
- GitHub Actionsワークフローの理解
- FastlaneとMatchの設定に関する知識
- パイプラインの維持とデバッグに必要な時間
- 多くの開発者がいるチーム、そうでない場合は__CAPGO_KEEP_1__ __CAPGO_KEEP_2__を使用することをお勧めします fastlane cert より簡単なワークフロー
専門のCI/CD設定はCapgoによって行われます
複雑さをスキップしてください。 Capgo __CAPGO_KEEP_0__は、ご自身の好みのプラットフォームでCI/CDパイプラインを直接設定します:
- プラットフォーム独立性: GitHubアクション、GitLab CI、または他のものとともに動作します
- シームレスな統合: プラットフォームの切り替えは必要ありません。ご自身の現在のプロセスとともに動作します
- カスタマイズされた設定: ご自身のプロジェクトのニーズに合わせたカスタマイズされた設定
- 専門ガイド: 50+アプリのCI/CDをすでに設定済み
価格
- 一時設定料金: $2,600
- 実行中のコスト: ~$300/年
- 他の独自のソリューションと比較: $6,000/年
- 5年間で$26,100を節約
手動設定ガイド
CI/CDを自分で設定したい場合は、以下の手順に従ってください:
iOS用のFastlaneとGitHubアクションを使用した継続的デリバリー
前提条件
チュートリアルを続ける前に…
- Fastlaneがインストールされていることを確認してください 開発マシンに iOS開発者プログラムの会員資格
- 読むことができる欲求…
- 多くの開発者がいるチームの場合、
- より簡単なワークフローで使用することをお勧めします。 価格について重要なこと 価格「__CAPGO_KEEP_0__」アクション
https://__CAPGO_KEEP_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 キーを使用する
- ファストレーンファイルをコピー
- ファストレーンマッチを設定
- ファストレーンマッチを設定
1. App Store Connect API をファストレーンマッチと組み合わせて使用する
2021年2月以降、すべてのユーザーがApp Store Connectにサインインするには、2要素認証または2段階認証が必要になります。Apple IDの追加セキュリティ層により、自分のアカウントにアクセスできるのはあなただけであることを保証します。
From Apple Support
マッチを始めるには、既存の証明書を取り消す必要がありますが、心配はいりません。新しい証明書は直接取得できます。
要件
App Store Connect API を使用するには、ファストレーンが必要な 3 つのものがあります。 three もの
- 発行者 ID。
- キー ID。
- キー ファイルまたはキー コンテンツ。
App Store Connect API キーの作成
キーを生成するには、App Store ConnectでAdminの権限が必要です。権限がない場合は、この記事を指示し、以下の手順に従ってください。
1 — App Store Connectにログインする App Store Connect.
2 — "ユーザーとアクセス"を選択する App Store Connectユーザーアクセス.

App Store Connect __CAPGO_KEEP_0__ インテグレーション

4 — API を生成するボタンまたは追加 (+) ボタンをクリックしてください。

5 — キーの名前を入力してください。名前はあなた自身の記録用であり、キーの本体とは関係ありません。

6 — アクセスセクションで、キーのロールを選択してください。キーのロールは、チームのユーザーに適用されるロールと同じです。詳しくは ロールの権限を参照してください。 あなたのチームの管理者を選択することをお勧めします。.
7 — __CAPGO_KEEP_0__ キーを生成するボタンをクリックしてください。
API キーのアクセスは、特定のアプリに制限することはできません。
新しいキーの名前、キーのID、ダウンロード用リンク、他に情報が表示されます。

必要な情報はすべてここで取得できます。
<1> 問題 ID。
<2> キー ID。
<3> 「API キーをダウンロードする」ボタンをクリックして、API プライベート キーをダウンロードしてください。ダウンロード リンクは、プライベート キーがまだダウンロードされていない場合にのみ表示されます。Apple はプライベート キーを保持していないため、ダウンロードすることができます。
🔴 プライベート キーを安全な場所に保存してください。キーを共有しないでください、キーを code リポジトリに保存しないでください、またはクライアント側の code にキーを含めないでください。
App Store Connect API キーを使用する
API キー ファイル (ダウンロードした p8 ファイル)、キー ID、発行者 ID が JWT トークンを作成するために必要です。Fastlane に情報を入力する方法は複数ありますが、Fastlane の新しいアクションを使用して入力する方法は、 app_store_connect_api_key他の方法を学ぶことができます。 Fastlane ドキュメント。この方法を紹介するのは、CI で最もよく使用できる方法であるためです。環境変数を設定できます。
App Store Connect API キーを使用して、Fastlane を管理できます。すばらしい!
2. Fastlane ファイルをコピー
Fastlaneは、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を設定するには、Fastlane matchを使用します。
Fastlane match iOSのcode署名の新しいアプローチです。Fastlane matchは、iOSアプリの必要な証明書とプロビジョニングプロファイルを管理するチームに便利です。
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 HTTPSで証明書リポジトリのURLに設定する必要があります。オプションでSSHを使うこともできますが、別のステップで実行する必要があります。
_git_url_次に、Fastlane Matchで証明書を生成し、入力されたクレデンシャルを確認します。
# ios/Matchfilegit_url("https://github.com/gitusername/certificates")storage_mode("git")type("appstore")
__CAPGO_KEEP_0__アクションが証明書リポジトリを復号化するために使用するパスフレーズを入力してください。
You will be prompted to enter a passphrase. Remember it correctly because it will be used later by GitHub Actions to decrypt your certificates repository.
fastlane match appstore
__CAPGO_KEEP_0__と必要な権限で問題が発生した場合、gitの認証トークンを生成するための
[01:40:52]: All required keys, certificates and provisioning profiles are installed 🙌
If you experienced any problem with GitHub and the necessary permissions, maybe this 記事 が役に立ちます。
生成された証明書とプロビジョニングプロファイルは証明書リポジトリの

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

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

__CAPGO_KEEP_0__ アクションで使用するために、後で環境変数として使用するために生成されたパーソナル アクセス トークンのコピーを持ってください。 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 アクションによって証明書とプロビジョニング プロファイルをインポートするために使用されます。 また、ファイルにハードコードするのではなく、GitHub シークレットで変数が設定されるようになります。
ビルド処理
GitHub アクションで 実行中の CI/CD ワークフローで使用した分数に基づいて料金が請求されます。実際の経験から、App Store Connect でビルドが処理されるまでに約 10–15 分かかります。 プライベート プロジェクトの場合、ビルドあたりの推定コストは $0.08/分 x 15 分 = $1.2、またはそれ以上になります。
依存関係やプロジェクトの構成に応じて 料金の計算料金の計算
あなたも私もプライベートプロジェクトの価格について心配しているのであれば、以下のオプションを選択してください。 skip_waiting_for_build_processing to 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 pricing アプリ情報 → アプリの下部にスクロールし、 General Information アプリのセクションを探してください。 Apple ID.
3. DEVELOPER_APP_IDENTIFIER - アプリのバンドル識別子です。
4. DEVELOPER_PORTAL_TEAM_ID - 複数のチームに所属している場合の、開発者ポータルチームのIDです。
5. FASTLANE_APPLE_ID - アプリを管理するために使用するApple IDまたは開発者メールアドレスです。
6. GIT_USERNAME 、 GIT_TOKEN - Gitのユーザー名とパーソナルアクセストークン。
7. MATCH_PASSWORD - matchを初期化したときに割り当てたパスフレーズが、証明書とプロビジョニングプロファイルの暗号化に使用されます。
8. PROVISIONING_PROFILE_SPECIFIER - match AppStore <YOUR_APP_BUNDLE_IDENTIFIER>例えば、 match AppStore com.domain.blabla.demo.
9. TEMP_KEYCHAIN_USER 、 TEMP_KEYCHAIN_PASSWORD - ワークフローのために一時的なキーチェーンユーザーとパスワードを割り当ててください。
10. APPLE_KEY_ID — App Store Connect API Key 🔺Key ID.
11. APPLE_ISSUER_ID — App Store Connect API Key 🔺Issuer ID.
12. APPLE_KEY_CONTENT — App Store Connect API Key 🔺 Key file or Key content of .p8, check it
13. CERTIFICATE_STORE_URL — Match keys のリポジトリ URL (例: https://github.com/***/fastlane_match.git)
4. GitHub ワークフロー ファイルを設定
Create a GitHub workflow directory.
cd .github/workflows
ディレクトリの中にファイルを作成し、 workflow 以下の内容を追加してください。 build-upload-ios.yml4. __CAPGO_KEEP_0__ ワークフロー設定ファイルを作成
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アクションを使用します。 最初に。
このワークフローは、NodeJSの依存関係を取得し、JavaScriptアプリをインストールしてビルドします。
各コミットを送信するたびに、テストフライトでリリースが作成されます。
アプリはIonicを使用する必要はありません。ただし、Capacitorベースは必須です。古いCordovaモジュールを含めることができますが、CapacitorJSプラグインを優先することをお勧めします。
5. ワークフローをトリガーする
コミットを作成する
コミットを作成する Create a Commit, では、リポジトリ内でアクティブなワークフローを確認できます。
ワークフローをトリガーする
新しいコミットをブランチにプッシュする main または development ワークフローをトリガーするには

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

ローカルマシンからデプロイすることはできますか?
はい、簡単にできます。
想像してみてください。プライベート リポジトリがあり、無料プランの分数を使用済みで、新しいリリースのために支払いたくない場合、またはアプリケーションを手動で提出したい場合などがあります。
それでは、行きましょう
まず、 my_project_path/fastlane ファイルを作成する .env Fastfileと同じパスに ローカルマシンからデプロイするための ___CAPGO_KEEP_0__ 以下の内容を含む.envファイル properties found in our _GitHub, a_s below:
デプロイ用の.envファイル
ターミナルに移動してください targetLanguage と実行する 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と__CAPGO_KEEP_0__ Actionsを使用してiOSアプリの完全自動化プロセスを実現しました。
GitHub
Google Playコンソールのベータチャネルで毎回コミットを送信するたびにリリースが作成されます。 martin@capgo.app
martin@__CAPGO_KEEP_0__.app
デバイスでビルドする
デバイスをMacに接続し、デバイスメニューを開きます。
識別子をコピーします。
fastlane register_new_device
識別子を探すiOS

デバイス名と識別子を設定するよう求められます。
識別子を設定するiOSの場合、問題が発生した場合にどうすればいいですか。
あなたを救う魔法のコマンドが存在します:
fastlane match nuke development
fastlane match development
次に: プロジェクトをクリーンするためにShift(⇧)+Command(⌘)+Kを押すか、Product > Clean(クリーンビルドフォルダとラベル付けされているかもしれません)を選択します。
次に、デバイス上でアプリを再実行してみてください。
ありがとうございます。
このブログは以下の記事に基づいています: