メインコンテンツにジャンプ
CI/CD

Capacitor を使用した自動 IOS ビルドと GitHub アクションのマッチング

IOS Ionic アプリの CI/CD パイプラインを設定する方法:fastlane と GitHub Actions を使用して 5 分で

自動 Capacitor IOS ビルドと GitHub アクションのマッチング

自動iOSビルドにGitHubアクションを使用する

CI/CDの設定はCapacitorアプリの開発に時間がかかります。ここでは、必要な情報をご紹介します。

今後は__CAPGO_KEEP_0__ ビルドを使用することをお勧めします。 Capgo ビルドとCapgo CLIを使用する ネイティブ Capacitor ビルド用。 このFastlane Matchガイドは、既存のGitHub Actionsパイプラインを維持するチーム向けに残されていますが、新しいiOSビルドにはCapgo CLIを使用してください。そうすることで、Fastlane、Matchリポジトリ、Xcodeランナー、証明書、アップロードスクリプトを自分で維持する必要がなくなります。

Capgo CI/CD用ビルドに Capgo を使用

Fastlane Match、Xcodeランナー、証明書、プロビジョニングプロファイル、アップロードスクリプトの維持をスキップしてください。 Capgo ビルド 既存のCI/CDパイプラインからネイティブiOSビルドを実行します。

  • パイプラインと一緒に機能します。: Capgo ビルドをGitHub Actions、GitLab CI、Jenkins、またはローカルスクリプトからトリガーしてください。ウェブビルド後に npx cap sync.
  • CIシークレットから署名します。: App Store Connectキー、証明書、プロビジョニングプロファイル、パスワード、チームIDを自分のCIシークレットに保持してください。
  • ネイティブランナーの維持をせずに。: Capgo ビルドは、macOSランナー、Xcodeイメージ、Fastlane、またはMatchリポジトリを管理する必要がなくなります。
  • アーティファクトと提出: Download signed artifacts for QA or submit release builds through the Capgo CLI.

価格

  • Capgo プランは月額12ドルから
  • OTA更新と約15回のネイティブビルドが含まれます
  • 追加のビルド時間はクレジットを通じて1分あたり請求されます

CI/CDでCapgo ビルドを設定する

手動設定ガイド

ここで何が必要か

iOS向けの継続的デリバリーをFastlaneとGitHub アクションの設定

前提条件

このチュートリアルに進む前に…

  • Fastlaneをインストールしてください インストール 開発マシンに
  • iOS開発者プログラムの会員資格
  • 読みたい😆…
  • 多くの開発者がいるチームの場合、より単純なワークフローを実現するために fastlane cert を使用することをお勧めします。

価格についての重要なこと

価格GitHubアクション

https://github.com/features/actions

サービスは、選択したマシンに応じて、一定の制限まで無料です。
Capgoでは、CapacitorのiOSビルドを自動化するGitHubアクションをMatchで実行する方法について説明します。 macOS 要件と価格についての警告を表示した後、続ける場合はこちら

🔴 この記事では、iTunes Connectでアプリを作成し、Appleのエコシステムの証明書を持っていることを前提としています。Fastlaneがすべてをコピーします!

📣 では始めましょう!

この記事で説明する手順

App Store ConnectのKeyを使用してFastlane Match

  1. App Store Connect を使用して Fastlane Match API
  2. Requirements
  3. Creating an App Store Connect API Key
  4. Using an App Store Connect API Key
  5. ファイルをコピーする
  6. 設定

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 項目が必要です。

  1. 発行者ID
  2. キーID
  3. __CAPGO_KEEP_0__ファイルまたは__CAPGO_KEEP_0__コンテンツ。

App Store ConnectのAPIキーを作成する

App Store Connectの__CAPGO_KEEP_0__キーを生成するには、App Store ConnectでAdmin権限が必要です。権限がなければ、関連する人にこの記事を指示し、以下の手順に従ってください。

1 — App Store Connectにログインします。 App Store Connect.

2 — 選択 App Store Connectのユーザーとアクセス.

3 — "統合"タブを選択します。

App Store Connectの__CAPGO_KEEP_0__統合

4 — "APIキーを生成"または「+」ボタンをクリックします。

App Store ConnectのAPIキーを作成します

APIファイルまたはAPIコンテンツ。

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

App Store Connect APIキーを作成する名前

6 — アクセスセクションで、__CAPGO_KEEP_0__のロールを選択してください。__CAPGO_KEEP_0__のロールは、チームのユーザーに適用されるロールと同じです。詳しくは ロールの権限を参照してください。 App Store Connectでは.

App manager

API キーのアクセスは特定のアプリに制限できません。

7 — 生成をクリックしてください。

