原文:fastlane Tutorial: Getting Started
作者:Satraj Bambra
译者:kmyhy
激动人心的时刻到来了:你花了几天和几周时间(甚至是几个月)制作了一个精彩的 App,准备发布到全世界。剩下来的事情就是将 App 提交到苹果商店了,但是 —— 嗯?咋个提交个 App 就这么难呢?
针对各种支持的设备和语言抓取屏幕截图完全是一个充斥着大量枯燥乏味的重复性工作的过程。啊!还有让人无力吐槽的编译过程。你不禁会想:难道没有更好的办法吗?
能不能只要一条命令,不管支持什么样的设备和语言,就可以自动生成所有的屏幕截图?能不能只要一条命令,就能上传这些截图,生成 provisioning profile,并提交 App ?这会节省多少时间?
感谢 Felix Krause, 才有了为我们解决这个问题的工具。它会是你最好的朋友!
fastlane 是一套工具,帮助你简化和自动化 App 发布或部署的过程,将之变成一条平直的工作流。通过 fastlane,你可以实现 持续分发(CD,一种用于自动化和改进软件分发过程的设计实践)。
通过 fastlane 内置的工具,你可以创建一个由 build task (又叫做 lane)构成的有序列表,你只需要点击一个按钮就可以将 App 发布到 App 商店。你可以节省大量的时间,用于提升软件质量,或者缩短团队中发布者的发布周期。
在本教程中,你将学习如何设置 fastlane,了解它的工具集,并用它来发布一个示例 app。接下来你会嗨到爆,安全带系好了吗?
注意:本文主要使用命令行。你不一定要是命令行高手,但必须知道一些关于终端和命令行的知识。
另外,本文假设你知道如何进行代码签名以及使用过 iTunes Connect。如果你不熟悉这些主题,请先阅读这些教程。
下载本文使用的项目,将它保存到任意地方。
示例 App 叫做 mZone,是一个用在无限额德州扑克锦标赛的计算器。它会根据你的筹码和当前大盲注提出一个出牌建议:
首先,要让 fastlane 能够运行,你需要安装:
因为 fastlane 其实是一个 Ruby 脚本的集合,你必须安装正确的 Ruby 版本。 OS X 10.9(Mavericks) 以后默认安装的是 Ruby 2.0 本。你可以在终端窗口中用下列命令来确认:
ruby -v
然后检查 Xcode 命令行工具(CLT)是否安装。在终端窗口中输入命令:
xcode-select --install
如果 Xcode CLT 已经安装,则会报如下错误:
command line tools are already installed, use "Software Update" to install updates.
如果未安装,终端会开始安装 CLT。
当这些要求满足后,你就可以安装 fastlane 了。输入下列命令:
sudo gem install fastlane -v 1.32.1 --verbose
注意,书写本文时 fastlane 是 1.32.1 版本 。当你阅读本文时,很可能会有更新版本。新版本的配置和用法可能会有所不同,你可以查看在每个任务之后显示的更新信息。
输入超级管理员密码,终端窗口会打印一堆进度信息,表示安装进程。安装需要花几分钟时间,倒一杯咖啡,溜溜狗,或者玩一下 zombie-fighting tactics 游戏 :]
安装完成后,你就可以在项目中配置 fastlane 了。但在配置项目之前,我们先来了解一下 fastlanme 中都包含了什么工具。
在 fastlane 这个大家庭中,包含了下列工具:
在部署实例 App 的过程中,这些工具中的大部分工具你都会用到。
理论部分结束了——接下来让我们到快车道上体验一下 fastlane (fastlane 即快车道)吧!
首先,打开终端窗口,cd 到 mZone 项目目录。进入 mZone 文件夹之后,输入下列命令
fastlane init
注意:如果你看到一个 “permission denied” 错误,你可能要在命令前加上 sudo。
几分钟之后,fastlane 会通过询问下列问题,引导你完成设置过程:
打开 mZone 项目文件夹。你会发现多了一个 fastlane 文件夹,其内容如下:
其中:
恭喜你!你现在可以使用 fastlane 了。
在任意文本编辑器中打开 Fastlane 文件,将内容替换为:
# Minimum version of fastlane
fastlane_version "1.32.1"
default_platform :ios
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 名字——我建议用 mZone 加上你的 email 地址或者其它唯一性文本。你的 iTC 用户名和 app ID 通过 Appfile 文件加载,因此这里不需要手动指定。
如果你之前从来没有用过 Ruby,这些代码对你来说可能难于理解,所以这里顺便解释一下:
注意:sigh 默认创建的是 App Store 的发布 profile。如果你想创建 ad hoc profile,你需要使用 sigh(adhoc:true)。如果是开发 profile 则使用 sigh(development:true)。为简单起见,在本文中你只需要创建 distribution profile。
哇!你创建了第一个 lane。保存文件,打开终端进入到项目文件夹,输入命令:
fastlane provision
这会让 fastlane 执行 provision lane。
大约一分钟左右,fastlane 会问你 iTunes Connect 密码,它会保存到你的 Mac 的钥匙串里。输入密码,如果执行成功,你的终端窗口会显示如下:
注意:如果你看到错误,例如 “Creation of apps of this type is not available”, 则请登录你的 iTunes Connect,看一下是否有某些更新的协议需要你确认。
在进行下一步之前,你还需要在 Xcode 中进行某些修改。打开 mZone Poker.xcodeproj,选择 mZone Poker Target,切换到 General 页。将 bundle identifier 修改为初始化 fastlane 时输入的 App ID。
在 Build Settings > Code Signing > Provisioning Profile 设为 “ <新的 app ID> AppStore”。然后在 Code Signing Identity 选择和这个 provisioning profile 相对应的 ID:
注意,code signing identity 应该和 provisioning profile 中的 identities 相匹配。这样,当 gym 编译 IPA 文件时会使用新创建的 provisioning profile。
登录进 iTunes Connect,哇喔!你的 app 已经创建好了,太酷了!
只需要一条命令,你就在 iTunes Connect 和 Dev Portal 中创建了一个 app 和一个 provisioning profile。你的工作一下子就节省了几个小时!:]
在提交 app 时,上传屏幕截图是最无聊的工作之一。你的 app 用得越广泛(也就是说支持的语言和设备类型越多),你花在屏幕截图上的工作越多。真 tm 痛苦啊!
mZone 支持两种语言,英语和法语,以及 4 种屏幕尺寸。如果每个设备针对一种语言需要 5 张截图,则你需要 40 张截图!使用 fastlane,你只需要一条命令就可以完成这个工作!
打开 fastlane 文件夹下的 Snapfile 文件,将内容替换为:
# A list of devices you want to take the screenshots from
devices([
"iPhone 4s",
"iPhone 5",
"iPhone 6",
"iPhone 6 Plus"
])
# A list of supported languages
languages([
'en-US',
'fr-FR'
])
# Where should the resulting screenshots be stored?
screenshots_path "./screenshots"
# Clears previous screenshots
clear_previous_screenshots
# Latest version of iOS
ios_version '9.1'
将设备类型、语种设置为你想支持的类型和语言。clear_previous_screenshots 一句会清空上次创建的截屏图。
保存、关闭文件。
打开 Fastfile 文件,在 error do |lane, exception| 一句上面加入:
desc "Take screenshots"
lane :screenshot do
snapshot
end
这里创建了一个新的 lane,名为 screenshot,并使用 snapshot 命令根据你在 Snapfile 文件中输入的配置创建截屏图。
保存文件,在终端窗口中输入:
fastlane screenshot
稍等一会 … 截屏图在你什么都没做的情况下生成了!欢呼吧,你不再需要做那些无味的重复工作了 :]
注意:本文使用的 snapshot 版本使用了 UI Automation 和 JavaScript(为了调用模拟器)。但在 snapshot 1.0,则使用了 Xcode 7 的 UI Testing,一次你可以用 Swift 或 Objective-C 来编写你的自动化脚本。
注意:snapshot 为了截取屏幕,需要调用 Snapfile 中列出的设备类型所对应的模拟器。如果缺少了一种或多种模拟器,你要 Xcode 中通过 Window\Devices 菜单来添加相应的模拟器。左下角的 + 号按钮就是用来添加新模拟器的。
命令执行完后,找到 mZone 项目文件夹下面的 fastlane 目录,你会看到多了一个 screenshots 子目录:
现在,所有设备的英语和法语的屏幕截图都有了。你还会发现一个 screenshots.html 文件。打开这个文件,可以浏览所有的屏幕截图。
所有屏幕截图的生成只消要一条命令——没有比这个更省事的了!
注意:如果出现错误 ambiguous simulator name,删除某几个模拟器或者修改 Snapfile 即可。
snapshot 可以和 Xcode 的 UI test 配合工作。UI test 能够截取 app 某一部分的屏幕内容,因此它在测试中用得更多一些:]
不再需要创建屏幕截图固然省事,但提交 App 中真正费事的是编译 app 和代码签名。你猜对了 —— fastlane 也可以帮你干这个!
打开 Fastfile,在 screenshot lane 之后添加:
desc "Create ipa"
lane :build do
gym
end
这里创建了一个 lane 叫做 build,它使用 gym 命令创建签名的 ipa 文件。
保存 Fastfile,打开终端窗口,进入 mZone 项目文件夹,输入命令:
fastlane build
这会执行 build lane,开始编译。一旦编译完成,打开 mZone 项目文件夹。你会看到签好名的 ipa 文件:
搞定!只消一行命令就搞定 iOS 开发中公认的最繁琐和最不可理喻的工作。
要上传屏幕截图、元数据和 IPA 文件到 iTunes Connect,可以使用 deliver 命令,它已经包含在 fastlane 中了。
首先,需要用 deliver 来初始化项目。在终端窗口,进入项目文件夹输入命令:
deliver init
执行完成,终端窗口应当显示如下:
在 summary 栏中,你会看到 deliver 已经自动检测到 ipa 文件和屏幕截图的位置。
它还会创建一个 metadata 文件夹以及一堆文本文件。这些文本文件中包含了一些常见的 App Store 对象,比如 description、keywords 和 categories 等。
一般,你需要填写这些信息,但在本教程中,只需要填写一个简单描述。打开 en-US/description.txt 添加如下内容:
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.
在这里,你需要解决一个 Bug。打开 metadata 文件夹。你会看到我们的 app 明明支持英语和法语,但你只看到一个 en-US 文件夹。
要解决这个 Bug,拷贝一份 en-US 文件夹并更名为 fr-FR。现在,你的项目文件夹应当如下图所示:
打开 Fastfile 在 build lane 后面添加:
desc "Upload to App Store"
lane :upload do
deliver
end
在终端窗口中,输入命令:
fastlane upload
通过这个命令,fastlane 会创建一个 html 文件,它将以 html form 表单的形式上传文件。
预览 html,如果一切正常,则在问题 “Does the Preview on path ‘./Preview.html’ look okay for you? (y/n)” 后面回答 y。
这时你可以稍微休息一下,让电脑为你工作 :] 当执行成功后,你的终端窗口应当显示如下:
登录你的 iTunes Connect。所有的屏幕截图、描述、版本 build 1.0 都应当上传就绪。
剩下来的事情就是点击 “Submit for Review” 按钮。
等等!还要手动登录并点击按钮?我以为这一切都应该是自动的!
是的,deliver 确实可以自动提交 app 去审核,但你需要修改 upload lane:
desc "Upload to App Store and submit for review"
lane :upload do
deliver(
submit_for_review: true
)
end
提醒:比起你之前没有使用 fastlane 的日子,你可能会觉得手上一下子多出那么多时间会挺难受的,但我相信你一定会习惯的 :]
今天,你学习了如何使用 fastlane 发布 app 来节省大把时间。要让 fastlane 能够正常工作只需要不多的几个步骤,而其中很大一部分又是在初始化时候。
fastlane 还提供很多定制 lane 的工具,比如支持在 Slack 中实时反馈信息、允许单元测试、部署 TestFlight build 以及提交 app 到商店等等。
要进一步了解这些神奇的工具,请浏览 fastlane 官方网站。
希望你喜欢这篇教程,并在发布 app 时用好 fastlane 这个工具。