Vi brukade frukta att trycka på deploy-knappen. Inte för att något kunde gå sönder, men för att varje bygge kostade oss pengar.
Under lång tid förlitade vi oss på Codemagic för att bygga och deploya våra iOS- och Android-appar. Det var vettigt vid den tiden eftersom ingen av oss hade en Mac som kunde bygga iOS-appar och Codemagic hanterade allt i molnet. Vi gillade det överlag, men prissättningen för småföretag var icke-optimal. Vi pratar om tusentals kronor över tid, och det gjorde oss passiva när det gällde releaser.
Istället för att ship-fast och iterera fort, batchande vi uppdateringar för att minimera byggkostnader.
Låt oss vänta tills vi har några fler features klara. Låt oss kombinera dessa buggfixar i en release.
Det här tillvägagångssättet fick vi betala för när uppdateringar misslyckades, vilket innebar att rollbacks och felsökning blev en mardröm eftersom vi inte hade någon aning om vilken av de tio ändringarna vi buntat ihop som var orsaken.
För bekväma
Även efter att vi båda skaffat Mac-datorer höll vi oss till Codemagic. Det var bekvämt. Det fungerade. Tanken på att bygga på våra egna maskiner hade slagit oss men jobbet av att hantera certifikat och nycklar samt hålla miljöer synkroniserade höll oss borta. Ingen av oss hade någon riktig DevOps-erfarenhet, och arbetet med att läsa igenom .yaml-konfigurationsfiler kändes o-roligt.
Så vi fortsatte betala. Månad efter månad.
Brytpunkten
Sen en dag blev jag frustrerad. Jag ville pusha en snabb patch med Shorebird (som är ett fantastiskt verktyg som låter dig pusha over-the-air-uppdateringar till Flutter-appar utan att gå via appbutikerna). Men istället för att vänta på Codemagic bestämde jag mig för att försöka patcha lokalt.
När jag arbetade mig igenom diverse certifikatproblem och nyckel-huvudvärk slog en tanke mig: Om jag ändå ska hantera det här, låt oss göra det ordentligt.
Det var då jag snubblade över GitHub self-hosted runners.
Äntligen klickade det. Jag kunde använda min Mac på exakt samma sätt som Codemagics byggagenter men köra på min egen hårdvara. Inga minutavgifter. Ingen artificiell begränsning på byggtid. Bara min maskin, som gör det den alltid kunde göra.
Vad är GitHub Self-Hosted Runners?
För de obekanta så är det GitHub Actions som normalt kör dina workflows på GitHubs molninfrastruktur. Men med self-hosted runners kan du registrera din egen maskin som en byggagent. När ett workflow triggas skickar GitHub jobbet till din maskin istället för deras servrar.
Uppsättningen är överraskande enkel:
- Gå till dina repository-inställningar
- Navigera till Actions > Runners
- Klicka på "New self-hosted runner"
- Följ installationsstegen för ditt OS
När det är konfigurerat sitter din Mac redo att plocka upp vilket workflow som helst som specificerar runs-on: self-hosted. Det är som att ha din egen personliga Codemagic-agent, förutom att det är gratis och du kontrollerar allt.
Den sista pusselbiten: Fastlane
Refaktoreringen började. Jag började prata med Claude om vad jag ville uppnå, och ganska snabbt hade jag ett fungerande GitHub Actions-workflow. Men det fanns ett problem: workflowet använde mina lokalt installerade certifikat och nycklar för att signera apparna. Det här skulle vara jobbigt att hantera i teamet, även om vi just nu bara är två. Certifikatsynkronisering lät som ett klassikt fall av: "det funkar för mig".
Sen upptäckte vi Fastlane.
Fastlane är en open source-plattform som automatiserar byggande och release av mobilappar. Men det som verkligen övertygade oss var Fastlane Match som är ett verktyg som synkar dina certifikat och provisioning profiles mellan maskiner via ett privat Git-repository eller molnlagring.
Så här fungerar det:
- Alla signeringscertifikat krypteras och lagras i ett Git-repo
- När någon teammedlem (eller CI-runner) behöver bygga hämtar Match automatiskt rätt certifikat och installerar dem
- Inget mer manuellt exporterande av
.p12-filer eller delande av provisioning profiles över Slack
Vår Fastlane-uppsättning hanterar allt från att inkrementera byggnummer till att ladda upp till TestFlight och Play Store. Det som brukade vara en skrämmande manuell process är nu ett enda kommando.
Resultatet
Nu är våra deploymentkostnader exakt 0. Vi kör byggen på våra egna Maccar, certifikat synkas automatiskt via Match, och vi kan patcha och releasa när vi vill. Inget mer batchande av uppdateringar för att "byggen är dyra." Ingen mer tvekan att pusha en snabb fix för att det äter in i månadsbudgeten.
Det psykologiska skiftet har varit massivt. Vi gick från att frukta deployments till att omfamna dem. Hittade ett stavfel? Shippa det. Vill testa en liten feature med betaanvändare? Shippa det. Friktionen är borta.
Om du är en del av ett litet team som betalar för moln-CI/CD och har Maccar som samlar damm, överväg det här tillvägagångssättet. Den initiala uppsättningen tar en helg, men friheten det ger dig är värd varje minut.

