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

自動Capacitor IOS ビルドとGitHub アクションの使用によるマッチ

5分以内に、fastlaneとGitHub Actionsを使用してIOS IonicアプリのCI/CDパイプラインを設定する方法 (2022)

記事のクレジット

マーティン・ドナディュー

ライター

バレリア

レビュアー

ジョーダン

エディター

自動Capacitor iOS ビルドの作成に GitHub アクションを使用して Match を実行

自動 iOS ビルドの作成に GitHub アクションを使用して Match を実行

CI/CD の設定は Capacitor アプリケーションに時間と労力を要します。ここでは、必要な情報をご紹介します。

今後は __CAPGO_KEEP_0__ ビルドを使用することをお勧めします。 Capgo ビルドと Capgo CLI を使用して、ネイティブ Capgo ビルドを実行 この Fastlane Match ガイドは、既存の Capacitor アクションのパイプラインを維持しているチーム向けに残されていますが、新しい iOS ビルドの場合は、__CAPGO_KEEP_1__ __CAPGO_KEEP_2__ を使用することをお勧めします。これにより、Fastlane、Match リポジトリ、Xcode ランナー、証明書、アップロードスクリプトの管理を自分で行う必要がなくなります。 This Fastlane Match 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, Match repositories, Xcode runners, certificates, and upload scripts yourself.

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

ジョーダン Capgo ビルド CI/CD パイプラインから署名済みネイティブiOSビルドを実行します:

  • CI/CD パイプラインと一緒に機能します: Capgo ビルドを GitHub Actions、GitLab CI、Jenkins、またはローカルスクリプトからトリガーします。ウェブビルド後に npx cap sync.
  • CIシークレットから署名: App Store Connect キー、証明書、プロビジョニングプロファイル、パスワード、チームIDをCIシークレットに保持します。
  • ネイティブランナーのメンテナンスなし: Capgo ビルドはAppleのビルド環境を維持しているので、macOSランナー、Xcodeイメージ、Fastlane、またはMatchリポジトリを管理する必要がありません。
  • アーティファクトと提出: QA用に署名済みアーティファクトをダウンロードしたり、Capgo CLIを通じてリリースビルドを提出します。

価格

  • : Capgo プランは月額12ドルから始まります
  • 月次のOTA更新と約15のネイティブビルドを含みます。
  • 追加のビルド時間は、分単位でクレジットを通じて請求されます。

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

手動セットアップガイド

ここで行う必要があります:

FastlaneとGitHubアクションを使用したiOSの継続的デリバリー

前提条件

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

  • 開発環境にFastlaneが インストールされている iOS開発者プログラムの会員である
  • iOS 開発者プログラムの会員です。
  • 読みたい欲求…😆…
  • 多くのエンジニアがいるチームでは、代わりに ファストレーン証明書 を使用することをお勧めします。

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

価格 GitHub アクション

https://github.com/features/actions

サービスは、選択したマシンに応じて、一定の制限まで無料です。
ここでは、 macOS マシンを使用します。スクリーンショットでは、その価格と制限(このチュートリアルの作成時点での価格、将来の変更があってもかまいません)が確認できます。

🔴 要件や価格についての注意を述べた後、続ける場合はどうぞ…

📣 In the post we assume that we have the app created in iTunes connect, we do have the certificates of the Apple ecosystem, everything will be copied by Fastlane!

Let's dive in

ブログ記事の手順

  1. App Store Connectの使用APIとFastlane Match
  2. Requirements
  3. App Store ConnectAPIの作成
  4. App Store ConnectAPIの使用
  5. Fastlaneファイルのコピー
  6. Fastlane matchの設定

1. App Store ConnectAPIとFastlane Matchの使用

2021年2月以降、すべてのユーザーがApp Store Connectにサインインするには、2要素認証または2段階認証が必要になります。この追加のセキュリティ層により、Apple IDのアクセス権を保証するのに役立ちます。
From Apple Support

matchの始め方

要件

App Store Connectの設定に必要なのはAPI 3つ Issuer ID

  1. Key ID
  2. キーアイデンティティ
  3. App Store Connectの__CAPGO_KEEP_0__ Keyの作成

Creating an App Store Connect API Key

2 —

3 — App Store Connect.

2 — 選択 ユーザーとアクセス.

App Store Connectユーザーアクセス

3 — Integrationタブを選択してください。

App Store ConnectAPI統合

4 — Generate API KeyまたはAddボタンをクリックしてください。

App Store ConnectAPIキーを作成

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

App Store ConnectAPIキーを作成する名前

6 — アクセスセクションで、キーに対するロールを選択してください。キーに対するロールは、チームのユーザーに対するロールと同じです。詳細は ロールの権限. Capgo では、以下のことをお勧めします。 アプリマネージャー.

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

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

__CAPGO_KEEP_0__ キーの新しい名前、キーアイディ、ダウンロードリンク、他に関する情報がページに表示されます。

App Store Connect ダウンロードキー

ここで、必要な3つの情報をすべて取得できます。
<1> 問題 ID.
<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 キーを使用する

CapgoのAPIキーファイル(ダウンロードしたp8ファイル)、キーID、発行者IDが必要です。これらの情報をFastlaneにインプットする方法は複数ありますが、Fastlaneの新しいアクションを使用して app_store_connect_api_key. これらの方法を他の方法で学ぶことができます。 Fastlaneドキュメント. この方法を紹介するのは、CIで最も簡単に作業できる方法だと思ったからです。

今、App Store ConnectのAPIキーでFastlaneを管理できます。すばらしい!

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

