メインコンテンツにスキップ
CI/CD

自動 Capacitor IOS ビルドと GitHub アクションの証明書

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

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

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

コンテンツマーケター

自動 Capacitor IOS ビルドと GitHub アクションの証明書

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

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

Capgo Build for CI/CD by Capgo

CI/CDの自動化をスキップする Capgo Build __CAPGO_KEEP_0__ Buildは、既存のCI/CDパイプラインからiOSの署名されたネイティブビルドを実行します。

  • __CAPGO_KEEP_0__ Buildは、パイプラインと連携して動作します。: Capgo Buildは、Webビルド後にGitHub Actions、GitLab CI、Jenkins、またはローカルスクリプトからトリガーされます。 npx cap sync.
  • : CIシークレットから署名: App Store Connectのキー、証明書、プロビジョニングプロファイル、パスワード、チームIDをCIシークレットに保持します。
  • : __CAPGO_KEEP_0__ Buildは、macOSランナー、Xcodeイメージ、Fastlaneのレーンの管理を提供するため、ネイティブランナーの管理をスキップできます。: Capgo Buildは、署名されたアーティファクトをダウンロードしたり、Capgo __CAPGO_KEEP_1__を通じてリリースビルドを提出できます。
  • __CAPGO_KEEP_0__ __CAPGO_KEEP_1__Capgo CLI

料金

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

Capgo ビルドを CI/CD にセットアップする

手動セットアップガイド

ここでは、必要な手順を説明します。

GitHub アクションと証明書を使用して、Fastlane と iOS の継続的デリバリー

チュートリアルに進む前に、以下の事項を確認してください。

__CAPGO_KEEP_0__ をインストールしてください。

  • Fastlane インストール済み 開発用マシン上で。
  • iOS開発者プログラムのメンバーであることを確認してください。

価格に関する重要な情報

価格 GitHub アクション

https://github.com/features/actions

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

要件と価格についての注意を与えられたら、続けてください。

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

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

この記事で従う手順

  1. Using App Store Connect API with Fastlane
    • 要件:
      • Creating an App Store Connect API Key
      • Using an App Store Connect API Key
  2. Fastlaneのファイルのコピー
  3. Configure GitHub Actions

1. Using App Store Connect API with Fastlane

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

Requirements

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

  1. エアストエア
  2. アイストエア
  3. アイストエアに反たらにを読しだ

Obtaining an App Store Connect API Key

エアストエアを为だらとアイストエアを为だらとアイストエアに反たらにを読しだ

  1. エアストエアを読しだらとアイストエアを为だらとアイストエアに反たらにを読しだ Log in to App Store Connect.

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

App Store Connect ユーザー アクセス

3 — インテグレーション タブを選択してください。

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

  1. 「Generate API Key」または「+」ボタンをクリックしてください。

App Store Connect API キーを作成

  1. __CAPGO_KEEP_0__ キーの名前を入力してください。名前はあなたの参考用であり、キー自体の部分ではありません。

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

6 — アクセス下で、キーに対するロールを選択してください。キーに対するロールは、チームのユーザーに対するロールと同じです。詳しくは ロールの権限をご覧ください。ロールを「」で選択することをお勧めします App manager.

  1. Click Generate.

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

__CAPGO_KEEP_1__の名前、キーID、ダウンロードリンク、他情報がページに表示されます。

App Store Connectダウンロードキー

必要な3つの情報をすべてここから取得できます。
<1> Issue ID. (APPLE_ISSUER_ID secret)
<2> Key ID. (APPLE_KEY_ID secret)
<3> APIキーをダウンロードするには、「ダウンロードAPIキー」をクリックしてください。ダウンロードリンクは、プライベートキーがまだダウンロードされていない場合にのみ表示されます。Appleはプライベートキーを保管していないため、ダウンロードすることができます。

🔴 プライベートキーを安全な場所に保存してください。キーを共有しないでください、codeリポジトリにキーを保存しないでください、またはクライアントサイドのcodeにキーを含めないでください。

App Store ConnectのAPIキーを使用します。

API キー ファイル(ダウンロードしたp8ファイル)、キーアイデンティティ、発行者IDは、認証用のJWTトークンを作成するために必要です。この情報をFastlaneに渡す方法は複数あります。私はFastlaneの新しいアクションを使用しました。 app_store_connect_api_keyCIで最も多く使用されている方法を紹介します。Fastlaneのドキュメントを参照してください。 Fastlaneのドキュメントを参照してください。CIで最も多く使用されている方法を紹介します。Fastlaneのドキュメントを参照してください。

CIで最も多く使用されている方法を紹介します。Fastlaneのドキュメントを参照してください。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!

