Min Capacitor deploy-workflow: Fra git push til App Store på under en time
Sådan ser min konkrete deploy-pipeline ud, når jeg sender en ny version af en Capacitor-app til både iOS, Android og web. Trin for trin, uden bullshit.
Capacitor giver dig én React-codebase, der kan blive til iOS-app, Android-app og web-app. Men den faktiske deploy-proces involverer stadig flere skridt.
Her er den workflow, jeg bruger hver gang jeg sender en ny version af en app som HeadToHead eller Quiz Fight. Trin for trin.
Forudsætninger
Min standard-opsætning:
- GitHub til kode
- Cloudflare Pages (eller UnoEuro) til web-versionen
- Xcode + Apple Developer Account til iOS
- Android Studio + Google Play Console til Android
- EAS eller manuel build til App Store/Play Store
Jeg holder altid versioner synkroniseret på tværs af platforme. Hvis web er på 2.4.1, så skal iOS og Android også være på 2.4.1.
Trin 1: Bump version-nummeret
I package.json:
{
"version": "2.4.1"
}
I ios/App/App/Info.plist:
<key>CFBundleShortVersionString</key>
<string>2.4.1</string>
<key>CFBundleVersion</key>
<string>241</string>
I android/app/build.gradle:
defaultConfig {
versionCode 241
versionName "2.4.1"
}
Jeg har en lille script-fil (scripts/bump-version.mjs) der gør alle tre på én gang. Det sparer 5 minutter, og fjerner risikoen for at glemme én af platformene.
Trin 2: Test alt lokalt
npm run build
npx cap sync
Først npm run build — bygger React-app’en til dist/.
Så npx cap sync — kopierer bygget over i iOS og Android-projekterne.
Derefter åbner jeg appen lokalt i Xcode og Android Studio for at tjekke:
- Starter den uden crash?
- Virker de vigtigste flows?
- Ingen mærkelige WebView-issues?
Hvis web-versionen virker, men iOS crasher, er det næsten altid noget med Capacitor-pluginerne, der ikke er synced korrekt.
Trin 3: Deploy web-versionen først
Web-versionen er den nemmeste at deploye og rulle tilbage. Den får altid den nye version først:
git commit -am "Release v2.4.1"
git push
Cloudflare Pages builder automatisk. Inden for et par minutter er web-versionen live.
Hvis noget skulle gå galt, så er det en web-deploy, jeg kan rette på 5 minutter. iOS og Android er sværere at rette bagud.
Trin 4: Build iOS
Åbn ios/App/App.xcworkspace i Xcode.
- Vælg “Any iOS Device” som target
- Product → Archive
- Vent (det tager 3-5 minutter)
- I Organizer: Distribute App → App Store Connect → Upload
Når uploaden er færdig, går der typisk 10-15 minutter, før den dukker op i App Store Connect under TestFlight.
Mens jeg venter, deployer jeg Android.
Trin 5: Build Android
Open android/ i Android Studio.
- Build → Generate Signed Bundle / APK → Android App Bundle
- Vælg din keystore (den jeg bruger gemmer jeg i 1Password)
- Build release
- Bundle ligger nu i
android/app/release/
Upload .aab-filen til Google Play Console:
- Production → Create new release
- Upload bundle
- Tilføj release notes (jeg har en template)
- Save → Review → Roll out
Google er hurtigere end Apple. Typisk er nye Android-versioner live inden for et par timer.
Trin 6: TestFlight først, App Store bagefter
For iOS sender jeg altid versionen via TestFlight først:
- Når build dukker op i App Store Connect, tilføj den til TestFlight
- Test selv på en rigtig enhed
- Hvis alt er godt, send til ekstern testing (mine “trusted testers”)
- Lad det ligge 24 timer
- Hvis ingen klager, “Submit for Review” til App Store
Den her ekstra dag fanger mange problemer. Det er værd at vente.
Trin 7: Release notes — én gang, mange steder
Jeg skriver release notes én gang i et RELEASES.md i repo’et. Så kopierer jeg dem til:
- App Store Connect (iOS release notes)
- Google Play Console (What’s new)
- GitHub Releases (for changelog)
- Web-version (i en lille “What’s new”-popup hvis det er stort)
Det tager 5 minutter mere, men det giver mig én konsistent kilde til hvad-er-ændret-hvornår.
Hele workflowen i én bevægelse
På en god dag:
| Trin | Tid |
|---|---|
| Bump version | 1 min |
npm run build && npx cap sync | 2 min |
| Test lokalt på iOS + Android | 10 min |
| Web deploy via git push | 3 min |
| iOS Archive + Upload | 10 min |
| Android Bundle + Upload | 10 min |
| Release notes overalt | 5 min |
| TestFlight test | 15 min |
| Submit to App Store | 2 min |
| Total til submission | ~1 time |
Plus 1-3 dages ventetid på Apple review.
Det her er muligt fordi det er én codebase
Pointen med hele Capacitor-tilgangen er, at jeg ikke skal bygge tre forskellige apps. Jeg bygger én React-app, og pakker den til tre platforme.
Det betyder:
- Samme feature ryger til alle tre platforme samtidig
- Bug-fixes bliver fikset alle tre steder med én PR
- Brugere får konsistent oplevelse uanset hvilken platform de er på
Det her er den vigtigste grund til, at jeg som solo-udvikler kan have fire seriøse apps live samtidig — uden at gå til grunde.
Halfdan Harring bygger og deployer Capacitor-apps fra Aarhus. Se de aktuelle produkter på AppsMedHalfdan.dk.
Se mine apps · Hvorfor React + Capacitor · App Store review-tjekliste · Firestore security rules