Azure DevOps Xcode@5 Release构建卡[CP] Check Pods Manifest.lock
问题根因
日志中抛出的System.OperationCanceledException是任务挂起超时后,Azure DevOps流水线主动取消步骤抛出的上层错误,并非[CP] Check Pods Manifest.lock脚本本身的执行报错。仅Release构建触发卡死、UAT配置构建正常,本质是不同scheme的构建配置差异导致,核心触发点有三类:
- Release对应scheme(
MyProject_PROD_Release)的Target构建阶段中,[CP] Check Pods Manifest.lock脚本开启了「基于依赖分析执行」选项,但脚本的输入输出路径配置错误,Xcode增量构建机制会一直等待不存在的输出文件,进入永久挂起状态直到超时。 - Xcode@5任务默认开启xcodebuild并行编译,1.10版本以下的CocoaPods生成的Manifest检查脚本未做并发锁兼容,多编译线程同时读写锁文件时会触发死锁。UAT配置编译资源占用更低,未触发并发冲突因此可正常完成构建。
- CI环境执行Release构建时,工作目录被xcodebuild切换到DerivedData临时路径,Check脚本找不到
Podfile.lock和Pods/Manifest.lock文件,脚本内置的文件等待逻辑无超时退出机制,直接卡死。
排查步骤
按以下顺序排查可快速定位问题:
- 本地复现验证:在开发机执行和CI完全一致的构建命令,复现卡死问题:
如果本地同样卡死,直接打开Xcode进入PROD target的Build Phases配置,找到xcodebuild clean build -workspace MyProject.xcworkspace -scheme MyProject_PROD_Release -configuration RELEASE -sdk <对应sdk参数值>[CP] Check Pods Manifest.lock脚本,取消勾选Based on dependency analysis选项,重新执行pod deintegrate && pod install后再试。 - 检查CocoaPods版本:在CI构建机执行
pod --version,如果版本低于1.10,先升级到1.11以上稳定版本,低版本CocoaPods对Xcode 13+的并行构建、CI无交互环境的兼容存在已知问题。 - 验证文件路径权限:在Xcode构建任务前加一行脚本执行
ls -la Podfile.lock Pods/Manifest.lock,确认两个锁文件存在,且构建服务账号对文件有读权限,排除路径切换、权限不足导致的脚本卡死。
修复方案
- 先在Xcode构建任务前增加CocoaPods安装步骤,显式执行全量安装,避免增量安装带来的配置不一致:
- script: | sudo gem install cocoapods -v 1.14.3 --no-document pod deintegrate pod install --repo-update displayName: 'Install CocoaPods Dependencies' - 调整Xcode@5任务配置,关闭默认的并行构建优化、关闭xcodebuild格式化输出(该功能会吞掉脚本执行日志,不利于排查问题),修正后的配置如下:
- task: Xcode@5 displayName: 'Xcode Build' continueOnError: ${{ parameters.CanContinue }} inputs: actions: 'clean build' ${{ if eq(variables['configuration'], 'DEBUG' ) }}: scheme: 'MyProject_UAT_Debug' ${{ if eq(variables['configuration'], 'UAT' ) }}: scheme: 'MyProject_UAT_Release' ${{ if eq(variables['configuration'], 'RELEASE' ) }}: scheme: 'MyProject_PROD_Release' sdk: '$(sdk)' configuration: $(configuration) xcWorkspacePath: 'MyProject.xcworkspace' xcodeVersion: 'default' packageApp: true signingOption: 'manual' provisioningProfileUuid: '$(APPLE_PROV_PROFILE_UUID)' signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)' exportPath: '$(agent.buildDirectory)/output/$(sdk)/$(configuration)' # 新增配置解决卡死问题 useXcodebuildFormatter: false arguments: '-parallelizeTargets=NO -IDEBuildOperationMaxNumberOfConcurrentCompileTasks=4' - 临时验证方案:如果需要快速验证后续构建流程是否正常,可在Xcode任务的
arguments中加入PODS_SKIP_MANIFEST_CHECK=YES临时跳过Manifest锁检查,确认后续流程无问题后再移除该参数,重新生成CocoaPods配置彻底修复。
内容的提问来源于stack exchange,提问作者AISAC
相关产品推荐
相关产品推荐

