Jenkins M1 CI执行归档构建时Command CompileSwift命令失败问题问询
问题根因与解决方案
本地执行正常、CI侧复现编译错误的核心原因是本地执行环境与CI Jenkins任务的运行架构、环境配置存在差异,具体对应以下常见场景和修复方案:
- CocoaPods版本兼容性问题
你当前使用的1.10.2版本CocoaPods未完成Apple Silicon原生适配,本地执行时默认通过Rosetta转译运行命令,生成的Pods项目配置兼容架构要求;但CI侧Jenkins任务如果以原生ARM64架构执行命令,会生成架构配置错误的Pods项目,导致第三方库编译失败。
修复方案:- 升级CocoaPods至1.11.0及以上版本,该版本正式支持Apple Silicon原生运行
- 无法升级版本时,给CI执行命令统一增加x86_64架构前缀:
arch -x86_64 bundle exec fastlane build,保持和本地执行架构一致
- 构建架构配置不匹配
CI侧的构建参数未过滤不必要的架构,比如模拟器x86_64架构混入真机归档流程,本地直接针对当前设备架构构建不会触发冲突,CI全局配置未做过滤就会引发编译错误。
修复方案:
在Podfile末尾添加如下配置,强制Pods项目架构和主项目对齐:post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64' config.build_settings['EXCLUDED_ARCHS[sdk=iphoneos*]'] = 'x86_64' end end end - CI缓存冲突
Jenkins工作区残留了旧的Pods缓存、DerivedData缓存,与新拉取的代码配置不匹配,本地环境没有历史冲突缓存因此运行正常。
修复方案:
在CI构建步骤前增加缓存清理逻辑:- 执行
rm -rf ~/Library/Developer/Xcode/DerivedData/*清理Xcode编译缓存 - 执行
pod deintegrate && rm Podfile.lock强制重新生成Pods配置
- 执行
- Jenkins运行环境差异
如果Jenkins通过LaunchDaemon后台运行,会缺少部分普通用户的环境变量,或者运行身份为root用户,调用的Xcode命令行工具版本、Ruby版本与本地环境不一致,引发编译异常。
修复方案:
在CI流水线开头打印环境变量,确认xcode-select -p返回的Xcode路径、ruby -v版本、pod --version版本与本地环境完全一致。
内容的提问来源于stack exchange,提问作者Alexandr Zhuchinskiy
相关产品推荐
相关产品推荐

