You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Actions中Xcode构建耗时过长,如何缩短构建时间?

缩短GitHub Actions中iOS构建时间的优化方案

针对你的iOS构建流水线耗时过长的问题,结合现有配置,给出以下可落地的优化手段:

1. 启用现代构建系统

你的xcodebuild命令中指定了-UseModernBuildSystem=NO,而现代构建系统(默认启用)支持并行构建、增量编译优化,能大幅提升构建速度。建议移除该参数,或显式设置为YES:

xcodebuild -workspace ios/AwesomeProject.xcworkspace -scheme AwesomeProject archive -sdk iphoneos -configuration Debug -archivePath $PWD/AwesomeProject CODE_SIGNING_ALLOWED=NO

2. 移除不必要的clean操作

每次构建执行clean会删除所有编译产物,强制全量编译,这是耗时的核心原因之一。若没有特殊清理需求,直接移除clean命令,改用增量构建:

xcodebuild -workspace ios/AwesomeProject.xcworkspace -scheme AwesomeProject archive -sdk iphoneos -configuration Debug -archivePath $PWD/AwesomeProject CODE_SIGNING_ALLOWED=NO

如果确实需要清理(比如依赖变更场景),可将clean拆分为单独步骤,仅在特定触发条件下执行。

3. 优化Pod依赖安装

  • 跳过Pod仓库更新:若无需每次构建同步Pod索引,在pod install时添加--no-repo-update参数,节省仓库同步时间:
    pod install --no-repo-update
    
  • 缓存Pod依赖:用GitHub Actions缓存功能保存Pods目录和Podfile.lock,避免重复下载安装依赖。在Install pod dependencies步骤前添加:
    - name: Cache Pods
      uses: actions/cache@v3
      with:
        path: ios/Pods
        key: ${{ runner.os }}-pods-${{ hashFiles('ios/Podfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-pods-
    

4. 缓存Node与Xcode构建产物

  • 缓存Node依赖:缓存node_modules目录,避免每次npm ci重复下载依赖:
    - name: Cache Node Modules
      uses: actions/cache@v3
      with:
        path: node_modules
        key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
        restore-keys: |
          ${{ runner.os }}-node-
    
  • 缓存Xcode DerivedData:Xcode的DerivedData目录存储编译中间产物,缓存它可实现增量编译,大幅减少重复编译时间:
    - name: Cache Xcode DerivedData
      uses: actions/cache@v3
      with:
        path: ~/Library/Developer/Xcode/DerivedData
        key: ${{ runner.os }}-deriveddata-${{ hashFiles('ios/AwesomeProject.xcodeproj/project.pbxproj', 'ios/Podfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-deriveddata-
    

5. 调整构建配置提升速度

  • 改用Release配置:Debug配置默认关闭编译优化、保留大量调试信息,编译速度慢。若构建归档无需调试功能,改用Release配置:
    xcodebuild -workspace ios/AwesomeProject.xcworkspace -scheme AwesomeProject archive -sdk iphoneos -configuration Release -archivePath $PWD/AwesomeProject CODE_SIGNING_ALLOWED=NO
    
  • 优化Debug配置:若必须使用Debug,可在Xcode项目设置中将Optimization Level设为Fastest, Smallest,平衡调试能力与编译速度。

6. 启用并行构建

在xcodebuild命令中添加-parallelizeTargets参数,利用GitHub Runner的多核CPU并行编译多个目标:

xcodebuild -workspace ios/AwesomeProject.xcworkspace -scheme AwesomeProject archive -sdk iphoneos -configuration Debug -parallelizeTargets -archivePath $PWD/AwesomeProject CODE_SIGNING_ALLOWED=NO

7. 优化压缩步骤

当前使用zip -r -9的高压缩级别会增加耗时,可降低压缩级别至-6,在压缩速度和文件大小间取平衡:

zip -r -6 AwesomeProject.xcarchive.zip $PWD/AwesomeProject.xcarchive/

优化后的完整工作流示例

name: iOS

on: [push, pull_request]

jobs:
  build:
    runs-on: macos-latest
    steps:
    - uses: actions/checkout@v4
    
    - name: Cache Node Modules
      uses: actions/cache@v3
      with:
        path: node_modules
        key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
        restore-keys: |
          ${{ runner.os }}-node-
    
    - name: Use Node.js
      uses: actions/setup-node@v4
      with:
        node-version: 14.x
        
    - run: npm ci

    - run: xcode-select -p
    
    - name: Cache Pods
      uses: actions/cache@v3
      with:
        path: ios/Pods
        key: ${{ runner.os }}-pods-${{ hashFiles('ios/Podfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-pods-
          
    - run: pod install --no-repo-update
      working-directory: ios
      name: Install pod dependencies

    - name: Cache Xcode DerivedData
      uses: actions/cache@v3
      with:
        path: ~/Library/Developer/Xcode/DerivedData
        key: ${{ runner.os }}-deriveddata-${{ hashFiles('ios/AwesomeProject.xcodeproj/project.pbxproj', 'ios/Podfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-deriveddata-

    - name: Build iOS (debug)
      run: "xcodebuild -workspace ios/AwesomeProject.xcworkspace -scheme AwesomeProject archive -sdk iphoneos -configuration Debug -parallelizeTargets -archivePath $PWD/AwesomeProject CODE_SIGNING_ALLOWED=NO"

    - name: Compress .xcarchive
      run: zip -r -6 AwesomeProject.xcarchive.zip $PWD/AwesomeProject.xcarchive/

    - uses: actions/upload-artifact@v4
      with:
        name: ios-xarchive
        path: AwesomeProject.xcarchive.zip

内容的提问来源于stack exchange,提问作者Muhammad_Bilal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:48:22