__CAPGO_KEEP_0__キーは、特定のアプリにアクセスを制限することはできません。

__CAPGO_KEEP_0__の名前、キーID、ダウンロードリンク、その他の情報がページに表示されます。
App Store Connectでキーをダウンロードする方法はこちらです。
<2> キー ID.
<3> “API キーをダウンロード”をクリックして、API プライベート キーをダウンロードしてください。ダウンロード リンクは、プライベート キーがまだダウンロードされていない場合にのみ表示されます。Apple はプライベート キーを保持していないため、ダウンロードすることができます。ただし、プライベート キーは一度だけダウンロードできます。

🔴 Store your private key in a safe place. You should never share your keys, store keys in a code repository, or include keys in client-side code.

App Store Connect API キーを使用する

API キー ファイル(ダウンロードした p8 ファイル)、キーアイデンティティ、発行者 ID が必要です。これらの情報を Fastlane に入力する方法は複数あります。 app_store_connect_api_key. __CAPGO_KEEP_0__ キー ファイル、キーアイデンティティ、発行者 ID を入力する方法を学ぶには、 Fastlane ドキュメントを参照してください。ここでは、この方法を紹介しています。なぜなら、CI で最もよく使用される方法だと思っているからです。

Fastlane を App Store Connect API キーで管理できるようになりました!

2. Fastlane ファイルをコピーする

Fastlane は、Ruby ライブラリで、モバイル開発タスクを自動化するために作成されました。Fastlane を使用すると、カスタムの「レーン」を設定できます。これは、Android Studio で実行するタスクのシーケンスです。Fastlane を使用すると、Android Studio で実行するタスクのシーケンスをカスタマイズできます。

プロジェクトのルートディレクトリに 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 is a new approach to iOS’s code signing. Fastlane match makes it easy for teams to manage the required certificates and provisioning profiles for your iOS apps.

新しいプライベートリポジトリを作成します。 certificates, 例えば、GitHub の個人アカウントまたは組織で。

iOSアプリ用のFastlane matchを初期化します。

fastlane match init

次に、Git Storageのオプション#1を選択します。

