Langsung ke konten utama

Cara OTA Update Aplikasi CapacitorJS dengan Benar

Pelajari cara melakukan OTA update untuk aplikasi CapacitorJS dan Electron dengan Capgo, mencakup setup, signing, channels, CI/CD, testing, dan rollback dalam satu panduan praktis.

Cara OTA Update Aplikasi CapacitorJS dengan Benar

Anda menemukan regresi checkout pada Jumat sore. Perbaikannya sudah ada di lapisan web Capacitor Anda, tetapi jendela review App Store baru ditutup tiga hari lagi. Pengguna Android bisa menerima paket baru lebih cepat, tetapi memaksa setiap pelanggan menginstal ulang native build hanya untuk koreksi JavaScript tetap pemborosan.

Itulah alasan praktis mengapa tim mempelajari cara melakukan OTA update untuk aplikasi CapacitorJS. Rilis over-the-air yang terkontrol dapat mengirimkan web bundle bertanda tangan ke binary terinstal yang memenuhi syarat, mengunduhnya di latar belakang, dan menerapkannya pada peluncuran berikutnya, sementara perubahan native tetap mengikuti proses store. Bagian yang sulit bukan mengunggah file, melainkan menjaga keselarasan version targeting, signing, rollout control, observability, dan recovery di seluruh fleet aktif.

Table of Contents

Mengapa OTA Penting bagi Tim CapacitorJS

Aplikasi Capacitor biasanya punya dua permukaan rilis. Binary native membawa platform shell, permission, plugin, ikon, entitlement, dan kapabilitas lain yang ditinjau store. Layer web membawa JavaScript, CSS, HTML, routing, copy, dan aset. Update OTA menangani permukaan kedua, jadi tim bisa memperbaiki alur checkout yang rusak tanpa rebuild native shell, selama perubahan tetap dalam batas platform dan kebijakan store yang dijelaskan di panduan OTA Capgo.

Diagram yang mengilustrasikan pentingnya update OTA dengan membandingkan keterlambatan store dengan perbaikan instan.

Manfaat operasionalnya lebih dari sekadar kecepatan. Binary yang terinstal tidak bergerak serempak. Sebagian pengguna menjalankan native build lama, sebagian lagi versi store terbaru, dan tiap binary bisa punya native API berbeda yang tersedia untuk web bundle. Bundle yang dikompilasi terhadap native API yang tidak didukung bisa gagal meski JavaScript diff-nya valid. Itu membuat OTA jadi sistem kompatibilitas, bukan jalan pintas menghindari release engineering.

Perlakukan updater sebagai delivery pipeline

Setup produksi butuh urutan yang jelas:

  1. Install native bridge: Tambahkan package updater dan sinkronkan Capacitor agar iOS dan Android mengetahuinya.
  2. Tandatangani bundle: Simpan signing material di luar repository dan jadikan verifikasi bagian dari client path.
  3. Targetkan sebuah channel: Arahkan staging, beta, production, atau cohort khusus pelanggan secara sengaja.
  4. Otomatiskan pengiriman: Biarkan CI melakukan build, sign, upload, dan promote hanya setelah tes lulus.
  5. Pantau adopsi: Lacak sinyal download, install, boot, crash, dan health berdasarkan channel dan binary.
  6. Roll back dengan cepat: Pulihkan bundle yang sudah teruji di sisi server dan pertahankan proteksi recovery di sisi client.

Capgo adalah salah satu opsi untuk workflow ini. Updater Capacitor yang open-source dan layanan cloud-nya mempublikasikan signed web bundle ke channel target, menerapkannya pada launch berikutnya, serta menampilkan informasi pengiriman per versi dan perangkat. Tim yang mengevaluasi ketersediaan dan ketahanan rilis juga dapat meninjau ketersediaan app untuk aplikasi Capacitor.

Aturan praktis: Jika Anda tidak bisa mengidentifikasi native binary mana yang ditargetkan oleh sebuah bundle, jangan promote bundle tersebut ke production.

