自动化工具Fastlane: 安装, 打包,上传(testFlight,app store)


什么是Fastlane?

官方自己的定义是这样的:

fastlane is a tool for iOS, Mac, and Android developers to automate tedious tasks like generating screenshots, dealing with provisioning profiles, and releasing your application.

从这里我们可以看出,fastlane针对的developers主要是 iOS, Mac, and Android。目的在于替代完成一切 没有技术含量的、乏味的工作。简单列举了比如screenshot,provisioning profiles,deliver。

我们第一次接触fastlane或者之前从来没有使用过CLI工具的人,对于上边的概念描述只能知道他的功能,但是不知道fastlane到底是哪个类型的工具,怎么实现上边功能。 关于这一点,我在阅读 Wang Hailong 的文章得到了很简练的答案,摘录如下

fastlane命令是一个流程控制的命令行工具(CLI),通过内部集成action和第三方的action完成一系列控制流程。运行fastlane命令行工具,会读取当前目录或者./fastlane目录下的Fastfile配置文件。


在Fastfile中:

action => Fastlane中的每一条命令都是一个扩展(action),上面提到的deliver,sigh之类的工具本身是CLI,但是在Fastlane中内嵌了对他们支持的action

lane => Fastlane中流程的合集,每一个动作即可以是action,也可以是其他的lane。语法和ruby中的rake非常像

一个简单的发布流程:

lane :deploy do

# 执行 pod instasll

cocoapods

# 执行 carthage bootstrap

carthage

# 增加build版本号

increment_build_number

# 编译代码

gym

# 发布到Apple Store

deliver(force: true)

end


安装

搞了半小天和在同事的帮助下终于安装上了,也把在安装时候遇到的一些问题分享给大家,看完下面相信大家,很快就会搞定的。

首先:

fastlane安装的方式有三种,分别是Homebrew、Installer Script,Rubygems。 这里需要注意的是,不管选择哪种方式,你都要安装Ruby。

我使用的是rubygems 

1.Ruby必须在2.0以上版本

2.macOS 10.9以上系统

3.Xcode 7.3.1 以上版本

4.拥有一个付费的苹果开发者账号


其他:#

安装Ruby/Rubygems,这里注意你在下来一个Ruby版本之后,之前的Ruby也是存在的,所以你需要通过rvm use XXXX --default指定你要使用哪一个Ruby版本,具体可以参考这篇文章《MAC机中安装RUBY环境》

配置环境

更新ruby版本,安装rvm

curl -L get.rvm.io | bash -s stable    # 安装

rvm -v        # 测试是否安装正常

rvm list known        # 列出已知ruby版本

rvm install ruby-xxxxx    #  安装一个最新ruby版本 注:此处xxxxx为list中的最新版本号

如果报错的话

brew install openssl

reinstall|install ruby-xxxxx    #    注意修改xxxxxx

以上所需的ruby环境基本配置好了

2.打开终端,选择ruby 源

#查看gem源

gem sources

# 删除默认的gem源

gem sources --remove https://ruby.taobao.org/

# 增加rubygems作为gem源

gem sources --a https://rubygems.org/

# 查看当前的gem源

gem sources

*** CURRENT SOURCES ***

https://rubygems.org/

# 清空源缓存

gem sources -c

# 更新源缓存

gem sources -u

安装Fastlane

1.安装xcode-select

xcode-select --install

# 如果 Xcode CLT 已经安装,则会报如下错误

# command line tools are already installed, use "Software Update" to install updates.

# 如果未安装,终端会开始安装 CLT

2.安装fastlane

sudo gem install fastlane --verbose

#  如果报错:ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/commander

sudo gem install -n /usr/local/bin fastlane

# 等待着安装完毕....coffee or tea

# 安装结束后,查看版本(2016.9.26我的版本是1.104.0)

fastlane --version

# 实际上目前安装的fastlane并不是最新版本,还需要更新,怎么更新呢,看下面

