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

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

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

記事のクレジット

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

ライター

バレリア

レビュアー

ジョーダン

エディター

自動 Capacitor IOS ビルドの GitHub アクションの __CAPGO_KEEP_2__

CI/CDの設定は Capacitor アプリケーションに複雑で時間のかかる作業です。ここでは、必要なことを知っておくことが重要です。

今後は、__CAPGO_KEEP_0__ ビルドと __CAPGO_KEEP_1__ __CAPGO_KEEP_2__ を使用することをお勧めします。 Capgo Capgo で CLI をビルド このFastlaneガイドは、既存の Capacitor Actionsパイプラインを維持しているチーム向けに残されていますが、新しい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 CI/CD用ビルドに Capgo を使用

__CAPGO_KEEP_0__ ビルド Capgo ビルド CI/CD Pipeliningを使用して、iOSネイティブビルドを自動化します。

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

価格

  • Capgo プランは 1 か月あたり 12 ドルから
  • 自動 OTA 更新と約 15 つのネイティブ ビルド毎月
  • 分単位でクレジットを通じて課金される追加ビルド時間

CI/CDでCapgoビルドを設定

手動設定ガイド

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

iOS向け継続的デリバリーのFastlaneとGitHubアクション、証明書

前提条件

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

  • Fastlaneが開発環境にインストールされていることを確認 installed 価格に関する重要な情報
  • 重要な情報について

重要な情報

価格 GitHub アクション

https://github.com/features/actions

サービスは ‘無料’ 制限まで無料ですが、選択したマシンに依存します。
このチュートリアルでは、macOSマシンを使用します。スクリーンショットには価格と制限が表示されています (価格はこのチュートリアルの作成時点のもので、将来の変更が可能です) macOS 注意: この投稿では、App Store Connectでアプリを作成していることを前提としています。重要な情報はFastlaneによってコピーされます。

このチュートリアルで学びます

この投稿で従う手順

__CAPGO_KEEP_0__

__CAPGO_KEEP_0__

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

1. App Store Connectを使用してAPIをFastlaneで使用する

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

必要なもの

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

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

App Store ConnectのAPIキーを取得する

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

  1. ログイン アプリストア接続.

  2. ユーザーとアクセス App Store Connectユーザーアクセス.

users

3 —

App Store Connect API Integration

  1. Capgoでキーを生成するには、"Generate API Key"ボタンをクリックしてください。

App Store Connect API キーを作成

  1. App Store Connect

App Store Connect API キーを作成します。

Enter a name for the key. App Store Connectを生成します。 6 —.

  1. role permissions

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

新しいキー名、キーID、ダウンロードリンク、他に関する情報がページに表示されます。

App Store Connectダウンロードキー

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

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

App Store ConnectAPIキーを使用する

APIキーファイル(ダウンロードしたp8ファイル)、キーID、発行者IDは、承認のためにJWTトークンを作成するために必要です。この情報をFastlaneに渡す方法は複数あります。私はFastlaneの新しいアクションを使用しました。 app_store_connect_api_keyFastlaneのアクションの他に Fastlane ドキュメント. 私はこの方法を示します。私はCIの多くで環境変数を設定できるため、最も簡単な方法だと思います。

p8ファイルをダウンロードしたものをBase64に変換し、シークレットとして保存してください(APPLE_KEY_CONTENT).

base64 -i APPLE_KEY_CONTENT.p8 | pbcopy

Fastlaneを使用してApp Store Connectを管理できるようになりました。APIキーは素晴らしいものです!

2. 証明書

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

Code署名のID

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

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

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

Apple Distribution

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

そのためには、キーチェーンにアクセスし、 ログイン キーチェーンのタブに移動し、 マイ・サertificate.

マイ・サertificate

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

次に、証明書のプライベートキーに右クリックし、 エクスポート.

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

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

ファイルを開いて、ターミナルで以下のコマンドを実行して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スタジオで実行するタスクを実行します。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は、次のステップで設定するリポジトリシークレットを使用します。ローカルに .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を取得する

