虽说网上关于iOS的持续集成的文章数不胜数,还是那句话:不经风雨是见不到彩虹的,不亲身经历,你根本体会不到踩坑的滋味是多么酸爽。酸爽的滋味其实并不是从iOS的自动化打包开始,从构建我们产品2.0版本就已经有尝不尽的酸爽味道,如:使用cocoapods打造智能化的iOS组件化方案,使用AFNetworking打造面向对象的网络组件并将AFNetworking升级到2.0、3.0,使用Realm替换SQLite的本地持久化方案,关于AOP面向切片编程实现的无埋点日志处理方案,使用Mantle打造智能化解析时与Realm如何结合,等等。以后会慢慢再总结吧。
我一直主张好钢应该用在刀刃上,如果将一个iOS研发人员一天当中有一个小时,哪怕半个小时去做打包的事情,我觉得都是极大的浪费。由于我们项目的特性或者吐槽点说是由于不规范,打一个安装包要牵扯到的资源有:项目部提供打包时APP名称调研表格、项目助理提供打包时配置信息表格(微信key、支付宝、微博、百度、友盟、不同tag的版本号、主题色)、产品UI组提供打包的图片资源、服务端提供打包时接口配置表格(接口地址、HOSID等)、服务端提供打包时开发者信息表格(公钥、私钥、签名信息等),而且由于每个部门使用不同的svn库,如果打包,单单准备这些资料恐怕就得一两个小时(无力吐槽点不是要找的配置信息多,而是有时候这些信息根本不全),这些太浪费时间了。
现在加上苹果对四大领域审核的全面收紧,导致我们之前在一个苹果账号下挂载多个APP的路走不通了,现在几乎是一个APP就需要一个苹果账号,这样的无技术含量且重复性的劳动量占据了开发人员很多的时间成本。
好了,这里我们只说面包,不谈爱情,也就是不谈理论,只谈实践。我们的自动化打包方案:Jenkins+python+shell+fastlane。
本章就只说说shell+fastlane
fastlane是一组工具套件,旨在实现iOS应用发布流程的自动化。
环境搭建:
按照之前的文章,在Mac XOS上
1、安装brew
2、安装ruby
3、通过gem安装fastlane
自动化打包的流程和思路:
1、利用python根据配置的版本号找到对应的代码tag。并将该路径传入shell build script。
2、根据入参scheme找到xcodeproj的路径和Info.plist的路径。
3、重置Info.plist,如:bundleid、version、displayName、微信key等。
4、替换资源文件,对某些资源文件进行加密处理。
5、cocoapods生成xcworkspace。
6、安装证书,并获取到证书codesign-identity。
7、添加用户名密码到keychain。
8、下载mobileprovision配置文件。
9、根据mobileprovision配置文件生成Entitlements,从而读取UUID和teamID。
10、重置exportPlist中teamID和exprotMethod项为打包做准备。
11、编译并打包。
亟待解决的问题:
1、钥匙串访问权限
2、多个证书的选择
3、账户密码添加到keychain
4、证书安装
5、证书codesign-identity的读取
6、mobileprovision文件下载问题
7、teamID获取问题
8、配置文件UUID获取问题
9、exprotPlist配置项问题
10、cocoapods中podfile文件动态修改问题
1、security命令
|
|
|
|
|
|
|
|
|
|
2、PlistBuddy命令
|
|
|
|
|
|
|
|
fastlane-credentias用法:
fastlane-sigh用法:
查看官方使用帮助:
根据官方使用帮助编写代码:
踩坑:
1、${sighMethod} 此参数为””时,创建或下载production配置文件,如果需要develop配置文件时,则需要配置成”development”。
2、–force true时,无论开发者账号上是否存在可用的配置文件都会重新生成一个。
3、–skip_install true时只下载配置文件,不安装。一定要安装才能打包,也就是必须要设置为false。
fastlane-gym用法:
查看官方使用帮助:
根据官方使用帮助编写代码:
踩坑:
1、xcode8以后--xcargs
项中需要增加PROVISIONING_PROFILE_SPECIFIER='${provisionProfileSpecifier}'
2、当CODE_SIGNING_IDENTITY字符串中有特殊符号时,如:iPhone Distribution: YUYAO PEOPLE'S HOSPITAL OF ZHEJIANG PROVINCE (xxxxx)
,无论是否对CODE_SIGNING_IDENTITY进行特殊字符转义都编译不成功。
a、使用非转义的CODE_SIGNING_IDENTITY:iPhone Distribution: YUYAO PEOPLE'S HOSPITAL OF ZHEJIANG PROVINCE (xxxxx)
编译如下:
b、使用转义的CODE_SIGNING_IDENTITY:iPhone\ Distribution:\ YUYAO\ PEOPLE\'S\ HOSPITAL\ OF\ ZHEJIANG\ PROVINCE\ \(xxxxx\)
编译如下:
c、最终解决,去掉--xcargs
中的CODE_SIGNING_IDENTITY项。
编译如下:
正常编译且签名成功!
fastlane-deliver用法:
fastlane-pilot用法:
最后附上整个CI工程的截图: