Skip to main content
CI/CD

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

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

記事のクレジット

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

ライター

バレリア

レビュアー

ジョーダン

編集者

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

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

__CAPGO_KEEP_0__ ビルドを使用することをお勧めします。 Capgo ビルドとCapgo CLIを使用します。 既存のCapacitorアクションパイプラインを維持するチーム向けに、この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__ ビルドは、既存のCI/CDパイプラインから署名されたネイティブiOSビルドを実行します。 Capgo Build : __CAPGO_KEEP_0__ ビルドを__CAPGO_KEEP_1__アクション、GitLab CI、Jenkins、またはローカルスクリプトから、Webビルド後にトリガーしてください。

  • __CAPGO_KEEP_0__: 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 __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

__CAPGO_KEEP_0__

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

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 Keyの作成
      • App Store Connect API キーを使用する
  2. ファストレーンのファイルをコピーする
  3. GitHub アクションを設定する

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

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

要件

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

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

App Store Connect の API を取得する

App Store Connect の __CAPGO_KEEP_0__ を生成するには、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 — キーのアクセス権を設定するには、右側のメニューから "アクセス" を選択してください。ユーザーと同じロールが適用されます。詳しくは ロールの権限をご覧ください。 あなたのチームの管理者として推奨します。.

  1. 「生成」をクリックしてください。

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

新しいキー名、キーID、ダウンロードリンク、その他の情報が表示されます。

App Store Connect download keys

ここから必要な3つの情報をすべて取得できます。
1. 問題 ID。 (APPLE_ISSUER_ID 秘密)
2. キー ID。 (APPLE_KEY_ID 秘密)
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署名の特性

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

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

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

Apple Distribution

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

キーチェーンに切り替え、タブ __CAPGO_KEEP_1__ __CAPGO_KEEP_2__ マイ証明書.

マイ証明書

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

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

ファイル形式を選択 パーソナル情報交換(.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に変換し、シークレットとして保存してください (

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

base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy

4. Copy Fastlane files

Fastlaneは、Rubyライブラリで、モバイル開発の一般的なタスクを自動化するために作成されました。Fastlaneを使用すると、カスタムの「レーン」を構成できます。これは、Android Studioを使用してタスクを実行する代わりに、シリーズの「アクション」をバンドルするものです。Fastlaneを使用できますが、このチュートリアルの目的のために、このチュートリアルでは、通常のAndroid Studioを使用して実行するタスクを実行するために使用するアクションの少数のコアのみを使用します。

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 next to the 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

と進み

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

  1. Open Xcode
  2. Double click on the App in the project navigator
  3. Then click on the tab Signing and Capabilities
  4. Copy the value of the Bundle identifier. This is the value you need to set in the BUNDLE_IDENTIFIER secret.
bundle-identifier-xcode

6. Build Processing

In GitHub Actions, you are billed based on the minutes you have used for running your CI/CD workflow. From my experience, it takes about 10–15 minutes before a build can be processed in App Store Connect.

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

コストの懸念がある場合は、プライベートプロジェクトの場合にビルド時間を節約するために、App Store Connectの処理を待たずにビルドを実行できます。 skip_waiting_for_build_processing to trueビルド時間を節約するには、App Store Connectの処理を待たずにビルドを実行できます。この設定を有効にすることで、ビルド時間を節約できます。

しかし、代わりにアプリの適合性情報を手動でアップデートする必要があります。

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

7. GitHubの設定

GitHubのシークレットを設定

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

__CAPGO_KEEP_0__ へのリポジトリのシークレットに貼り付けてください。 をクリックしてください。 設定 &gt; シークレットと変数 &gt; アクション &gt;

github-secrets

2. BUILD_CERTIFICATE_BASE64 __CAPGO_KEEP_0__-secrets - 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 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 アプリをインストールしてビルドします。

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

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

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

コミットを作成する

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

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

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

コミットを開始しました

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

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

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

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

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統合 CI/CD統合の実装詳細についての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_KEEP_0__を通して修正を配信します。ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビュー経路を通じます。

ページ/エリア: ホームページマーケティングコピー。役割: ウェブサイトコピー文。見つかった場所: コンポーネント HumanSupport.astro、コンポーネント pricing/Plans.astro。メッセージキー `home_hero_human_support` (ホームヒーローワンマンサポート)。

今すぐ始めましょう

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