Fastlaneは、Android Studioで実行することができる、モバイル開発タスクを自動化するRubyライブラリです。Fastlaneを使用すると、カスタムの「レーン」を構成できます。これらのレーンには、複数の「アクション」が含まれます。これらのアクションは、通常、Android Studioで実行するタスクを実行します。Fastlaneを使用すると、多くのことが実行できますが、このチュートリアルでは、コアアクションのいくつかを使用することになります。

プロジェクトのルートディレクトリにFastlaneフォルダを作成し、次のファイルをコピーしてください。

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

Fastfile

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"])

Appfile

Fastlaneを設定する Fastlane iOSのcode署名に新しいアプローチです。Fastlane matchは、iOSアプリの必要な証明書とプロビジョニングプロファイルを管理するチームに簡単にします。

新しいプライベートリポジトリを作成します。 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 があります。 _git_url_そして

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

HTTPSの証明書リポジトリのURLに設定する必要があります。オプションでSSHを使用することもできますが、別のステップで実行する必要があります。

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

もし全て順調であれば、以下のようなものが見えるはずです:

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

もし GitHub と必要な権限で問題が発生した場合は、この 投稿 がgitの認証トークンを生成するのに役立つかもしれません。

生成された証明書とプロビジョニングプロファイルは、証明書リポジトリのリソース

App Store Connect証明書

最後に、 project Xcode

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

XCode証明書

いくつかの注意事項 💡

MATCH

In GitHub、以下の手順に従ってください。 設定 → 開発者設定 → パーソナルアクセストークン → クリック Generate New Token → チェック repo スコープ → するとクリック Generate token.

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

パーソナルアクセストークンが生成されます。後で環境変数として使用します。 GIT_TOKEN.

次に、Fastlane フォルダ内の生成されたマッチファイルを置き換えます。 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に変数が設定されます。

ビルド処理

CapgoのGitHubアクション あなたは分数に基づいて請求されます。 プライベートプロジェクトの場合、ビルドの予定コストは$0.08/分×15分=$1.2

、または、プロジェクトの構成または依存関係に応じて、さらに高くなります。 Live Updateの「to」Live Updateの製品ページ。ロール:短いUIラベルまたはナビゲーションアイテム。

何が問題か?ビルドが処理された後、App Store Connectでアプリの準拠性を手動で更新する必要があります。そうしないと、ユーザーにビルドを配布できません。 skip_waiting_for_build_processing to true.

価格

3. Capgoの__CAPGO_KEEP_0__アクションの設定 pricing.

CapgoのGitHubアクションの設定

GitHub のシークレットを設定

値の出所は何なのか気になることはありませんか? ENV 値はプロジェクトのシークレットから取得されます。

GitHub のシークレットを設定

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

2. DEVELOPER_APP_ID - App Store Connect からアプリを選択し、 - アプリ情報 - 下部のセクションに移動し、 General Information - アプリのバンドル ID Apple ID.

3. DEVELOPER_APP_IDENTIFIER - 複数のチームに所属している場合は、

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 キー 🔺キーアイディー。

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

フォルダの中に workflow ファイルを作成し、以下の内容を追加する 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

Automatic build and release with GitHub actions を参照してください。次に、このワークフローはNode.jsの依存関係を取得し、JavaScriptアプリケーションをビルドする Configure GitHub workflow file first.

Inside the folder, create a file named and add the following.

各コミットを送信するたびに、テストフライトでリリースが作成されます。

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

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

コミットを作成する

作成する 、コミット、コミットを送信すると、リポジトリでアクティブなワークフローが表示されます。

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

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

コミットが開始されました

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

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

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

はい、簡単です。

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

それでは始めましょう

まず、ファイルを作成する必要があります。 my_project_path/fastlane ファイル名は .env です。 .env, ファイル名は .env です。 Fastfile, iOS用Capacitorの自動ビルドをGitHub Actionsで実行する 秘密 _GitHubのプロパティの例

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

ここに移動してください ターミナル このマシンから Fastlane ❌ .envファイルについて

fastlane closed_beta

このデータを公開したくないので、.envファイルに追加する必要があります .env このデータを公開したくないので、.envファイルに追加する必要があります .gitignore, 以下のようになります: ❌

fastlane/*.env

ローカルマシン上で、リモートマシン上の GitHub Actions と同じように動作するようにする必要があります。 🍻

ローカルFastlane実行

ターミナル実行: $ Fastlane closed_beta

ここまで来たら、congratulations、Fastlaneと GitHub Actionsを使用してiOSアプリの完全自動化プロセスを持っていることになります。

毎回コミットを送信すると、Google Playコンソールのベータチャンネルでリリースが作成されます。 このブログを改善するために、フィードバックや質問、提案がある場合は、メールでご連絡ください。 martin@capgo.app

デバイス上でビルド

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

問題が発生した場合

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

問題を解決するための魔法のコマンドがあります:

fastlane match nuke development
fastlane match development

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

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

感謝します。

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

Automatic Capacitor IOS ビルドから、GitHub アクションを使用してマッチングする

Capacitor の自動 IOS ビルドから、Match を使用したアクションで進めましょう オートメーション Capacitor IOS ビルドと GitHub アクションのマッチング Capacitor の CI/CD Capgo CI/CD Capgoの製品ワークフローにおけるCapgo CI/CDで Capgo 自然ネイティブビルド Capacitorの製品ワークフローにおけるCapgoネイティブビルドのために Capgo 連携機能 Capacitorの製品ワークフローでCapgo統合 CI/CD統合 CI/CD統合の実装詳細については GitHub アクション統合 CI/CD統合の実装詳細についてはGitHub アクション統合

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

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

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

コンテキスト: Capgo マーケティング ウェブサイト。役割: サポートする説明文またはメタ説明文。見つかった場所: コンポーネント GetStarted.astro。Capgo の製品/ブランド名と開発者用語を完全に保持します。

マーティンから人間のサポート

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