Go to セクションまでスクロールします。 必要な値は、 Membership details section Team ID value APP_STORE_CONNECT_TEAM_ID 秘密。

App Store Connect チーム ID

BUNDLE IDENTIFIER を取得する

  1. Xcode を開く
  2. プロジェクトナビゲータでダブルクリック App プロジェクトナビゲータで
  3. タブをクリック Signing and Capabilities
  4. 値をコピーする。 これは、Xcode で設定する必要がある値です。 Bundle identifierBUNDLE IDENTIFIER (Xcode) BUNDLE_IDENTIFIER 秘密。
6. ビルド処理

targetLanguage

GitHub アクションで あなたは使用した分数に基づいて請求されます。 プライベートプロジェクトの場合、ビルドあたりの推定コストは

$0.08/分 x 15分 = $1.2 、または、プロジェクトの構成と依存関係に応じて、さらに高くなります。コストの懸念がある場合は、

を設定できます。これにより、App Store Connectがビルドを処理するのを待たずにビルド時間を節約できます。 skip_waiting_for_build_processing to trueこの最適化は、ビルド時間がコストがかかるプライベートプロジェクト向けに主に有効です。無料のパブリックプロジェクトでは、ビルド時間は無料なので、この設定を有効にする必要はありません。__CAPGO_KEEP_0__の

価格設定ページ

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

7. GitHub Actionsの設定

GitHub のシークレットを設定

ファイルからシークレットをコピーし、__CAPGO_KEEP_0__ リポジトリのシークレットにペーストしてください。 .env ファイルとGitHubリポジトリのシークレットに貼り付けてください。

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

github-シークレット

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

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

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

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

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

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

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

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

cd .github/workflows

Inside the workflow ファイルを作成し、CapacitorのiOSビルドを自動化するGitHubアクション 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

Capgoのワークフローは、各GitHub後にトリガーされるべきです。 タグ自動化タグの場合、以下のリンクを参照ください。 自動ビルドとリリースの実行に GitHub アクションを使用します。 最初。

ノードJSの依存関係を取得し、インストールし、JavaScriptアプリケーションをビルドします。

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

Your App doesn’t need to use Ionic, only Capacitor base is mandatory., it can have old Cordova module, but Capacitor JS plugin should be preferred.

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

作成するコミット

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

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

新しいコミットをブランチにプッシュする main または development HTMLテキストのフラグメント

Capacitorライブアップデートの代替

ページ/エリア:Capacitorライブアップデートの代替比較ページ。役割:長いマーケティングまたは法的文章。見つける:ページalternatives.astro。Capgo製品/ブランドと開発者用語を完全に保持する。

HTMLテキストのフラグメント

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

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

Xcodeを使用してアプリをビルドおよび署名することができます。

CI/CD設定ガイド

自動化iOSビルドGitHubアクション

ライブアップデートとデプロイ

感謝

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

自動CapacitoriOSビルドからGitHubアクションと証明書で続ける

あなたが使用している 自動CapacitoriOSビルドからGitHubアクションと証明書で続ける CI/CDの自動化を計画するには、__CAPGO_KEEP_0__ CI/CDに接続する Capgo CI/CD Capgo CI/CDの製品ワークフロー Capgoネイティブビルド Capgoネイティブビルドの製品ワークフロー Capgo 連携 Capgo 連携の製品ワークフローに CI/CD 連携 __CAPGO_KEEP_0__ アクション連携 GitHub アクション連携の実装詳細 Capacitorの実装詳細については、GitHub Actions統合です。

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__ を使用して修正を配信するのではなく、App Store の承認待ちの日数を待たずに。ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビュー パスに残ります。

コンテキスト:Capgo マーケティング ウェブサイト。役割:サポートする説明文またはメタ説明文。見つける場所:コンポーネント GetStarted.astro。Capgo の製品/ブランド名と開発者用語をそのまま保存。メッセージキー `instant_updates_for_capacitor_apps_description` (Capacitor アプリの即時更新の説明)。

マーティンから人間のサポートを受けます。

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