对一个iOS开发者而言,当你专心利用一个周期快速开发了一个版本时,在上线以前老是面临不断对内或对外发布测试版本需求。而这个过程当中,应用发布和证书管理基本上都是最使人头疼的问题,好在证书的问题已经在XCode 8.0中获得充分自动化管理,基本不须要额外接入。而打包则没法避免的要走向以下重复的流程:git
如上流程是极为繁琐枯燥且毫无技术含量可言,而当一个小的需求发生变化甚至是一处小的文案的修改,你都要按照如上再次从新Rebuild. 简直是扼杀工程师的宝贵时间. 若是你跟我同样饱受部署的痛苦,我想Fastlane也许是你的救星.typescript
初次邂逅Fastlane是其去年5月份,当我看到彻底有一个工具可以彻底自动化这个流程,异常的兴奋。shell
Fastlane自己包含两大模块,一个是其内核部分,另一个就是Action了。Action是Fastlane自动化流程中的最小执行单元,直观上来说就是Fastfile脚本中的一个个命令,好比:git_pull,deliver,pod_install等等,而这些命令背后都对应实际上是一个用Ruby编写的脚本。
vim
Fastlane 是一套用 Ruby 编写的 iOS 命令行工具集(后来也支持了 Android),主要组件包括:
api
match
/ cert
/ sigh
协助管理代码签名pem
自动生成 APNs 证书scan
自动化测试gym
自动化编译并打包生成签名的 .ipa 文件snapshot
/ frameit
协助处理 iOS 屏幕快照pilot
上传和管理 TestFlightdeliver
将应用及其它信息上传到 App Store而正是这些颗粒度极小的Action,根据本身需求组合成一个自动化的链条。我猜测,Fastlane的做者们在项目的早期甚至规划的阶段,应该就考虑到了这一点:在实际开发中,自动化的业务场景太多,每一个团队可能都有本身的独特需求,单靠一两我的的力量是没法知足的,因此如何将涉及到实际业务的功能开发,用优雅的方式交给开源社区中庞大工程师们来维护,成为Fastlane架构中须要重点考虑的内容。因此你能够看到官方Actions文档中包含大约170多个Action,这些Action大部分来自开源社区贡献。xcode
首先确保Xcode命令行工具是最新版本的:ruby
xcode-select --install复制代码
安装Fastlane:bash
sudo gem install fastlane -NV复制代码
找到工程文件目录下执行:架构
fastlane init复制代码
在执行“Your Apple ID" 这一步输入苹果开发者帐号,fastlane 会自动获取工程文件名,目录等其余数据。这一步“Please confirm the above values”,确认信息,没问题则输入 y。而后,fastlane 会进行一系列的初始化操做,包括下载 App Store 上的元数据和截屏文件。等待初始化完成以后,工程目录下就多了一个 fastlane目录:
app
$ cd fastlane && ls
Appfile Fastfile metadata report.xml
Deliverfile README.md screenshots复制代码
文件目录:
安装fastlane成功后,首先拆解咱们须要自动化的两个流程:
不少确定问为何不合并成一步,其实彻底是能够的,只是上传bugly须要额外单独设置对应版本一些描述信息。我为了方便本身控制,拆分红了两步.
自动化打包使用最多就是Fastlane中gym这个Action, 转为打包而生, 安装gym这个组件:
sudo gem install gym复制代码
cd项目根目录, 建立自动打包脚本:
vim gym.sh复制代码
输入脚本内容:
#!/bin/bash
#计时
SECONDS=0复制代码#假设脚本放置在与项目相同的路径下复制代码project_path=$(pwd)复制代码#取当前时间字符串添加到文件结尾复制代码now=$(date +"%Y_%m_%d_%H_%M_%S")复制代码#指定项目的scheme名称
scheme="Xitu"复制代码#指定要打包的配置名
configuration="Adhoc"复制代码#指定打包所使用的输出方式,目前支持app-store, package, ad-hoc, enterprise, development, 和developer-id,即xcodebuild的method参数复制代码export_method='ad-hoc'复制代码#指定项目地址
workspace_path="$project_path/Xitu.xcworkspace"复制代码#指定输出路径
output_path="project_path/APP"复制代码#指定输出归档文件地址
archive_path="$output_path/Xitu${now}.xcarchive"复制代码#指定输出ipa地址
ipa_path="$output_path/Xitu${now}.ipa"复制代码#指定输出ipa名称
ipa_name="Xitu${now}.ipa"复制代码#获取执行命令时的commit message
commit_msg="$1"复制代码#输出设定的变量值
echo "===workspace path: ${workspace_path}==="
echo "===archive path: ${archive_path}==="
echo "===ipa path: ${ipa_path}==="
echo "===export method: ${export_method}==="
echo "===commit msg: $1==="复制代码#先清空前一次build
gym --workspace ${workspace_path} --scheme ${scheme} --clean --configuration ${configuration} --archive_path ${archive_path} --export_method ${export_method} --output_directory ${output_path} --output_name ${ipa_name}
#输出总用时
echo "===Finished. Total time: ${SECONDS}s==="
复制代码
把如上脚本中Xitu改为你的项目名称便可. 为脚本执行提高权限:
chmod +x gym.sh复制代码
执行一下脚本看一下打包效果:
./gym.sh复制代码
执行结果:
通过572s,Adhoc版本的ipa文件打包成功,咱们在项目根目录下找到App目录:
会发现如上三个文件. ok.至此自动化打包ipa文件流程完成. 关于gym这个action调用强烈推荐看一下官方文档的调用参数,对你调试过程会很是有帮助.
为何选择Bugly呢?其实缘由很简单,他可以把崩溃发生时页面访问路径和崩溃堆栈信息自动根据符号表翻译能够读懂调用代码路径. 在定位异常上更为直观,而最关键的是Bugly官方在插件版本是支持fastlane的,能够看这个文档.
官方文档提供了两个比较重要的扩展一个是上传文件和更新插件. 首先下载两个插件,而如何在fastlane中调用者两个插件呢?咱们知道针对官方定义action, 直接经过fastfile文件就修改便可,那如何在fastlane中定义本身的action?
步骤很简单,首先执行:
fastlane new_action复制代码
这时命令行会要求你输入自定义action名字,直接以bugly上传文件命名:
upload_app_to_bugly复制代码
而后Fastlane会在当前目录的建立一个名为actions文件夹, 这个文件夹下默认也会建立一个名为upload_app_to_bugly.rb的ruby文件。而咱们要作就是把刚才下载上传插件文件在这个文件进行替换便可.
自定义action成功,改如何调用呢?这是就须要回到fastfile这个文件了。这个文件基本是整个fastlane的核心,我在调试过程花了不少时间浪费它的规则和调试错误解决上。那根据Bugly文档定义在fastfile文件添加以下代码:
而当你点击api说明你发现这个你根本打不开这个页面。这样会致使你根本不知道fastlane这些参数每一个参数应该传什么值。不过不要紧,通过一番折腾,仍是在google上找到关于这篇文档的网页快照,而快照其实就是上个月20号左右的(可能由于最近控制第三方app在国内内测平台分发须要身份认证,Tencent继续这个角度考虑,把接口文档从官方网页入口隐藏了):
继续在快照找到这个上传接口文档的参数说明:
as you see. 咱们仍是弄到fastlane每一个参数意义, 这是基于如上参数表修改后的:
这里须要额外说明参数就是filepath,这个参数在fastlane定义中通常指向ipa所在的文件夹,后来我调试过程发现不是,必须是相对于当前工程目录一个ipa文件绝对路径.
ok.到这里,上传fastlane自定义已经ok了,让咱们测试一下,let's do it:
执行结果:
fastlane upload复制代码
上传成功. 登陆bugly后台看一下内测分发:
上传成功. 扫二维码测试安装,一切正常。同理关于更新插件流程基本相似这里就不在赘述了。
如上基于bugly自动打包整个流程,我故意拆分红两步,目的是方便本身控制,固然你也能够改形成一步自动打包上传,fastlane自己在fastfile文件中也是支持调用shellscript脚本的,调用很简单,参考官方文档便可.
well,这个自动化流程基本一开始就不须要你来管了,很是方便.