Fastlane自动化部署

在上一篇中有讲过使用Jenkins+Git+Xcode+Fir的使用进行CI集成工作,但是会存在一些问题,对于开发者测试版本,企业版版本是可行的。如果想同时集成app store也自动化,越狱版本的话,那样就不能满足了。接下来的fastlane这一神器工具将会满足需求,一起进入fastlane的神奇世界吧!

What’s fastlane?

fastlane是一键式自动化部署,CI集成工具,能够极大的简化app的部署和发布流程。

为什么要使用fastlane?

我们可以回顾一下,一般发布一个appstore所需要的流程,其中大概流程如下:

  1. 创建appID
  2. 创建cert和provision
  3. 下载provision并安
  4. 使用Xcode的archive工具进行打包
  5. 在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创建新的app
  • cert:自动创建维护iOS的代码签名证书
  • sign:创建,刷新,下载,修复provision mobile profile
  • snapshot:自动帮你在每一台指定的机型上创建每一张本地化的screenshot
  • frameit:将你的截图添加上相应机器的外框
  • gym:编译并打包iOS app
  • deliver:上传screenshots,metadata(应用描述等)和你的app到appstore上
  • pem:自动生成并刷新app的apns证书
  • ……

fastlane init

进入你的工程根目录下,执行以下命令

1
fastlane init

注意:如果提示permission denied错误,你需要在此命令前加sudo

几分钟后,fastlane将显示以下步骤来让你设置初始步骤

  1. Do you want to get started? This will move your Deliverfile and Snapfile (if they exist) (y/n)
    Enter y

  2. Do you have everything committed in version control? If not please do so!
    Enter y

  3. App Identifier (com.krausefx.app):
    Enter a unique app ID. Keep this app ID handy, as you will need it later!

  4. Your Apple ID (fastlane@krausefx.com):
    Enter your Apple ID
  5. 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
  6. 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
  7. Do you want to use ‘sigh’, which will maintain and download the provisioning profile for your app? (y/n)
    Enter y
  8. Optional: The scheme name of your app: (If you don’t need one, just hit Enter.)
    Press enter

执行完以上步骤后,打开mZone的工程文件夹,你会注意到工程下已经有了fastlane的文件夹了

Smaller icon

fastlane Toolchain

  • provision lane

在你的fastlane的文件夹下的fastlane加入provision lane

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
platform :ios do

# 1
desc "Creating a code signing certificate and provisioning profile"
# 2
lane :provision do
# 3
produce(
app_name: 'ENTER_A_UNIQUE_APP_NAME_HERE',
language: 'English',
app_version: '1.0',
sku: '123abc'
)
# 4
cert
# 5
sigh(force: true)
end

error do |lane, exception|
# This block is called, if there was an error running a specific lane.
end

end

ENTER_A_UNIQUE_APP_NAME_HERE替换成一个新的app名字(此名字不能和已知的重名),你的itunesConnect的用户名和app identifier自动从Appfile中加载,所以你无需在这里指定它们

如果你从来没用过Ruby,以上的语法看起来可能有点奇怪,让我们一条条过一下

  1. lane指定了相应的描述,一个lane是一个按顺序工作的工作流
  2. 为这个lane指定一个名字
  3. 在指定app identifier,名字,语言和version number后,使用produce来在ITC和Developer Portal创建一个app
  4. 使用cert来创建私钥和签名申请文件,下载并安装生成的certificate并将所有文件安装到keychain中
  5. 使用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里,输入你的密码,一旦成功后,你的终端窗口看起来应该如下图

produce

注意:如果你碰到一些错误,特别是Creation of apps of this type is not available这样的错误时,登录ITC,确保没有任何需要签名的agreements

现在你可以登录iTunes Connect,可以看到你已经创建了app,怎么样 ,是不是很神奇

itunesConnect

  • Screeshots lane

当提交app时,app的截图是必不可少,可是人工截图又是如此无趣,特别是如果你要针对多语言开发时,会浪费很多宝贵的时间做这种无聊的截图工作,幸运的是,fastlane可以帮你搞定这些工作!
在fastlane文件夹下打开Snapfile文件,替换成以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
devices([
"iPhone 6",
"iPhone 6 Plus",
"iPhone 5",
"iPhone 4s",
])

languages([
"en-US",
"de-DE",
"it-IT"
])

snapshot#launch_arguments

screenshots before creating new ones

以是内容指定了你想支持的机型和语言,clear_previous_screenshots将清除之前已创建好的screenshots

保存文件并关掉它

打开Fastfile文件,在error do |lane, exception|上添加以下内容

1
2
3
4
desc "Take screenshots"
lane :screenshot do
snapshot
end

我们创建了一个新的名叫screenshotlane,它使用snapshot来截你在Snapfile中指定支持的设备和语言的截图

保存文件,打开终端输入

1
fastlane screenshot

神奇的事情发生了,所有的截图操作都自动帮你搞定啦

screenshot

注意:这版的教程中的snapshot使用了UI AutomationJavaScript来驱动模拟器,但snapshot 1.0使用了Xcode 7的UI Testing,也就是说你可以用Swift或OC来写自动化脚本了

需要特别注意的是:为了让snapshot正常截图,它需要首先能正常访问在Snapfile中列举的设备列表,如果Xcode中少了其中的某些devices,你需要在Xcode中的Window\Devices中的左下角下,点击+来添加新的模拟器

一旦此过程结束,我们可以到fastlane文件夹下找到一下screenshots的文件夹

screenshotresult

现在你有EnglishFrench这两语言支持的所有设备截图了,你也会注意到一个screenshots.html的文件,打开它可以看到所有的screenshot!

  • gym

好了,现在我们可以准备创建IPA文件了
打开Fastfile文件并且在screenshotend后面添加以下内容

1
2
3
4
desc "Create ipa"
lane :build do
gym
end

以上创建了一个buildlane,它使用gym来创建一个签名的ipa文件

在终端中保存Fastfile,在mZone工程根目录下输入以下命令

1
fastlane build

一旦完成,你可以在mZone工程根目录下看到一个签名的ipa文件

ipa

  • …..

其它的工具需要你自己去探索了

fastlane一键式发布

为了将screenshots,metadata,ipa文件发送到iTunes Connect,我们可以使用deliver这个工具

首先,我们需要初始化工程以让它使用deliver这个工具,进入工程文件夹下,输入以下命令

1
deliver init

一旦完成,你的终端窗口看起来应该像以下这样

delivery

我们可以看到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文件夹,注意到尽管我们的应该支持FrenchEnglish,只有en-US文件夹存在

为了解决这个问题,我们对en-US文件夹作一份copy,并将它命名为fr-FR.现在你的工程看起来应该如下

prepare

打开Fastfile并在buildlane的end之后添加以下内容

1
2
3
4
desc "Upload to App Store"
lane :upload do
deliver
end

打开终端,输入以下命令

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和你的appleID
  • Fastfile:管理你需要执行actions的所有lanes
  • Snapfile:让你指定对所有语言对应的设备尺寸进行截图

参考

  1. fastlane官网
  2. fastlane Tutorial: Getting Started
  3. fastlane git开源项目
  4. Xcode中Command Line Tools安装方法
  5. 下一篇Jenkins+Git+Fastlane+Fir CI集成,将会详细介绍具体项目中使用

问题

  1. 不要随便更新版本,如果更新了版本会导致相关lane存在问题,那这个时候需要看最新的官网的更新。现在fastlane更新的速度较快,需要持续关注。