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

自動Capacitor IOS ビルドにGitHubアクションを使用してマッチ

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

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

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

コンテンツマーケター

自動Capacitor IOS ビルドにGitHubアクションを使用してマッチ

自動iOSビルドにGitHubアクションを使用してマッチ

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

現在、__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を設定する

手動設定ガイド

CI/CDを自分で設定したい場合は、以下の手順に従ってください:

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

前提条件

チュートリアルを続ける前に…

  • Fastlaneがインストールされていることを確認してください 開発マシンに iOS開発者プログラムの会員資格
  • 読むことができる欲求…
  • 多くの開発者がいるチームの場合、
  • より簡単なワークフローで使用することをお勧めします。 価格について重要なこと 価格「__CAPGO_KEEP_0__」アクション

https://__CAPGO_KEEP_0__.com/features/actions

Price GitHub Action

https://github.com/features/actions

サービスは ‘無料’ である限り、選択したマシンに依存します。
次に、 macOS マシンを使用します。スクリーンショットに表示されている価格と制限 (価格はこのチュートリアルの作成時点のものであり、将来の変更が可能です) を確認できます。

🔴 要件と価格については注意を呼びかけてから、続ける場合はどうですか?

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

では、始めましょう!

この記事で説明する手順

  1. App Store Connect API を使用してFastlane Match
  2. 必要なもの
  3. App Store Connect API キーを作成する
  4. App Store Connect API キーを使用する
  5. ファストレーンファイルをコピー
  6. ファストレーンマッチを設定
  7. ファストレーンマッチを設定

1. App Store Connect API をファストレーンマッチと組み合わせて使用する

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

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

要件

App Store Connect API を使用するには、ファストレーンが必要な 3 つのものがあります。 three もの

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

App Store Connect API キーの作成

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

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

2 — "ユーザーとアクセス"を選択する App Store Connectユーザーアクセス.

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

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

App Store Connect API Integration

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

API キーを作成する App Store Connect

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

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

6 — アクセスセクションで、キーのロールを選択してください。キーのロールは、チームのユーザーに適用されるロールと同じです。詳しくは ロールの権限を参照してください。 あなたのチームの管理者を選択することをお勧めします。.

7 — __CAPGO_KEEP_0__ キーを生成するボタンをクリックしてください。

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

新しいキーの名前、キーのID、ダウンロード用リンク、他に情報が表示されます。

__CAPGO_KEEP_0__ キーをダウンロードする App Store Connect

必要な情報はすべてここで取得できます。
<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 記事 が役に立ちます。

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

App Store Connect証明書

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

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__シークレットの設定

Set GitHub secrets

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_USERNAMEGIT_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_USERTEMP_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 closed_beta

Fastlaneと__CAPGO_KEEP_0__ Actionsを使用してiOSアプリの完全自動化プロセスを実現しました。

GitHub

Google Playコンソールのベータチャネルで毎回コミットを送信するたびにリリースが作成されます。 martin@capgo.app

martin@__CAPGO_KEEP_0__.app

デバイスでビルドする デバイスでビルドする必要がある場合は、手動でプロビジョニングに追加する必要があります。 デバイスをMacに接続し、デバイスメニューを開きます。 デバイスのiOSメニューを探す 識別子をコピーします。 fastlane register_new_device 識別子を探すiOS 次に、以下のコマンドを実行します。

デバイス名と識別子を設定するよう求められます。

識別子を設定するiOSの場合、問題が発生した場合にどうすればいいですか。

あなたを救う魔法のコマンドが存在します:

fastlane match nuke development
fastlane match development

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

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

ありがとうございます。

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

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

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

今すぐ始めましょう

ブログの最新記事

Capgo を使用すると、プロフェッショナルなモバイル アプリを作成するために必要な最良の洞察を得ることができます。