Scegli automaticamente l'aggiornamento in tempo reale o la costruzione nativa
Copia un prompt di configurazione con i passaggi di installazione e la guida markdown completa per questo plugin.
La maggior parte delle rilasci Capacitor sono JavaScript-only e dovrebbero essere inviati come un aggiornamento live. Alcune modifiche toccano il code nativo e richiedono un nuovo binario da code Build Costruzione di Capgo. Questa guida mostra come fare in modo che le GitHub azioni, GitLab CI o qualsiasi altra piattaforma CI/CD scelgano la strada corretta con ogni push — senza che un essere umano decida.
La Decisione
Sottosezione intitolata “La Decisione”Capgo già sa quale percorso è sicuro. Dopo la tua costruzione web (e prima di caricare o richiedere una costruzione nativa), esegui:
npx @capgo/cli@latest bundle releaseType com.example.app --channel production# → OTA ship with bundle upload# → native ship with Capgo BuildOTA significa che i pacchetti nativi corrispondono a quelli già disponibili sul canale. native significa che è stato modificato un plugin, la versione Capacitor o una dipendenza nativa — un pacchetto OTA non può aggiornare quei dispositivi in modo sicuro.
releaseType compara metadati dei pacchetti nativi (Capacitor/plugin di Cordova e versioni). Ciò non vede ogni modifica sotto ios/, android/, o capacitor.config.*Blocca quelle cartelle in Git prima, poi utilizza releaseType per la compatibilità delle dipendenze — gli esempi che seguono fanno entrambe.
Vedi Compatibilità nativa per le regole complete e il manuale bundle compatibility tabella.
Requisiti
Sezione intitolata “Requisiti”- l'app Capgo registrata e una Capgo __CAPGO_KEEP_1__ chiave Capgo API key In segreto CI come
CAPGO_TOKEN - Aggiornamenti in tempo reale caricano funzionano (
bundle upload) — vedere Integrazione CI/CD - Capgo Credenziali di costruzione in CI se si aspettano lavori nativi — vedere GitHub Azioni o Per esempio, una canale che esiste già e corrisponde alla produzione (ad esempio utilizza
- Canale sul
production) - tattica in modo che ogni caricamento possa trasportare
metadata(una volta):--auto-min-update-versionCredenziali
npx @capgo/cli@latest channel set production com.example.app --disable-auto-update metadataCome dovrebbe funzionare il flusso di lavoro
Sezione intitolata “Come dovrebbe funzionare il flusso di lavoro”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]
- Costruisci gli asset web come di consueto.
- Se il commit tocca
ios/,android/, ocapacitor.config.*, forza la via nativa. - Altrimenti chiedi a Capgo
releaseTypese il commit è sicuro per OTA. - Se
OTA, caricare con--fail-on-incompatiblee--auto-min-update-version. - Se
native, eseguire Capgo Build, quindi caricare il bundle corrispondente con--auto-min-update-versioncosì il metadata nativo del canale avanzerà. Non fare utilizzare--fail-on-incompatibleper quel caricamento di base — i nuovi pacchetti nativi sono destinati a differire. Vedi Flusso di lavoro del canale nativo + OTA per la FAQ del livello del canale.
GitHub Azioni
Sezione intitolata “GitHub Azioni”Un flusso di lavoro che blocca le vie native, quindi si dirama su 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 \ --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-versionSostituisci com.example.app e collega i segreti di firma come descritto in GitHub Azioni per Capgo Costruzione.
GitLab CI
Sezione intitolata “GitLab CI”GitLab valuta rules quando viene creata la pipeline, quindi il ramo con un shell if all'interno di un lavoro di distribuzione (o generare un pipeline figlio dinamico se hai bisogno di lavori di matrice nativi separati):
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: - mainSalva CAPGO_TOKEN e Capgo le variabili di firma di build come variabili CI/CD mascherate/protette.
Altre piattaforme CI
Sezione intitolata “Altre piattaforme CI”I tre stessi passaggi funzionano ovunque:
| Passo | Comando |
|---|---|
| Verdetto | npx @capgo/cli@latest bundle releaseType APP_ID --channel production |
| Percorso OTA | npx @capgo/cli@latest bundle upload APP_ID --channel production --fail-on-incompatible --auto-min-update-version |
| Percorso nativo | npx @capgo/cli@latest build request APP_ID --platform ios (o android) --build-mode release |
Mappa l'uscita della shell / stdout nei condizionali della tua piattaforma (o conserva un solo lavoro con una shell if, come GitLab sopra):
- Azure Pipelines — impostare una variabile di output da un passaggio di script, quindi utilizzare
condition: eq(variables['releaseType'], 'OTA') - Bitbucket Pipelines — scrivere
RELEASE_TYPE=…per$BITBUCKET_PIPELINES_VARIABLES_PATHdichiararlo sottooutput-variablese procedere con i passaggi successivi concondition: state: RELEASE_TYPE == "OTA"(gli artefatti di file da soli non possono guidarecondition) - CircleCI —
whenviene valutato al tempo di compilazione della configurazione, quindi procedere con un shell di runtimeifo una configurazione dinamica / continuazione, non un valore di workspace inwhen - Jenkins — cattura la stdout in una variabile di ambiente e utilizza
when { environment name: 'RELEASE_TYPE', value: 'OTA' }
Percorsi Filtri (Opcional Speedup)
Sottosezione intitolata “Percorsi Filtri (Opcional Speedup)”Il filtro dei percorsi è un'ottimizzazione dei costi, non un sostituto del controllo Capgo. Preferisci escludere i percorsi dedicati ai documenti piuttosto che mantenere una lista di concessione fragile — le costruzioni web spesso dipendono anche da vite.config.*, tsconfig*.json, e file di configurazione del framework:
on: push: branches: [main] paths-ignore: - '**.md' - 'docs/**' - '.github/**'Se utilizzi una lista di concessione invece, includi ogni input che le costruzioni web e native leggono, non solo src/ e package.json.
Context: Pagina/Area: Sito web di marketing Capgo. Ruolo: Etichetta UI breve o elemento di navigazione. Visualizzato in: pagina trust.astro. Chiave del messaggio `e` (E).
Dopo un Verdetto NativoSottosezione intitolata “Dopo un Verdetto Nativo”
- Capgo Build produces signed binaries and can submit to TestFlight / Play (see configurazione).
- Carica il bundle JS corrispondente con
--auto-min-update-version(strategia di metadati) in modo che il canale registri i nuovi pacchetti nativi — altrimenti il prossimo commit solo JS ritornanative. - Una volta che gli utenti installano il nuovo binario, i commit JavaScript successivi tornano a
OTAdi nuovo.