Jedes Mobile-Dev-Team kennt den Schmerz: Eine Funktion ist bereit für die Review, aber um sie Stakeholdern zugänglich zu machen, muss man sich durch den Labyrinth der TestFlight- oder Google-Play-Beta-Reviews kämpfen. Was Minuten dauern sollte, wird zu Stunden des Wartens, Installierens und Verwaltens von Beta-Builds.
Was wäre, wenn deine Produktions-App die neuesten Änderungen aus jedem Pull Request direkt auf das Gerät ziehen könnte – ohne Neuinstallationen oder App-Store-Verzögerungen?
Genau das ist PR-Previews aktivieren. Wenn ein Entwickler einen Pull Request öffnet, erstellt eine GitHub Action einen eigenen Update-Channel und veröffentlicht die Änderungen. Alle, die die App installiert haben, können zu diesem Channel wechseln, das Feature testen und wieder zurückwechseln – ohne die App zu verlassen, die sie bereits haben.
Das TestFlight-Problem
Der klassische Workflow zum Testen von Mobile-Features sieht meistens so aus:
- Entwickler öffnet PR - Code ist bereit fürs Review
- Auf TestFlight warten - 15-30 Minuten Verarbeitungszeit
- Suchen und installieren - Tester suchen nach dem richtigen Build
- Testen und wiederholen - Jede Änderung bedeutet erneut Warten
Das schafft einen Engpass. QA wird durch das Warten auf Builds blockiert. Product Manager können Features nicht schnell verifizieren. Entwickler verlieren den Kontext, während sie auf Feedback warten. Branchenschätzungen zufolge kostet das etwa 340 $ pro PR an verlorener Produktivität.
So funktionieren PR-Previews
PR-Previews nutzen das Channel-System von Capgo, um Update-Streams pro PR zu erstellen. So läuft der Ablauf ab:
- PR geöffnet oder aktualisiert - GitHub Action wird ausgelöst
- Bundle hochgeladen - Deine JS/CSS-Änderungen gehen in einen PR-spezifischen Channel
- Kommentar gepostet - Tester erhalten Anweisungen im PR
- Sofortiges Testen - Kanäle wechseln, testen, zurückwechseln
Keine neuen App-Installationen. Keine TestFlight-Verzögerungen. Dieselbe Produktions-App kann aus verschiedenen Update-Kanälen laden.
PR-Previews einrichten
Bevor du PR-Previews implementieren kannst, muss dein Projekt mit Capgo Live Updates konfiguriert sein. Folge dem Capgo Quickstart-Guide , falls du es noch nicht getan hast.
GitHub Actions-Workflow
Erstellen .github/workflows/pr-preview.yml:
name: PR Preview
on:
pull_request:
types: [opened, synchronize]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup Bun
uses: oven-sh/setup-bun@v2
- name: Install Dependencies
run: bun install
- name: Build
run: bun run build
# Create a channel named after your PR (may already exist on synchronize)
- name: Create PR Channel
id: create_channel
continue-on-error: true
run: bunx @capgo/cli@latest channel add pr-${{ github.event.pull_request.number }} --self-assign
env:
CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }}
# Upload the build to that channel
- name: Upload to Capgo
run: bunx @capgo/cli@latest bundle upload --channel pr-${{ github.event.pull_request.number }}
env:
CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }}
# Post a comment with testing instructions (only on PR open)
- name: Comment on PR
if: github.event.action == 'opened'
uses: actions/github-script@v7
with:
script: |
github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: ${{ github.event.pull_request.number }},
body: '📱 **Test this PR on device:**\n\nOpen your app and switch to channel: `pr-${{ github.event.pull_request.number }}`\n\nUse the shake menu or call `setChannel()` from your app.'
})
Der Schlüssel ist das --self-assign -Flag bei der Erstellung des Kanals. Damit können Tester in der App auf den Kanal wechseln, indem sie das setChannel() API.
Einrichten des Capgo-Tokens
- Gehe zu deinem Capgo Dashboard
- Gehe zu Einstellungen > API-Keys
- Erstelle einen neuen Key mit
allBerechtigungen - Füge ihn als
CAPGO_TOKENin den Secrets deines GitHub-Repositoriums hinzu
So wechseln Tester zwischen Channels
Tester können auf zwei Arten in einen PR-Channel wechseln:
Option 1: Shake-Menü (am einfachsten)
Aktiviere das Shake-Menü mit Channel-Auswahl in deiner Capacitor-Konfiguration:
// capacitor.config.ts
const config: CapacitorConfig = {
// ... your other config
plugins: {
CapacitorUpdater: {
shakeMenu: true,
allowShakeChannelSelector: true
}
}
};
Tester schütteln ihr Gerät, um das Debug-Menü zu öffnen, das eine Liste der verfügbaren Channels mit Suchleiste anzeigt. Sie finden ihren PR-Channel (z. B. pr-123), tippen zur Auswahl und die App lädt das Update automatisch herunter und wendet es an. Nach dem Testen schütteln sie erneut und wechseln zurück zu Production.
Das Shake-Menü übernimmt den gesamten Ablauf automatisch:
- Ruft alle selbst zuweisbaren Channels ab über
listChannels() - Zeigt Channels mit Suche an, um bestimmte PRs zu finden
- Lädt das Update nach der Auswahl herunter
- Fordert zum Neuladen mit den Optionen „Jetzt neu laden“ / „Später“ auf
Option 2: Eigene Channel-Auswahl-UI
Integriere einen Channel-Switcher in deine App, der verfügbare PR-Channels auflistet und Testern die Auswahl ermöglicht. Dies nutzt zwei zentrale APIs:
listChannels()- Ruft alle Channels mit aktivierter Selbstzuweisung absetChannel()- Wechselt das Gerät zum ausgewählten Channel
import { CapacitorUpdater } from '@capgo/capacitor-updater';
// Get all available channels (including PR channels)
async function getAvailableChannels() {
const { channels } = await CapacitorUpdater.listChannels();
// Filter to show only PR channels
const prChannels = channels.filter(c => c.name.startsWith('pr-'));
return prChannels;
}
// Switch to a specific PR channel
async function switchToChannel(channelName: string) {
await CapacitorUpdater.setChannel({
channel: channelName,
triggerAutoUpdate: true // Immediately check for updates
});
}
// Return to production
async function switchBackToProduction() {
await CapacitorUpdater.unsetChannel({});
}
// Get current channel
async function getCurrentChannel() {
const { channel } = await CapacitorUpdater.getChannel();
return channel;
}
Mit diesen Bausteinen kannst du eine einfache UI erstellen:
// Example: List PR channels and let user select
const channels = await getAvailableChannels();
const current = await getCurrentChannel();
// Display channels in your UI
channels.forEach(channel => {
console.log(`${channel.name} ${channel.name === current ? '(current)' : ''}`);
});
// When user selects a channel
await switchToChannel('pr-123');
Ein vollständiges Beispiel für ein React-Component findest du in unserem Artikel zu Channel Surfing.
PR-Channels aufräumen
Wenn ein PR gemerged oder geschlossen wird, solltest du den Channel aufräumen. Füge einen weiteren Workflow hinzu:
name: Cleanup PR Preview
on:
pull_request:
types: [closed]
jobs:
cleanup:
runs-on: ubuntu-latest
steps:
- name: Delete PR Channel
run: bunx @capgo/cli@latest channel delete pr-${{ github.event.pull_request.number }}
env:
CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }}
Dadurch wird der Channel entfernt, sobald der PR geschlossen wird, damit deine Channel-Liste sauber bleibt.
Versionskompatibilität
PR-Previews funktionieren nur, wenn das JavaScript-Bundle mit der installierten nativen Version kompatibel ist. Wenn dein PR native code Änderungen enthält (neue Capacitor Plugins, iOS/Android-Modifikationen), brauchen Tester einen neuen Native Build.
Capgo prüft die Versionskompatibilität automatisch. Wenn das Bundle eines PRs auf eine andere native Version abzielt als die installierte, wird das Update nicht angewendet. Das verhindert Abstürze durch inkompatible code.
Für PRs, die native Änderungen erfordern, musst du einen neuen TestFlight/Play Store Build ausliefern. PR-Previews eignen sich am besten für JavaScript-, CSS- und Asset-Änderungen, die kein natives code betreffen.
Wer profitiert von PR-Previews
QA-Engineers
- Features sofort testen, wenn PRs geöffnet werden
- Zwischen mehreren PRs wechseln, ohne neu zu installieren
- Fixes und Regressionen auf echten Geräten verifizieren
- Kein Warten mehr auf die TestFlight-Verarbeitung
Product Manager
- Funktionen vor dem Merge prüfen
- Feedback direkt im PR geben
- Prüfen, ob die Implementierung den Anforderungen entspricht
- Review-Zyklen verkürzen
Entwickler
- Schnelleres Feedback zu Änderungen erhalten
- Funktionen sofort Stakeholdern demonstrieren
- Probleme mit bestimmten Nutzern debuggen
- Weniger Zeit für das Management von Beta-Builds
Vergleich: klassisch vs. PR Previews
| Aspekt | TestFlight/Beta | Capgo PR-Vorschau |
|---|---|---|
| Build-Zeit | 15–30 Min. | <1 Min. |
| PRs wechseln | 5+ Min. Neuinstallation | 10 Sekunden |
| Setup-Komplexität | App Store-Zugangsdaten | Eine Workflow-Datei |
| Aufräumen | Manuell | Automatisch |
| Native code-Änderungen | Erforderlich | Optional (nur JS) |
Best Practices
- Channels klar benennen: Nutze
pr-{number}Konvention zur einfachen Identifizierung - Auto-Cleanup: Channels immer löschen, wenn PRs geschlossen werden
- Zugriff einschränken: Shake-Menü nur in Debug/Staging-Builds aktivieren
- Den Prozess dokumentieren: Testanweisungen zu deinem PR-Template hinzufügen
- Fehler sauber behandeln: Vor dem Posten von Kommentaren prüfen, ob die Channel-Erstellung erfolgreich war
Wann man PR Previews nicht nutzen sollte
PR-Previews sind für JavaScript/CSS-Änderungen gedacht. Wenn dein PR Folgendes enthält:
- Neue Capacitor-Plugins
- Native iOS-Änderungen für code
- Native Android-Änderungen für code
- Abhängigkeits-Updates, die native Builds betreffen
Für diese Änderungen benötigen Sie die klassische TestFlight-/Play-Store-Verteilung.
Kombination mit Channel Surfing
PR-Previews funktionieren am besten in Kombination mit Channel Surfing. Deine App kann Folgendes bieten:
production- Stabile Releases für alle Nutzerbeta- Early Access für Opt-in-Nutzerpr-123- Feature-Previews für spezifische PRs
Tester mit Production-Builds können einfach in jeden PR-Channel wechseln, das Feature testen und dann zurückwechseln – alles mit derselben installierten App.
Ressourcen
- Capgo Live Updates Dokumentation
- Channels Dokumentation
- Channel-Surfing-Guide
- CLI Befehlsreferenz
- PR-Preview-Lösungsseite
Fazit
PR-Previews verändern, wie Ihr Team mobile Features prüft und testet. Statt auf die TestFlight-Verarbeitung zu warten und mehrere Beta-Builds zu verwalten, können Tester in Sekunden auf jeden PR-Channel wechseln – mit der App, die sie bereits installiert haben.
Die Einrichtung ist minimal – eine einzige GitHub Actions-Workflow-Datei – und die Vorteile summieren sich im gesamten Team. QA bleibt blockiert, Produktmanager prüfen schneller und Entwickler erhalten schnelleres Feedback.
Fangen Sie an, indem Sie den Workflow in ein Repository hinzufügen, und sehen Sie, wie sich Ihr Review-Prozess verändert.
Weiterlesen: Jeden Pull Request in eine installierbare Vorschau verwandeln
Wenn du es nutzt Mach aus jedem Pull Request eine installierbare Preview um Channel-Routing und Staged Rollout zu planen, verbinde es mit Kanäle für die Implementierungsdetails in Channels, Kanäle für die Implementierungsdetails in Channels, Kanäle für die Implementierungsdetails in Channels, Beta-Testing-Lösung für den Produkt-Workflow in der Beta-Testing-Lösung, und Version-Targeting-Lösung für den Produkt-Workflow in der Version-Targeting-Lösung.