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
相关产品推荐
相关产品推荐

