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

証明書を使用した自動Capacitor IOSビルドとGitHubアクション

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

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

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

コンテンツマーケター

証明書を使用した自動Capacitor IOSビルドとGitHubアクション

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

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

Capgo Build for CI/CD by Capgo

__CAPGO_KEEP_0__ ビルドは、既存のCI/CDパイプラインから署名されたネイティブiOSビルドを実行します。 Capgo Build __CAPGO_KEEP_0__ ビルドを__CAPGO_KEEP_1__アクション、GitLab CI、Jenkins、またはローカルスクリプトから、Webビルド後にトリガーしてください。

  • __CAPGO_KEEP_0__: Trigger Capgo Build from GitHub Actions, GitLab CI, Jenkins, or local scripts after your web build and npx cap sync.
  • CIシークレットから署名: App Store Connectのキー、証明書、プロビジョニングプロファイル、パスワード、チームIDをCIシークレットに保管してください。
  • ネイティブランナーのメンテナンスなし: Capgo BuildはAppleのビルド環境を管理しているので、macOSランナー、Xcodeイメージ、またはFastlaneのレーンを管理する必要がありません。
  • アーティファクトと提出: QAで署名されたアーティファクトをダウンロードしたり、Capgo CLIを通じてリリースビルドを提出することができます。

価格

  • : Capgo プランは月額$12から始まります。
  • 含まれるもの
  • : OTA更新と約15回のネイティブビルドが含まれます。

Set up Capgo Build in CI/CD

__CAPGO_KEEP_0__ BuildをCI/CDに設定するには

ここでは何が必要ですか:

iOS用のFastlaneとGitHubアクション、証明書の連続的な配信

前提条件

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

  • __CAPGO_KEEP_0__がインストールされていることを確認してください 開発環境にインストール iOS開発者プログラムのメンバーであることを確認してください
  • 価格に関する重要な情報

価格:__CAPGO_KEEP_0__アクション

https://GitHub.com/features/actions

https://github.com/features/actions

無料 __CAPGO_KEEP_0__に基づいて選択したマシンに応じて、制限まで
App Store Connectを使用します macOS スクリーンショットに表示されている価格と制限(チュートリアルの作成時点での価格、将来の変更に注意)

要件と価格について注意した後、続きます

注:この投稿では、App Store Connectでアプリを作成していることを前提としています。Fastlaneによって重要な情報がコピーされます。

このチュートリアルで学ぶこと

この投稿で従う手順

  1. App Store Connect APIとFastlaneを使用する
    • 必要なもの:
      • App Store Connect API Keyを作成する
      • App Store Connect API キーを使用する
  2. Fastlane ファイルをコピーする
  3. GitHub アクションを設定する

1. App Store Connect API を使用する

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

要件

FastlaneがApp Store Connect APIを使用してアプリをアップロードできるようにするには、以下の3つの情報を提供する必要があります。 3 もの

  1. 発行者ID
  2. Key ID
  3. Key file or Key content

App Store Connect API Keyの取得

App Store Connectでキーを生成するには、Adminの権限が必要です。権限がない場合は、この記事を参照してもらうように指示してください。

  1. ログイン App Store Connect.

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

App Store Connectユーザーアクセス

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

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

  1. 「Generate API Key」または「Add (+)」ボタンをクリック

App Store Connect API keys create

  1. キーを作成する際の名前を入力してください。キーを作成する際の名前は、キー自体とは無関係です。

App Store Connect API keys create name

6 — キーにアクセスする権限を選択してください。チームのメンバーに与えられる権限と同じ権限がキーに適用されます。詳しくは 役割の権限をご覧ください。 キーを作成する際は.

  1. App manager

An API key’s access cannot be limited to specific apps.

Click Generate。

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

