使用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