Azure Pipelines iOS CI添加use_frameworks!报xcodebuild返回码65错误
问题场景
使用微软托管macos-latest代理搭建iOS CI流程,为压缩构建时长配置CocoaPods缓存,Podfile添加use_frameworks!后构建失败,报错信息如下:
> The following build commands failed: > > PhaseScriptExecution [CP]\ Copy\ dSYMs > /Users/runner/Library/Developer/Xcode/DerivedData/.../Build/Intermediates.noindex/Pods.build/Release-iphoneos/nanopb.build/Script-46EB2E00016410.sh > (in target 'nanopb' from project 'Pods') > > PhaseScriptExecution [CP]\ Copy\ dSYMs > /Users/runner/Library/Developer/Xcode/DerivedData/.../Build/Intermediates.noindex/Pods.build/Release-iphoneos/libwebp.build/Script-46EB2E00016400.sh > (in target 'libwebp' from project 'Pods') > > (2 failures) > > ##[error]Error: /usr/bin/xcodebuild failed with return code: 65
报错核心是nanopb、libwebp两个静态类Pod依赖的dSYM拷贝脚本执行失败:开启use_frameworks!后CocoaPods会为所有Pod目标添加Copy dSYMs脚本,脚本默认开启严格错误检查,只要预期路径下找不到dSYM文件就会终止构建,通常和缓存配置不合理、静态库dSYM生成配置不匹配有关。
可落地修复方案(按优先级排序)
修正CocoaPods缓存配置
不要缓存DerivedData下的Pods编译中间产物(包括历史dSYM文件),这类产物和当前代理环境的Xcode版本、构建配置强绑定,跨次构建命中旧缓存非常容易触发路径不匹配错误。缓存范围仅保留Pods/源码目录即可,缓存key必须绑定Podfile.lock哈希、Xcode版本、use_frameworks!开关状态,避免不同配置下的缓存混用。
Azure Pipeline Cache任务参考配置:- task: Cache@2 inputs: key: 'cocoapods | macos-latest | $(Agent.OS) | Podfile.lock | $(Xcode.Version) | use_frameworks_enabled' path: 'Pods/' cacheHitVar: PODS_CACHE_RESTORED - script: pod install --no-repo-update displayName: 'Install CocoaPods Dependencies' condition: ne(variables.PODS_CACHE_RESTORED, 'true')该配置下仅跳过pod install和依赖源码拉取流程,Pods编译走Xcode原生增量编译,可压缩70%以上的构建时长,同时避免中间产物缓存带来的兼容性问题。
修改Podfile配置,跳过静态依赖的dSYM生成
nanopb、libwebp都是无业务符号价值的第三方静态依赖,不需要生成独立dSYM文件,在Podfile末尾添加如下post_install钩子,调整对应目标的编译配置,从根源上避免dSYM拷贝脚本找不到文件的问题:post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| # 针对报错的两个静态库关闭独立dSYM生成 if ['nanopb', 'libwebp'].include? target.name config.build_settings['DEBUG_INFORMATION_FORMAT'] = 'dwarf' end end end end修改完成后本地执行
pod install,将更新后的Podfile.lock提交到代码仓库即可。构建参数添加dSYM脚本错误忽略开关
如果前两步配置后仍偶发报错,可以在Xcode构建任务的附加参数中添加DISABLE_DSYM_SCRIPT_ERRORS=YES,该参数会让CocoaPods生成的Copy dSYMs脚本跳过文件不存在类的非致命错误,不会影响主应用Target的dSYM生成和后续符号化能力。
xcodebuild命令参考片段:xcodebuild -workspace YourApp.xcworkspace -scheme YourAppScheme -configuration Release -sdk iphoneos DISABLE_DSYM_SCRIPT_ERRORS=YES
内容的提问来源于stack exchange,提问作者ostr

