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

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

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

記事のクレジット

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

ライター

バレリア

レビュアー

ジョーダン

編集者

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

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

__CAPGO_KEEP_0__ ビルドを使用することをお勧めします。 Capgo ビルドと Capgo CLI を使用します。 既存のCapacitor Actionsパイプラインを維持しているチーム向けに、このFastlaneガイドを残していますが、新しい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__ ビルド Capgo ビルドは、既存のCI/CDパイプラインから署名されたネイティブiOSビルドを実行します。 既存のパイプラインと互換性があります。

  • : __CAPGO_KEEP_0__ ビルドを __CAPGO_KEEP_1__ Actions、GitLab CI、Jenkins、またはローカルスクリプトから、Webビルド後にトリガーします。: 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_KEEP_0__ ビルドは、macOSランナーやXcodeイメージ、Fastlaneのレーンの管理を必要とせず、維持されたAppleビルド環境を提供します。: Capgo __CAPGO_KEEP_1__ を使用して、署名済みアーティファクトをQAでダウンロードしたり、リリースビルドを提出したりできます。
  • 価格: Download signed artifacts for QA or submit release builds through the Capgo CLI.

: OTA更新と約15回のネイティブビルドを含みます。

  • Capgo plans start at $12/month
  • __CAPGO_KEEP_0__ ビルドをCI/CDに設定
  • 手動設定ガイド

Set up Capgo Build in CI/CD

ネイティブビルドの数は約15回/月です。

ここでは、実行する必要のあるものを紹介します。

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

前提条件

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

https://__CAPGO_KEEP_0__.com/features/actions

Price GitHub Action

https://github.com/features/actions

'無料 制限まで、選択したマシンに応じて
使用するのは macOS マシンの価格と制限(価格はこのチュートリアルを作成した時点のもので、将来の変更に応じて異なる場合があります)が見ることができます

価格や要件について注意した後、続きましょう

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

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

この投稿で従う手順

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

1. App Store Connect API をファストレーンで使用する

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

要件

ファストレーンがApp Store Connect API を使用してアプリをアップロードできるようにするには、以下のものが必要です。 3 もの:

  1. 発行者ID
  2. __CAPGO_KEEP_0__ ID
  3. __CAPGO_KEEP_0__ ファイルまたは __CAPGO_KEEP_0__ 内容

App Store Connect API キーの取得

App Store Connect __CAPGO_KEEP_0__ キーを生成するには、App Store Connect での Admin 権限が必要です。権限がない場合は、この記事を参照してもらうことをお勧めします。

  1. ログイン App Store Connect.

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

App Store Connect ユーザー アクセス

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

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

  1. API キーを生成するか、または (+) ボタンをクリックしてください。

App Store Connect API keys create

  1. キーを作成する際の名前を入力してください。名前はあなた自身の記録用であり、キー自体には含まれません。

App Store Connect API keys create name

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

  1. 権限を付与することをおすすめします。

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

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

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

新しいキー名、キーID、ダウンロードリンク、他に必要な情報が表示されます。
1. Issue ID. (APPLE_ISSUER_ID 秘密)
2. Key ID. (APPLE_KEY_ID 秘密)
3. "Download API Key" をクリックして、API プライベート キーをダウンロードします。プライベート キーがダウンロードされていない場合のみダウンロード リンクが表示されます。Apple はプライベート キーを保持していないため、ダウンロードは一度だけ行えます。

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

App Store Connect API Key の使用

