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

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

How to set up a CI/CD pipeline for your IOS Ionic app using fastlane and GitHub Actions in 5 mins (2024)

マーティン・ドナディエ

マーティン・ドナディエ

コンテンツマーケター

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

Setting up CI/CD for Capacitor apps can be complex and time-consuming. Here’s what you need to know:

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

Capgo Build for CI/CD by Capgo

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

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

価格

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

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

マニュアル設定ガイド

ここで何が必要か

iOS に対してファストレーンと GitHub アクションを使用した継続的配信

前提条件

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

価格に関する重要な情報

価格はGitHub Action

https://github.com/features/actions

サービスは無料です 制限まで無料です。選択したマシンに依存します。
macOSを使用します iOS開発者プログラムのメンバーであることを確認してください スクリーンショットで確認できる価格と制限 (価格はこのチュートリアルの作成時点で、将来の変更が可能)

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

注記: この記事では、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つ things:

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

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 ConnectAPIキーを作成します。

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

App Store ConnectAPIキーを作成します。キー名

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

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

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

__CAPGO_KEEP_0__ キーのアクセス

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

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

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

App Store Connect API キーを使用する

API キー ファイル(ダウンロードした p8 ファイル)、キーアイデンティティ、発行者 ID は、承認用 JWT トークンの作成に必要です。この情報を Fastlane に渡す方法は複数ありますが、私は Fastlane の新しいアクションを使用しました。 app_store_connect_api_keyFastlane のドキュメントを参照してください。 Fastlane のドキュメントを参照してください。p8 ファイルを Base64 に変換してシークレットとして保存してください(

App Store Connect を Fastlane で管理することができて、__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 を開いて、

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

Code signing identities

Click on 証明書を管理.

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

Click on + そして選択 Apple Distribution

Apple Distribution

次に、キーチェーンに移動して証明書をダウンロードする必要があります。 .p12 証明書をファイルとしてダウンロードするには、次の手順を実行してください。

証明書をダウンロードするには、キーチェーンに移動し、ログイン キーチェーン ログイン キーチェーン.

次に、証明書をダウンロードするには、ログイン

キーチェーン

証明書をダウンロードするには、ログイン エクスポート.

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

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

これがあなたの

base64 -i BUILD_CERTIFICATE.p12 | pbcopy

シークレットです。証明書のパスワードも提供してください。このパスワードがあなたの BUILD_CERTIFICATE_BASE64 シークレットになります。 P12_PASSWORD 3. プロビジョニングプロファイル

開く

Apple Developer 3. プロビジョニングプロファイル そして適切なチームを選択してください。

次に、新しいプロファイルを作成し、 +

新しいプロファイルを作成

そして App Store Connect.

App Store Connectを選択

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

適切なアプリを選択

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

適切な証明書を選択

最後に、プロファイルの名前を入力し 作成.

この名前は、Fastlaneのプロファイルの識別に使用されます。 APPLE_PROFILE_NAME.

作成

プロファイルを生成します。 .mobileprovision プロファイルをダウンロード

ファイルとしてダウンロードできます。

プロファイルをダウンロードBUILD_PROVISION_PROFILE_BASE64).

base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy

プロファイルをBase64に変換し、シークレットとして保存してください。

4. Fastlaneファイルをコピー

Create the Fastlane folder at the root of your Capacitor/Ionic project and add the Fastfile there:

  • Capgo IonicプロジェクトのルートディレクトリにFastlaneフォルダを作成し、Fastfileを追加してください。 <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 .env Actionsは、次のステップで設定したリポジトリのシークレットを使用します。 ただし、ローカルファイルは必要ありません。 ただし、ローカルで実行またはテストしたい場合は、Fastlaneをローカルマシンから実行したい場合は、ローカルファイルが必要になります。

ローカルテストの場合、 <project-root>/fastlane/.env をローカルマシンに作成してください。 そのファイルはコミットしないでください。 そのファイルを Fastfileに追加してください (またはすでに無視されていることを確認してください)。 ここに例があります: fastlane/.env APP_STORE_CONNECT_TEAM_IDの取得 .gitignore first (or verify it is already ignored). Here is an example:

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=

Getting the APP_STORE_CONNECT_TEAM_ID

Go to Developer Center と下にスクロールして Membership details セクションまで Team ID is the value you need to set in the APP_STORE_CONNECT_TEAM_ID 必要な値は

secret

app-store-connect-team-id

  1. BUNDLE_IDENTIFIERを取得する
  2. Xcodeを開く App プロジェクトナビゲータで
  3. タブをクリックする Signing and Capabilities
  4. 値をコピーしてください。 Bundle identifierこの値は、以下の__CAPGO_KEEP_0__に設定する必要があります。 BUNDLE_IDENTIFIER シークレット。
bundle-identifier-xcode

6. ビルド処理

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

コストの懸念がある場合は、プライベートプロジェクトの場合、 ビルドのコストを削減するには、Capgo Actionsの設定を調整することを検討してください。Capgo Actionsのコストは、実行時間に基づいて課金されます。

Capgo Actionsのコストを削減するには、CI/CDワークフローを実行するのにかかる時間を短縮することを検討してください。 skip_waiting_for_build_processing まで true。Capgo Builderでは、App Store Connectのビルド処理が完了するのを待たずにビルド時間を節約できます。

ただし、代わりに、App Store Connectにアプリの適合情報を手動で更新する必要があります。

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

7. Setup GitHub Actions

7. GitHubの設定

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

ここに移動 設定 > シークレットと変数 > アクション > 新しいリポジトリシークレット

github-secrets

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

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

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

5. APPLE_KEY_ID アプリストアコネクト API キー 🔺キーID。

6. APPLE_ISSUER_ID アプリストアコネクト API キー 🔺発行者ID。

7. APPLE_KEY_CONTENT App Store Connect API Key 🔺 Key content of .p8, 確認してください

8. GitHub ワークフロー ファイルを設定してください

GitHub ワークフロー ディレクトリを作成してください

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 タグ後にトリガーされるべきです タグ自動化するには、__CAPGO_KEEP_0__ アクションを使用してビルドとリリースを自動化する方法については 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. ワークフローをトリガーする

コミットを作成する

変更を コミットする、コミットを送ると、リポジトリのアクティブなワークフローが表示されます。

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

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

コミットから始めました。

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

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

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

はい、簡単です。

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

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

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

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

- 感謝

- この記事は以下の記事に基づいています。

- 自動Capacitor IOSビルドからGitHubアクションと証明書で続行する

- __CAPGO_KEEP_0__を使用している場合 - 自動Capacitor IOSビルドからGitHubアクションと証明書で続行する CI/CD自動化を計画するには、を接続する必要があります。 Capgo CI/CD 製品ワークフローにおけるCapgo CI/CDの機能 Capgoネイティブビルド 製品ワークフローにおけるCapgoネイティブビルドの機能 Capgo統合 for the product workflow in Capgo Integrations, CI/CD統合 CI/CD統合の実装詳細 GitHubアクション統合 GitHubアクション統合の実装詳細

Live updates for Capacitor apps

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.

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

スタートする

最新のブログ

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