Modern iOS CI/CD with Flutter & Xcode Cloud

Modern iOS CI/CD with Flutter & Xcode Cloud

Table of Contents

There was a Mac Mini under a desk. Everything shipped through it.

That sentence is the whole problem, and if you’ve worked on iOS delivery you already feel the shape of what went wrong: the machine needed OS updates that broke Xcode, Xcode updates that broke the Flutter toolchain, and certificates that expired on their own schedule regardless of what anyone was working on that week.

Web deployment doesn’t work like this. iOS demands code signing, provisioning profiles, and a physical Apple machine to build on. So I moved the whole thing to Xcode Cloud and turned the Mac Mini off.

Three things kept breaking

Certificates, first. Rotating them by hand meant the pipeline failed on a schedule nobody had written down.

Then the hardware. A build server in an office is a build server somebody has to babysit, and the person babysitting it was me.

And Flutter. Xcode Cloud is built for Swift and Objective-C projects. It does not know what Flutter is.

Getting Flutter through a Swift-shaped pipeline

Xcode Cloud instances are ephemeral, which is the point and also the difficulty. Every build starts from nothing, so the Flutter SDK has to arrive before Xcode goes looking for the iOS project.

That’s what ci_post_clone.sh does. It runs the moment the repo lands:

  • Pull the stable Flutter SDK
  • flutter pub get for dependencies
  • flutter build ios --no-codesign to generate the frameworks before the archive step

The ordering is the entire trick. Archive first and Xcode finds a project referencing frameworks that don’t exist yet.

Signing, handed over

The part I was most glad to stop owning. Xcode Cloud manages distribution certificates itself, so expiry stopped being an event that ruined an afternoon.

I want to be precise about this, because it’s easy to oversell: the certificates didn’t become simple. They became somebody else’s job. That’s a genuinely different thing, and for a small team it’s the better trade.

Where it landed

The Mac Mini is off. There’s no build machine to maintain, patch, or find desk space for.

Certificate-related build failures stopped, because the class of failure was removed rather than worked around.

And delivery is now boring, which is the highest compliment I can pay a pipeline. Merge to develop, and the build reaches testers through TestFlight without anyone doing anything.

call to action

Ready to build your next project with me?

I’m ready to help you build, improve, and launch your next project — just drop a message and let’s get started.

Get Started Now