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

自動Capacitor IOS ビルドとGitHub アクションで証明書を使用

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

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

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

コンテンツマーケター

自動Capacitor IOS ビルドとGitHub アクションで証明書を使用

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

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

Capgo Build for CI/CD by Capgo

Fastlane、Xcodeランナー、証明書、プロビジョニングプロファイル、アップロードスクリプトの維持をスキップしてください。 Capgo ビルド __CAPGO_KEEP_0__ ビルドは、既存のCI/CDパイプラインから実行される署名済みネイティブiOSビルドを実行します。

  • パイプラインと連携: Capgo ビルドをGitHub Actions、GitLab CI、Jenkins、またはローカルスクリプトからトリガーして、Webビルド後に実行してください。 npx cap sync.
  • CIシークレットから署名: App Store Connectのキー、証明書、プロビジョニングプロファイル、パスワード、チームIDを自分のCIシークレットに保持してください。
  • ネイティブランナーの維持をスキップ: Capgo ビルドは、Appleのビルド環境を維持しているので、macOSランナー、Xcodeイメージ、またはFastlaneのレーンを自分で管理する必要がなくなります。
  • アーティファクトと提出: Capgo CLI を通じて、署名済みアーティファクトをQAでダウンロードしたり、リリースビルドを提出したりする

価格

  • Capgo プランは月額 $12 で始まります
  • __CAPGO_KEEP_0__ で OTA の更新と約 15 のネイティブ ビルドが含まれます
  • クレジットを通じて、1 分あたり追加のビルド分数が請求されます

Capgo ビルドを CI/CD にセットアップする

手動セットアップガイド

ここで何が必要か

GitHub アクションと証明書を使用した iOS の継続的配信のために、Fastlane と GitHub を使用する

前提条件

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

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 キーの作成
      • 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

Requirements

In order for Fastlane to be able to use App Store Connect API to upload your app, you need to provide the following three things:

  1. Issuer ID
  2. Key ID
  3. Key file or Key content

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

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

  1. ログイン App Store Connect.

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

App Store Connect ユーザー アクセス

3 — インテグレーション タブを選択してください。

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

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

App Store Connect API キーを作成

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

App Store Connect API キーを作成する際のキー名

6 — アクセス下で、キーに対してロールを選択してください。キーに対するロールは、チームのユーザーに対するロールと同じです。 役割の権限選択することをお勧めします。 アプリケーション管理者.

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

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

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

App Store Connect ダウンロードキー

ここから、必要な3つの情報をすべて取得できます。
<1> Issue ID. (APPLE_ISSUER_ID 秘密
<2> Key ID. (APPLE_KEY_ID 秘密
&#x3C;3> 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 は、承認用 JWT トークンを作成するために必要です。この情報を Fastlane に渡す方法は複数あります。私は、Fastlane の新しいアクションを使用することを選択しました。 app_store_connect_api_keyFastlane のドキュメントを参照してください。 この方法を紹介したのは、CI で最もよく使用できるようにするためです。環境変数を設定できます。ダウンロードした p8 ファイルを Base64 に変換して、シークレットとして保存してください。

Fastlane を使用して App Store Connect を管理することができます。__CAPGO_KEEP_0__ キーはすごいですね!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!

XCode を開き、設定を参照してください。

__CAPGO_KEEP_0__ __CAPGO_KEEP_1__ > アカウント > Apple ID > チーム チームを選択してください。

Code の署名識別子

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

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

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

Apple Distribution

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

これを行うには、キーチェーンに移動し、ログインキーチェーンに切り替え、次にタブ My Certificates My Certificates 次に、ダウンロードしたい証明書を選択できます。(証明書の日付で検索してください).

そして、証明書のプライベートキーに右クリックし、

Export

ファイル形式を選択してください Personal Information Exchange (.p12).

Choose the file format Personal Information Exchange (.p12).

ファイルとしてダウンロードされます。 .p12 ファイル。

このコマンドを使用して、Base64に変換します。

base64 -i BUILD_CERTIFICATE.p12 | pbcopy

__CAPGO_KEEP_0__ BUILD_CERTIFICATE_BASE64 秘密のことです。 また、証明書のパスワードを尋ねられた場合、パスワードを提供してください。このパスワードは__CAPGO_KEEP_0__です。 P12_PASSWORD __CAPGO_KEEP_1__

3. プロビジョニング プロファイル

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

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

__CAPGO_KEEP_2__

と選択 App Store Connect.

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 Studioを使用して実行するタスクを実行します。Fastlaneを使用できますが、このチュートリアルの目的のために、このチュートリアルでは、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 ローカルファイルの例: .gitignore APP_STORE_CONNECT_TEAM_IDの取得

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=

Developer Center

にアクセスし、下部までスクロールしてください。 Getting the APP_STORE_CONNECT_TEAM_ID Go to Membership details セクション。 Team ID は、設定する必要がある値です。 APP_STORE_CONNECT_TEAM_ID シークレット。

app-store-connect-team-id

BUNDLE_IDENTIFIERを取得する

  1. Xcodeを開く
  2. プロジェクトナビゲータで 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/分×15分=$1.2

、またはそれ以上、プロジェクトの構成と依存関係に応じて、 コストの懸念がある場合は、を設定できます。これにより、App Store Connectがビルドを処理するのを待たずに、ビルドの分数を節約できます。

ただし、代償として、 skip_waiting_for_build_processing を手動で更新する必要があります。 true__CAPGO_KEEP_0__

__CAPGO_KEEP_0__

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

7. GitHubアクションの設定

GitHubシークレットの設定

ファイルからシークレットをコピーし、__CAPGO_KEEP_0__リポジトリのシークレットに貼り付けます。 .env file and paste them into the GitHub repository secrets.

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

github-シークレット

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

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

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

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

6. APPLE_ISSUER_ID — App Store Connect API キー 🔺発行者ID。

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

8. GitHub ワークフロー ファイルを設定する

Create a GitHub workflow directory.

cd .github/workflows

その内部 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の後でトリガーされるべきです。 タグ,タグを自動化する必要がある場合は、を参照してください。 自動ビルドとリリースのGitHubアクション 最初に。

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

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

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

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

コミットを作成する

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

ワークフローをトリガー

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

コミット

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

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

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

はい、簡単です。

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

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

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

ライブ更新とデプロイ

感謝

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

リアルタイムの更新機能付きのCapacitorアプリ

ウェブ層のバグが生じた場合、Capgoを通じて修正を配信し、アプリストアの承認待ちの日数を待たずに済みます。ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビュー経路を通じます。

今すぐ始める

ブログの最新記事

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