在上一篇中有讲过使用Jenkins+Git+Xcode+Fir的使用进行CI集成工作,但是会存在一些问题,对于开发者测试版本,企业版版本是可行的。如果想同时集成app store也自动化,越狱版本的话,那样就不能满足了。接下来的fastlane这一神器工具将会满足需求,一起进入fastlane的神奇世界吧!
What’s fastlane?
fastlane是一键式自动化部署,CI集成工具,能够极大的简化app的部署和发布流程。
为什么要使用fastlane?
我们可以回顾一下,一般发布一个appstore所需要的流程,其中大概流程如下:
- 创建appID
- 创建cert和provision
- 下载provision并安
- 使用Xcode的archive工具进行打包
- 在itunnesConnect上创建此app的相关信息(包括多张截图),编辑相关信息等
除开上面的1,2,3步骤后(当然这些内容还必须要依赖机器的特定的环境),就是进行每次的4,5步骤也是极其复杂的流程,并且会阻塞当前工作流程。
fastlane只要安装了相关的环境后,即可远程一键式发布。fastlane工作的方式是通过不同的lane
的任务来进行工作,并且其本身就是由许多工具集组合而成,每一个独立的工具即可实现一项特有的功能(eg:screenshot,deliver,gym等)。接下来我们会一步步的熟悉fastlane工具。
安装fastlane
fastlane dependency
- OS X系统:Mavericks以上
- Ruby 2.0或2.0以上
- Xcode
- 已付费的个人开发者帐号或在公司的开发者帐号里
由于fastlane是一由一套Ruby脚本实现,你必须有正确的相对应的Ruby版本,OSX Mavericks之后的操作系统默认都安装了Ruby 2.0,可以通过以下命令来查看Ruby的版本号
1 | ruby -v |
我们还需确认安装了Xcode的Command Line Tools
工具(CLT)git, xcrun, xcodebuild等等,C complier
,输入以下命令来查看
1 | xcode-select --install |
如果xcode的CLT已经安装了,你会看到以下错误
1 | command line tools are already installed, use "Software Update" to install updates |
如果CLT未安装,Terminal将会继承提示你安装Xcode CLT
一旦以上条件准备好了,我们就可以安装fastlane了,输入以下命令
1 | sudo gem install fastlane -v 1.48.0 --verbose |
千万注意
以上的版本号,以下的步骤在1.48.0能编译通过,但如果你升级到了最新的版本,可能会造成以下lane
步骤出错,到时请查看官网,按最新的步骤来做
以上安装可能需要花费几分钟,请耐心等待,一旦安装好了,你就可以让你的工程使用fastlane啦,相信你已经跃跃欲试了吧, 不过在开始之前,我们先整体看看fastlane的工具链吧
fastlane Toolchain
produce
:在iTunes Connect和Apple Developer创建新的appcert
:自动创建维护iOS的代码签名证书sign
:创建,刷新,下载,修复provision mobile profilesnapshot
:自动帮你在每一台指定的机型上创建每一张本地化的screenshotframeit
:将你的截图添加上相应机器的外框gym
:编译并打包iOS appdeliver
:上传screenshots,metadata(应用描述等)和你的app到appstore上pem
:自动生成并刷新app的apns证书- ……
fastlane init
进入你的工程根目录下,执行以下命令
1 | fastlane init |
注意
:如果提示permission denied
错误,你需要在此命令前加sudo
几分钟后,fastlane将显示以下步骤来让你设置初始步骤
Do you want to get started? This will move your Deliverfile and Snapfile (if they exist) (y/n)
Enter yDo you have everything committed in version control? If not please do so!
Enter yApp Identifier (com.krausefx.app):
Enter a unique app ID. Keep this app ID handy, as you will need it later!- Your Apple ID (fastlane@krausefx.com):
Enter your Apple ID - Do you want to setup ‘deliver’, which is used to upload app screenshots, app metadata and app updates to the App Store or Apple TestFlight? (y/n)
Enter n - Do you want to setup ‘snapshot’, which will help you to automatically take screenshots of your iOS app in all languages/devices? (y/n)
Enter y - Do you want to use ‘sigh’, which will maintain and download the provisioning profile for your app? (y/n)
Enter y - Optional: The scheme name of your app: (If you don’t need one, just hit Enter.)
Press enter
执行完以上步骤后,打开mZone的工程文件夹,你会注意到工程下已经有了fastlane的文件夹了
fastlane Toolchain
provision lane
在你的fastlane的文件夹下的fastlane加入provision lane
1 | platform :ios do |
将ENTER_A_UNIQUE_APP_NAME_HERE
替换成一个新的app名字(此名字不能和已知的重名),你的itunesConnect的用户名和app identifier自动从Appfile中加载,所以你无需在这里指定它们
如果你从来没用过Ruby,以上的语法看起来可能有点奇怪,让我们一条条过一下
- 为
lane
指定了相应的描述,一个lane是一个按顺序工作的工作流 - 为这个lane指定一个名字
- 在指定app identifier,名字,语言和version number后,使用
produce
来在ITC和Developer Portal创建一个app - 使用
cert
来创建私钥和签名申请文件,下载并安装生成的certificate并将所有文件安装到keychain中 - 使用
sigh
来生成一个provision profile,指定force: true
,在每一次运行的时候都会创建一个新的provision profile
注意
:sigh
每次默认都会创建App Store Distribution,如果你想创建一个adhoc的profile,你可以指定sigh(adhoc:true)
,如果想指定一个开发证书, 可以指定sigh(development:true)
为简单起见,在此教程中,我们只创建distribution profile
好啦!我们已经创建了第一个lane
了,打开终端,进入你的工程根目录下,输入以下命令
1 | fastlane provision |
它让fastlane运行你的provision
lane
一两分钟后,fastlane会请求你的ITC密码,不必担心,此密码会安全地保存在电脑的keychain
里,输入你的密码,一旦成功后,你的终端窗口看起来应该如下图
注意
:如果你碰到一些错误,特别是Creation of apps of this type is not available
这样的错误时,登录ITC,确保没有任何需要签名的agreements
现在你可以登录iTunes Connect
,可以看到你已经创建了app,怎么样 ,是不是很神奇
Screeshots lane
当提交app时,app的截图是必不可少,可是人工截图又是如此无趣,特别是如果你要针对多语言开发时,会浪费很多宝贵的时间做这种无聊的截图工作,幸运的是,fastlane可以帮你搞定这些工作!
在fastlane文件夹下打开Snapfile
文件,替换成以下内容:
1 | devices([ |
以是内容指定了你想支持的机型和语言,clear_previous_screenshots
将清除之前已创建好的screenshots
保存文件并关掉它
打开Fastfile
文件,在error do |lane, exception|
上添加以下内容
1 | desc "Take screenshots" |
我们创建了一个新的名叫screenshot
的lane
,它使用snapshot
来截你在Snapfile中指定支持的设备和语言的截图
保存文件,打开终端输入
1 | fastlane screenshot |
神奇的事情发生了,所有的截图操作都自动帮你搞定啦
注意
:这版的教程中的snapshot
使用了UI Automation
和JavaScript
来驱动模拟器,但snapshot
1.0使用了Xcode 7的UI Testing,也就是说你可以用Swift或OC来写自动化脚本了
需要特别注意
的是:为了让snapshot
正常截图,它需要首先能正常访问在Snapfile中列举的设备列表,如果Xcode中少了其中的某些devices,你需要在Xcode中的Window\Devices
中的左下角下,点击+
来添加新的模拟器
一旦此过程结束,我们可以到fastlane文件夹下找到一下screenshots
的文件夹
现在你有English
和French
这两语言支持的所有设备截图了,你也会注意到一个screenshots.html
的文件,打开它可以看到所有的screenshot!
gym
好了,现在我们可以准备创建IPA
文件了
打开Fastfile
文件并且在screenshot
的end
后面添加以下内容
1 | desc "Create ipa" |
以上创建了一个build
的lane
,它使用gym
来创建一个签名的ipa
文件
在终端中保存Fastfile
,在mZone工程根目录下输入以下命令
1 | fastlane build |
一旦完成,你可以在mZone工程根目录下看到一个签名的ipa文件
- …..
其它的工具需要你自己去探索了
fastlane一键式发布
为了将screenshots,metadata,ipa文件发送到iTunes Connect,我们可以使用deliver
这个工具
首先,我们需要初始化工程以让它使用deliver
这个工具,进入工程文件夹下,输入以下命令
1 | deliver init |
一旦完成,你的终端窗口看起来应该像以下这样
我们可以看到deliver
自动检测到了ipa
文件和screenshots的位置
它也创建了一个metadata
文件夹和一堆text文件,这些文件包含了常见的App Store items如description, keywords, categories等等
通常你应该填完这些信息,但教程为方便起见只添加了一句简单的描述,打开en-US/description.txt
添加以下文字:
1 | mZone is a simple poker calculator for No Limit Texas Hold’em tournaments that displays a recommended course of action based on your chip count and the current big blind level. |
不过在我们继续之前,我们需要修复一个issue,打开metadata
文件夹,注意到尽管我们的应该支持French
和English
,只有en-US
文件夹存在
为了解决这个问题,我们对en-US
文件夹作一份copy,并将它命名为fr-FR
.现在你的工程看起来应该如下
打开Fastfile
并在build
lane的end
之后添加以下内容
1 | desc "Upload to App Store" |
打开终端,输入以下命令
1 | fastlane upload |
这个命令,fastlane以HTML的形式展现了一个它最终将要上传的内容的preview
如果所有看起来都OK,在“Does the Preview on path ‘./Preview.html’ look okay for you? (y/n)”
此问题后面输入y
,好了,现在静静地喝杯咖啡吧,fastlane将会把所以该上传的都上传到appstore
进入iTunesConnect,现在看看,所有显示的内容是不是都与你本地的一一对应啦!
需要注意
以下文件
Appfile
: 记录了app的idenfifier和你的appleIDFastfile
:管理你需要执行actions的所有lanes
Snapfile
:让你指定对所有语言对应的设备尺寸进行截图
参考
- fastlane官网
- fastlane Tutorial: Getting Started
- fastlane git开源项目
- Xcode中Command Line Tools安装方法
- 下一篇Jenkins+Git+Fastlane+Fir CI集成,将会详细介绍具体项目中使用
问题
- 不要随便更新版本,如果更新了版本会导致相关
lane
存在问题,那这个时候需要看最新的官网的更新。现在fastlane更新的速度较快,需要持续关注。