OTA berhasil jika ia mengurangi rilis store yang tidak perlu tanpa menyembunyikan batas antara web code dan native code. Pertanyaannya bukan apakah tim Anda bisa push sebuah bundle, melainkan apakah Anda bisa menjelaskan siapa yang menerimanya, mengapa mereka memenuhi syarat, apa yang terjadi setelah launch, dan bagaimana Anda akan memulihkan layanan saat bundle bermasalah.

Prasyarat dan Cara Install Capgo Updater

Sebelum membuka terminal, pastikan akun proyek dan rilis sudah siap. Anda butuh aplikasi Capacitor 5 atau 6 dengan @capacitor/cli terinisialisasi, Node 18 atau lebih baru, akun Apple Developer dan Google Play Console yang aktif untuk binary target, serta akun cloud Capgo dengan appId dan key API.

Instalasi pertama sengaja dibuat singkat:

npm install @capgo/capacitor-updater
npx cap sync
npx @capgo/cli init

npm install menambahkan package JavaScript dan dependency native. npx cap sync adalah langkah yang sering dilewati, dan kalau terlewat native bridge jadi tidak terhubung. Layer JavaScript mungkin tetap compile, tapi runtime nanti memanggil bridge yang tidak ada di binary yang terpasang. Jalankan sinkronisasi setelah install dan lagi saat konfigurasi plugin native berubah.

Initializer akan mem-patch capacitor.config.ts dengan pengaturan updater, web endpoint, dan channel default. Jangan langsung terima patch-nya. Buka file dan verifikasi identitas aplikasi serta kontrak update secara eksplisit:

const config: CapacitorConfig = {
  appId: 'com.example.app',
  appName: 'Example',
  version: '1.0.0',
  autoUpdate: true,
  updateUrl: '',
  capgo: {
    channel: 'staging'
  }
}

Struktur yang dihasilkan bisa bervariasi tergantung proyek dan versi CLI Anda, tetapi nilai-nilai pentingnya tetap sama. appId harus sesuai dengan binary yang terpasang, version harus menjelaskan hubungan native build, autoUpdate harus mencerminkan kebijakan peluncuran Anda, updateUrl harus menunjuk ke layanan yang dipercaya oleh binary Anda, dan capgo blok harus mengidentifikasi channel awal.

Verifikasi sebelum membangun release

Jalankan perintah diagnostik sebelum membuka Xcode atau Android Studio:

npx @capgo/cli doctor

Hasil yang bersih harus mengonfirmasi bahwa CLI tersedia, konfigurasi proyek dapat dibaca, paket updater terdeteksi, identifikasi aplikasi yang diperlukan ada, dan autentikasi dapat mencapai akun yang dikonfigurasi. Tidak boleh melaporkan native sync yang hilang, identitas aplikasi yang tidak ada, atau konfigurasi updater yang tidak valid.

Tangkapan layar dari https://capgo.app/docs/img/cli-doctor.png

Jaga agar native build pertama tetap sederhana. Instal di perangkat iOS dan Android fisik, jalankan dengan akses jaringan, tutup dan buka kembali, lalu pastikan updater dapat memeriksa tanpa memengaruhi jalur startup normal. alur kerja instalasi updater Capacitor berguna saat Anda perlu membandingkan konfigurasi proyek dengan setup plugin yang diharapkan.

Mengirim Bundle OTA Pertama dengan Aman

Anggap bundle pertama sebagai uji jalur rilis, bukan peluncuran fitur. Buat atau rotasi kunci penandatanganan sebelum menyiapkan artefak:

npx @capgo/cli key create

Simpan kunci privat di secrets manager. Jangan commit, simpan di arsip proyek, atau tampilkan di output CI. Jalur kepercayaan native membutuhkan materi verifikasi publik. Hanya job penandatanganan yang boleh mengakses kunci privat.