Fastlaneを使用してApp Store Connectを管理することができます。__CAPGO_KEEP_0__ キーを使用して、素晴らしいことです!

2. 証明書 XCodeを開き、設定>アカウント>Apple IDを選択してください。 > 設定 > アカウント > チーム とチームを選択してください。

Code の署名の特性

Click on 証明書を管理.

証明書を作成していない場合は、証明書を作成できます。

Click on + と選択 Apple Distribution

Apple Distribution

次に、キーチェーンに移動して証明書をファイルとしてダウンロードする必要があります。 .p12 Then you need to go to keychain to download the certificate as a file.

To do so, you need to go to __CAPGO_KEEP_0__ and switch to the __CAPGO_KEEP_1__ login __CAPGO_KEEP_0__ My Certificates.

My Certificates

Then you can select the certificate you want to download. (Look by the date of the certificate)

And then right-click on the private key on the certificate and select Export.

Choose the file format Personal Information Exchange (.p12).

That will download the certificate as a __CAPGO_KEEP_2__. .p12 __CAPGO_KEEP_0__

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

base64 -i BUILD_CERTIFICATE.p12 | pbcopy

これはあなたの BUILD_CERTIFICATE_BASE64 秘密です。 また、質問されたときは、証明書のパスワードをご提供ください。このパスワードはあなたの P12_PASSWORD 秘密です。

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

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

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

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

をクリックしてください。 と、.

App Store Connectを選択

正しいアプリを選択してください。ワイルドカードを使用すると署名が失敗する可能性があるため、注意してください。

正しいアプリを選択

前に作成した正しい証明書を選択してください(有効期限の日付を確認してください。今日の日付と月と同じでなければなりません)そして Continue.

正しい証明書を選択

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

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

プロファイルを生成

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

ダウンロードするプロファイル

プロファイルをBase64に変換し、シークレットとして保存してください(BUILD_PROVISION_PROFILE_BASE64).

base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy

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

Fastlaneは、Android開発の一般的なタスクを自動化するために作成されたRubyライブラリです。Fastlaneを使用すると、カスタムの「レーン」を構成できます。これらの「レーン」には、「アクション」が含まれます。これらの「アクション」は、通常Android Studioを使用して実行するタスクを実行します。Fastlaneを使用できますが、このチュートリアルの目的のために、このチュートリアルでは、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 秘密。

__CAPGO_KEEP_0__

アプリストア接続チームIDを取得する

  1. Xcodeを開く
  2. プロジェクトナビゲータでダブルクリック App プロジェクトナビゲータで
  3. タブをクリック Signing and Capabilities
  4. プロジェクトナビゲータで Bundle identifier値をコピーする。 この値は、 BUNDLE_IDENTIFIER 秘密。
Xcodeのアプリ識別子

6. ビルド処理

In GitHub Actions、 あなたはCI/CDワークフローの実行に費やした分数に基づいて請求されます。 私の経験によると、App Store Connectでビルドが処理されるまでに約10~15分かかります。 プライベートプロジェクトの場合、ビルドあたりの推定コストは$0.08/分×15分=$1.2、またはそれ以上になります。 依存関係やプロジェクトの構成に応じて、

コストの懸念がある場合は、を設定できます。 これにより、App Store Connectがビルドを処理するのを待たずにビルド分数を節約できます。 ただし、代償として、App Store Connectでアプリの法的情報を手動で更新する必要があります。 これにより、ユーザーにビルドを配布できるようになります。この最適化は、ビルド分数がコストがかかるプライベートプロジェクト向けに主に役立ちます。 公開/無料プロジェクトの場合、ビルド分数は無料なので、この設定を有効にする必要はありません。 __CAPGO_KEEP_0__の

価格設定ページを参照してください skip_waiting_for_build_processing pricing page trueIn __CAPGO_KEEP_0__ Actions、

you are billed based on the minutes

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 For private projects, 詳細についてはこちらを参照してください。

7. GitHub の設定

GitHub のシークレットを設定

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

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

github-secrets

2. BUILD_CERTIFICATE_BASE64 __CAPGO_KEEP_0__-secrets

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 ワークフロー ファイルを構成します。

GitHub ワークフロー ディレクトリを作成します。

cd .github/workflows

フォルダの中に、ファイルを作成し、次の内容を追加してください。 workflow texts build-upload-ios.ymltexts

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モジュールを含むことができますが、Capacitor JS プラグインが推奨されます。

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

コミットを作成する

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

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

ブランチに新しいコミットをプッシュする 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を通して修正を配信するのではなく、数日間待ってアプリストアの承認を待つのではなく。ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビューのパスを通る。

Get Started Now

ブログの最新記事

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