使用fastlane deliver 自动上传App Store Connect 物料和截图
背景
时光荏苒,今年发生了很多事情(省略2w字)。最终iOS商店页物料上传的工作,辗转最终准备交给开发团队来处理。
运营丢过来的物料有6个国家,10种语言,每个语言6~7张截图,各种主标副标变更,更新点文案,哇的一下就哭出来了。
程序员懒癌发作,经过大概30s的google搜索和10s的艰难决策,我最终选择了fastlane。
提交在即,让持续集成帮忙估计不现实,就自己开始搞了。(当然最终还是希望能够放在持续集成一起完成。)
fastlane
fastlane是为iOS和Android应用程序自动化测试部署和发布的最简单方法。????它处理所有繁琐的任务,如生成屏幕截图,处理代码签名以及发布应用程序。
fastlane组件
fastlane是一套工具集,包括:
- 测试
- scan => 自动运行测试工具,并且可以生成漂亮的HTML报告
- 证书,配置文件
- 截图
- 编译
- shenzhen => 当年大名鼎鼎的自动编译工具,现在已经被弃用了
- gym => Fastlane家族的自动化编译工具,和其他工具配合的非常默契
- 发布
- TestFlight管理
- 辅助工具
- spaceship => 为pilot,boarding和deliver等工具提供和 iTC 和 ADC 的交互API。spaceship本来是个独立的项目,后来被Fastlane收编进来
- WatchBuild => 是一个独立的iTC监控工具,开启WatchBuild可以监控iTC上的文件状态,弹出MacOS自带的Notification
- Android
- supply => 自动上传到Google Play工具(如果有时间,我想把国内提供API的Android Store都写个插件自动上传,这个问题从10年我刚开始工作就觉得是个痛点)
- screengrab => Android的自动截图工具
fastlane中的概念
fastlane命令是一个流程控制的命令行工具(CLI),通过内部集成action和第三方的action完成一系列控制流程。运行fastlane命令行工具,会读取当前目录或者./fastlane目录下的Fastfile配置文件。
在Fastfile中:
- action => Fastlane中的每一条命令都是一个扩展(action),上面提到的deliver,sigh之类的工具本身是CLI,但是在Fastlane中内嵌了对他们支持的action
- lane => Fastlane中流程的合集,每一个动作即可以是action,也可以是其他的lane。语法和ruby中的rake非常像
一个简单的发布流程:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
lane :deploy do # 执行 pod instasll cocoapods # 执行 carthage bootstrap carthage # 增加build版本号 increment_build_number # 编译代码 gym # 发布到Apple Store deliver(force: true) end |
总之,fastlane帮你统一定义、运行、自动化你的app发布流程,并且可以和其他第三方工具如CocoaPods等很好的结合,也可以和其他第三方持续集成(Continuous Integration)工具如Jenkins等完美的结合。
fastlane看起来就是为了持续部署(Continuous Deployment)而生。
Deliver
Deliver可以完全管理与iTC的交互。其中包括:
- 上传和下载多语言截图
- 上传和下载多语言元数据
- 上传二进制文件
iTC中的所有的元数据信息都被保存在metadata中,所有的截图信息都被保存在screenshots中。
metadata:
- 可以很容易的管理对应目录下的文件和iTC后台的表单项,在执行deliver时会自动被传到iTC。
- 在metadata目录下的文件,如copyright.txt,是没有本地化的,在二层目录中的文件都是需要对应不同语言的表单项。
- 如果你不想修改某些项的信息,直接把对应的文件删除即可。
- 所有这些表单项也可以在Deliverfile中指定,Deliverfile中指定的项优先级比文件高
screenshots:
- 如果不想更改截图,可以把整个截图目录删除
- 如果不使用snapshot(自动化截图),也可以自己截图放到对应目录下,比一张一张上传iTC快的多。截图在iTC中的排列顺序就是本地文件名的「字母表顺序」(在目录中右击,按文件名排序)。deliver会识别图片分辨率,上传到对应设备中。
如果要通过deliver修改元数据或截图,你必须提供所有iTC后台中有的语言。比如后台中有「简体中文」和「英文」,你也必须提供对应的zh-Hans和en-US文件,否则deliver会报缺少语言的错误。可以在iTC后台提交的版本中删除语言。
目标
先看下iOS开发,打包和发布的流程:
- 开发前,需要登录苹果开发者后台创建App、Provisioning Profiles、certificates等;
- 使用Xcode开发,然后将上述相关文件和证书配置好;
- 编译项目并自测;
- Archive项目;
- 上传包到iTunes后台;
- 配置TestFlight,准备测试刚上传的版本;
- 发布测试版本;
- 测试发现问题,重回2;
- 测试完成,在iTunes后台提交版本截图、描述等信息;
- 提交App Store审核;
我们目标是9:提交截图和元数据信息。
接下来准备开始搞事了,整个步骤不是必须的,只是为了完整体验流程。
如果想快速集成,可以直接创建Appfile,Fastfile文件,Deliverfile文件,fastlane目录,添加配置即可。
系统环境要求:
Mac
Xcode
Gem
Ruby
安装
Xcode命令行工具,iOS开发略过
xcode-select --install
安装fastlane
# Using RubyGems
sudo gem install fastlane -NV
# Alternatively using Homebrew
brew cask install fastlane
初始化
切换到工程目录
执行 fastlane init
过程中会询问Apple ID账号和密码,如果有多个Team,会让你选择team。
据说密码因为是本地保存在keychina中,可以安心输入。
提问了你的Apple ID,Team的问题之后,fastlane会自动检测当前目录下项目的App Name和App Identifier。如果检测的不对,选择n自行输入。
因为账号权限问题,最终失败。不过这个是完成的produce流程,我们的目标是上传物料和截图,所以继续走deliver init。
其实这一步是可以不用执行的,只是为了自动创建对应的配置文件Appfile/Fastfile和fastlane目录而已,如果已经有配置,编辑正确后,是可以略过这一部分的。
拉取
首次拉取,执行 fastlane deliver init
二次拉取可以分别执行
下载截图 fastlane deliver download_screenshots
下载元数据 fastlane deliver download_metadata
在执行deliver init的过程中,会同步iTC中的所有语言的元数据和截图,并按照目录结构组织好。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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 │ ├── 一堆图片 |
如果没有fastlane目录,生成的目录是./metadata 和 ./screenshots
上一步中创建了fastlane目录,拉取存放的路径是./fastlane/metadata 和 ./fastlane/screenshots
- Fastfile => 用来定义所有的lane任务Fastfile帮助
- Appfile => 是用来存储一些公共信息的,比如app_identifier,apple_id,team_id,itc_team_id等。Appfile帮助
- Deliverfile => deliver的配置文件Deliverfile帮助
上传
本地手动更新完本次更新的文字和图片后,
执行 fastlane deliver 就可以完成上传,可能有一些具体的参数需要调整。
这个部分主要是上传元数据,截图,同时设置了自动释放和分阶段发布。
参数设置上是可以设置提交时的出口和IDFA的设置,所以应该是可以自动提交的,这里还没有进行调研。
另外截图上传并没有尝试视频的上传,这里可能需要注意。
Deliverfile 我这边进行了如下配置:
force(true) #跳过HTML报告文件验证
app_version("9.0.10") #应该编辑或创建的版本,不存在会自动创建
#skip_metadata(true) # 不要上传元数据(如标题、描述)。打开后,下面的automatic_release和phased_release等配置会无效
skip_screenshots(true) #不上传屏幕快照
skip_binary_upload(true) #跳过上传ipa或pkg到iTunes Connect
overwrite_screenshots(false) #在上传新截图之前,先清除所有之前上传的截图,个人觉得通常是打开,全新上传比较好。
run_precheck_before_submit(false) #在提交应用程序审核之前运行precheck
automatic_release(true) #一旦应用程序审核通过,该应用会自动发布App Store
phased_release(true) #启用iTC的分阶段发布功能
结语
整体的流程还是比较简单的的,拉取,修改,上传,实现了我们的目标。
还有其他很多功能和配置,还在学习和研究中,欢迎大家一起交流。
据我所知,其实持续集成已经有集成了部分fastlane的功能,包括match证书管理,gym打包,上传包等业务,这部分如果能够集成到整个持续集成中,持续集成可以完整的自动化整个iOS开发流程。
比如:这个上传部分,可以通过前端开发工具,生成自动的包格式,一键自动上传到iTC上。
Deliver常用配置
网上copy的,具体也可以通过执行fastlane action deliver查看
|
Key |
Description |
Default |
|
username |
Apple ID的用户名 |
* |
|
app_identifier |
应用程序的包标识符 |
* |
|
app |
你想要使用/修改的应用程序的ID |
|
|
edit_live |
修改实时元数据,此选项禁用ipa上传和截图上传 |
false |
|
ipa |
ipa文件路径 |
* |
|
pkg |
pkg文件路径 |
* |
|
platform |
使用的平台(optional) |
ios |
|
metadata_path |
包含metadata文件夹的路径,metadata中保存的appstore中你应用的具体内容介绍(如标题、描述) |
|
|
screenshots_path |
包含屏幕快照文件夹的路径 |
|
|
skip_binary_upload |
跳过上传ipa或pkg到iTunes Connect |
false |
|
use_live_version |
使用实时版本而不是编辑版本 |
false |
|
skip_screenshots |
不上传屏幕快照 |
false |
|
app_version |
应该编辑或创建的版本 |
|
|
skip_metadata |
不要上传元数据(如标题、描述)。这仍然会上传屏幕快照 |
false |
|
skip_app_version_update |
不要更新app提交的版本 |
false |
|
force |
跳过HTML报告文件验证。 |
false |
|
submit_for_review |
在上传所有内容后提交新版本进行审核 |
false |
|
reject_if_possible |
拒绝先前提交的处于所有可能的状态构建 |
false |
|
automatic_release |
一旦应用程序审核通过,该应用会自动发布App Store |
false |
|
auto_release_date |
审核通过后自动发布App Store的以毫秒为单位的日期 |
|
|
phased_release |
启用iTC的分阶段发布功能(不懂) |
false |
|
price_tier |
应用程序的价格层级别 |
|
|
build_number |
如果设置给定的构建号(已经上传到iTC)将被使用代替当前构建号 |
|
|
app_rating_config_path |
应用程序配置的路径 |
|
|
submission_information |
提交的额外资料(例如:第三方内容) |
|
|
team_id |
如果你在多个团队,你的iTunes Connect团队的ID |
* |
|
team_name |
如果你在多个团队中,你的iTunes Connect团队的名字 |
* |
|
dev_portal_team_id |
如果您在多个团队中,您的开发人员门户团队的短ID。不同于您的iTC团队ID! |
* |
|
dev_portal_team_name |
如果您在多个团队中,您的开发人员门户团队的名称 |
* |
|
itc_provider |
提供者的短名称,用iTMSTransporter标识您的团队。来获得提供者的短名称,去运行Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v。供应商的短名称应该列在第二列 |
|
|
overwrite_screenshots |
在上传新截图之前,先清除所有之前上传的截图 |
false |
|
run_precheck_before_submit |
在提交应用程序审核之前运行precheck |
true |
|
precheck_default_rule_level |
默认的规则级别,除非有其他配置 |
:warn |
|
app_icon |
Metadata(元数据):应用程序图标的路径。 |
|
|
apple_watch_app_icon |
Metadata(元数据):苹果手表应用程序图标的路径。 |
|
|
copyright |
Metadata(元数据):版权公告 |
|
|
primary_category |
Metadata(元数据):主要类别的英文名称(如商业、书籍) |
|
|
secondary_category |
Metadata(元数据):次级类别的英文名称(如商业、书籍) |
|
|
primary_first_sub_category |
Metadata(元数据):主要的第一个子类别的英文名(如教育、字谜) |
|
|
primary_second_sub_category |
Metadata(元数据):主要的二级类别的英文名(如教育、字谜) |
|
|
secondary_first_sub_category |
Metadata(元数据): 次级类别第一个子类别的英文名称(如教育、字谜) |
|
|
secondary_second_sub_category |
Metadata(元数据):次级的第二子类别的英文名称(如教育、字谜) |
|
|
trade_representative_contact_information |
Metadata(元数据):包含商务代表的联系信息的hash(不懂) |
|
|
app_review_information |
Metadata(元数据):包含审核信息的hash |
|
|
description |
Metadata(元数据):应用程序描述 |
|
|
name |
Metadata(元数据): 应用程序名字 |
|
|
subtitle |
Metadata(元数据): 应用程序副标题 |
|
|
keywords |
Metadata(元数据):一组关键字 |
|
|
promotional_text |
Metadata(元数据): 一段促销文字 |
|
|
release_notes |
Metadata(元数据): 本版本的版本说明 |
|
|
privacy_url |
Metadata(元数据):隐私的url |
|
|
support_url |
Metadata(元数据): 支持的url |
|
|
marketing_url |
Metadata(元数据): 营销url |
|
|
languages |
Metadata(元数据):应用中使用的语言种类 |
|
|
ignore_language_directory_validation |
Metadata(元数据): 应用程序名字 |
false |
|
subtitle |
Metadata(元数据): 应用程序副标题 |
true |
* = 默认值依赖于用户的系统
参考
https://docs.fastlane.tools/actions/upload_to_app_store/
https://whlsxl.github.io/fastlane1/
https://lipan.me/2016/08/25/fastlane-ios-continuous-deployment-tool.html
https://juejin.im/post/5a7b10bb6fb9a0636263bfd5