Ubah versi sisi JavaScript di package.json atau metadata rilis web Anda. Biarkan field versi native tetap tidak berubah untuk perbaikan web-only. Bundle OTA tidak dapat menambahkan code native atau mengubah kapabilitas yang dideklarasikan oleh binary yang terpasang, jadi perubahan versi native akan mengaburkan kompatibilitas, bukan memperbaikinya.

Upload artefak yang ditandatangani ke channel yang dituju:

npx @capgo/cli bundle upload --channel production

Upload yang berhasil hanya mengonfirmasi bahwa server menerima permintaan. Baca output perintah dan verifikasi identifier bundle, constraint versi native target, checksum yang ditandatangani, dan penugasan channel. Field-field ini mengidentifikasi artefak dan menunjukkan apakah binary yang terpasang memenuhi syarat untuk menerimanya.

Baca dashboard sebagai gerbang rilis

Tampilan detail bundle harus menjawab empat pertanyaan rilis:

  • Versi native minimum: Binary mana yang paling lama bisa menjalankan bundle ini?
  • Versi native maksimum: Binary versi baru mana yang sengaja dikecualikan?
  • Channel: Audiens mana yang dapat menemukan artifact ini?
  • Persentase rollout: Berapa banyak dari audiens yang memenuhi syarat itu yang bisa menerimanya?

Mulai eksposur produksi pada 5%, lalu tentukan bukti yang diperlukan untuk perluasan. Cek keberhasilan download dan instalasi, cold start normal, sesi bebas crash, dan error JavaScript pada alur yang diubah. Pastikan identitas artifact dan kontrol pengiriman tetap terlihat bersamaan di dashboard Capgo.

Screenshot dari https://capgo.app/docs/img/bundle-detail.png

Gunakan debug build untuk menguji jalur perangkat. getCurrent() melaporkan bundle yang aktif, dan notifyAppReady() mengonfirmasi bahwa bundle baru sudah mencapai kondisi sehat:

import { CapacitorUpdater } from '@capgo/capacitor-updater'

const current = await CapacitorUpdater.getCurrent()
console.log(current)

await CapacitorUpdater.notifyAppReady()

Panggil readiness hanya setelah app terinisialisasi cukup jauh untuk lolos health check Anda. Jika readiness tidak pernah terkonfirmasi, pemulihan otomatis bisa menandai bundle gagal saat cold start berikutnya. Safeguard itu melindungi pengguna produksi, tapi juga bisa membuat pengujian yang belum lengkap terlihat seperti masalah pengiriman. Catat bundle aktif dan hasil startup untuk setiap perangkat uji sebelum memperluas eksposur.

Channels, Rollouts, dan Otomatisasi CI/CD

Channels adalah lapisan routing antara bundle yang dipublikasikan dan perangkat yang terinstal. Channels juga jadi gate rilis Anda. Channel staging harus mengarah ke native binary yang sudah diketahui, channel beta harus melayani cohort yang terkontrol, dan production baru boleh bergerak setelah channel sebelumnya lolos smoke test.

Buat jalur staging dengan nama eksplisit:

npx @capgo/cli channel create staging
npx @capgo/cli bundle assign <bundle-id> --channel staging

Kunci channel tersebut ke versi native yang digunakan oleh perangkat uji Anda. Penguji harus menjalankan binary yang sama dengan yang didukung di produksi, bukan build pengembangan lokal dengan plugin tambahan atau konfigurasi berbeda. Setelah smoke suite lulus, promosikan artefak yang telah diuji, bukan mengunggah bundle kedua yang sedikit berbeda.

Peta channel Anda sebaiknya disimpan di capgo.config.json dan ditinjau seperti aplikasi code. Jaga nama channel tetap stabil, identifikasi rentang kompatibilitas native yang ditargetkan, dan jadikan promosi ke produksi sebagai aksi CI yang eksplisit. Untuk tim yang mengelola paparan fitur bersamaan dengan paparan pengiriman, ini tips tata kelola feature flag memberikan cara yang berguna untuk memisahkan izin deployment dari aktivasi yang terlihat oleh pengguna.

Hubungkan promosi ke CI

