メインコンテンツにジャンプ

ライブアップデートまたはネイティブビルドを自動選択

ほとんどの Capacitor リリースは JavaScript-only で、ライブ アップデートとして配信する必要があります。 一部の変更はネイティブ __CAPGO_KEEP_0__ をタッチし、__CAPGO_KEEP_0__ ビルドから新しいバイナリが必要になります。code ビルド このガイドでは、Capgo アクション、GitLab CI、または他の CI/CD プラットフォームが、毎回のプッシュで正しいパスを選択する方法を示します — 人間が判断することなく。. This guide shows how to make GitHub Actions, GitLab CI, or any other CI/CD platform pick the correct path on every push — without a human deciding.

Capgo はすでに安全なパスを知っています。ウェブ ビルド後 (アップロードまたはネイティブ ビルドを要求する前に)、次のコマンドを実行してください。

ターミナル画面
npx @capgo/cli@latest bundle releaseType com.example.app --channel production
# → OTA ship with bundle upload
# → native ship with Capgo Build

OTA チャンネルにすでに公開されているものと一致するnativeパッケージであることを意味します。 native Capacitorバージョンや他のnative依存関係が変更された場合、Capacitorプラグインや、安全にデバイスを更新するにはオーバー・ザ・エア・バンドルでは十分ではありません。

releaseType 比較 nativeパッケージのメタデータ Capacitor/Cordovaプラグインやバージョンです。 それが それを見て 、または ios/, android/capacitor.config.*パスをgitでゲートし、依存関係の互換性のために使用してください。 以下の例は両方を行っています。 releaseType Terminal window

参照 ネイティブ互換性 ルールとマニュアルの詳細は、 bundle compatibility テーブル

前提条件

前提条件
  • Capgoアプリが登録され、Capgo __CAPGO_KEEP_1__キーが Capgo API key CIシークレット内に CAPGO_TOKEN
  • ライブアップデートのアップロードが正常に動作している (bundle upload) — ご覧ください CI/CD統合
  • Capgo CIでネイティブジョブを実行する場合にビルドクレデンシャルをCIに保存してください — ご覧ください GitHub アクション または __CAPGO_KEEP_0__
  • ネイティブジョブの場合、ビルドクレデンシャルをCIに保存してください production)
  • クレデンシャル metadata すでに存在するプロダクションにマッチするチャンネル (例えば) --auto-min-update-version チャンネルに
ターミナル画面
npx @capgo/cli@latest channel set production com.example.app --disable-auto-update metadata

Pipelineの動作

Pipelineの動作
  1. 通常のWebアセットビルド
  2. コミットが ios/, android/、または capacitor.config.*__CAPGO_KEEP_0__がコミットがOTA安全かどうかを判断
  3. Otherwise ask Capgo releaseType もし
  4. もし OTA、アップロードする --fail-on-incompatible--auto-min-update-version.
  5. ページ/エリア: Capgo マーケティング ウェブサイト。役割: 短い UI ラベルまたはナビゲーションアイテム。ページ: trust.astro。メッセージキー `and` (And)。 native, run Capgo Build, then upload the matching bundle with --auto-min-update-version 、__CAPGO_KEEP_0__ ビルドを実行し、次にアップロードするマッチング バンドルとともに チャンネルのネイティブ メタデータが進化するようにする。そうしないで そのベースライン アップロード — 新しいネイティブ パッケージは異なるはず。 --fail-on-incompatible 参考: Native + OTA チャンネル ワークフロー チャンネル レベル FAQ を参照。

GitHub アクション

GitHub アクション

1 つのワークフローがネイティブ パスをゲートし、次に __CAPGO_KEEP_0__ によって分岐します。 releaseType:

github/workflows/capgo-release.yml
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 \
--auto-min-update-version
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: |
# Channel must already be on metadata (see Prerequisites above)
npx @capgo/cli@latest bundle upload com.example.app \
--channel production \
--auto-min-update-version

置換 com.example.app と __CAPGO_KEEP_0__ Actions for __CAPGO_KEEP_1__ Build に記載されている署名シークレットをワイヤします。 GitHub Actions for Capgo Build.

GitLabは rules パイプラインが作成されたとき、ブランチ内でシェルを実行します。 if 1 つのデプロイジョブ (または生成された子パイプライン) 内に 必要な場合、別々のネイティブマトリックスジョブを生成します。 .gitlab-ci.yml

コピー
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 \
--auto-min-update-version
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変数として設定します。

同じ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 --auto-min-update-version
ネイティブパスnpx @capgo/cli@latest build request APP_ID --platform ios (または android) --build-mode release

シェルのエラー/標準出力値をプラットフォームの条件分岐にマップする (または、GitLabと同様に、1つのジョブにシェルを保持する): ifMap the shell exit / stdout into your platform’s conditionals (or keep a single job with a shell

  • Azure Pipelines — スクリプト ステップから出力変数を設定し、次に condition: eq(variables['releaseType'], 'OTA')
  • Bitbucket PipelinesRELEASE_TYPE=…$BITBUCKET_PIPELINES_VARIABLES_PATHoutput-variablescondition: state: RELEASE_TYPE == "OTA"condition)
  • (ファイル アーティファクトだけでは動作を制御することはできないため)when CircleCI if はコンフィグ コンパイル時点で評価されるため、ランタイム シェル (またはダイナミック コンフィグ / 続行) でブランチする when
  • Jenkins — 標準出力(stdout)を環境変数にキャプチャし使用 when { environment name: 'RELEASE_TYPE', value: 'OTA' }

パスフィルタ(オプションの高速化)

セクション:パスフィルタ(オプションの高速化)

パスフィルタはコスト最適化であり、Capgo チェックの代替ではありません。ドキュメント専用パスを除外することを優先するのではなく、脆弱な許可リストを維持するのではなく、ウェブビルドとネイティブビルドが読み込む入力をすべて含める vite.config.*, tsconfig*.json,およびフレームワーク構成ファイル:

on:
push:
branches: [main]
paths-ignore:
- '**.md'
- 'docs/**'
- '.github/**'

許可リストを使用する場合、ウェブとネイティブビルドが読み込む入力をすべて含めるのではなく、 src/package.json.

CIがネイティブを選択した場合:

  1. Capgo ビルドは署名済みバイナリを生成し、テストフライト/プレイに提出できます(詳細は 構成).
  2. マッチングのJSバンドルをアップロードする --auto-min-update-version (メタデータ戦略) により、チャンネルは新しいネイティブパッケージを記録する — そうでない場合、次のJSのみのコミットは native.
  3. ユーザーが新しいバイナリをインストールした後、後続のJavaScriptのみのコミットは OTA 再び
「関連ガイド」