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
如果你的项目只有一个 bundle id 也只有一个开发者账号的话,可以直接遵循官方的步骤配置。否则需要按照官方文档,配置不同参数和环境变量。
Last login: Tue Aug 7 13:19:59 on ttys000
yuhanle:360qws-G100 yuhanle$ fastlane init
[✔] 🚀
[✔] Looking for iOS and Android projects in current directory...
[13:33:35]: Created new folder './fastlane'.
[13:33:35]: Detected an iOS/macOS project in the current directory: 'G100.xcworkspace'
[13:33:35]: -----------------------------
[13:33:35]: --- Welcome to fastlane 🚀 ---
[13:33:35]: -----------------------------
[13:33:35]: fastlane can help you with all kinds of automation for your mobile app
[13:33:35]: We recommend automating one task first, and then gradually automating more over time
[13:33:35]: What would you like to use fastlane for?
1. 📸 Automate screenshots
2. 👩✈️ Automate beta distribution to TestFlight
3. 🚀 Automate App Store distribution
4. 🛠 Manual setup - manually setup your project to automate your tasks
?
在提问了你的 Apple ID,Team 的问题之后,fastlane 会自动检测当前目录下项目的 App Name 和 App Identifier。如果检测的不对,选择 n 自行输入。
接下来会问你这个 app 是否需要在 iTC 和 ADC 中创建(上一步中如果选择 y 会自动检测是否需要创建),fastlane 会调用 produce 进行初始化,如果现在还不想创建,也可以之后再运行 produce init 进行这个流程。如果不执行 produce 的流程,deliver 的流程也会被掠过,当然之后也可以 deliver init 运行完全一样的流程。
# Appfile
#The bundle identifier of your app
app_identifier ENV['APP_IDENTIFIER']
# Your Apple email address
apple_id ENV['APPLE_ID']
# Developer Portal Team ID
team_id ENV['TEAM_ID']
复制代码
使用 fastlane 进行 iOS 打包
fastlane 是一个通过简单命令来完成诸如截图、获取证书、编译、导出安装包、提交 iTunesConnect 等一系列操作的工具,它同时支持 iOS 和 Android。
你能够通过简单的方式配置流程进行的顺序,并通过非常简单的命令执行其中的一个流程。当然它的简单并不代表功能也简陋,有开源社区的支持,更新迅速且有很多功能能够满足你的需求。
为什么使用它
作为公司的 iOS 程序员,少不了在发布应用的时候各种等待。标准的手动发布流程是:编译->打包上传->填写应用更新数据->等待 iTunesConnect 编译->选择版本发布,整个过程大概需要 30 分钟左右。关键是这个过程就像windows 装系统一样,虽然手动参与的不多,但是要一直守在电脑前等着。
刚开始用 fastlane,发现其使用和配置还算简单,有开源社区支持,更新迅速功能强大。且相比 jenkins 里的插件,fastlane 可以单独使用,也可以被多种CI 接入。
程序员这么懒,一定会想办法让他自动化的。后来发现特别懒的 Felix Krause 写的 Fastlane,Fastlane可以非常快速简单的搭建一个自动化发布服务,并且支持
Android
,iOS
,MacOS
。他可以实现一条命令从编译到选版发布全程不用干预。作为程序员的你只要一条命令,看集美剧,发布就完成了。截止刚刚 Fastlane 官网上宣称已经为程序员节省了13,746,550小时+。使用场景
系统要求
工具集
fastlane
将如下的工具套件有机地结合起来,从管理证书到单元测试,从编译打包到上传发布,都能通过命令行轻松完成.该套件支持与Jenkins
和CocoaPods
,xctools
等其他第三方工具的集成,并且能够定义多个通道(lanes)以支持不同的部署目标。测试
证书,配置文件
Provisioning Profile
战斗过无数次。总是有这样那样的问题导致配置文件过期或者失效。sigh
是用来创建、更新、下载、修复Provisioning Profile
的工具。match
同步回来就不用管证书问题了,小团队福音啊!截图
Xcode7
推出的UI test
功能实现自动化截图发布
TestFlight 管理
TestFlight
的测试用户,上传二进制文件iTC
辅助工具
pilot
,boarding
和deliver
等工具提供和 iTC 和 ADC 的交互 API。spaceship
本来是个独立的项目,后来被Fastlane
收编进来WatchBuild
可以监控 iTC 上的文件状态,弹出 MacOS 自带的 NotificationAndroid
简例
fastlane 命令是一个流程控制的命令行工具(CLI),通过内部集成
action
和第三方的action
完成一系列控制流程。运行 fastlane 命令行工具,会读取当前目录或者./fastlane
目录下的Fastfile
配置文件。在
Fastfile
中:action
=> Fastlane 中的每一条命令都是一个扩展(action),上面提到的deliver
,sigh
之类的工具本身是 CLI,但是在 Fastlane 中内嵌了对他们支持的action
lane
=> Fastlane 中流程的合集,每一个动作即可以是action
,也可以是其他的lane
。语法和 ruby 中的 rake 非常像一个简单的发布流程:
安装
安装
如果 ruby 版本满足要求,可以直接在命令行执行以下命令安装 fastlane
使用的环境搭建好了,就可以进行下一步来配置 fastlane
初始化
执行默认的初始化
如果你的项目只有一个 bundle id 也只有一个开发者账号的话,可以直接遵循官方的步骤配置。否则需要按照官方文档,配置不同参数和环境变量。
在提问了你的
Apple ID
,Team
的问题之后,fastlane 会自动检测当前目录下项目的App Name
和App Identifier
。如果检测的不对,选择n
自行输入。接下来会问你这个 app 是否需要在 iTC 和 ADC 中创建(上一步中如果选择
y
会自动检测是否需要创建),fastlane 会调用produce
进行初始化,如果现在还不想创建,也可以之后再运行produce init
进行这个流程。如果不执行produce
的流程,deliver
的流程也会被掠过,当然之后也可以deliver init
运行完全一样的流程。在执行
deliver init
的过程中,会同步 iTC 中的所有语言的元数据和截图,并按照目录结构组织好。目录结构应该类似下面:这里肯定会被创建的是
Appfile
和Fastfile
。如果Deliverfile
,screenshots
和metadata
目录没被创建,可以运行deliver init
来创建。app_identifier
,apple_id
,team_id
,itc_team_id
等。Appfile帮助deliver
的配置文件 Deliverfile帮助PS:
Team ID
是不一样的,在fastlane init
中只会自动在 Appfile 里写入 ADC 的team_id
,所以在这个过程中会不停的问你 iTC 的Team ID
,所以在创建完 Appfile 后,手动在里面添加itc_team_id
。配置
fastlane 可以通过配置 .env 文件、Appfile、Deliverfile、Fastfile 来完成各种工作。
其中 Fastfile 是最核心的用来控制流程走向的配置文件,.env 和 Appfile 可以辅助 Fastfile 来设置一些参数,Deliverfile 可用于配置提交 iTunesConnect 的一些参数。
需要查看,样例配置可直接前往下载样例配置
Appfile
Appfile是用来配置一些类似于 AppleID、BundleID 参数(参数是 fastlane 已经定义好的,新增的并没有用,如果想新增变量需要使用 .env 方式),可以在 Fastfile 中使用,AppleID、BundleID 等其实会被一些 actions 直接调用,并不需要写出来传递。
普通配置方式
直接在 Appfile 里填写 app_identifier、apple_id、team_id 等,然后根据 lane 的不同可以设置成不同。
使用 .env 配置方式
.env 这个文件的作用是作为环境变量的配置文件,在 fastlane init 进行初始化后并不会自动生成,如果需要可以自己创建。
执行时默认会读取
.env
和.env.default
文件里的配置。通过执行fastlane [lane-name] --env [envName]
来指定使用配置文件.env.[envName]
,读取顺序是.env -> .env.default -> .env.<envName>
,相同的变量名会被后面的覆盖。如我建了文件 .env.myDev,里面写了一些参数,那在执行的时候使用
fastlane [lane-name] --env myDev
即可,想在 Appfile、Deliverfile、Fastfile 等调用,直接使用ENV['keyName']
即可注意:因为是 .env 文件是.开头文件,默认是在 finder 中隐藏的,需要通过执行一下命令来显示
配置方式对比
Fastfile
Fastfile 是对流程进行控制的核心文件,需要设定支持的平台和在一些环节里需要做的事情,是我们脚本的入口,所有的事件驱动都是在这个文件来调度的。
Lane
有了
Fastfile
,就可以添加自己的发布流程了。打开Fastfile文件(这里我用Sublime 设定语法为Ruby),如果不出意外的话你生成的Fastfile和我应该差不多。这里我就不贴出来了。最开始定义了
fastlane_version
=> 指定fastlane最小版本default_platform
=> 指定当前平台,可选ios,android,mac
在
platform
中就是需要修改的重点。先忽略before_all
,after_all
,error
这些方法,这里的lane
就是一组任务,上传到 Firim 的任务如下Sigh
如果你不确定证书目前是否可用,可以用 Sigh 自动生成获取证书。Sigh 会自动根据 Appfile 里设置的
app_identifier
从 ADC (苹果开发者中心)生成证书,并下载到项目根目录下(不是 fastlane 目录),下载后自动安装。你可以通过指定output_path
指定证书下载位置。PS:建议不要把这个文件夹同步到项目的 git 中( Fastlane 提供了
match
专门管理所有证书)。可以在 .gitignore 中可以忽略这个文件夹。Sigh 常用的配置项:
production
证书iOS 里 code 打包证书有 4 种,adhoc,inhouse,appstore,development 证书。
其中
In-House
的方式打包的ipa安装没有设备的限制。AdHoc
打包的 ipa 必须提前把设备的 UDID 添加到证书中,并且有 100 台设备限制。所以如果你不指定
adhoc
为true
,Sigh 会识别帐户类型,企业帐户默认生成In-House
证书,公司账号和个人帐户默认生成 AppStore 证书。Gym
Gym 常用配置项:
./
app-store
ad-hoc``package
enterprise``development``developer-id
bitcode
Xcode7 之后,Xcode API 允许我们指定一个
plist
文件作为额外的配置文件。gym 默认会帮你创建这个文件,你可以直接指定配置。更多关于 plist 可配置项,执行xcodebuild -help
查看Available keys for -exportOptionsPlist
。export_method
,include_symbols
,和include_bitcode
这些参数都是exportOptionsPlist
的配置,对应method
,uploadSymbols
和uploadBitcode
。Gym 可以指定配置文件
Gymfile
。初始化:
Multi-Target
如果我们需要配置多个 target 进行打包的话,我们可以使用 环境变量,来进行配置。假如我们现在有两个
target
,targetA
和targetB
,则我们需要创建两个.env
文件,例如.env.targetA
,.env.targetB
,放在Fastfile
文件同级目录下在
.env
文件里面我们可以配置一些不同的内容(非公共),比如app_identifier
,release_notes
等等。截图如下:在
Appfile
,Deliverfile
,Fastfile
等文件,我们都可以直接使用.env
文件里面的内容。Appfile
Deliverfile,请在设置 release_nores、support_url、private_url 等配置的时候,采用 hash 的方式写。
Deliver
Deliver 可以完全管理与 iTC 的交互。其中包括:
还记得上面初始化的时候初始化的
metadata
,screenshots
目录么?iTC 中的所有的元数据信息都被保存在metadata
中,所有的截图信息都被保存在screenshots
中。metadata:
deliver
时会自动被传到 iTC。metadata
目录下的文件,如copyright.txt
,是没有本地化的,在二层目录中的文件都是需要对应不同语言的表单项。Deliverfile
中指定,Deliverfile
中指定的项优先级比文件高screenshots:
snapshot
(自动化截图),也可以自己截图放到对应目录下,比一张一张上传 iTC 快的多。截图在iTC 中的排列顺序就是本地文件名的「字母表顺序」(在目录中右击,按文件名排序)。deliver
会识别图片分辨率,上传到对应设备中。如果要通过
deliver
修改元数据或截图,你必须提供所有 iTC 中有的语言。比如后台中有「简体中文」和「英文」,你也必须提供对应的zh-Hans
和en-US
文件,否则deliver
会报缺少语言的错误。可以在 iTC 后台提交的版本中删除语言。Deliver 常用配置项:
ipa
地址gym
,可以通过上下文获取metadata
目录地址fastlane
中./fastlane/metadata
,如果作为独立的命令行应用./metadata
screenshots
目录地址fastlane
中./fastlane/screenshots
,如果作为独立的命令行应用./screenshots
metadata
deliver
会在上传时汇总信息生成HTML也,等待你审核。跳过这项审核此项设为true
icon
图片地址,必须为png
格式submission_information =>
前缀
export_compliance
=> 对应「出口合规信息」,没有特殊情况都选false
就可以。前缀
content_rights
=> 问你是否包含,显示,访问第三方内容(这项我没在我提交过程中找到),没有特殊情况也都选false
就可以。前缀
add_id_info
=> 可就关键了,对应「广告标识符」,如果你在 App 中使用了IDFA
。你必须在这给个理由,而不能直接选false
。下图等价下表,App 中投放了广告。
deliver
的CLI
工具:deliver download_screenshots
下载 iTC 上的元数据
deliver download_metadata
配置完以上的设置,最后只需要一条命令发布
系统级 lane
fastlane
默认有 lane。before_all
,就是在执行一次脚本之前首先执行的代码,我们可以在这里面执行一些公共的东西,比如git_pull
,cocoapods
。after_all
, 成功结束之后,处理共有的后置逻辑。before_each
,每次执行 lane 之前都会执行一次。after_each
,每次执行 lane 之后都会执行一次。error
,在执行上述情况任意环境报错都会中止并执行一次。执行顺序
Error
Command timed out after 10 seconds on try 1 of 4, trying again...
,在fastlane
文件开头加上:插件
Fastlane 的插件是一个或者一组
action
的打包,单独发布在 fastlane 之外。Fastlane Plugin 指南自从 16 年 5 月份推出插件系统以来,现在已经有很多第三方的插件可以使用。查看所有插件:
这里介绍两个下文会用到的插件:
fastlane-plugin-versioning => 用来修改 build 版本号和 version 版本号。
Fastlane 内嵌的 action
increment_build_number
使用的是苹果提供的agvtool
,agvtool
在更改 Build 的时候会改变所有target的版本号。这时如果你在一个工程里有多个产品的话,每次编译,所有的Build都要加1,最后就不知道高到哪里去了。有了
fastlane-plugin-versioning
不仅可以指定 target 增加 Build,而且可以按照「语义化版本」规范增加 Version,当然也可以直接设定 Version。PS:最开始写 iOS 时不知道怎么定义 Build。现在我一般都直接定义成纯数字,比如 100 起,每次编译的时候让他自动加一。
fastlane-plugin-firim => 直接把 AdHoc 或者 InHouse 打包的 ipa 上传到 fir.im,供测试下载。
安装上面的插件
参考链接
iOS 持续交付之 Fastlane
和重复劳动说再见-使用fastlane进行iOS打包
小团队的自动化发布-Fastlane带来的全自动化发布