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

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

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

記事のクレジット

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

ライター

バレリア

レビュアー

ジョーダン

エディター

マッチを使った自動Capacitor iOS ビルドのGitHubアクション

マッチを使った自動GitHub iOS ビルドの__CAPGO_KEEP_1__アクション

CapacitorアプリのCI/CD設定は複雑で時間がかかることがあります。ここでは、必要なことを知っておくことがおすすめです。

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

Capgo Build for CI/CD by Capgo

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

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

料金

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

Capgo ビルドのセットアップ

手動セットアップガイド

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

Fastlane と GitHub Actions を使用した iOS の継続的デリバリー

前提条件

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

  • 開発環境に Fastlane がインストールされていること iOS 開発者プログラムのメンバーであること 読む気分です…
  • Extra build minutes are billed by minute through credits
  • Set up __CAPGO_KEEP_0__ Build in CI/CD
  • 多くの開発者がチームを組む場合、別のオプションとしては fastlane cert シンプルなワークフローを実現するために

価格について重要な注意事項

価格 GitHub アクション

https://github.com/features/actions

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

🔴 価格や要件については注意しておきました。続けたい場合は、続きます…

📣 このチュートリアルでは、iTunes Connectでアプリを作成し、Appleのエコシステムの証明書を取得していることを前提としています。Fastlaneで全てをコピーします!

Let's dive in

この記事の手順

  1. App Store Connectの使用APIとFastlane Match
  2. 必要なもの
  3. App Store ConnectのAPIキーを作成する
  4. App Store ConnectのAPIキーを使用する
  5. Fastlaneファイルをコピーする
  6. Fastlane matchを設定する

1. App Store ConnectのAPIとFastlane Matchを使用する

2021年2月以降、すべてのユーザーがApp Store Connectにサインインするには、2要素認証または2段階認証が必要になります。Apple IDの追加セキュリティ層により、自分のアカウントにアクセスできるのはあなただけであることを保証します。
から Appleサポート

matchを始めるには、既存の証明書を取り消す必要があります。ただし、心配する必要はありません。新しい証明書は直接取得できます。

要件

App Store Connect API を使用するには、Fastlane が必要なのは 3 つです。 発行者ID

  1. キーID
  2. キーファイルまたはキー内容
  3. App Store Connect __CAPGO_KEEP_0__ キーの作成

Creating an App Store Connect API Key

1 — App Store Connect にログインする

App Store Connect __CAPGO_KEEP_0__.

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

App Store Connect ユーザー アクセス

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

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

4 — Generate API キーまたは追加 (+) ボタンをクリック

App Store Connect API キーを作成

5 — キーの名前を入力します。名前はあなたの参照用であり、キー自体の部分ではありません。

App Store Connect API キーを作成した名前

6 — アクセス下で、キーのロールを選択します。キーのロールは、チームのユーザーに適用されるロールと同じです。詳細は ロールの権限を参照してください。キーのロールを アプリマネージャー.

7 — Generate をクリックします。

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

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

App Store Connect ダウンロードキー

ここで必要な3つの情報をすべて取得できます。
1. Issue ID
2. Key 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 に含めることはできません。

API キーを使用する

API キー (ダウンロードした p8 ファイル)、キーアイディ、発行者 ID が JWT トークンを作成するために必要です。Fastlane の新しいアクションを使用して、これらの情報を Fastlane に入力する方法は複数あります。 app_store_connect_api_key. iOSアプリの自動ビルドのためのCapacitorのGitHubアクションをMatchで使う Fastlaneのドキュメント. CIで環境変数を設定できるので、最も簡単な方法だと思います。

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

2. Fastlaneファイルをコピー

Fastlaneは、Android Studioで実行することができるiOSアプリの開発タスクを自動化するRubyライブラリです。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の__CAPGO_KEEP_0__署名の新しいアプローチです。Fastlane Matchは、iOSアプリの必要な証明書とプロビジョニングプロファイルを管理するチームに簡単にできるようにします。 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 の個人アカウントまたは組織で。

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

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" のファイルが生成されます。 Matchfile ページ/エリア: Capgo マーケティング ウェブサイト。役割: ショート UI ラベルまたはナビゲーション アイテム。見つける場所: page trust.astro。メッセージ キー `and` (And)。 _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の認証トークンを生成するのに役立つかもしれません。

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

App Store Connect 証明書

最後に、リリース構成のアプリのプロビジョニング プロファイルをアップデートするために、Xcode で project XCode 証明書

いくつかの注意事項があります 💡

MATCH