ページに表示される新しいキー名、キーID、ダウンロードリンク、他に必要な情報がすべて入手できます。
<1> 問題 ID。 (APPLE_ISSUER_ID <2> キー ID。 (
<3> 「__CAPGO_KEEP_0__ キーをダウンロードする」ボタンをクリックして、__CAPGO_KEEP_1__ プライベート キーをダウンロードしてください。ダウンロード リンクは、プライベート キーがまだダウンロードされていない場合にのみ表示されます。Apple はプライベート キーを保持していないため、ダウンロードすることができます。ただし、プライベート キーは一度だけダウンロードできます。APPLE_KEY_ID プライベート キーを安全な場所に保存してください。キーを共有しないでください。キーを __CAPGO_KEEP_0__ リポジトリに保存しないでください。クライアントサイドの __CAPGO_KEEP_1__ にキーを含めないでください。
<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.

🔴 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.

Using an App Store Connect API Key

The API Key file (p8 file that you download), the key ID, and the issuer ID are required in order to create the JWT token for authorization. There are multiple ways that this information can be passed into Fastlane. I chose to use the Fastlane’s new action app_store_connect_api_keyを参照してください。 この方法を示すのは、CI で最も多く使用できるようにするためです。環境変数を設定できる CI であれば、最も簡単な方法です。ダウンロードした p8 ファイルを Base64 に変換して、シークレットとして保存してください。

Please convert the p8 file that you download to Base64 and store it as a secret (APPLE_KEY_CONTENT).

base64 -i APPLE_KEY_CONTENT.p8 | pbcopy

Now we can manage the App Store Connect with Fastlane using the API key, great!

2. 証明書

Open XCode and go to 設定 > アカウント > Apple ID > チーム とチームを選択してください。

Code の署名の特性

クリックしてください 証明書を管理.

__CAPGO_KEEP_0__の証明書がまだ作成されていない場合は、新しい証明書を作成できます。

クリックしてください + と選択 Apple Distribution

Apple Distribution

次に、キーチェーンに移動して証明書をファイルとしてダウンロードする必要があります。 .p12 これを行うには、キーチェーンに移動し、ログイン

キーチェーンに切り替え、ログイン keychainに切り替え tabに切り替え 私の証明書.

私の証明書

次に、ダウンロードしたい証明書を選択してください。 (証明書の日付で検索してください)

そして、証明書のプライベートキーに右クリックして選択してください エクスポート.

ファイル形式を選択してください パーソナル情報交換(.p12).

これが証明書をダウンロードする .p12 ファイル。

ファイルを開いて、以下のコマンドを使用してBase64に変換してください。

base64 -i BUILD_CERTIFICATE.p12 | pbcopy

これがあなたの BUILD_CERTIFICATE_BASE64 秘密です。 また、証明書のパスワードを尋ねられたときは、パスワードを提供してください。このパスワードはあなたの P12_PASSWORD __CAPGO_KEEP_0__.

3. プロビジョニングプロファイル

オープン Apple Developer と、適切なチームを選択してください。

次に、新しいプロファイルを作成するには、 +

新しいプロファイルを作成

と、適切なチームを選択してください。 App Store Connect.

App Store Connectを選択

次に、適切なアプリを選択する必要があります。注意してください。ワイルドカードを使用すると署名が失敗する可能性があります。

適切なアプリを選択

先ほど作成した適切な証明書を選択し、有効期限の日付を確認してください (有効期限の日付は今日と同じ日と月でなければなりません) そしてクリックしてください Continue.

適切な証明書を選択してください

最後にプロファイルの名前を入力し、クリックしてください Generate.

プロファイルの名前は、Fastlane の値の下でプロファイルを識別するために使用されます。 APPLE_PROFILE_NAME.

プロファイルを生成

プロファイルを Base64 に変換し、シークレットとして保存してください ( .mobileprovision 4. Fastlane のファイルをコピーしてください

プロファイルをダウンロードすることができます。

プロファイルをダウンロードBUILD_PROVISION_PROFILE_BASE64).

base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy

4. Copy Fastlane files

RubyライブラリのFastlaneは、モバイル開発の一般的なタスクを自動化するために作成されました。Fastlaneを使用すると、カスタムの「レーン」を設定できます。これらの「レーン」は、通常Android Studioを使用して実行するタスクを実行する「アクション」のシリーズです。Fastlaneを使用できますが、このチュートリアルの目的のために、このチュートリアルでは、コアアクションの少数のセットのみを使用します。

Create the Fastlane folder at the root of your Capacitor/Ionic project and add the Fastfile there:

  • フォルダ: <project-root>/fastlane/
  • ファイル: <project-root>/fastlane/Fastfile

このレベルは package.json, capacitor.config.*、と同じです。 ios/ フォルダを作成しないでください。 ios/App/.

platform :ios do
  desc 'Export ipa and submit to TestFlight'
  lane :beta do
    keychain_info = { keychain_name: "ios-build-#{Time.now.to_i}.keychain", keychain_password: SecureRandom.uuid }
    
    begin
      setup_signing(keychain_info)
      bump_build_number
      build_app_with_signing(keychain_info)
      submit_to_testflight
    ensure
      cleanup_keychain(keychain_info)
    end
  end

  private_lane :setup_signing do |options|
    create_keychain(
      name: options[:keychain_name],
      password: options[:keychain_password],
      unlock: true,
      timeout: 0,
      lock_when_sleeps: false, 
      add_to_search_list: true
    )
    import_cert(options)
    install_profile
    update_project_settings
  end

  lane :bump_build_number do
		file = File.read('../package.json')
		data_hash = JSON.parse(file)
		api_key = app_store_connect_api_key(
      key_id: ENV['APPLE_KEY_ID'],
      issuer_id: ENV['APPLE_ISSUER_ID'],
      key_content: ENV['APPLE_KEY_CONTENT'],
      is_key_content_base64: true,
      duration: 1200,
      in_house: false
    )
		build_num = app_store_build_number(
      api_key: api_key,
			app_identifier: ENV['BUNDLE_IDENTIFIER'],
			live: false
    )
		build_num = build_num + 1
		UI.message("Bumped build number to #{build_num}")
		increment_build_number(
			build_number: build_num,
			xcodeproj: "./ios/App/App.xcodeproj",
			skip_info_plist: true
		)
	end

  private_lane :import_cert do |options|
    cert_path = "#{Dir.tmpdir}/build_certificate.p12"
    File.write(cert_path, Base64.decode64(ENV['BUILD_CERTIFICATE_BASE64']))
    import_certificate(
      certificate_path: cert_path,
      certificate_password: ENV['P12_PASSWORD'] || "",
      keychain_name: options[:keychain_name],
      keychain_password: options[:keychain_password],
      log_output: true
    )
    File.delete(cert_path)
  end  
  
  private_lane :cleanup_keychain do |options|
    delete_keychain(
      name: options[:keychain_name]
    )
  end  

  private_lane :install_profile do
    profile_path = "#{Dir.tmpdir}/build_pp.mobileprovision"
    File.write(profile_path, Base64.decode64(ENV['BUILD_PROVISION_PROFILE_BASE64']))
    UI.user_error!("Failed to create provisioning profile at #{profile_path}") unless File.exist?(profile_path)
    ENV['PROVISIONING_PROFILE_PATH'] = profile_path
    install_provisioning_profile(path: profile_path)
    File.delete(profile_path)
  end

  private_lane :update_project_settings do
    update_code_signing_settings(
      use_automatic_signing: false,
      path: "./ios/App/App.xcodeproj",
      code_sign_identity: "iPhone Distribution",
      profile_name: ENV['APPLE_PROFILE_NAME'],
      bundle_identifier: ENV['BUNDLE_IDENTIFIER'],
      team_id: ENV['APP_STORE_CONNECT_TEAM_ID']
    )
    update_project_team(
      path: "./ios/App/App.xcodeproj",
      teamid: ENV['APP_STORE_CONNECT_TEAM_ID']
    )
  end

  private_lane :build_app_with_signing do |options|
    unlock_keychain(
      path: options[:keychain_name],
      password: options[:keychain_password],
      set_default: false
    )
    build_app(
      workspace: "./ios/App/App.xcworkspace",
      scheme: "App",
      configuration: "Release",
      export_method: "app-store",
      output_name: "App.ipa",
      export_options: {
        provisioningProfiles: {
          ENV['BUNDLE_IDENTIFIER'] => ENV['APPLE_PROFILE_NAME']
        }
      },
      xcargs: "-verbose",
      buildlog_path: "./build_logs",
      export_xcargs: "-allowProvisioningUpdates",
    )
  end   

  private_lane :submit_to_testflight do
    api_key = app_store_connect_api_key(
      key_id: ENV['APPLE_KEY_ID'],
      issuer_id: ENV['APPLE_ISSUER_ID'],
      key_content: ENV['APPLE_KEY_CONTENT'],
      is_key_content_base64: true,
      duration: 1200,
      in_house: false
    )
    pilot(
      api_key: api_key,
      skip_waiting_for_build_processing: true,
      skip_submission: true,
      distribute_external: false,
      notify_external_testers: false,
      ipa: "./App.ipa"
    )
  end
end

5. シークレットの設定

GitHub Actions uses the repository secrets you configure in the next step. You only need a local .env ローカルテストのために、

の横に <project-root>/fastlane/.env を作成してください。 Fastfileこのファイルをコミットしないようにしてください。 fastlane/.env に追加 .gitignore 最初のファイル(または既に無視されていることを確認)します。ここに例があります。

APP_STORE_CONNECT_TEAM_ID=UVTJ336J2D
BUNDLE_IDENTIFIER=ee.forgr.testfastlane
# See previous section for these secrets
BUILD_CERTIFICATE_BASE64=
BUILD_PROVISION_PROFILE_BASE64=
APPLE_KEY_ID=
APPLE_ISSUER_ID=
APPLE_KEY_CONTENT=
P12_PASSWORD=
APPLE_PROFILE_NAME=

APP_STORE_CONNECT_TEAM_IDを取得する

Developer Center に移動し セクションまでスクロールします。 Membership details 必要な値は Team ID シークレットの APP_STORE_CONNECT_TEAM_ID app-store-connect-team-id

BUNDLE_IDENTIFIERを取得する

Getting the BUNDLE_IDENTIFIER

  1. Xcodeを開く
  2. プロジェクトナビゲータで、 App プロジェクトナビゲータで
  3. タブをクリックしてください Signing and Capabilities
  4. CI/CDワークフローを実行するのに必要な Bundle identifierApp Store Connectに設定する値です。 BUNDLE_IDENTIFIER __CAPGO_KEEP_0__
6. ビルド処理

Capgoのアクションで、

In GitHub Actions,

For private projects, the estimated cost per build can go up to $0.08/min x 15 mins = $1.2, or more, depending on the configuration and dependencies of your project.

or more, depending on the configuration and dependencies of your project. skip_waiting_for_build_processing If you’re concerned about costs for private projects, you can set trueto

. This will save build minutes by not waiting for App Store Connect to finish processing the build.

This optimization is mainly useful for private projects where build minutes cost money. For public/free projects, the build minutes are free so there’s no need to enable this setting. See GitHub’s This optimization is mainly useful for private projects where build minutes cost money. For public/free projects, the build minutes are free so there’s no need to enable this setting. See __CAPGO_KEEP_0__’s pricing page

7. Setup GitHub Actions

7. GitHubの設定

__CAPGO_KEEP_0__のシークレットをファイルからコピーし、__CAPGO_KEEP_0__リポジトリのシークレットに貼り付けます。 .env GitHub

設定 &gt; シークレットと変数 &gt; アクション &gt; 新しいリポジトリシークレット __CAPGO_KEEP_0__-secrets

github-secrets

2. BUILD_CERTIFICATE_BASE64 __CAPGO_KEEP_0__のシークレットをファイルからコピーし、__CAPGO_KEEP_0__リポジトリのシークレットに貼り付けます。

3. BUILD_PROVISION_PROFILE_BASE64 - Base64 エンコードされたプロビジョニング プロファイル。

4. BUNDLE_IDENTIFIER - アプリのバンドル ID。

5. APPLE_KEY_ID — App Store Connect API キー 🔺キー ID。

6. APPLE_ISSUER_ID — App Store Connect API キー 🔺発行者 ID。

7. APPLE_KEY_CONTENT — App Store Connect API キー 🔺キー内容 .p8, 確認してください

8. GitHub ワークフロー ファイルを設定する

Create a GitHub workflow directory.

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: '3.0'
          bundler-cache: true
      - uses: maierj/fastlane-action@v3.1.0
        env:
          APP_STORE_CONNECT_TEAM_ID: ${{ secrets.APP_STORE_CONNECT_TEAM_ID }}
          BUNDLE_IDENTIFIER: ${{ secrets.BUNDLE_IDENTIFIER }}
          BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
          BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
          APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
          APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
          APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }}
          P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
          APPLE_PROFILE_NAME: ${{ secrets.APPLE_PROFILE_NAME }}
        with:
          lane: ios beta
      - name: Upload release bundle
        uses: actions/upload-artifact@v6
        with:
          name: ios-release
          path: ./App.ipa
          retention-days: 10

