把一台 Mac mini
变成你的 iOS 构建机
iOS 和 Flutter 的打包离不开 macOS 和 Xcode。与其让每次构建都占用自己的电脑,不如在一台常开的远程 Mac 上装好 GitHub Actions 自托管 runner:推送代码就自动构建、测试、上传 TestFlight。下面是从零配置的完整步骤。
准备一台专用的 Mac
构建机最好专用:环境不被日常使用打乱,也不会因为合盖或休眠中断任务。远程租用的 Mac mini 7×24 在线,正好合适。登录后先为 runner 建一个单独的 macOS 用户(例如 runner),避免流水线拿到你个人账户的钥匙串和文件。
确认机器不会自动休眠:系统设置 → 能耗 → 打开「显示器关闭时防止自动进入睡眠」;也可以用管理员账户执行:
sudo pmset -a sleep 0 disksleep 0安装 Xcode 与命令行工具
从 App Store 或 Apple Developer 下载 Xcode,安装后执行首次启动和许可确认,并安装需要的模拟器运行时:
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -license accept
xcodebuild -runFirstLaunch
xcodebuild -downloadPlatform iOS需要多个 Xcode 版本时,可以用 xcodes 管理,并在流水线里用 DEVELOPER_DIR 指定版本。Flutter 项目再装 Flutter SDK 与 CocoaPods(brew install cocoapods)。
注册 GitHub Actions 自托管 Runner
在仓库或组织的 Settings → Actions → Runners → New self-hosted runner,选择 macOS、ARM64,页面会给出带临时令牌的命令。以 runner 用户登录后按页面执行,大致如下(以页面上的版本号和令牌为准):
mkdir actions-runner && cd actions-runner
curl -o actions-runner-osx-arm64.tar.gz -L <页面给出的下载地址>
tar xzf ./actions-runner-osx-arm64.tar.gz
./config.sh --url https://github.com/<组织>/<仓库> --token <页面给出的令牌> --labels ios,xcode自定义标签(如 ios、xcode)方便在流水线里精确指定这台机器。
安装为服务,重启后自动运行
./svc.sh install
./svc.sh start
./svc.sh statusrunner 会以 launchd 服务运行,机器重启后自动上线。在 GitHub 的 Runners 页面能看到它的状态变为 Idle。
写一条构建流水线
在 .github/workflows/ios.yml 里用 runs-on 指向自托管标签。因为环境常驻,依赖和 DerivedData 会被复用,增量构建明显更快:
name: iOS
on: [push]
jobs:
build:
runs-on: [self-hosted, macOS, ARM64, ios]
steps:
- uses: actions/checkout@v4
- name: Build and test
run: |
xcodebuild -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 16' test签名与上传 TestFlight
推荐用 fastlane:match 把证书和描述文件加密存进私有仓库,构建时下载到临时钥匙串;pilot 或 upload_to_testflight 用 App Store Connect API Key 上传,不需要在机器上登录 Apple ID。
API Key、match 密码等放在 GitHub Secrets 里,通过环境变量传给 fastlane,不要写进仓库或机器上的明文文件。退租前删除 runner(./svc.sh uninstall、./config.sh remove),并在 App Store Connect 撤销不再使用的密钥。
常见问题
为什么不用 GitHub 托管的 macOS runner?
托管 runner 按分钟计费、每次都是全新环境,缓存要反复恢复;构建频繁时费用和等待时间都会上升。一台常驻的自托管 Mac mini 保留 Xcode、模拟器、依赖缓存和签名环境,增量构建更快,费用按月固定。
自托管 runner 能用在公开仓库吗?
GitHub 官方不建议。公开仓库的任何人都能发起 Pull Request,可能在你的机器上执行任意代码。自托管 runner 应只用于私有仓库,或限制只有受信任的分支和人员能触发。
M6 Mac mini 够用吗,还是要 M5 Pro?
单个 App、一两条流水线并行时,M6 16 GB 足够;同时跑多个模拟器测试、多个项目并行构建,或 Flutter 加原生大项目,建议 M5 Pro 24 GB 以上。存储至少 512 GB,Xcode、模拟器运行时和 DerivedData 会占不少空间。
扫码加微信客服手机上长按二维码识别