iOS 构建

把一台 Mac mini
变成你的 iOS 构建机

iOS 和 Flutter 的打包离不开 macOS 和 Xcode。与其让每次构建都占用自己的电脑,不如在一台常开的远程 Mac 上装好 GitHub Actions 自托管 runner:推送代码就自动构建、测试、上传 TestFlight。下面是从零配置的完整步骤。

三万主机 · 更新于

01 / PREPARE

准备一台专用的 Mac

构建机最好专用:环境不被日常使用打乱,也不会因为合盖或休眠中断任务。远程租用的 Mac mini 7×24 在线,正好合适。登录后先为 runner 建一个单独的 macOS 用户(例如 runner),避免流水线拿到你个人账户的钥匙串和文件。

确认机器不会自动休眠:系统设置 → 能耗 → 打开「显示器关闭时防止自动进入睡眠」;也可以用管理员账户执行:

sudo pmset -a sleep 0 disksleep 0
02 / XCODE

安装 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)。

03 / RUNNER

注册 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)方便在流水线里精确指定这台机器。

04 / SERVICE

安装为服务,重启后自动运行

./svc.sh install
./svc.sh start
./svc.sh status

runner 会以 launchd 服务运行,机器重启后自动上线。在 GitHub 的 Runners 页面能看到它的状态变为 Idle。

05 / WORKFLOW

写一条构建流水线

在 .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
06 / SIGNING

签名与上传 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 撤销不再使用的密钥。

FAQ

常见问题

为什么不用 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 会占不少空间。

微信
微信客服二维码扫码加微信客服手机上长按二维码识别
Telegram 客服