__CAPGO_KEEP_0__の自動__CAPGO_KEEP_1__ビルドと証明書
CI/CD

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

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

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

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

コンテンツマーケター

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

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

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

Capgo Build for CI/CD by Capgo

CI/CD用に__CAPGO_KEEP_1__でビルド Capgo Build __CAPGO_KEEP_0__ ビルド

  • 既存のCI/CDパイプラインから実行される署名済みネイティブiOSビルド:: Trigger Capgo Build from GitHub Actions, GitLab CI, Jenkins, or local scripts after your web build and npx cap sync.
  • __CAPGO_KEEP_0__ ビルドを__CAPGO_KEEP_1__ Actions、GitLab CI、Jenkins、またはローカルスクリプトからトリガーするCIシークレットから署名
  • App Store Connectのキー、証明書、プロビジョニングプロファイル、パスワード、チームIDをCIシークレットに保持ネイティブランナーの維持をせずに済むようにする:Capgo ビルドは、macOSランナー、Xcodeイメージ、またはFastlaneレーンの管理を提供しているため
  • アーティファクトと提出: Capgo と CLI を使用して QA 用に署名済みアーティファクトをダウンロードしたり、リリースビルドを提出したりします。

価格

  • Capgo プランは 1 か月あたり 12 ドルから始まります。
  • __CAPGO_KEEP_0__ で OTA 更新と約 15 個のネイティブ ビルドが含まれます。
  • __CAPGO_KEEP_0__ の追加ビルド分数は、分単位でクレジットを使用して請求されます。

Capgo ビルドを CI/CD に設定する

手動設定ガイド

ここで何が必要かを説明します。

GitHub アクションと証明書を使用して iOS については、Fastlane と GitHub で継続的な配信を行います。

前提条件

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

価格に関する重要な情報

価格:GitHub Action

https://github.com/features/actions

__CAPGO_KEEP_0__は「無料」です制限値に応じて、選択したマシンに応じて料金が発生します CapgoではmacOSを使用します
__CAPGO_KEEP_0__は無料です __CAPGO_KEEP_0__は無料です スクリーンショットで確認できる価格と制限 (価格はこのチュートリアルの作成時点のものであり、将来の変更が可能です)

警告された要件と価格については、次に進みます。

注意: この投稿では、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つの もの:

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

App Store Connect API キーの取得

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

  1. Log in to App Store Connect.

  2. Select ユーザーとアクセス.

App Store Connectユーザーアクセス

3 — インテグレーションタブを選択します。

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

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

App Store ConnectAPIキーを作成します

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

App Store ConnectAPIキーを作成するキー名

6 — アクセス下で、キーに対してロールを選択してください。キーに対するロールは、チームのユーザーに対するロールと同じです。 ロールの権限. 以下の選択を推奨します アプリマネージャ.

  1. Generate をクリックしてください。

特定のアプリにアクセスを制限することはできない API キーの場合

ページに表示されるのは、新しいキーの名前、キーアイデンティティ、ダウンロードリンク、その他の情報です

App Store Connect ダウンロードキー

必要なすべての情報をここから取得できます
<1> Issue ID. (APPLE_ISSUER_ID 秘密)
<2> Key ID. (APPLE_KEY_ID 秘密)
&lt;3&gt; 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.

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

App Store Connect の API キーを使用する

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 を開いて、 設定 &gt; アカウント &gt; Apple ID &gt; チーム チームを選択してください。

Code署名のID

クリックして 証明書を管理.

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

クリックして + と選択 Apple Distribution

Apple Distribution

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

証明書をダウンロードするには、キーチェーンにアクセスし、ログイン キーチェーンに切り替え、次にタブ My Certificates My Certificates.

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

と右クリックして証明書のプライベートキーを選択します。

select エクスポート.

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

ファイルとしての証明書をダウンロードします。 .p12 ファイルを開いて、以下のコマンドを使用してBase64に変換してください。

これがあなたの

base64 -i BUILD_CERTIFICATE.p12 | pbcopy