API Key ファイル (ダウンロードした p8 ファイル)、キーアイデンティティ、発行者 ID は、承認用 JWT トークンの作成に必要です。この情報を Fastlane に渡す方法は複数あります。私は、環境変数を設定できる CI で最も簡単に動作する方法である Fastlane の新しいアクションを使用しました。 app_store_connect_api_keyFastlane ドキュメント を参照してください。 Fastlane のドキュメントを参照してください。ダウンロードした p8 ファイルを Base64 に変換して、秘密 (

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. 証明書

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

Codeの署名のID

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

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

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

Apple Distribution

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

キーチェーンに切り替え、次にタブ を選択してください してください My Certificates.

My Certificates

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

右クリックして証明書の秘密鍵を選択し、 エクスポート.

ファイル形式を選択 パーソナル インフォメーション エクスポート (.p12).

証明書をBase64形式の .p12 ファイルとしてダウンロードします。

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

base64 -i BUILD_CERTIFICATE.p12 | pbcopy

これがあなたの BUILD_CERTIFICATE_BASE64 シークレットになります。 また、証明書のパスワードを求められた場合、証明書のパスワードを入力してください。このパスワードはあなたの P12_PASSWORD 秘密。

3. 設定プロファイル

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

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

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

そして、 App Store Connect.

App Store Connectを選択

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

適切なアプリを選択

適切な証明書を選択してください (有効期限の日付は今日と同じ日と月でなければなりません)。 続行.

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

最後にプロファイルの名前を入力し、 生成.

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

プロファイルを生成

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

プロファイルをBase64に変換し、秘密鍵として保存してください (

4. FastlaneファイルをコピーBUILD_PROVISION_PROFILE_BASE64).

base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy

4. Copy Fastlane files

Fastlaneは、Rubyライブラリで、モバイル開発の一般的なタスクを自動化するために作成されました。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.*、と同じです。フォルダを作成してください。CapgoプロジェクトのルートディレクトリにFastlaneフォルダを作成し、そこにFastfileを追加してください。 ios/ 5. シークレットの設定 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

Capgo Actionsは、次のステップで設定したリポジトリシークレットを使用します。ローカルファイルは必要ありません。ローカルでFastlaneを実行したりテストしたい場合は、ローカルファイルを作成してください。

GitHub Actions uses the repository secrets you configure in the next step. You only need a local .env フォルダ:

ファイル: <project-root>/fastlane/.env このレベルは Fastfile. Do not commit this file. Add fastlane/.env に追加しないでください .gitignore to your

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=

に追加する

first (or verify it is already ignored). Here is an example: 最初の (またはすでに無視されていることを確認してください)。 以下の例を参照してください。 Getting the APP_STORE_CONNECT_TEAM_ID Membership details APP_STORE_CONNECT_TEAM_IDを取得する Team ID Go to APP_STORE_CONNECT_TEAM_ID Developer Center

Developer Center

and scroll down to section. The is the value you need to set in the secret. app-store-connect-team-id Getting the BUNDLE_IDENTIFIER

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

bundle-identifier-xcode

In GitHub Actions, Actions 実行時間に基づいて課金されます。CI/CD ワークフローを実行するのに使用した分数に基づいて課金されます。私の経験によると、App Store Connectでビルドが処理されるまでに約10-15分かかります。

プライベートプロジェクトの場合、ビルドの予想コストは1分あたり$0.08 x 15分 = $1.2、またはそれ以上になります。 1分あたり$0.08 x 15分 = $1.2、または、プロジェクトの構成と依存関係に応じて、さらに多くかかります。

コストの懸念がある場合は、プライベートプロジェクトの場合にビルドのコストを節約できます。 skip_waiting_for_build_processing to true(Live Update Dynamic Label To)

ビルド時間を節約するには、App Store Connectの処理が完了するのを待たずにビルドを実行できます。

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 この最適化は、ビルド時間がコストのかかるプライベートプロジェクト向けに主に有効です。無料のプロジェクトの場合、ビルド時間は無料なので、この設定を有効にする必要はありません。詳しくは__CAPGO_KEEP_0__の (Native Build Builder Build Minutes)

7. Setup GitHub Actions

7. GitHubの設定

秘密をコピーして .env GitHubからファイルを

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

github-secrets

2. BUILD_CERTIFICATE_BASE64 Base64エンコードされた証明書

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

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

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

6. APPLE_ISSUER_ID — App Store Connect API キー 🔺Issuer ID。

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

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

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

cd .github/workflows

フォルダの中に、ファイルを作成し、以下を追加します。 workflow check it build-upload-ios.yml8. Configure __CAPGO_KEEP_0__ workflow file

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の後でトリガーされるべきです。 タグタグを自動化する必要がある場合は、 Automatic build and release with GitHub actions 最初に参照してください。

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

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

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

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

コミットを作成する

コミットする 変更、リポジトリ内でアクティブなワークフローを確認します。

ワークフローをトリガーします。

ブランチに新しいコミットをプッシュします。 main または development Capacitorライブアップデートの代替手段を比較するページ。Capacitorライブアップデートの代替手段を比較するページ。

Appflowの比較/移行マーケティングコピー。Appflowの比較/移行マーケティングコピー。

Capawesomeの比較ページ。Capawesomeの比較ページ。

Capgoのコンサルティングサービスページ。Capgoのコンサルティングサービスページ。

Appflowの比較/移行マーケティングコピー。

ワークフローをトリガーします。

コミットで始めました。

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

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

ライブ更新 &amp; デプロイ

感謝

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

Keep going from Automatic Capacitor IOS build with GitHub actions with certificate

あなたが使用している場合 Automatic Capacitor IOS build with GitHub actions with certificate CI/CD オートメーションを計画するには、__CAPGO_KEEP_0__ CI/CD Capgo CI/CD for the product workflow in Capgo CI/CD, Capgo Native Builds for the product workflow in Capgo Native Builds, Capgo Integrations for the product workflow in Capgo Integrations, CI/CD統合 CI/CD統合の実装詳細について GitHub Actions統合 for the implementation detail in GitHub Actions Integration.

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__を使用して修正を配信し、アプリストアの承認待ちの日数を待たずに。ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビュー経路を通じて。

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

ページ/エリア: Capgoのマーケティングウェブサイト。役割: ショートUIラベルまたはナビゲーションアイテム。見つかった場所: コンポーネント GetStarted.astro。メッセージキー `get_started_now` (Get Started Now)。

Capgo gives you the best insights you need to create a truly professional mobile app.