在一個iOS專案進行到了測試和釋出階段,一般都會經歷一次又一次的打包-截圖-上傳及metadata填寫及修改的過程。這點做伺服器開發的同學就要比我們幸福太多了,因為這一部分的工作他們可以交付給運維同學來完成。那我們就只能自己手動去做這些重複且耗時的操作了麼?答案並不是,fastlane就給我們提供了一整套工具來幫助我們實現自動化。
一、Fastlane簡介及配置安裝
1.簡介
fastlane
是一套基於ruby
開發的自動化構建工具,為專案的釋出流程提供一整套解決方案。
2.安裝
2.1 確保安裝了最新版的Xcode command line tools
對使用Xcode
進行開發的iOS
開發者是標配,若發現提示沒有安裝的話嘗試使用以下命令安裝
xcode-select --install
複製程式碼
2.2 選擇安裝方式
安裝方式一共有三種:
homebrew | installer script | RubyGem |
---|---|---|
brew cask install fastlane | 下載安裝包,執行安裝指令碼 | sudo gem install fastlane -NV |
筆者專案中都使用到了cocoapods
本地有Ruby
環境,因此選擇了第三種安裝方案
2.3 安裝bundler
若你的ruby
環境中沒有安裝bundler
,執行以下命令安裝bundler
sudo gem install bundler
複製程式碼
3.配置
進入專案的根目錄中
3.1 初始化
fastlane init
複製程式碼
初始化的過程中會詢問您的APPID
和密碼,請放心它只會把密碼資訊存在本地的keychain
中,並不會傳到雲端伺服器。
初始化的過程中會有四個選項,分別是為四種不同的任務建立配置:
- 自動化截圖
- 自動建立
TestFlight
測試版釋出專案 - 自動建立
Appstore
釋出專案 - 手動設定自己需要任務的配置
第一次建立可以選擇第三項,它會自動檢測當前專案的App Name
和App bundleID
並輸出在控制檯,若資訊有誤可以在確認資訊的時候選擇n
然後去配置檔案中手動編輯。接著會詢問是否需要在ITU
和ADC
中建立專案,若選擇了y
會生成類似下圖的目錄結構,其中Appfile
和Fastfile
這兩個核心檔案必然會被建立。
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
複製程式碼
若選擇了n
可以在之後使用fastlane
提供的對應功能的命令來生成配置檔案。
筆者已經習慣了自己手動去設定相關的配置檔案,一般都直接使用第四種方式建立任務。
3.2 使用Gemfile管理fastlane的版本和依賴
同cocoapods
一樣,fastlane
也可以使用Gemfile
來管理對應的版本和依賴。
在執行init
操作的時候會自動生成一個Gemfile
內容如下:
source "https://rubygems.org"
gem "fastlane"
複製程式碼
可以直接在此處指定fastlane
的版本資訊。
致辭我們的初始化操作就完成了。
二、Fastlane的理念及元件
在上一步初始化的操作中,生成了兩個核心檔案Appfile
以及Fastfile
,其中Appfile
存放的是你app
的bundleID
以及appID
。
Fastfile
是我們實際的自動化流程操作實現檔案,我們會將相關動作在其中實現。
1.理念
在Fastlane
有兩個重要的概念:
- action: 每一個動作就是action,對應一條命令。
- lane: 某個操作流程,比如釋出
appstore
的包的一系列action
集合是一個lane,釋出adhoc
包又是一個lane
當執行fastlane
命令列工具的時候會讀取fastlane
目錄下的Fastfile
檔案,執行相應lane
中的action
操作
一個簡單的流程:
lane :dependence_manager do
# 執行cocoapods屬於一個action
cocoapods
# 執行carthage屬於一個action
carthage
end
複製程式碼
2.元件
fastlane
提供了一套工具集,涵蓋了釋出流程大多數可能會使用到的操作,主要包括幾個大類:
- 測試:
scan
-自動生成測試工具,並可以生成HTML
報告 - 構建:
gym
-專案打包工具、cocoapod
-執行pod install
操作 - 截圖:
snapshot
-截圖工具(需要編寫UI測試)、framekit
-生成帶邊框的截圖 - 專案:
increment_build_number
:增加專案構建次數 - 簽名:
match
-同步簽名資訊和專案provision profile
、cert
-同步ADC
中的證書資訊、register_device
-向ADC
中新增新的裝置 - 文件:
appledoc
-根據原始碼生成Apple
風格的程式碼文件 - Beta:
testflight
-將專案釋出至testflight
- 推送:
pem
-獲取推送證書 - 釋出:
deliver
-將專案釋出至appstore
等 - 版本控制:
git pull
-這就不用解釋了 - 通知:
Slack
-將打包資訊告知你的開發組
fastlane
提供的工具非常之多,以上只列舉了部分常用的元件,想了解更多請訪問Fastlane Actions文件
3.第三方外掛
fastlane
內部提供了足夠多的工具,同時也支援第三方的外掛接入。可以使用
fastlane search_plugins
複製程式碼
命令來檢視所有可用第三方外掛。
這裡介紹兩個最常用的外掛:
- firim: 將測試包釋出到
firim
fastlane add_plugin firim
複製程式碼
- pgyer: 將測試包釋出到蒲公英
fastlane add_plugin pgyer
複製程式碼
三、Fastlane實踐之旅
由於fastlane
提供的元件相當之多,專案實踐中並不一定都能用上。比如snapshot
截圖工具,由於公司的宣傳頁面都是使用的UI
切圖,筆者也一直沒有具體實踐的機會。這一部分只能介紹下筆者在專案中實際用過的元件,要是您想要了解的部分並沒有被提及,fastlane
提供了十分詳細的文件可以參考。
1.match-同步證書及provision profile利器
在多人開發的iOS
專案中,大部分新手應該都鬧出過刪證書的笑話,尤其是一些小公司用的個人開發者賬號去開發公司專案,成員之間就需要依靠證書的P12
檔案來進行證書的傳遞,這種方式效率又低管理又不方便。
fastlane
的match
命令就提供了一套基於git
的證書和provision profile
管理方案。通過match
生成的證書和provision profile
將會同步到一個你指定的git
地址,需要的成員通過match
去下拉專案需要的證書到本地,match
會自己負責和ADC
證書及provision profile
的同步操作。
1.1 match初始化
通過命令
match init
複製程式碼
會讓你輸入一個git地址,這個地址就是證書的存放位置,同時會在專案中的fastlane
中建立一個matchfile
與Fastfile
同級,其中的內容就是此git
地址
1.2 生成證書和provision profile
# 生成appstore釋出證書及provision profile
fastlane match appstore
# 生成adhoc釋出證書及provision profile
fastlane match adhoc
# 生成除錯證書
fastlane match development
複製程式碼
這一步match
會檢測ADC
中是否有需要的證書和provision profile
要是有就直接下載到本地,要是沒有就直接在ADC
中建立
match
自動建立的provision profile
如圖:
完全不用自己手動在ADC
中建立了是不是非常方面
1.3 在Xcode中配置證書和provision profile
到了這一步其實就和手動建立配置證書一樣了,就不再贅述。
1.4 在Fastlanefile中配置證書操作的lane
貼上在專案中的實際配置
desc "Init develope environment"
lane :config do
match(type: "appstore", app_identifier: AppID, readonly: true)
match(type: "adhoc", app_identifier: AppID, readonly: true)
cocoapods
end
複製程式碼
以上配置完成之後,團隊新加入成員或者更換了裝置後只要執行
fastlane config
複製程式碼
命令即可同步整套開發釋出環境,相當方便。
2.sigh-選擇正確的provision profile
match
將provision profile
下載到本地,sigh
在打包之前確認對應使用的provision profile
用法如下:
sync_code_signing(type: "appstore",
readonly: true,
app_identifier: AppID)
複製程式碼
3.gym-編譯打包工具
此action
就是對應的Xcode
的Archive
操作
# gym是build_app命令的一個別名
build_app(workspace: "xxxxxx.xcworkspace",
scheme: "xxxxxxxx",
configuration: "release",
# 輸出.ipa檔案的路徑
output_directory: "./Package/AppStore",
export_method: "app-store")
複製程式碼
4.deliver-釋出工具
在fastlane init
的時候若是沒有允許fastlane
自動同步專案在ADC
中的metadata
。可以使用
fastlane deliver init
複製程式碼
來建立ADC
中需要的metadata
檔案,會在專案中的fastlane
目錄下建立metadata
資料夾以及Deliverfile
檔案。
若是ADC
中已經存在了metadata
資訊,則可以使用
fastlane deliver download_metadata
複製程式碼
來同步ADC
上的metadata資訊。
注意:若是ADC
中存在已經編輯好的metadata
沒有同步到本地,則deliver
上去的metadata
會覆蓋原有的metadata
實際在Fastfile
中的用法很簡單就一行程式碼:
# deliver是upload_to_app_store的一個別名兩個方法用法一致
upload_to_app_store
複製程式碼
5.完整發布appstore的lane
Fastfile
中如下:
desc "upload release version"
lane :release do
sync_code_signing(type: "appstore",
readonly: true,
app_identifier: AppID)
build_app(workspace: "xxxxx.xcworkspace",
scheme: "xxxxxxx",
configuration: "release",
output_directory: "./Package/AppStore",
export_method: "app-store")
upload_to_app_store
end
複製程式碼
只要在命令列執行
fastlane release
複製程式碼
即可完全自動化釋出的流程,極大的節省了開發者的時間。
6.釋出到fir.im或蒲公英
將upload_to_app_store
替換為firim
或pgyer
外掛提供的上傳方法即可。
firim(firim_api_token:"xxxxxxxxxxxxxxxxxx")
四、總結
fastlane
是一套及其強大的自動化構建工具,善用action
可以定製很多個性化操作,筆者只是拋磚引玉提供了一套滿足最基本釋出需求的方案。如果您有更好的方案,歡迎郵件交流。
由於筆者所在公司並沒有專門的iOS
打包機,很遺憾沒有實踐fastlane
+jekins
的機會。但身為軟體開發工程師尋找更"輕鬆"的工作方式應該是我們一直以來的追求,筆者在今後的工作中也會持續在這個方向發力。
五、參考文獻
小團隊的自動化釋出: whlsxl.github.io/index.html
How to Set Up Fastlane: blog.metova.com/how-to-set-…
fastlane官方文件: docs.fastlane.tools/
六、縮寫釋義
ADC: Apple Developer Center
ITC: iTunes Connect