メインコンテンツへスキップ

Live Update または Native Build を自動選択

ほとんどの Capacitor リリースは JavaScript のみで構成されているため、次のように配信します live update を. 一部の変更はネイティブの code に影響するため、以下から新しいバイナリを取得する必要があります: Capgo のビルド. このガイドでは、GitHub Actions、GitLab CI、その他のCI/CDプラットフォームで、プッシュのたびに人が判断することなく正しいパスを選ばせる方法を説明します。

Capgo は、どのパスが安全かをすでに把握しています。Webビルド後(uploadまたはNative Buildをリクエストする前に)、次を実行してください:

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

OTA は、ネイティブパッケージがすでにチャンネルで公開されているものと一致していることを意味します。 native は、プラグイン、Capacitor のバージョン、その他のネイティブ依存関係が変更されたことを意味します。OTA bundleだけでは、それらのデバイスを安全にアップデートできません。

releaseType 比較します ネイティブパッケージのメタデータ (Capacitor/Cordovaプラグインとバージョン)。これは 決して 以下のすべての変更を確認します ios/, android/、または capacitor.config.*. まずgitでこれらのパスを制限し、次に releaseType 依存関係の互換性のために使用します — 以下の例では両方を行っています。

詳細は ネイティブ互換性 詳細なルールとマニュアルは bundle compatibility 表を参照してください。

  • Capgo アプリが登録済みで、 Capgo API キー を CI のシークレットに CAPGO_TOKEN
  • Live Updates のアップロードが動作すること(bundle upload) — 参照 CI/CD 連携
  • Capgo Build の認証情報を CI に設定してください(ネイティブジョブが実行される場合) — 参照 GitHub アクション または 認証情報
  • 既に存在し、本番環境と一致するチャンネル(例では production)
  • のチャンネル metadata 戦略により、すべての upload が --auto-min-update-version (初回のみ):
ターミナル
npx @capgo/cli@latest channel set production com.example.app --disable-auto-update metadata
  1. 通常通り Web アセットを build する。
  2. コミットが触れる場合 ios/, android/、または capacitor.config.*、ネイティブパスを強制します。
  3. それ以外の場合は Capgo に releaseType コミットがOTAセーフかどうかを尋ねます。
  4. もし OTAのときは、~でアップロードしてください --fail-on-incompatible と --auto-min-update-version.
  5. もし native、Capgo Buildを実行し、対応するbundleをアップロードして --auto-min-update-version 、チャンネルのネイティブメタデータが更新されるようにします。実行してください。 決して 使用する --fail-on-incompatible そのベースラインのアップロードにおいて、新しい Native Build パッケージは異なるものである必要があります。詳細は Native + OTA Channel のワークフローを ご覧ください。チャンネルレベルの FAQ も用意しています。

ネイティブパスを制限し、次に以下で分岐させるワークフローがあります: 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 また、以下のドキュメントに従って署名用のシークレットを設定してください: GitHub による Capgo Build 用のアクション.

GitLabは、 rules pipelineが作成されたときに評価を行います。そのため、シェルスクリプトを含むブランチは if 単一のデプロイジョブ内(または、 動的な子パイプラインを生成して 個別の Native Build マトリックスジョブが必要な場合):

.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 Build の署名変数は、マスク/保護された CI/CD 変数として保存してください。

その他のCIプラットフォーム

「Other CI Platforms」セクション

同じ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
Nativeパスnpx @capgo/cli@latest build request APP_ID --platform ios (または android) --build-mode release

シェルの終了コード / stdout をプラットフォームの条件分岐にマッピングします(または、シェルを使う単一ジョブのままにして if、上記のGitLabのように):

  • Azure Pipelines — スクリプトステップで出力変数を設定し、それを使用します condition: eq(variables['releaseType'], 'OTA')
  • Bitbucket Pipelines — 書き込む RELEASE_TYPE=… まで $BITBUCKET_PIPELINES_VARIABLES_PATH, 以下で宣言します output-variables、そして後続のステップを分岐させるには condition: state: RELEASE_TYPE == "OTA" (ファイルアーティファクトだけでは condition)
  • CircleCI — when は設定コンパイル時に評価されるため、ランタイムシェルで分岐してください if (または dynamic config / continuation)、workspace の値ではなく when
  • Jenkins — stdout を環境変数にキャプチャして使用します when { environment name: 'RELEASE_TYPE', value: 'OTA' }

パスフィルター(任意の高速化)

「Paths Filters (オプションの高速化)」セクション

Path filters はコスト最適化であり、Capgo チェックの代替ではありません。壊れやすい許可リストを維持するより、ドキュメント専用のパスを除外することを推奨します — Web ビルドは多くの場合、次にも依存します vite.config.*, tsconfig*.json、およびフレームワーク設定ファイル:

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

代わりにallowlistを使用する場合は、WebおよびNative Buildが読み取るすべての入力を含めてください。単に src/ と package.json.

CIがnativeを選択した場合:

  1. Capgo Buildは署名済みバイナリを生成し、TestFlightやPlayへ提出可能です(詳細は 設定).
  2. 対応するJS bundleを次を使用してuploadしてください: --auto-min-update-version (metadata strategy)を使用することで、channelに新しいnativeパッケージが記録されます。そうしないと、次にJSのみをcommitしても、依然として native.
  3. ユーザーが新しいバイナリをインストールすると、その後のJavaScriptのみのcommitは OTA を再度呼び出してください。