Jenkins调用iOS slave的缓存问题解决方法
今天,在使用jenkins执行iOS编译的时候,遇到一个问题,创建的这个job编译结果中缺少一个.h头文件,
问题描述
在创建公司iOS产品的编译构建job时,创建完job后运行,发现输出结果中缺少一个库文件。开发人员在mac环境中调整了xcode输出配置,增加了该头文件的输出,并验证能够产生文件后,代码重新上传到Gitlab。然后我在jenkins服务器上重新运行xcodebuild进行编译,结果无论如何也不能产生该头文件。
问题定位过程
- 开发人员对比了本地xcodebuild输出结果跟jenkins编译时的输出结果,发现jenkins在生成头文件过程中缺少了PBXCP的输出:
PBXCp /Users/workspace/Mobile-iOS-Products-SignetSDKCore-All/Signet-SDK/Signet-SDK/include/SignetManager.h /Users/baiyu/bjcaci/workspace/Mobile-iOS-Products-SignetSDKCore-All/Signet-SDK/build/Release-iphoneos/include/Signet-SDK/SignetManager.h (in target ‘Signet-SDK’ from project ‘Signet-SDK’)
cd /Users/workspace/Mobile-iOS-Products-SignetSDKCore-All/Signet-SDK
builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -strip-debug-symbols -strip-tool /Applications/Xcode11.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip -resolve-src-symlinks /Users/baiyu/bjcaci/workspace/Mobile-iOS-Products-SignetSDKCore-All/Signet-SDK/Signet-SDK/include/SignetManager.h /Users/baiyu/bjcaci/workspace/Mobile-iOS-Products-SignetSDKCore-All/Signet-SDK/build/Release-iphoneos/include/Signet-SDK
2.检查其他成功的项目build,发现PBXCp命令能够被执行。
于是我怀疑,是不是跟原来job已经执行过,导致每次重新执行的时候,直接使用缓存的配置执行xcodebuid,导致结果不正确。 - 开发按照这个思路 , 将iOS 上workspace中的代码挪到另一个目录,然后运行xcodebuild,发现可以生成出这个头文件。 确认了是缓存问题导致的编译问题。
- 于是我尝试更改job名称,重新运行job。然后发现结果跟预期一致。
在找到正确的路之前,google了各种方法,没有找到解决方案。
问题分析
梳理问题过程:
- 最开始的时候,jenkins job执行xcodebuild的缺少头文件导出功能;
- 开发调整了iOS Xcode的配置以后,增加了头文件的导出功能。
- jenkins job配置了在build前清除workspace,但是运行xcodebuild仍然没有产生头文件;
- 直接通过VNC viewer登录iOS系统,运行xcode,是可以产生头文件的;(中间尝试了多次)
- jenkins job不能产生头文件,只好对比2次xcodebuild的输出结果,发现缺少PBXCp步骤;
- 检查其他job,能够正常运行PBXCp命令;
- 怀疑跟缓存有关系,然后拷贝workspace下的job 代码到另一个位置运行,运行结果正确,可以产生头文件;
- 确认缓存问题,更改jenkins job名称,问题解决。
问题解决方案更新20200628
今天再次碰到开发人员删除了Gitlab上的一个文件,导致jenkins job运行失败。跟开发人员确认了xcode缓存的位置:
/Users/<用户名>/Library/Developer/Xcode/DerivedData
然后在编译脚本中,添加
rm -rf /Users/<用户名>/Library/Developer/Xcode/DerivedData/*
job编译成功,终于从根上解决了这个问题,不用再改job名称了。