Desain GitHub Actions yang praktis memiliki dua jalur:

  • Pull request: Build lapisan web, tandai dengan kredensial preview terbatas, dan terbitkan ke channel preview sementara. Hancurkan atau kadaluwarkan channel tersebut saat pull request ditutup.
  • Rilis main bertag: Jalankan unit tests, build production bundle, validasi constraint versi native-nya, upload, dan promote hanya jika test job selesai dengan sukses.

Perintah promosi bisa seperti ini:

npx @capgo/cli bundle promote <bundle-id> \
  --to-channel production \
  --percent 5

Tingkatkan eksposur secara bertahap, misalnya 25%, 50%, dan 100%, dengan persetujuan CI atau job terpantau di antara setiap langkah. Persentase dan perintah adalah kontrol, bukan bukti keamanan. Build yang lolos hanya menunjukkan bundle valid secara sintaksis. Tidak menjamin perilaku pada binary native tertentu, dengan state lokal yang tersimpan, koneksi lambat, atau perangkat yang melanjutkan dari sesi lama.

Batas rilis: Web bundle terikat pada jendela kompatibilitas binary. Channel tidak boleh menjadi celah untuk menyajikan code yang merujuk API native yang tidak ada di aplikasi terpasang.

Jaga konsistensi build TestFlight dan internal-track Android dengan mengaitkan setiap bundle ke versi native persis yang menjadi targetnya. Jika build native berubah, terbitkan bundle baru yang ditargetkan untuk kompatibilitas atau buat pemetaan channel baru. The Panduan integrasi Capgo GitHub Actions dapat membantu menerjemahkan kebijakan tersebut menjadi langkah workflow yang dapat diulang.

Diagram yang mengilustrasikan tiga langkah channel perangkat lunak dan otomasi: Staging Channel, Pin Binary, dan CI/CD Auto-Deploy.

Strategi Pengujian dan Rollback Otomatis

Rilis OTA dapat lolos CI tetapi tetap gagal setelah diaktifkan. Kegagalan ini bisa bergantung pada bundle, binari native, status perangkat yang tersimpan, atau kondisi jaringan. Simulator dapat mengonfirmasi bahwa layar dirender, tetapi tidak dapat mencakup setiap binari yang terpasang atau menunjukkan apakah startup yang gagal pulih dengan bersih.

Gunakan tiga tingkatan pengujian:

  1. Tes bundle CI: Jalankan unit test, type check, linting, dan production web build. Uji jalur checkout, autentikasi, navigasi, dan persistence yang berubah, bukan sekadar berhenti di tahap kompilasi.
  2. Channel perangkat privat: Isi channel privat dengan perangkat fisik yang menjalankan native binary sebelumnya. Cakup kedua platform, clean install, upgrade install, dan stored state yang representatif.
  3. Canary produksi: Mulai dengan kohort kecil yang memenuhi syarat, crash reporting yang terhubung, dan alert error JavaScript. Perlakukan kegagalan startup sebagai hal mendesak karena pengguna yang terdampak mungkin tidak pernah sampai ke code yang melaporkan error in-app.

Panduan Panduan pengujian OTA Capacitor menjelaskan mekanisme pengujiannya. Aturan operasionalnya sederhana: uji setiap update terhadap Native Build yang ingin dilindungi.

Pisahkan kontrol server dari recovery client

Rollback di sisi server menghentikan download baru:

npx @capgo/cli channel set production --bundle <previous-id>

Hal ini mengubah apa yang akan ditemukan perangkat yang memenuhi syarat selanjutnya. Ini tidak menghapus bundle yang sudah diunduh atau aktif di setiap perangkat, sehingga klien juga memerlukan kontrol pemulihan. Konfigurasikan updater untuk mempertahankan fallback yang diketahui baik dan kembali ke kondisi tersebut setelah kegagalan startup yang ditentukan.