# cd到项目文件夹

cd xxxxx

fastlane init

# 需要按照提示输入 AppID以及密码, 这个是你项目的开发者帐号,下边要输入项目的bundleIdentifier,然后出现了提示

########################################################################

# fastlane 1.104.0 is available. You are on 1.103.0.

# It is recommended to use the latest version.

# Update using 'sudo gem update fastlane'.

#######################################################################

# 更新最新版本

sudo gem install -n /usr/local/bin/ fastlane --version1.104.0

# 如果报错 Could not find a valid gem 'fastlane' (= 1.66.0) in any repository , 那么更换一个ruby源,详见步骤2

# 继续更新最新版本

sudo gem install -n /usr/local/bin/ fastlane --version1.104.0

# 1.104.0成功安装!

接着

确保Xcode Command Line Tools 安装了最新版

`xcode-select --install`

如果你单独安装过ruby(如果你能看得懂这句),去掉sudo。如果使用系统自带的ruby,需要sudo权限

sudo gem install fastlane`

提示安装成功,恭喜你,你已经成功了一半。

初始化

cd 到项目目录中

fastlane init

# 注意:如果你看到一个 “permission denied” 错误,你可能要在命令前加上 sudo。

接着

请输入  App Identifier (com.krausefx.app):

请输入一个唯一的 app ID。请记住这个 ID,因为后面你还会用到它! 你的 Apple ID (fastlane@krausefx.com):

请输入你的 Apple ID 是否创建 deliver 命令,即上传 app 屏幕截图、app 元数据和 app 更新到 App 商店或者苹果的 TestFlight?(y/n)

输入 n 是否创建 snapshot 命令,它会自动获取 app 在所有语言和设备类型上的屏幕截图?(y/n)

输入 y 是否使用 sigh 命令,它会维护和下载 app 的 provisioning profile?(y/n)

输入 y 可选项:app 的 scheme 名称:(如果不需要,直接回车)

在项目根目录下,初始化Fastlane:

fastlane init

提问了你的Apple ID,Team的问题之后,fastlane会自动检测当前目录下项目的App Name和App Identifier。如果检测的不对,选择n自行输入。

接下来会问你这个app是否需要在iTC和ADC中创建(上一步中如果选择y会自动检测是否需要创建),fastlane会调用produce进行初始化,如果现在还不想创建,也可以之后再运行produce init进行这个流程。如果不执行produce的流程,deliver的流程也会被掠过,当然之后也可以deliver init运行完全一样的流程。

在执行deliver init的过程中,会同步iTC中的所有语言的元数据和截图,并按照目录结构组织好。目录结构应该类似下面:

fastlane

├── Appfile

├── Deliverfile

├── Fastfile

├── metadata

│  ├── copyright.txt

│  ├── en-US

│  │  ├── description.txt

│  │  ├── keywords.txt

│  │  ├── marketing_url.txt

│  │  ├── name.txt

│  │  ├── privacy_url.txt

│  │  ├── release_notes.txt

│  │  └── support_url.txt

│  ├── primary_category.txt

│  ├── primary_first_sub_category.txt

│  ├── primary_second_sub_category.txt

│  ├── secondary_category.txt

│  ├── secondary_first_sub_category.txt

│  ├── secondary_second_sub_category.txt

│  └── zh-Hans

│      ├── description.txt

│      ├── keywords.txt

│      ├── marketing_url.txt

│      ├── name.txt

│      ├── privacy_url.txt

│      ├── release_notes.txt

│      └── support_url.txt

└── screenshots

├── README.txt

├── en-US

│  ├── 一堆png图片

这里肯定会被创建的是Appfile和Fastfile。如果Deliverfile,screenshots和metadata目录没被创建,可以运行deliver init来创建。

1. Fastfile => 用来定义所有的lane任务Fastfile帮助

2. Appfile => 是用来存储一些公共信息的,比如app_identifier,apple_id,team_id,itc_team_id等。Appfile帮助

3. Deliverfile => deliver的配置文件Deliverfile帮助

PS:

1. 这里有个小问题,iTC和ADC中的Team ID是不一样的,在fastlane init中只会自动在Appfile里写入ADC的team_id,所以在这个过程中会不停的问你iTC的Team ID,所以在创建完Appfile后,手动在里面添加itc_team_id。

2. 这个问答对不同的项目可能有各种各样的分支。我已经用不同的项目试过很多次了,但是可能还不是全部,所以你还需要见招拆招。

3. 在这里可以安心的输入密码,所有的密码都加密保存在系统的Keychain里。

接着在项目目录中会生成fastlane文件夹

其中Fastfile,Appfile,Deliverfile这三个文件,功能如上介绍,如果不出问题的话,大家的这三个文件内容应该是和我一样的如下(可以选择sublime打开,然后把当前显示样式设置为Ruby):

Fastfile:

fastlane_version "2.5.0"

default_platform :ios

platform :ios do

before_all do

# ENV["SLACK_URL"] = "https://hooks.slack.com/services/..."

end

desc "Runs all the tests"

lane :test do

scan

end

desc "Submit a new Beta Build to Apple TestFlight"

desc "This will also make sure the profile is up to date"

lane :beta do

# match(type: "appstore") # more information: https://codesigning.guide

gym(scheme: "BlusinessAreaPlat") # Build your app - more options available

pilot

# sh "your_script.sh"

# You can also use other beta testing services here (run `fastlane actions`)

end

desc "Deploy a new version to the App Store"

lane :release do

# match(type: "appstore")

# snapshot

gym(scheme: "BlusinessAreaPlat") # Build your app - more options available

deliver(force: true)

# frameit

end

# You can define as many lanes as you want

after_all do |lane|

# This block is called, only if the executed lane was successful

# slack(

#  message: "Successfully deployed new App Update."

# )

end

error do |lane, exception|

# slack(

#  message: exception.message,

#  success: false

# )

end

end

在Fastfile这个文件中,就是我们打包,发布到fir,testFlight,appstore等等操作的具体配置文件。

Appfile:

app_identifier "com.xxxx.xxxx" # The bundle identifier of your app

apple_id "xxxxx@xxxx.com" # Your Apple email address

team_id "XXXXXXXXX"  # Developer Portal Team ID

Deliverfile:

app_identifier "com.xxxx.xxxx" # The bundle identifier of your app

username "xxxxx@xxxx.com" # your Apple ID user

关于Fastfile文件

对照我们上边fastlane init命令创建出来的默认是的Fastfile默认文件,我们一次解析文件中的「元素」所代表的含义

fastlane_version => 指定fastlane最小版本

default_platform => 指定当前平台,可选ios,android,mac

desc => 一个lane(英文翻译是:小巷,小路,我们这里可以理解为任务)的描述,一般说明这个lane是做什么的

lane : 任务的名字 do => 指定任务的名字,我们在执行这个任务的时候,调用命令的格式为 fastlane 任务的名字,比如fastlane release。 在Fastfile文件中会有很多的lane,我们通俗的把理解为小任务,每个小任务都负责一个功能。 然后我们调用不同的小任务,来实现打包、上传到development、上传到testFlight、上传到app store等功能。 换句话来说,也就是,我们具体关于怎么打包、怎么上传的配置是放到对应的lane里边的

(lane......)end => lane到end标识之间的内容,声明了一个任务具体执行哪些操作,不指定哪些操作


这个模块是表示我们上传到app store的。

打包

这里再执行打包就很简单了,默认Fastfile中包含gym这一个功能模块的lane,都可以执行打包操作。 在gym中指定output_directory一项来指定输出的.ipa文件的输出目录,如果不指定的话,只在项目根目录下。

执行lane命令:

fastlane lane的名字

比如 fast lane release 执行打包上传到appstore

推荐阅读更多精彩内容