ライブアップデートまたはネイティブビルドを自動選択
このプラグインのインストール手順と完全なマークダウンガイドを含む設定プロンプトをコピーする。
ほとんどの Capacitor リリースは JavaScript-only で、ライブアップデートとして配信する必要があります。 ライブアップデート. 一部の変更はネイティブ code に影響を与え、code ビルドから新しいバイナリが必要になります。 Capgo ビルド. このガイドでは、GitHub アクション、GitLab CI、または他の CI/CD プラットフォームが、毎回プッシュ時に正しいパスを選択するようにする方法を示します — 人間が判断する必要はありません。
Capgo はすでに安全なパスの情報を知っています。ウェブビルド後 (アップロードまたはネイティブビルドの要求前に)、次のコマンドを実行してください。
npx @capgo/cli@latest bundle releaseType com.example.app --channel production# → OTA ship with bundle upload# → native ship with Capgo BuildOTA チャンネルにすでに公開されているネイティブパッケージと一致することを意味します。 native Capacitorバージョンや他のネイティブ依存関係が変更された場合 — そのデバイスを安全に更新するには、オーバー・ザ・エア・バンドルだけでは不十分です。
releaseType 比較 ネイティブパッケージのメタデータ Capacitor/コルダバ プラグインとバージョンです。 それが それ すべての変更を ios/, android/、または capacitor.config.*。 そのパスをGitでゲートし、依存性の互換性を確保するために releaseType を使用します。 以下の例は両方を行っています。
参照してください ネイティブ互換性 全ルールとマニュアルの詳細はこちら bundle compatibility 表
前提条件
前提条件- Capgo アプリが登録され、__CAPGO_KEEP_1__ Capgo キーが Capgo API key CI シークレット
CAPGO_TOKEN - リアルタイムアップデートのアップロードが正常に動作しています()— ご覧ください
bundle uploadCI/CD統合 __CAPGO_KEEP_0__ CIでネイティブジョブを実行する場合にビルドクレデンシャルを設定してください — ご覧ください - Capgo Actions GitHub Actions クレデンシャル ネイティブビルドのためのチャンネル名がプロダクションにマッチする(例えば
- パイプラインがどのように動作するか
production)
「パイプラインがどのように動作するか」のセクション
CIがリアルタイムアップデートとネイティブビルドのどちらを選択するかを示すフローチャートflowchart TD A[Push / merge] --> B[Install + web build] B --> C["bundle releaseType"] C -->|OTA| D["bundle upload"] C -->|native| E["build request iOS + Android"] E --> F[Store / TestFlight / Play]
- __CAPGO_KEEP_0__
- コミットがタッチしている場合
ios/,android/、またはcapacitor.config.*、強制的にネイティブパスを使用します。 - そうでない場合は、Capgo
releaseTypeコミットがOTAセーフであるかどうかを尋ねます。 - もし
OTA、バンドルをアップロードします (--fail-on-incompatibleを安全性のためのレールとして)。 - もし
native、Capgo Buildを実行し、次にマッチングのバンドルをアップロードします (--auto-min-update-versionで、チャンネルのネイティブメタデータを進めるため) ( メタデータ戦略を使用します. Do 使わないでください そのベースラインアップロード — 新しいネイティブパッケージは異なるものであるはずです。--fail-on-incompatible__CAPGO_KEEP_0__ アクション
セクションのタイトル「GitHub アクション」
Section titled “GitHub Actions”__CAPGO_KEEP_0__/workflows/__CAPGO_KEEP_1__-release.yml releaseType:
name: Capgo Release
on: push: branches: [main]
jobs: decide: runs-on: ubuntu-latest outputs: release_type: ${{ steps.verdict.outputs.type }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-node@v6 with: node-version: '24' cache: 'npm'
- run: npm ci - run: npm run build
- name: Decide OTA vs native id: verdict env: CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }} run: | BEFORE="${{ github.event.before }}" if [ -z "$BEFORE" ] || [ "$BEFORE" = "0000000000000000000000000000000000000000" ]; then BEFORE="$(git rev-parse HEAD~1 2>/dev/null || echo '')" fi if [ -z "$BEFORE" ] || git diff --name-only "$BEFORE" "${{ github.sha }}" \ | grep -qE '^(ios/|android/|capacitor\.config\.)'; then TYPE=native echo "Native path/config changed (or no prior commit) — forcing native" else TYPE=$(npx @capgo/cli@latest bundle releaseType com.example.app --channel production | tr -d '[:space:]') fi echo "type=$TYPE" >> "$GITHUB_OUTPUT" echo "Capgo release type: $TYPE"
live_update: needs: decide if: needs.decide.outputs.release_type == 'OTA' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v6 with: node-version: '24' cache: 'npm' - run: npm ci - run: npm run build - name: Upload live update env: CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }} run: | npx @capgo/cli@latest bundle upload com.example.app \ --channel production \ --fail-on-incompatible
native_build: needs: decide if: needs.decide.outputs.release_type == 'native' runs-on: ubuntu-latest strategy: fail-fast: false matrix: platform: [ios, android] steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v6 with: node-version: '24' cache: 'npm' - run: npm ci - run: npm run build - run: npx cap sync ${{ matrix.platform }} - name: Capgo Build ${{ matrix.platform }} env: CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }} BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} P12_PASSWORD: ${{ secrets.P12_PASSWORD }} CAPGO_IOS_PROVISIONING_MAP: ${{ secrets.CAPGO_IOS_PROVISIONING_MAP }} APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }} APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }} APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }} APP_STORE_CONNECT_TEAM_ID: ${{ secrets.APP_STORE_CONNECT_TEAM_ID }} ANDROID_KEYSTORE_FILE: ${{ secrets.ANDROID_KEYSTORE_FILE }} KEYSTORE_KEY_ALIAS: ${{ secrets.KEYSTORE_KEY_ALIAS }} KEYSTORE_KEY_PASSWORD: ${{ secrets.KEYSTORE_KEY_PASSWORD }} KEYSTORE_STORE_PASSWORD: ${{ secrets.KEYSTORE_STORE_PASSWORD }} PLAY_CONFIG_JSON: ${{ secrets.PLAY_CONFIG_JSON }} run: | npx @capgo/cli@latest build request com.example.app \ --platform ${{ matrix.platform }} \ --build-mode release
native_bundle: needs: [decide, native_build] if: needs.decide.outputs.release_type == 'native' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v6 with: node-version: '24' cache: 'npm' - run: npm ci - run: npm run build - name: Upload bundle for new native baseline env: CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }} run: | # One-time: channel set production --disable-auto-update metadata npx @capgo/cli@latest bundle upload com.example.app \ --channel production \ --auto-min-update-versionと、__CAPGO_KEEP_1__ ビルドの__CAPGO_KEEP_0__ アクションで記述されている署名シークレットを接続してください com.example.app __CAPGO_KEEP_0__ Actions for __CAPGO_KEEP_1__ Build GitHub Actions for Capgo Build.
GitLab CI
「GitLab CI」セクションGitLabは rules パイプラインが作成されたときに評価されるので、ブランチにシェル if 1つのデプロイジョブの中に またはネイティブマトリックスジョブに別々の動的子パイプラインを生成する必要がある場合は __CAPGO_KEEP_0__
image: node:24
stages: - build - deploy
variables: APP_ID: com.example.app CHANNEL: production
build_web: stage: build script: - npm ci - npm run build artifacts: paths: - dist/ - node_modules/ expire_in: 1 hour only: - main
deploy: stage: deploy needs: [build_web] script: - | BEFORE="${CI_COMMIT_BEFORE_SHA:-}" if [ -z "$BEFORE" ] || [ "$BEFORE" = "0000000000000000000000000000000000000000" ]; then BEFORE="$(git rev-parse HEAD~1 2>/dev/null || echo '')" fi if [ -z "$BEFORE" ] || git diff --name-only "$BEFORE" "$CI_COMMIT_SHA" \ | grep -qE '^(ios/|android/|capacitor\.config\.)'; then TYPE=native else TYPE=$(npx @capgo/cli@latest bundle releaseType "$APP_ID" --channel "$CHANNEL" | tr -d '[:space:]') fi echo "Capgo release type: $TYPE" if [ "$TYPE" = "OTA" ]; then npx @capgo/cli@latest bundle upload "$APP_ID" \ --channel "$CHANNEL" \ --fail-on-incompatible elif [ "$TYPE" = "native" ]; then npx cap sync npx @capgo/cli@latest build request "$APP_ID" --platform ios --build-mode release npx @capgo/cli@latest build request "$APP_ID" --platform android --build-mode release npx @capgo/cli@latest bundle upload "$APP_ID" \ --channel "$CHANNEL" \ --auto-min-update-version else echo "Unexpected release type: $TYPE" >&2 exit 1 fi only: - main保存 CAPGO_TOKEN そして Capgo ビルド署名変数をマスク/保護されたCI/CD変数として保存します。
他のCIプラットフォーム
セクション「他のCIプラットフォーム」同じ3つのステップはどこでも機能します。
| ステップ | コマンド |
|---|---|
| 判定 | npx @capgo/cli@latest bundle releaseType APP_ID --channel production |
| OTAパス | npx @capgo/cli@latest bundle upload APP_ID --channel production --fail-on-incompatible |
| ネイティブパス | npx @capgo/cli@latest build request APP_ID --platform ios (または) android) --build-mode release |
シェルの終了/標準出力値をプラットフォームの条件分岐にマップする (または、シングル ジョブにシェルを保持する) if:
- Azure Pipelines — スクリプト ステップから出力変数を設定し、次に
condition: eq(variables['releaseType'], 'OTA') - Bitbucket Pipelines —
RELEASE_TYPE=…を$BITBUCKET_PIPELINES_VARIABLES_PATHを宣言し、output-variablesを使用して後続のステップを分岐するcondition: state: RELEASE_TYPE == "OTA"ファイル アーティファクトのみでは動作を制御することはできないcondition) - (ファイル アーティファクトのみでは動作を制御することはできない) —
whenはコンフィグコンパイル時点で評価されるため、ランタイムシェルを持つブランチif(またはダイナミックコンフィグ/継続)、ワークスペース値ではなくwhen - Jenkins — 標準出力を環境変数にキャプチャし使用
when { environment name: 'RELEASE_TYPE', value: 'OTA' }
パスフィルタ (オプションの高速化)
セクション「パスフィルタ (オプションの高速化)」パスフィルタはコスト最適化であり、Capgo チェックの代替ではありません。ドキュメント専用パスを除外するのではなく、脆弱な許可リストを維持するのではなく、 vite.config.*, tsconfig*.json、およびフレームワークの構成ファイル:
on: push: branches: [main] paths-ignore: - '**.md' - 'docs/**' - '.github/**'許可リストを使用する場合は、Web とネイティブ ビルドが読み取る入力すべてを含めるのではなく、 src/ そして package.json.
ネイティブ判定後
「ネイティブ判決後のセクション」CIがネイティブを選択した場合:
- Capgo ビルドは署名済みバイナリを生成し、テストフライト / プレイに提出できます ( 構成).
- JS バンドルをアップロードする
--auto-min-update-version(メタデータ戦略) により、チャネルは新しいネイティブ パッケージを記録します — そうでない場合、次のJSのみのコミットはnative. - ユーザーが新しいバイナリをインストールした後、後続のJavaScriptのみのコミットは
OTA再び