CI/CD が証明書とプロビジョニング プロファイルをインポートするには、証明書リポジトリにアクセスできる必要があります。

あなたは、プライベート リポジトリにアクセスまたは読み取り専用のリポジトリにアクセスできるスコープを持つパーソナル アクセス トークンを生成することでこれを行うことができます。

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に変数が設定され、ファイルにハードコードするのではなく、代わりに使用されます。

ビルド処理

In GitHub Actions, ご利用時間に基づいて請求されます。 CI/CD ワークフローを実行するのに使用した分数に基づいて請求されます。実際の経験から、App Store Connect でビルドを処理するには約 10–15 分かかります。

プライベート プロジェクトの場合、ビルドあたりの推定コストは $0.08/分 x 15 分 = $1.2 となります。 、または、プロジェクトの構成または依存関係に応じて、さらに多くかかる可能性があります。私がプライベート プロジェクトの価格設定について懸念しているのと同じ懸念を持っている場合は、を維持できます。

の設定 skip_waiting_for_build_processing の秘密鍵 true.

の依存関係

の構成 の依存関係.

3. Setup GitHub Actions

Configure GitHub secrets

Ever wonder where the values of the ENV are coming from? Well, it’s not a secret anymore – it’s from your project’s secret.

Set GitHub secrets

1. APP_STORE_CONNECT_TEAM_ID - the ID of your App Store Connect team in you’re in multiple teams.

2. DEVELOPER_APP_ID - in App Store Connect, go to the app - - your app’s bundle identifier. General Information - the ID of your Developer Portal team if you’re in multiple teams. Apple ID.

3. DEVELOPER_APP_IDENTIFIER - the Apple ID or developer email you use to manage the app.

4. DEVELOPER_PORTAL_TEAM_ID &amp;

5. FASTLANE_APPLE_ID - the Apple ID or developer email you use to manage the app.

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://__CAPGO_KEEP_0__.com/***/fastlane_match.git) https://github.com/***/fastlane_match.git)

4. GitHub のワークフロー ファイルを設定します。

GitHub ワークフロー ディレクトリを作成してください。

cd .github/workflows

その workflow フォルダの中に、ファイル名を 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 タグの後でトリガーされます。タグを自動化する必要がある場合は、まず Automatic build and release with GitHub actions を参照してください。

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

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

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

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

コミットを作成する

コミットする 、あなたはリポジトリでアクティブなワークフローを確認することができます。ワークフローをトリガーする

ブランチに新しいコミットをプッシュする

または main Capgoの製品やブランド、開発者用の用語をそのままにしながら、CapgoのUIの長いマーケティングまたは法的文章を表示します。 development ワークフローをトリガーする

コミットの開始

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

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

ローカルマシンから配布できるか?

はい、できます。とても簡単です。

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

それでは始めましょう

まず、ファイルを作成する必要があります。 my_project_path/fastlane ファイル名は .env です。 Fastfile と同じパスに置いてください。 同じ環境を設定できます。 path a file called my_project_path/fastlane secret _GitHub

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

現在、ローカルマシンからデプロイするための.envファイル ターミナル ローカルマシンからデプロイするためのFastlane ❌ .envファイルの重要なこと .envファイル

fastlane closed_beta

.gitignoreに追加する必要があるのは、データを公開したくないからです。 ❌ .envファイルの重要なこと .envファイル .gitignoreに追加する必要があるのは、データを公開したくないからです。

fastlane/*.env

GitHub Actionsからリモートマシンで実行されるように同じように動作するようにする

ローカルFastlane実行

ターミナル実行: $ Fastlane closed_beta

あなたがここまで来てくれたら、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 アクションを使用して Match を使用して進めましょう

自動 __CAPGO_KEEP_0__ IOS ビルドの __CAPGO_KEEP_1__ アクションを使用して Match を使用して進めましょう 自動 Capacitor IOS ビルドの GitHub アクションを使用して Match を使用して進めましょう __CAPGO_KEEP_0__ CI/CD Capgo CI/CD Capgo Native Builds Capgo Native Builds Capgo Integrations Capgo Integrations for the product workflow in Capgo Integrations, CI/CD Integration CI/CD統合の実装詳細について GitHub Actions統合 for the implementation detail in GitHub Actions Integration.

Capacitor アプリのリアルタイム更新

Capgo アプリのリアルタイム更新の場合、ウェブ層のバグが生じた場合、Capgo を通じて修正を配信するのではなく、数日間待ってアプリストアの承認を待つ必要はありません。ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビュー経路を通じて進みます。

マーティンによる人間のサポート

今すぐ始めよう

最新のブログ記事

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