Lebih lanjut ke konten

Pilih Otomatis Live Update atau Bangun Natively

Sebagian besar rilis Capacitor adalah JavaScript-only dan harus dikirim sebagai live update. Beberapa perubahan menyentuh native code dan memerlukan biner baru dari Capgo Pembangunan. 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 sudah tahu jalur yang aman. Setelah Anda melakukan build web (dan sebelum mengunggah atau meminta build native), jalankan:

Jendela Terminal
npx @capgo/cli@latest bundle releaseType com.example.app --channel production
# → OTA ship with bundle upload
# → native ship with Capgo Build

OTA berarti paket native sesuai dengan yang sudah hidup di saluran. native berarti plugin, versi Capacitor, atau dependensi native lainnya berubah — paket udara melalui udara tidak dapat memperbarui perangkat tersebut dengan aman.

releaseType mengumpulkan metadata paket native (Capacitor/plugin Cordova dan versi). Ini tidak not Lihat setiap perubahan di bawah ios/, android/, or capacitor.config.*. Gate those paths in git first, then use releaseType untuk konsistensi dependensi — contoh di bawah ini melakukan kedua hal.

See Kompatibilitas Asli untuk aturan-aturan penuh dan manual bundle compatibility meja.

  • Aplikasi Capgo terdaftar dan sebuah Capgo API kunci dalam rahasia CI sebagai CAPGO_TOKEN
  • Update Hidup secara Langsung unggah bekerja (bundle upload) — lihat Integrasi CI/CD
  • Capgo Build credentials in CI if you expect native jobs — see GitHub Actions or Credentials
  • Salah satu saluran yang sudah ada dan sesuai dengan produksi (contoh-contoh menggunakan) production)
  • Saluran di metadata Jika Anda mengharapkan pekerjaan asli — lihat --auto-min-update-version (one-time):
__CAPGO_KEEP_0__ Aksi atau
npx @capgo/cli@latest channel set production com.example.app --disable-auto-update metadata
  1. Bangun aset web seperti biasa.
  2. Jika komit menyentuh ios/, android/, atau capacitor.config.*, paksa jalur native.
  3. Jika tidak, tanyakan kepada Capgo releaseType apakah komit aman untuk OTA.
  4. Jika OTA, unggah dengan --fail-on-incompatible dan --auto-min-update-version.
  5. Jika native, jalankan Capgo Build, kemudian unggah bundle yang sesuai dengan --auto-min-update-version sehingga metadata native kanal maju. Tidak gunakan use --fail-on-incompatible untuk dasar upload tersebut — paket native baru seharusnya berbeda. Lihat untuk FAQ kanal-level. __CAPGO_KEEP_0__ Actions

Bab yang berjudul “GitHub Actions”

Section titled “GitHub Actions”

Satu alur kerja yang mengatur jalur asli, kemudian memisahkan ke dalam releaseType:

/github/aliran kerja/capgo-rilis.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

Ganti com.example.app dan hubungkan rahasia tanda tangan seperti yang dijelaskan di GitHub Aksi untuk Capgo Bangun.

GitLab mengevaluasi rules ketika pipeline dibuat, sehingga cabang dengan shell if dalam satu pekerjaan deploy (atau buatlah) pipa anak dinamis Jika Anda memerlukan pekerjaan matrix native terpisah):

Salin ke clipboard
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

Store CAPGO_TOKEN dan Capgo Variabel signing build sebagai variabel CI/CD tersembunyi.

Langkah-langkah yang sama tiga bekerja di mana saja:

LangkahPerintah
Hasilnpx @capgo/cli@latest bundle releaseType APP_ID --channel production
Jalan Update OTAnpx @capgo/cli@latest bundle upload APP_ID --channel production --fail-on-incompatible --auto-min-update-version
Jalan OTAnpx @capgo/cli@latest build request APP_ID --platform ios (or android) --build-mode release

Mapkan keluaran shell / stdout ke kondisional platform Anda (atau simpanlah satu pekerjaan dengan shell) ifseperti di GitLab di atas):

  • Azure Pipelines — atur variabel keluaran dari langkah skrip, kemudian gunakan condition: eq(variables['releaseType'], 'OTA')
  • Pipelines Bitbucket — tulis RELEASE_TYPE=… ke $BITBUCKET_PIPELINES_VARIABLES_PATHdeklarasikan di bawah output-variables, deklarasikan di bawah condition: state: RELEASE_TYPE == "OTA" , dan cabang langkah-langkah berikutnya dengan condition)
  • CircleCI — when di evaluasi pada waktu kompilasi konfigurasi, jadi cabang dengan shell waktu eksekusi if dievaluasi pada waktu kompilasi konfigurasi, sehingga cabang dengan shell waktu eksekusi when
  • Jenkins — tangkap stdout ke dalam variabel lingkungan dan gunakan when { environment name: 'RELEASE_TYPE', value: 'OTA' }

Jalur Filter (Pengurangan Kecepatan Opsional)

Judul Bagian: "Pembatasan Jalur (Optimasi Biaya, Opsional)"

Path filters are a cost optimization, not a substitute for the Capgo check. Prefer excluding docs-only paths rather than maintaining a fragile allowlist — web builds often also depend on vite.config.*, tsconfig*.jsondan konfigurasi file framework:

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

Jika Anda menggunakan daftar yang diizinkan, masukkan setiap input yang dibaca oleh pembangunan web dan native, bukan hanya src/ dan package.json.

Ketika CI memilih native:

  1. Capgo Membangun produksi file biner yang ditandatangani dan dapat mengirimkan ke TestFlight / Play (lihat Konfigurasi).
  2. Unggah bundle JS yang sesuai dengan --auto-min-update-version Strategi metadata — sehingga saluran merekam paket native baru — jika tidak, komit JS-only berikutnya masih mengembalikan native.
  3. Setelah pengguna menginstal biner baru, komit JavaScript-only kemudian mengembalikan OTA lagi.