Wählen Sie Auto Choose Live Update oder Native Build
Kopieren Sie einen Setup-Vorschlag mit den Installationsanweisungen und der vollständigen Markdown-Anleitung für diesen Plugin.
Die meisten Capacitor-Veröffentlichungen sind JavaScript-only und sollten als ein live updateEinige Änderungen betreffen native code und erfordern ein neues Binärpaket von Capgo Build. Diese Anleitung zeigt, wie man GitHub-Aktionen, GitLab CI oder jede andere CI/CD-Plattform die richtige Route auf jeden Push auswählen können – ohne dass ein Mensch entscheidet.
Die Entscheidung
Abschnitt mit dem Titel ‘Die Entscheidung’Capgo weiß bereits, welcher Weg sicher ist. Nach Ihrer Web-Build (und bevor Sie eine native Build hochladen oder anfordern) führen Sie:
npx @capgo/cli@latest bundle releaseType com.example.app --channel production# → OTA ship with bundle upload# → native ship with Capgo BuildOTA bedeutet, dass die native Pakete mit dem bereits im Kanal verfügbaren entsprechen. native bedeutet, dass ein Plugin, eine Capacitor-Version oder eine andere native Abhängigkeit geändert wurde – ein über-ein-Netzwerk-Paket kann diese Geräte nicht sicher aktualisieren.
releaseType vergleicht native Paketmetadata (Capacitor/Cordova-Plugins und -Versionen). Es tut nicht jedes Änderung unter ios/, android/, oder capacitor.config.*Git-Verzeichnisse zuvor speichern, dann verwenden releaseType für Abhängigkeitskompatibilität – die folgenden Beispiele tun beides.
Siehe Native Kompatibilität Für die vollständigen Regeln und die Anleitung bundle compatibility Tabelle
Voraussetzungen
Sektion mit dem Titel „Voraussetzungen“- Capgo-App registriert und ein Capgo __CAPGO_KEEP_1__-Schlüssel Capgo API Schlüssel Live-Updates-Upload funktioniert (
CAPGO_TOKEN - Live Updates stellen Daten hoch ("
bundle upload— siehe CI/CD-Integration - Capgo Build-Zugangsdaten in CI, wenn Sie native Jobs erwarten – siehe GitHub Aktionen oder Entweder
- Ein Channel, der bereits existiert und dem Produktionsumfeld entspricht (Beispiele verwenden)
production) - Kanal auf dem
metadatastrategy, damit jeder Upload eine--auto-min-update-version(one-time):
npx @capgo/cli@latest channel set production com.example.app --disable-auto-update metadataWie die Pipeline funktionieren sollte
Abschnitt mit dem Titel „Wie die Pipeline funktionieren sollte“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]
- Bauen Sie Web-Assets wie gewohnt.
- Wenn der Commit das
ios/,android/, odercapacitor.config.*, zwingen Sie den nativen Pfad. - Ansonsten fragen Sie Capgo
releaseTypeob die Commit OTA-sicher ist. - If
OTA, hochladen mit--fail-on-incompatibleWenn--auto-min-update-version. - If
nativerun Capgo Build, dann laden Sie das entsprechende Bundle hoch--auto-min-update-versionso dass sich die native Metadaten des Kanals fortsetzen nicht benutzen--fail-on-incompatiblefür diese Basisupload — die neuen native Pakete sollen sich unterscheiden. Siehe Native + OTA-Kanal-Workflow für das Channel-Level-Faq
GitHub Aktionen
Sektion mit dem Titel „GitHub Aktionen“Eine Workflow, die native Pfade einschränkt, dann auf 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-versionErsetzen com.example.app und verbinden Sie die Signaturgeheimnisse wie in GitHub Aktionen für Capgo Build.
GitLab CI
Abschnitt mit dem Titel “GitLab CI”GitLab bewertet rules wenn der Pipeline erstellt wird, also Zweig mit einer Shell if inside one deploy job (or generate a dynamisches Kindpipeline wenn Sie separate native Matrix-Jobs benötigen):
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: - mainSpeichern CAPGO_TOKEN und Capgo Gebäude Signierung Variablen als maskiert/geschützte CI/CD-Variablen speichern.
Sonstige CI-Plattformen
Abschnitt mit dem Titel “Sonstige CI-Plattformen”Die gleichen drei Schritte funktionieren überall:
| Schritt | Befehl |
|---|---|
| Urteil | npx @capgo/cli@latest bundle releaseType APP_ID --channel production |
| OTA-Pfad | npx @capgo/cli@latest bundle upload APP_ID --channel production --fail-on-incompatible --auto-min-update-version |
| Native-Pfad | npx @capgo/cli@latest build request APP_ID --platform ios oder android) --build-mode release |
Mapte die Ausgabe der Shell in Ihre Plattformbedingungen (oder behalten Sie ein einzelnes Job mit einer Shell ifAzure Pipelines
- Azure Pipelines setze eine Ausgabeveränderliche aus einem Skript-Schritt, dann verwende
condition: eq(variables['releaseType'], 'OTA') - Bitbucket Pipelines — schreiben
RELEASE_TYPE=…zu$BITBUCKET_PIPELINES_VARIABLES_PATHErkläre es an.output-variablesund verwalte die späteren Schritte mitcondition: state: RELEASE_TYPE == "OTA", und später Schritte mitcondition) - CircleCI —
whenwird bei der Konfigurationskompilierung ausgewertet, also Zweig mit einem Laufzeit-Shellifam Konfigurations-Kompilationszeitpunkt ausgewertet wird, also mit einer Laufzeit-Shellwhen - Jenkins — stdout in eine Umgebungsvariable speichern und verwenden
when { environment name: 'RELEASE_TYPE', value: 'OTA' }
Pfade Filtern (Optional Speedup)
Verzeichnisse-Filter (Optional Speedup)Pfadfilter sind eine Kostenoptimierung, kein Ersatz für die Capgo-Überprüfung. Vorziehen Sie die Ausschluss von Dokumentationspfaden anstatt eine fragile Zulassungsliste zu pflegen — Web-Builds hängen oft auch von vite.config.*, tsconfig*.json, und Konfigurationsdateien für das Framework.
on: push: branches: [main] paths-ignore: - '**.md' - 'docs/**' - '.github/**'Wenn Sie eine Zulassungsliste verwenden, sollten Sie alle Eingaben berücksichtigen, die Ihre Web- und Native-Builds lesen, nicht nur src/ und package.json.
Nach einem Native-Urteil
Abschnitt mit dem Titel „Nach einem Native-Urteil“Wenn CI native wählt:
- Capgo-Build erzeugt signierte Binärdateien und kann bei TestFlight/Play hochladen (siehe Konfiguration).
- Laden Sie das entsprechende JS-Bundle mit
--auto-min-update-version(Metadatenstrategie) so dass der Kanal die neuen Native-Pakete aufzeichnet — ansonsten kehrt der nächste JS-nur-Commitnative. - Einmal die Benutzer die neue Binärdatei installieren, kehren später JavaScript-only-Commits zu
OTAWieder.