シークレットです。 また、証明書のパスワードを尋ねられた場合、パスワードをあなたの BUILD_CERTIFICATE_BASE64 シークレットとして提供してください。 P12_PASSWORD 3. プロビジョニング プロファイル

開く

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

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

プロファイルを作成

と選択 App Store Connect.

App Store Connectを選択

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

適切なアプリを選択

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

適切な証明書を選択

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

この名前は、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は、次のステップで設定するリポジトリシークレットを使用します。ローカルファイルは必要ありません。ローカルでFastlaneを実行したりテストしたりする場合にのみ必要です。 .env ローカルテストの場合、

に作成してください。ファイルをコミットしないでください。 <project-root>/fastlane/.env に追加してください。最初のファイル (または既に無視されていることを確認)。 Fastfile例えば、 fastlane/.env APP_STORE_CONNECT_TEAM_IDを取得します .gitignore ローカルファイルは必要ありません。ローカルでFastlaneを実行したりテストしたりする場合にのみ必要です。

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=

ローカルテストの場合、

Go to 開発者センター と下にスクロールして Membership details セクションまで。 Team IDAPP_STORE_CONNECT_TEAM_ID に設定する必要がある値です。

シークレット.

app-store-connect-team-id

  1. BUNDLE_IDENTIFIERを取得する
  2. Open Xcode App ダブルクリックして
  3. プロジェクトナビゲータで表示される Signing and Capabilities
  4. 値をコピーしてください。 Bundle identifierこの値は、 BUNDLE_IDENTIFIER シークレット。
bundle-identifier-xcode

6. ビルド処理

In GitHub Actions, CI/CDワークフローを実行するのにかかる分数に基づいて請求されます。私の経験によると、App Store Connectでビルドが処理されるまでに約10~15分かかります。 プライベートプロジェクトのビルドの予定コストは、

$0.08/分 x 15 分 = $1.2 、またはそれ以上、プロジェクトの構成と依存関係に応じて、コストに心配な場合は、プライベートプロジェクトの場合、

コストを設定できます。 skip_waiting_for_build_processingtrue. この設定を有効にすることで、App Store Connect のビルド処理を待つ時間を節約できます。

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

この最適化は、ビルド時間が金銭的コストを掛けるプライベートプロジェクト向けに主に有効です。ビルド時間が無料のパブリック/フリープロジェクトでは、この設定を有効にする必要はありません。詳しくは GitHub の "料金" ページを参照してください。 7. __CAPGO_KEEP_0__ の設定 __CAPGO_KEEP_0__ の設定を構成する

GitHub のシークレットをコピーし、GitHub リポジトリのシークレットに貼り付けます。

Configure GitHub secrets

設定 .env GitHub

__CAPGO_KEEP_0__ __CAPGO_KEEP_0__機密情報と変数アクション新しいリポジトリのシークレット

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 🔺Key ID.

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

7. APPLE_KEY_CONTENT — App Store Connect API Key 🔺 Key content of .p8, check it

8. GitHub workflowファイルを設定する

GitHubワークフローディレクトリを作成する

cd .github/workflows

Inside the 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タグ後にトリガーされる必要がある 自動化されたタグの設定については、Automatic build and release with __CAPGO_KEEP_0__ actionsを参照してください。 Automatic build and release with GitHub actionsを参照してください。 first.

Then this workflow will pull your NodeJS deps, install them and build your JavaScript app.

Each time you send a new commit, a release will be built in TestFlight.

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.

Create a Commit

Make a commit, you should see the active workflow in the repository.

Trigger the workflow

Push the new commits to the branch main or development ワークフローをトリガーする。

__CAPGO_KEEP_0__で始まるコミット

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

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

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

はい、簡単です。

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

CI/CD設定ガイド

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

ライブ更新とデプロイ

ありがとうございます

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

自動Capacitor IOS ビルドからGitHubアクションと証明書を使用して続行する

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

Capacitor アプリのライブ更新

ウェブ層のバグがライブの場合、App Store 承認待ちの日数を待たずに Capgo を通して修正を配信する。ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビュー パスを通る。

今すぐ始める

Latest from our Blog

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