[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のファイルが生成されます。 Matchfile と _git_url_HTTPSで証明書リポジトリのURLを設定する必要があります。オプションで、SSHを使用することもできますが、別のステップで実行する必要があります。

# ios/Matchfilegit_url("https://github.com/gitusername/certificates")storage_mode("git")type("appstore")

次に、Fastlane Matchでパスフレーズを入力するときに、パスフレーズを正しく入力してください。後で__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__と必要な権限に関する問題が発生した場合は、この

[01:40:52]: All required keys, certificates and provisioning profiles are installed 🙌

もし GitHub に関して何らかの問題が発生し、必要な権限が得られなかった場合は、 post 生成された証明書とプロビジョニングプロファイルは、証明書リポジトリのリソースにアップロードされます。

App Store Connect証明書

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

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

iOS用XCode証明書

注意点

MATCH

CI/CDが証明書とプロビジョニングプロファイルをインポートするには、証明書リポジトリにアクセスする必要があります。パーソナルアクセストークンを生成し、プライベートリポジトリにアクセスする権限を持つものを使用してください。

GitHubに移動してください 設定 → 開発者設定 → パーソナルアクセストークン → Generate New Token → repo スコープを選択してください → ここにクリックしてください Generate token.

パーソナルアクセストークンを作成

アクセストークンを生成したコピーを持っておいてください。後で環境変数として使用します。 GIT_TOKEN.

次に、Fastlane フォルダで生成された Match ファイルを置き換えてください Matchfile

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 で var を設定します。

ビルド処理

GitHub Actions で、 あなたは使用時間に基づいて請求されます。 プライベート プロジェクトの場合、ビルドあたりの推定コストは $0.08/分 x 15 分 = $1.2 となります。

, または、プロジェクトの構成または依存関係に応じて、より多くなります。 価格設定に関する懸念を共有している場合は、プライベート プロジェクトの場合、コストを削減する方法を検討できます。「」

「」 skip_waiting_for_build_processing 「」 true.

何が問題か?

ビルドが処理された後、App Store Connectでアプリの適合性を手動で更新する必要があります。 pricing.

3. GitHub アクションの設定

3. GitHub Actionsの設定

__CAPGO_KEEP_0__ シークレットの設定 ENV プロジェクトのシークレットから値がどのように取得されるのか、気になっていたらもう知る必要はありません – それ単にプロジェクトのシークレットからです。

GitHub シークレットの設定

1. APP_STORE_CONNECT_TEAM_ID - App Store ConnectのチームID

2. DEVELOPER_APP_ID - App Store Connectでアプリを選択し、 アプリ情報 → 下部にスクロールして General Information アプリのセクションを選択し、 Apple ID.

3. DEVELOPER_APP_IDENTIFIER - アプリのバンドルIDを確認してください。

4. DEVELOPER_PORTAL_TEAM_ID - 複数のチームに所属している場合は、開発者ポータルチームのIDを確認してください。

5. FASTLANE_APPLE_ID - アプリを管理するために使用するApple IDまたは開発者メールアドレスを確認してください。

6. GIT_USERNAME &amp; 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 &amp; TEMP_KEYCHAIN_PASSWORD - ワークフロー用に一時的なキーチェーンユーザーとパスワードを割り当ててください。

10. APPLE_KEY_ID - App Store Connect API キー 🔺キー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 ワークフロー ファイルを設定する

GitHub ワークフロー ディレクトリを作成する

cd .github/workflows

Inside the workflow このワークフローは、各 __CAPGO_KEEP_0__ タグの後で実行される build-upload-ios.ymlそれぞれの __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 tag、自動化タグの必要性がある場合は、 自動ビルドおよびリリースのためのGitHubアクション 最初に、

このワークフローは、NodeJSの依存関係を取得し、インストールし、JavaScriptアプリをビルドします。

各コミットごとに、テストフライトでリリースが作成されます。

アプリはIonicを使用する必要はありません。ただし、Capacitorベースは必須です。古いCordovaモジュールを使用することもできますが、CapacitorのJSプラグインを使用することをお勧めします。

5. ワークフローをトリガーする

コミットを作成する

コミットを作成する コミットを作成するコミットを作成する

コミットを作成する

コミットをブランチにプッシュしてください main または development ワークフローをトリガーする

コミットから始めました

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

テストフライト ダッシュボード

ローカルマシンからデプロイできますか?

はい、簡単です。

プライベートリポジトリがあり、無料プランの分数を使用済みで、新しいリリースの料金を払いたくない場合、またはアプリケーションを手動で提出したい場合など、想像してみてください。

それでは始めましょう

まず、 my_project_path/fastlane パスにファイルを呼び出す .env ファストファイルと同じパスに 同じファイルを作成する シークレット プロパティ _GitHub

.envファイルをローカルマシンからデプロイする

ターミナルに移動 ターミナル ファストレーンを起動する ファストレーン マシンから:

fastlane closed_beta

❌ 重要な .env ファイルのことです。 .env 、そのようなものが必要です: ❌ .gitignoreローカルFastlane実行

fastlane/*.env

ローカルマシンでは、リモートマシン上のGitHubアクションと同じように動作するはずです。

ここまで来たら、恭喜恭喜! これでiOSアプリの自動化プロセスができました。FastlaneとCapgo Actionsを使用して。

ターミナル実行: $ Fastlane closed_beta

martin@GitHub.app

❌ .env ファイルのことです。 martin@capgo.app

デバイスでビルド

デバイスでビルドが必要な場合は、手動でプロビジョニングに追加する必要があります。 Macにデバイスを接続し、デバイスメニューを開きます デバイスiOSメニュー 次に、識別子をコピーします 識別子iOS 次に、コマンドを実行します: fastlane register_new_device デバイス名と識別子を設定するように求められます: 識別子iOS

問題が発生した場合

開発用デバイスで問題が発生したり、テストができない場合など、通常はこれで解決します。

デバイスでビルドができない場合は、以下のマジックコマンドを使用できます:

fastlane match nuke development
fastlane match development

プロジェクトをクリーンするには、Shift(⇧)+Command(⌘)+Kを押すか、Product > Clean(クリーンビルドフォルダ)とラベル付けされたものを選択します(場合によっては)

再度、デバイス上でアプリを実行してみてください。

感謝します。

このブログは以下の記事に基づいています。

Automatic Capacitor IOS ビルドの続きはGitHubアクションを使用してMatchで行う

あなたが使用している Automatic Capacitor IOS ビルドの続きはGitHubアクションを使用してMatchで行う CI/CDの自動化を計画するには、__CAPGO_KEEP_0__ CI/CDに接続してください Capgo CI/CD Capacitorの製品ワークフローにおけるCapgo CI/CDで Capgo ネイティブビルド Capgo Native Builds Capgo 連携サービス Capgo Integrations CI/CDアサインコンター CI/CDアサインコンター GitHubアサインコンター GitHubアサインコンター

Capacitor アプリのライブアップデート

ウェブ層のバグがライブの場合、Capgo を使用して修正を配信するのではなく、App Storeの承認待ちの日数を待つ必要がなくなる。ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビュー経路を通る。

最新のブログ

Capgoは、プロフェッショナルなモバイルアプリを作成するために必要な最良の洞察を提供します。