Jalur pemulihan yang andal mencakup:

  • Pelacakan kegagalan unduhan: Bedakan masalah konektivitas dari artefak yang tidak valid.
  • Pelacakan kegagalan instalasi: Deteksi masalah unpacking, verifikasi, dan filesystem.
  • Pelacakan kesehatan boot: Pastikan aplikasi mencapai kondisi yang dapat digunakan setelah aktivasi.
  • Fallback otomatis: Pulihkan bundle yang sebelumnya diketahui baik jika startup gagal berulang kali.
  • Eskalasi manual: Simpan identifikasi perangkat dan bundle untuk dukungan dan tim engineering.

Pada skala fleet, tingkat kegagalan kecil pun tetap menciptakan beban dukungan yang signifikan. Sebuah tingkat keberhasilan OTA update 99,95% masih menyiratkan sekitar 1.000 kegagalan per 1 juta perangkat, menurut data benchmark pengujian OTA untuk fleet IoT. Sumber yang sama menggambarkan guardrails termasuk rollback dalam 30 menit, tingkat crash di bawah 0,1%, dan 98% perangkat berada di dalam jendela dukungan. Perlakukan ini sebagai contoh benchmark, bukan kriteria penerimaan universal. Tetapkan error budget sesuai dengan risiko aplikasi dan dampak pada pengguna.

Penandatanganan, Keamanan, dan Apa yang Tidak Bisa Diubah oleh OTA

Update tanpa tanda tangan menjadikan endpoint pengiriman sebagai bagian dari permukaan serangan supply-chain Anda. TLS melindungi koneksi, tetapi klien juga harus memastikan bahwa artefak yang diunduh berasal dari proses rilis yang berwenang dan tidak diganti atau diubah selama transit.

Buat keypair Ed25519 dengan tooling updater. Simpan private key di secret CI, dan tanamkan public verification key di binary native saat build aplikasi. Klien harus memverifikasi setiap bundle sebelum aktivasi. Batasi token CLI berdasarkan lingkungan dan cakupan izin, simpan log upload dan promosi, serta wajibkan autentikasi kuat untuk aksi produksi.

Anggap rotasi kunci sebagai migrasi kompatibilitas, bukan sekadar perubahan konfigurasi. Buat kunci pengganti, kirim native build yang mempercayai kunci publik saat ini dan kunci pengganti, lalu tandai rilis dengan private key baru. Hapus kunci lama hanya setelah binary native yang kompatibel mengadopsi pengganti. Menghapus kepercayaan terlalu dini mencegah binary lama menerima update valid. Meninggalkan kunci yang terkompromi tetap dipercaya tanpa batas waktu membuat rotasi sia-sia.

Tetapkan batas dalam rencana rilis

OTA menangani perubahan lapisan web. Rilis native diperlukan ketika perubahan bergantung pada kapabilitas yang tidak ada di binary yang terpasang:

Kategori Kirim via OTA Memerlukan rilis native
Perilaku aplikasi Logika JavaScript, routing, validasi, dan penanganan state Implementasi plugin native
Presentasi CSS, HTML, copy, theme tokens, dan aset gambar yang kompatibel Ikon aplikasi dan sumber daya splash
Akses platform Panggilan web-layer Capacitor yang sudah ada ke kapabilitas yang tersedia di binary Izin, entitlement, atau API native baru
Konfigurasi Konfigurasi web dan aturan konten remote yang kompatibel Info.plist, AndroidManifest.xml, identitas penandatanganan
Metadata Store Tidak ada yang mengubah perilaku yang ditinjau Store atau metadata versi Metadata sensitif kebijakan Store dan perubahan nomor versi

Panduan Dokumentasi code-signing untuk updater Capacitor menjelaskan model verifikasi. Terapkan secara operasional dengan audit log yang tamper-evident, verifikasi sertifikat, TLS, kontrol akses ketat, dan proses investigasi untuk spoofing versi atau kompromi kunci.

