最近在尝试搭建Jenkins+fastlane持续集成环境,在打包的iMac第一次执行Jenkins任务打包多target项目时总是打包不到指定的scheme,所以记录下这次的问题。
1.什么是target和scheme
target
一个项目可以包含一个或多个target,每个target有自己对应的编译信息且互不影响,我们最终编译成的app就是一个target。
scheme
一个scheme定义了你项目的Build,Test,Archive等命令所执行对应的target,一个scheme对应一个target,但是一个target可以有多个scheme。
2.问题描述
[09:45:37]: �[31mCouldn't find specified scheme 'xxxx'. Please make sure that the scheme is shared, see https://developer.apple.com/library/content/documentation/IDEs/Conceptual/xcode_guide-continuous_integration/ConfigureBots.html#//apple_ref/doc/uid/TP40013292-CH9-SW3�[0m
上面就是Jenkins执行任务时出现的问题log,我们知道一个scheme对应一个target,当Manage Schemes里勾选了Autocreate schemems时,复制一个target时会自动创建对应的scheme,Xcode里的scheme如下:
按照log的字面意思,是SchemeB没有勾选shared,但是我们打开Manage Schemes查看里面的shared复选框确实选中了,如图所示:
Fastfile文件里配置如下:
build_number = get_build_number_from_plist(target: SchemeB)
build_app(
configuration:"Release",
clean: true,
workspace: "MyApp.xcworkspace",
scheme: SchemeB,
export_method: "development",
output_name:"SchemeB_#{build_number}.ipa",
output_directory: "xxxx/IPA"
)
Fastfile里的配置是正确的,SchemeB的Shared复选框我们也勾选中了,那build_app为啥还是找不到SchemeB呢?当我们把SchemeB的Shared复选框勾选去掉然后再勾选下,然后重新执行Jenkins任务,发现就能成功找到SchemeB并成功打包,但这并不是我们想要的,毕竟自动化的东西我为啥还是手动去掉勾选再重新勾选呢。
3.问题解决
fastlane里的buildapp执行xcodebuild,Fastfile里的一些配置文件实际上也都是传给了xcodebuild,包括scheme,workspace,configuration等,build_app执行xcodebuild前会遍历MyApp/MyApp.xcodeproj/xcshareddata/xcschemes里xcscheme文件,如果有,则执行对应的scheme,否则执行第一个scheme,所以出现上述问题,就是xcshareddata文件夹里不存在对应的xcscheme文件或者xcshareddata文件夹不存在,这里大概介绍下xcshareddata文件夹,项目一开始创建是没有xcshareddata文件夹的,当某个scheme下的Shared复选框被选中,则会创建xcshareddata文件夹和xcschemes文件夹,并在xcschemes文件夹里创建SchemeB.xcscheme,而我们打包的iMac里的项目并不存在xcshareddata文件夹,但本地项目存在,由此判断是没有把xcshareddata和里面的xcscheme上传到git,把gitignore里的 *.xcscheme和 *.xcshareddata去掉并且重新上传到git即可。
4.总结
第一次写文章,文笔和描述可能会比较乱,望包涵,如有错误,请指出谢谢。Jenkins+fastlane持续集成有很多坑要踩,只有踩的坑多,才能更加了解其原理,大家一起共勉。