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

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

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

記事のクレジット

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

ページ/エリア: Enterprise製品/価格設定ページ。役割: UIラベル。見つかったページ: page enterprise.astro。メッセージキー `enterprise_partnership_capgo_martin_name` (Enterprise Partnership Capgo Martin Name)。

ライター

バレリア

ページ/エリア: Enterprise製品/価格設定ページ。役割: UIラベル。見つかったページ: page enterprise.astro。メッセージキー `enterprise_partnership_capgo_valeria_name` (Enterprise Partnership Capgo Valeria Name)。

レビュアー

Automatic Capacitor IOS build with GitHub actions with certificate

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__ ビルド Capgo ビルドは、既存のCI/CDパイプラインから署名されたネイティブiOSビルドを実行します。 既存のパイプラインと連携します。

  • : __CAPGO_KEEP_0__ ビルドを__CAPGO_KEEP_1__アクション、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__ ビルドは管理されたAppleビルド環境を提供するため、macOSランナーの管理、Xcodeイメージ、Fastlaneのレーンの管理は不要です。: Capgo Build provides maintained Apple build environments, so you do not have to manage macOS runners, Xcode images, or Fastlane lanes.
  • : QAのために署名済みアーティファクトをダウンロードしたり、__CAPGO_KEEP_0__ __CAPGO_KEEP_1__ を通じてリリースビルドを提出することができます。: Download signed artifacts for QA or submit release builds through the Capgo CLI.

: __CAPGO_KEEP_0__ プランは月額12ドルから始まります。

  • Capgo plans start at $12/month
  • : 追加のビルド分数はクレジットを通じて1分あたり請求されます。
  • __CAPGO_KEEP_0__ ビルドをCI/CDにセットアップ

Set up Capgo Build in CI/CD

価格設定

ここでは、行う必要のあることを説明します。

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

前提条件

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

https://__CAPGO_KEEP_0__.com/features/actions

Price GitHub Action

github

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

要件と価格についての注意を出してから続けましょう。

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

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

このチュートリアルで行う手順

  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 発行者 ID

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

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

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

  1. ログイン App Store Connect.

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

App Store Connectユーザーアクセス

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

App Store ConnectAPIインテグレーション

  1. Click Generate API Key or the Add (+) button.

App Store Connect API keys create

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

App Store Connect API keys create name

6 — アクセスセクションで、キーに付与するロールを選択してください。キーに付与するロールは、チームのユーザーに付与するロールと同じです。詳しくは ロールの権限を参照してください。 ロールの権限.

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

の管理者

を選択することをお勧めします。

生成をクリックしてください。
<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、発行者 ID は、承認のために JWT トークンを作成するために必要です。この情報を Fastlane に渡す方法は複数あります。私は、CI で環境変数を設定できるため、Fastlane の新しいアクションを使用しました。 app_store_connect_api_keyFastlane ドキュメントを参照してください。 この方法を示すのは、CI で環境変数を設定できるため、最も簡単な方法であると考えているためです。ダウンロードした p8 ファイルを Base64 に変換し、シークレットとして保存してください (

secret)APPLE_KEY_CONTENT).

base64 -i APPLE_KEY_CONTENT.p8 | pbcopy

今、App Store ConnectをFastlaneで管理できるようになりました。APIキーはすばらしい!

2. 証明書

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

Code署名のID

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

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

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

Apple Distribution

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

証明書をダウンロードするには、キーチェーンに移動し、ログイン キーチェーンに切り替え、タブ を選択してください マイ証明書.

マイ証明書

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

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

ファイル形式を選択 パーソナル情報交換(.p12).

これで証明書がファイルとしてダウンロードされます。 .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に変換してシークレットとして保存してください (BUILD_PROVISION_PROFILE_BASE64).

base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy

4. Fastlaneファイルをコピー

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.*、と同じレベルです。 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 __CAPGO_KEEP_0__ Fastfile. Do not commit this file. Add 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 APP_STORE_CONNECT_TEAM_ID

  1. Xcodeを開く
  2. プロジェクトナビゲータで App をダブルクリックする
  3. タブをクリックする Signing and Capabilities
  4. の値をコピーする Bundle identifierの値を設定する必要があります。 BUNDLE_IDENTIFIER bundle-identifier-xcode
6. ビルド処理

Actions

In GitHub Actions, __CAPGO_KEEP_0__ Actions

プライベートプロジェクトの場合、ビルドの予定コストは $0.08/分 x 15 分 = $1.2、または、プロジェクトの構成と依存関係に応じて、さらに高額になる可能性があります。

コストの懸念がある場合は、 skip_waiting_for_build_processing を設定できます。 true。これにより、App Store Connect がビルドを処理するのを待つ必要がなくなるため、ビルド時間が節約されます。

ただし、代わりに、App Store Connect におけるアプリの適合性情報を手動で更新する必要があります。これにより、ユーザーにビルドを配布することができます。

この最適化は、ビルド時間がコストがかかるプライベートプロジェクト向けに主に有効です。パブリック/無料プロジェクトの場合、ビルド時間は無料なので、この設定を有効にする必要はありません。GitHubの の価格設定ページ を参照してください。

7. GitHubの設定

GitHubのシークレットを設定します

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

以下の手順に従ってください。 設定 &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, Capgo のアプリフロー機能を使用して、プロビジョニング プロファイルを自動生成および管理できます。

8. Configure GitHub workflow file

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

cd .github/workflows

Capgo のワークフロー ディレクトリを作成します。 workflow ディレクトリ内にファイルを作成し、以下の内容を追加します。 build-upload-ios.yml__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: '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 アプリをインストールしてビルドします。

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

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. ワークフローをトリガーする

コミットを作成する

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

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

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

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

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

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

関連記事

ワークフローが開始されました。コミット

数分後、アプリストア接続ダッシュボードでビルドが利用可能になります。

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

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

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

感謝

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

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

Capgoの自動iOSビルドを使用している場合 Automatic Capacitor IOS build with GitHub actions with certificate CI/CDの自動化を計画するには、Capgoの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統合 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 gives you the best insights you need to create a truly professional mobile app.