Spring til indhold
AppsMedHalfdan.
Journal · af Halfdan Harring

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.

  1. Vælg “Any iOS Device” som target
  2. Product → Archive
  3. Vent (det tager 3-5 minutter)
  4. 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.

  1. Build → Generate Signed Bundle / APK → Android App Bundle
  2. Vælg din keystore (den jeg bruger gemmer jeg i 1Password)
  3. Build release
  4. Bundle ligger nu i android/app/release/

Upload .aab-filen til Google Play Console:

  1. Production → Create new release
  2. Upload bundle
  3. Tilføj release notes (jeg har en template)
  4. 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:

  1. Når build dukker op i App Store Connect, tilføj den til TestFlight
  2. Test selv på en rigtig enhed
  3. Hvis alt er godt, send til ekstern testing (mine “trusted testers”)
  4. Lad det ligge 24 timer
  5. 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:

TrinTid
Bump version1 min
npm run build && npx cap sync2 min
Test lokalt på iOS + Android10 min
Web deploy via git push3 min
iOS Archive + Upload10 min
Android Bundle + Upload10 min
Release notes overalt5 min
TestFlight test15 min
Submit to App Store2 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

Portræt af Halfdan Harring — dansk app-udvikler fra Aarhus
Skrevet af
Halfdan Harring

App-udvikler fra Aarhus. Bygger iOS, Android og webapps — mød mig her.