Targeting kompatibilitas tetap penting karena populasi native yang terpasang berubah secara bertahap. Apple melaporkan 66% dari semua perangkat aktif di iOS 26 dan 74% perangkat yang dirilis dalam empat tahun terakhir menjalankan iOS 26, sementara laporan lain menempatkan iOS 26 di angka 79% dari semua perangkat di tahap akhir siklus, sebagaimana dirangkum dalam riset manajemen kunci OTA mobile. Angka-angka ini mencakup titik waktu dan populasi perangkat yang berbeda. Kesimpulan praktisnya konsisten: bahkan platform yang matang tidak memperbarui semua perangkat sekaligus. Alokasikan bundle berdasarkan versi native dan kapabilitas, bukan dengan asumsi satu artefak OTA cocok untuk seluruh fleet.

Checklist operasional sebelum setiap rilis

Buat checklist rilis hanya satu halaman, simpan di repository atau runbook. Perbarui setelah setiap insiden. Kontrol yang ditambahkan setelah kegagalan nyata biasanya mencegah kejadian berulang berikutnya.

Sebelum upload

  • Konfirmasi kompatibilitas: Pastikan bundle menargetkan native binary yang tepat dan tidak menggunakan plugin API yang tidak tersedia.
  • Periksa artifact: Build dari workspace bersih, periksa file yang dihasilkan, dan konfirmasi versi web yang dimaksud.
  • Lindungi signing: Pastikan CI memiliki secret dan key yang diharapkan. Periksa bahwa logs tidak dapat mengekspos materi privat.
  • Validasi channel: Tinjau pemetaan staging, beta, dan production sebelum menetapkan bundle.
  • Jaga pemulihan: Catat bundle known-good sebelumnya dan verifikasi bahwa jalur fallback masih berfungsi.
  • Jalankan smoke test fisik: Uji startup, login, checkout, navigasi, persistensi, dan kesiapan update pada perangkat yang representatif.

Selama promosi

Rilis ke cohort terbatas dulu, lalu pantau sinyal terkait dampak pengguna:

  • Sesi bebas crash: Bandingkan hasilnya dengan bundle sebelumnya dan selidiki regresi.
  • Tingkat error JavaScript: Kelompokkan error berdasarkan bundle, versi native, platform, dan jalur fitur.
  • Perilaku cold-start: Cek apakah aktivasi mengubah startup atau membuat pengguna terjebak di layar kosong.
  • Cakupan fitur: Pastikan fungsionalitas yang diaktifkan secara remote sesuai dengan binary yang menerimanya.
  • Adopsi dan kegagalan: Pisahkan perangkat yang memenuhi syarat tapi belum cek update dari perangkat yang sudah cek tapi gagal.

Pertahankan jendela observasi pasca-promosi pertama selama 30 menit sebelum memperluas cakupan. Jika jalur kritis rusak, kembalikan channel produksi ke bundle sebelumnya, pertahankan logs, dan putuskan apakah perbaikannya harus masuk ke bundle OTA lain atau rilis native baru.

Disiplin hari rilis: Bundle fallback hanya berguna jika tim tahu ID, rentang kompatibilitas, dan perintah restore-nya.

Anggap checklist ini sebagai code operasional bersama. Capgo dapat menyediakan pengiriman bundle bertanda tangan, targeting channel, kontrol rollout, riwayat update, dan observability tingkat perangkat. Tim Anda tetap memegang kebijakan kompatibilitas dan keputusan untuk promote.


Capgo memberikan tim CapacitorJS jalur terkontrol untuk update bertanda tangan pada JavaScript, CSS, konfigurasi, dan aset, dengan channel, pengiriman bertahap, perlindungan rollback, dan observability rilis. Terapkan checklist ini pada deployment berikutnya, uji terhadap biner staging, dan evaluasi Capgo untuk alur kerja produksi.

Live updates untuk aplikasi Capacitor

Saat bug web-layer sudah live, kirim perbaikannya lewat Capgo alih-alih menunggu berhari-hari untuk persetujuan app store. Pengguna mendapat update di background, sementara perubahan native tetap mengikuti jalur review normal.

Terbaru dari Blog kami

Capgo memberikan insight terbaik yang Anda butuhkan untuk membuat aplikasi mobile yang benar-benar profesional.