SuperAPI AI 工具集

github-actions-ios

部署与运维

查看项目

更新于 10-16 11:55

技能介绍

本技能面向需要在 GitHub Actions 上完成 iOS 应用发布流程的团队,核心覆盖代码签名、archive 归档、TestFlight 分发以及 App Store Connect 上传(通过 API Key)或 EAS 方式。适用于发布 IPA、使用 Fastlane gym/pilot 等场景。

主要能力与规则:

一、安全与签名规则(不可妥协项)

  • 不得将 .p12、.mobileprovision 或 .p8 提交到 git。相关密钥需放入 Secrets,包括 API Key,以及使用 Match 时的证书仓库凭据。
  • 推荐使用 App Store Connect API Key(AUTHKEY_P8、ASC_KEY_ID、ASC_ISSUER_ID),不要在 YAML 中使用 Apple ID 加密码或 app-specific password。
  • 先发 TestFlight,再考虑 App Store。生产发布(deliver 或提交审核)需配合 environment: production 与 reviewer 审批。
  • Scheme 与 CODE_SIGN_STYLE 需与 Distribution(App Store)描述文件一致,上传作业不得使用 Development。
  • 使用 macos-latest,或固定到与项目 xcode-version 匹配的 Xcode 镜像。

二、CI(原生)

  • 提供 test 作业示例:runs-on: macos-latest、permissions: contents: read、timeout-minutes: 45,使用 actions/checkout@v4 与 actions/cache@v4 缓存 DerivedData,缓存键基于 xcodeproj、Package.resolved、Podfile.lock 哈希。
  • 通过 xcodebuild test 指定模拟器目标(示例为 iPhone 16)运行测试。
  • 单元测试与 Swift Testing 在模拟器跑;XCUITest 仅在关键路径或 workflow_dispatch 触发,因其不稳定且耗时。
  • SPM 可缓存 SourcePackages;CocoaPods 需 pod install 并缓存 Pods。
  • 当镜像包含多个 Xcode 时使用 xcode-select -s 指定版本。

三、签名方式选择

  • API Key 加 Fastlane Match:适用于团队,证书放在私有仓库/S3。
  • 导入 keychain:证书与描述文件以 base64 存入 secrets,属最后手段。
  • Xcode Cloud:若产品已使用则不强行迁移到 GitHub Actions。
  • Match 相关:MATCH_PASSWORD、MATCH_GIT_URL(或 S3)、APP_STORE_CONNECT_API_KEY_*;发布作业用 match appstore,CI 中加 readonly: true 避免每次轮换证书;runner 上用 create-keychain 或 Fastlane setup_ci 创建临时 keychain;商店归档不得设置 CODE_SIGNING_ALLOWED=NO。

四、归档与上传

  • 提供 deploy-testflight 作业示例:依赖 test,条件为 main 分支且 push 事件,runs-on: macos-latest,environment: testflight,timeout-minutes: 90。
  • Fastlane 路径:gym(archive)到 pilot 或 upload_to_testflight;若团队已有钩子可跳过等待处理。
  • 无 Fastlane 路径:xcodebuild -archivePath、xcodebuild -exportArchive,加上 xcrun altool、notarytool 或 iTMSTransporter,按仓库已有方式选择。
  • Export options 使用 method: app-store 与正确的 team ID;IPA 通过 upload-artifact 保留较短时间。

五、App Store 审核提交

  • 单独作业,environment: production,不要每次 merge 都提交。
  • 仅当团队对截图与说明做版本管理时才用 metadata/deliver;否则只上传二进制并在 Console 手动提交审核。
  • Build number(CFBundleVersion)必须递增:可用 agvtool、Fastlane increment_build_number,或明确记录的 GITHUB_RUN_NUMBER。

六、Expo / React Native

  • 使用 EXPO_TOKEN,执行 eas build --platform ios 与 eas submit --platform ios。
  • iOS 凭据放在 EAS,避免同一应用同时混用 Match 与 EAS 而无明确归属。
  • production profile 先发 TestFlight。

七、成本与稳定性

  • 每个 macOS 作业都设 timeout-minutes;部署工作流使用 concurrency 保证一次只归档一个;PR 上不要跑 4 个模拟器矩阵。

八、反模式

  • 在 fastlane 环境变量里放 Apple ID 与密码;提交时用 Development 证书;xcodebuild 缺少 -destination 或 scheme 错误;每次 push 都提交 App Store;提交 AuthKey_*.p8;把 UI 测试作为唯一合并门禁(缺少单元测试)。

九、与其他技能集成

  • 管道:github-actions;应用:swiftui-development;测试:swift-testing;Android:github-actions-android;同一 IPA 中的小组件:widgetkit(同一 archive);上线:production-readiness。

十、完成标准

  • PR 中在模拟器跑单元测试;通过 API Key 或 Match(secrets)签名并归档 Distribution 包;上传 TestFlight(生产受保护);Build number 递增;仓库中无证书;macOS 作业设置超时。