このワークフローは、各GitHub後にトリガーされるべきです。 タグタグを自動化する必要がある場合は、 自動ビルドとリリースにGitHubアクションを使用します。 最初に。

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

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

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

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

コミットを作成する

コミットを作成する Create a Commitリポジトリ内でアクティブなワークフローを確認できます。

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

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

コミットで始まる

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

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

9. ローカルマシンからデプロイすることはできますか?

はい、できます。簡単です。

Xcode を使用してアプリをビルドおよび署名できます。いつもと同じです。

CI/CD セットアップ ガイド

代替CI/CDプラットフォーム

リアルタイム更新 & デプロイ

感謝

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

自動Capacitor IOS ビルドから、GitHubアクションと証明書とともに続けます

自動__CAPGO_KEEP_0__ IOS ビルドと__CAPGO_KEEP_1__アクションと証明書を使用している場合 自動Capacitor IOS ビルドとGitHubアクションと証明書を使用している場合 CI/CDの自動化を計画する場合、__CAPGO_KEEP_0__ CI/CDと接続します Capgo CI/CDの製品ワークフロー Capgoネイティブビルドの製品ワークフロー Capgo統合の製品ワークフロー Capgo統合の製品ワークフロー Capgo Integrations CI/CDの自動化を計画する場合、Capgo CI/CDと接続します __CAPGO_KEEP_0__ CI/CDの製品ワークフロー CI/CD統合の実装詳細について GitHub アクション統合 for the implementation detail in GitHub Actions Integration.

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

Capgo を通して、ウェブ層のバグが生じた場合、修正を待つ必要がなくなる。アプリストアの承認待ちの日数を省き、ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビュー経路で

今すぐ始める

ブログの最新記事

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