fastlane使用 -- iOS从打包到发布的自动化处理
一、fastlane简介
fastlane是用Ruby语言编写的一套自动化工具集和框架,每一个工具实际都对应一个Ruby脚本,用来执行某一个特定的任务,而fastlane核心框架则允许使用者通过类似配置文件的形式,将不同的工具有机而灵活的结合在一起,从而形成一个个完整的自动化流程。
二、为什么选择fastlane
1、行命令实现打包工作,不需要时时等待操作下一步,节省打包的时间去做其他的事。
2、避免频繁修改配置导致可能出现的Release/Debug
环境错误,如果没有检查机制,那将是灾难,即使有检查机制,我们也不得不重新打包,浪费了一次打包时间。毕竟人始终没有程序可靠,可以告别便利贴了。
3、通过配置自动上传到蒲公英,fir.im内测平台进行测试分发,也可以直接上传到TestFlight,iTunes Connect。
4、证书的同步更新,管理,在新电脑能够迅速具备项目打包环境。
一个需求完成后需要打包并上传至蒲公英供产品测试验收,而打包是一个复杂且需要谨慎的工作,大致的打包和上传蒲公英流程如下:
选择scheme -> 选择项目 -> Archive -> 选择打包方式 -> 选择手动管理证书 -> 选择配置文件 -> 导出IPA包 -> 登录蒲公英 -> 选择项目 -> 上传新版本 -> 选择IPA包 -> 填写说明 -> 发布
完成一个打包至少需要这13步,不能出现错误,所有的操作必须按部就班,一步步执行,而且如果出现bug需要重新打包,需要重新执行以上步骤,十分繁琐。
作为一名程序员,这不是我们想要的!!!
我们要以最简洁的方式,完成最复杂的工作,那么,fastlane就是最好的选择👏
三、如何使用fastlane
1.安装fastlane
终端执行sodu gem install fastlane -NV -n/usr/local/bin
安装fastlane工具
2.初始化fastlane
终端进入项目所在目录,并输入fastlane init
会出现需要选择的初始化方式:
- 📸 Automate screenshots (自动截图)
- 👩✈️ Automate beta distribution to TestFlight (自动testfilght型配置)
- 🚀 Automate App Store distribution (自动发布型配置)
- 🛠 Manual setup - manually setup your project to automate your (需要手动配置内容)
选择2和3会要求填写Apple ID和密码,输入正确即可,后期还可以修改
3.安装蒲公英插件
终端执行fastlane add_plugin pgyer
,提示成功后即可
注意:
fastlane初始化成功后会生成:fastlane文件夹(包含Appfile、Fastfile两个文件)和Gemfile、Gemfile.lock两个文件,其中
1.Appfile可配置打包需要的Apple id和team id
2.Fastfile为我们工作的主要文件,用于命令行调用和处理具体事务流程
四、项目配置
-
gym初始化和配置
a. 终端执行fastlane gym init
,成功后生产Gymfile文件
b. Gymfile文件中写入IPA包出包路径:output_directory(“./IPA”) -
配置Apple ID和Team ID
Appfile中添加Apple ID和Team ID格式如下:
apple_id “xxx@degnity.com”
team_id “W6******3C”
- 配置Fastfile -- 重要(打包代码都在这里执行)
- 自动添加设备到Apple Developer
- 创建一个由制表符tab分割的文件device.txt,将此文件放在项目目录下
文件格式如下:
Device ID Device Name
135***********************5be Name
8si***********************8as Name
固定格式不得改变,每行包含一个设备号和一个用户名,最好将这个
文本复制下来或者在官网下载示例文件将里边的文本复制下来,再添加到txt文件中,然后修改设备号和名称即可
- 增加方法add_devices
lane :add_device do
register_devices(
devices_file: "./devices.txt"
)
#重新下载provisioning profile
get_provisioning_profile
end
- 版本号、构建号获取和自增操作
#获取构建版本号
get_build_number()
#获取版本号
get_version_number()
#构建版本号自增
increment_build_number()
#版本号自增
increment_version_number()
可自定义版本号或构建号:
#number为自定义内容
increment_build_number(build_number: “#{number}")
- build_app打包配置
#构建版本配置
build_app(
#项目路径 -- 本项目目录下初始化fastlane时不需要
project: project_path,
#出包方式:"app-store", "ad-hoc", "package", "enterprise", “development"
export_method: "ad-hoc",
#打包环境 -- "Release"、"Debug"、自定义等
configuration: "Release",
#需要打包的scheme
scheme: "xxx_Dev",
export_options: {
#配置文件 -- 通过bundle id获取对应的配置文件
provisioningProfiles: {
"com.xxx.xxxtest" => "xxxtest_adHoc",
"com.xxx.xxx" => "xxx_adHoc",
}
}
)
- gym配置
gym(
#打包前clean
clean: "true",
#出包方法 app-store, ad-hoc, package, enterprise, development
export_method: "ad-hoc",
#指定打的哪个scheme
scheme: “xxxProject_Debug”,
#指定project (未使用cocopods)
project: “xxxx.xcodeproj”,
#指定workspace (使用cocopods)
workspace: “xxxx.xcworkspace”,
#指定构建App的配置 Release、Debug、自定义
configuration: “Debug",
#输出目录
output_directory: “./IPA",
#输出名称
output_name: "测试包"
# include_symbols: "",#是否包含调试符号
# include_bitcode: ""#是否开启bitcode
)
- 上传至蒲公英
pgyer(api_key:"******", user_key:"******",update_description:"更新说明xxxxx")
至此所有打包文件都已配置完成,将这些代码按需求进行组合使用即可
五、学以致用
目前已完成的功能:
1、找到为止大众版Dev环境自动打包并上传至蒲公英
2、找到为止大众版Release环境自动打包并上传至蒲公英
3、找到为止签约版Dev环境自动打包并上传至蒲公英
4、找到为止签约版Release环境自动打包并上传至蒲公英
5、新项目只需添加bundle id和对应的配置文件即可使用自动打包和上传功能
将学习的fastlane使用到实际应用中,下面是根据需求完成的一个完整的打包流程(主要是Fastfile文件的代码部分):
platform :ios do
lane :update do
puts "\033[35m请输入更新说明:\033[0m"
pgyer_description = STDIN.gets.chomp()
#构建号自增
increment_build_number()
build_app(
#出包方法:app-store, ad-hoc, package, enterprise, development
export_method: "ad-hoc",
#环境配置
configuration: "FastlaneTest_Debug",
#打包scheme
scheme: "FastlaneTest",
export_options: {
#配置文件 -- 通过bundleid来选择配置文件
provisioningProfiles: ({
"com.xxxxxxxx.xxxtest" => "xxxxtest_adHoc"
})
}
)
pgyer(api_key:"********", user_key:"********",update_description:pgyer_description)
end
六、写在最后的话
1、fastlane简化了项目发布和测试打包的步骤,对提高工作效率有较大的帮助,而且实现方法都被开发者封装好成了一个个实用的方法,使用者只需要将这些方法进行组合和配置即可,简单方便。
2、学习过程中,查看了很多其他开发者编写的使用说明,但因为与别人遇到的问题不同或因为时间太久以前的方法都已失效,导致学习中走了一些弯路,最后都是从官方文档中得到了正确的解决方法,所以学习还是需要从官方文档着手。