
在一個(gè)iOS項(xiàng)目進(jìn)行到了測試和發(fā)布階段,一般都會(huì)經(jīng)歷一次又一次的打包-截圖-上傳及metadata填寫及修改的過程。這點(diǎn)做服務(wù)器開發(fā)的同學(xué)就要比我們幸福太多了,因?yàn)檫@一部分的工作他們可以交付給運(yùn)維同學(xué)來完成。那我們就只能自己手動(dòng)去做這些重復(fù)且耗時(shí)的操作了么?答案并不是,fastlane就給我們提供了一整套工具來幫助我們實(shí)現(xiàn)自動(dòng)化。
一、Fastlane簡介及配置安裝
1.簡介
fastlane是一套基于ruby開發(fā)的自動(dòng)化構(gòu)建工具,為項(xiàng)目的發(fā)布流程提供一整套解決方案。
2.安裝
2.1 確保安裝了最新版的Xcode command line tools
對使用Xcode進(jìn)行開發(fā)的iOS開發(fā)者是標(biāo)配,若發(fā)現(xiàn)提示沒有安裝的話嘗試使用以下命令安裝
xcode-select --install
2.2 選擇安裝方式
安裝方式一共有三種:
| homebrew | installer script | RubyGem |
|---|---|---|
| brew cask install fastlane | 下載安裝包,運(yùn)行安裝腳本 | sudo gem install fastlane -NV |
筆者項(xiàng)目中都使用到了cocoapods本地有Ruby環(huán)境,因此選擇了第三種安裝方案
2.3 安裝bundler
若你的ruby環(huán)境中沒有安裝bundler,執(zhí)行以下命令安裝bundler
sudo gem install bundler
3.配置
進(jìn)入項(xiàng)目的根目錄中
3.1 初始化
fastlane init
初始化的過程中會(huì)詢問您的APPID和密碼,請放心它只會(huì)把密碼信息存在本地的keychain中,并不會(huì)傳到云端服務(wù)器。
初始化的過程中會(huì)有四個(gè)選項(xiàng),分別是為四種不同的任務(wù)創(chuàng)建配置:
- 自動(dòng)化截圖
- 自動(dòng)創(chuàng)建
TestFlight測試版發(fā)布項(xiàng)目 - 自動(dòng)創(chuàng)建
Appstore發(fā)布項(xiàng)目 - 手動(dòng)設(shè)置自己需要任務(wù)的配置
第一次創(chuàng)建可以選擇第三項(xiàng),它會(huì)自動(dòng)檢測當(dāng)前項(xiàng)目的App Name和App bundleID并輸出在控制臺(tái),若信息有誤可以在確認(rèn)信息的時(shí)候選擇n然后去配置文件中手動(dòng)編輯。接著會(huì)詢問是否需要在ITU和ADC中創(chuàng)建項(xiàng)目,若選擇了y會(huì)生成類似下圖的目錄結(jié)構(gòu),其中Appfile和Fastfile這兩個(gè)核心文件必然會(huì)被創(chuàng)建。
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提供的對應(yīng)功能的命令來生成配置文件。
筆者已經(jīng)習(xí)慣了自己手動(dòng)去設(shè)置相關(guān)的配置文件,一般都直接使用第四種方式創(chuàng)建任務(wù)。
3.2 使用Gemfile管理fastlane的版本和依賴
同cocoapods一樣,fastlane也可以使用Gemfile來管理對應(yīng)的版本和依賴。
在執(zhí)行init操作的時(shí)候會(huì)自動(dòng)生成一個(gè)Gemfile內(nèi)容如下:
source "https://rubygems.org"
gem "fastlane"
可以直接在此處指定fastlane的版本信息。
致辭我們的初始化操作就完成了。
二、Fastlane的理念及組件
在上一步初始化的操作中,生成了兩個(gè)核心文件Appfile以及Fastfile,其中Appfile存放的是你app的bundleID以及appID。
Fastfile是我們實(shí)際的自動(dòng)化流程操作實(shí)現(xiàn)文件,我們會(huì)將相關(guān)動(dòng)作在其中實(shí)現(xiàn)。
1.理念
在Fastlane有兩個(gè)重要的概念:
- action: 每一個(gè)動(dòng)作就是action,對應(yīng)一條命令。
- lane: 某個(gè)操作流程,比如發(fā)布
appstore的包的一系列action集合是一個(gè)lane,發(fā)布adhoc包又是一個(gè)lane
當(dāng)運(yùn)行fastlane命令行工具的時(shí)候會(huì)讀取fastlane目錄下的Fastfile文件,執(zhí)行相應(yīng)lane中的action操作
一個(gè)簡單的流程:
lane :dependence_manager do
# 執(zhí)行cocoapods屬于一個(gè)action
cocoapods
# 執(zhí)行carthage屬于一個(gè)action
carthage
end
2.組件
fastlane提供了一套工具集,涵蓋了發(fā)布流程大多數(shù)可能會(huì)使用到的操作,主要包括幾個(gè)大類:
- 測試:
scan-自動(dòng)生成測試工具,并可以生成HTML報(bào)告 - 構(gòu)建:
gym-項(xiàng)目打包工具、cocoapod-執(zhí)行pod install操作 - 截圖:
snapshot-截圖工具(需要編寫UI測試)、framekit-生成帶邊框的截圖 - 項(xiàng)目:
increment_build_number:增加項(xiàng)目構(gòu)建次數(shù) - 簽名:
match-同步簽名信息和項(xiàng)目provision profile、cert-同步ADC中的證書信息、register_device-向ADC中添加新的設(shè)備 - 文檔:
appledoc-根據(jù)源碼生成Apple風(fēng)格的代碼文檔 - Beta:
testflight-將項(xiàng)目發(fā)布至testflight - 推送:
pem-獲取推送證書 - 發(fā)布:
deliver-將項(xiàng)目發(fā)布至appstore等 - 版本控制:
git pull-這就不用解釋了 - 通知:
Slack-將打包信息告知你的開發(fā)組
fastlane提供的工具非常之多,以上只列舉了部分常用的組件,想了解更多請?jiān)L問Fastlane Actions文檔
3.第三方插件
fastlane內(nèi)部提供了足夠多的工具,同時(shí)也支持第三方的插件接入。可以使用
fastlane search_plugins
命令來查看所有可用第三方插件。
這里介紹兩個(gè)最常用的插件:
- firim: 將測試包發(fā)布到
firim
fastlane add_plugin firim
- pgyer: 將測試包發(fā)布到蒲公英
fastlane add_plugin pgyer
三、Fastlane實(shí)踐之旅
由于fastlane提供的組件相當(dāng)之多,項(xiàng)目實(shí)踐中并不一定都能用上。比如snapshot截圖工具,由于公司的宣傳頁面都是使用的UI切圖,筆者也一直沒有具體實(shí)踐的機(jī)會(huì)。這一部分只能介紹下筆者在項(xiàng)目中實(shí)際用過的組件,要是您想要了解的部分并沒有被提及,fastlane提供了十分詳細(xì)的文檔可以參考。
1.match-同步證書及provision profile利器
在多人開發(fā)的iOS項(xiàng)目中,大部分新手應(yīng)該都鬧出過刪證書的笑話,尤其是一些小公司用的個(gè)人開發(fā)者賬號去開發(fā)公司項(xiàng)目,成員之間就需要依靠證書的P12文件來進(jìn)行證書的傳遞,這種方式效率又低管理又不方便。
fastlane的match命令就提供了一套基于git的證書和provision profile管理方案。通過match生成的證書和provision profile將會(huì)同步到一個(gè)你指定的git地址,需要的成員通過match去下拉項(xiàng)目需要的證書到本地,match會(huì)自己負(fù)責(zé)和ADC證書及provision profile的同步操作。
1.1 match初始化
通過命令
match init
會(huì)讓你輸入一個(gè)git地址,這個(gè)地址就是證書的存放位置,同時(shí)會(huì)在項(xiàng)目中的fastlane中創(chuàng)建一個(gè)matchfile與Fastfile同級,其中的內(nèi)容就是此git地址
1.2 生成證書和provision profile
# 生成appstore發(fā)布證書及provision profile
fastlane match appstore
# 生成adhoc發(fā)布證書及provision profile
fastlane match adhoc
# 生成調(diào)試證書
fastlane match development
這一步match會(huì)檢測ADC中是否有需要的證書和provision profile要是有就直接下載到本地,要是沒有就直接在ADC中創(chuàng)建
match自動(dòng)創(chuàng)建的provision profile如圖:

完全不用自己手動(dòng)在ADC中創(chuàng)建了是不是非常方面
1.3 在Xcode中配置證書和provision profile
到了這一步其實(shí)就和手動(dòng)創(chuàng)建配置證書一樣了,就不再贅述。
1.4 在Fastlanefile中配置證書操作的lane
貼上在項(xiàng)目中的實(shí)際配置
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
以上配置完成之后,團(tuán)隊(duì)新加入成員或者更換了設(shè)備后只要執(zhí)行
fastlane config
命令即可同步整套開發(fā)發(fā)布環(huán)境,相當(dāng)方便。
2.sigh-選擇正確的provision profile
match將provision profile下載到本地,sigh在打包之前確認(rèn)對應(yīng)使用的provision profile
用法如下:
sync_code_signing(type: "appstore",
readonly: true,
app_identifier: AppID)
3.gym-編譯打包工具
此action就是對應(yīng)的Xcode的Archive操作
# gym是build_app命令的一個(gè)別名
build_app(workspace: "xxxxxx.xcworkspace",
scheme: "xxxxxxxx",
configuration: "release",
# 輸出.ipa文件的路徑
output_directory: "./Package/AppStore",
export_method: "app-store")
4.deliver-發(fā)布工具
在fastlane init的時(shí)候若是沒有允許fastlane自動(dòng)同步項(xiàng)目在ADC中的metadata。可以使用
fastlane deliver init
來創(chuàng)建ADC中需要的metadata文件,會(huì)在項(xiàng)目中的fastlane目錄下創(chuàng)建metadata文件夾以及Deliverfile文件。
若是ADC中已經(jīng)存在了metadata信息,則可以使用
fastlane deliver download_metadata
來同步ADC上的metadata信息。
注意:若是ADC中存在已經(jīng)編輯好的metadata沒有同步到本地,則deliver上去的metadata會(huì)覆蓋原有的metadata
實(shí)際在Fastfile中的用法很簡單就一行代碼:
# deliver是upload_to_app_store的一個(gè)別名兩個(gè)方法用法一致
upload_to_app_store
5.完整發(fā)布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
只要在命令行執(zhí)行
fastlane release
即可完全自動(dòng)化發(fā)布的流程,極大的節(jié)省了開發(fā)者的時(shí)間。
6.發(fā)布到firim或蒲公英
將upload_to_app_store替換為firim或pgyer插件提供的上傳方法即可。
firim(firim_api_token:"xxxxxxxxxxxxxxxxxx")
四、總結(jié)
fastlane是一套及其強(qiáng)大的自動(dòng)化構(gòu)建工具,善用action可以定制很多個(gè)性化操作,筆者只是拋磚引玉提供了一套滿足最基本發(fā)布需求的方案。如果您有更好的方案,歡迎郵件交流。
由于筆者所在公司并沒有專門的iOS打包機(jī),很遺憾沒有實(shí)踐fastlane+jekins的機(jī)會(huì)。但身為軟件開發(fā)工程師尋找更"輕松"的工作方式應(yīng)該是我們一直以來的追求,筆者在今后的工作中也會(huì)持續(xù)在這個(gè)方向發(fā)力。
五、參考文獻(xiàn)
小團(tuán)隊(duì)的自動(dòng)化發(fā)布: https://whlsxl.github.io/index.html
How to Set Up Fastlane: https://blog.metova.com/how-to-set-up-fastlane
fastlane官方文檔: https://docs.fastlane.tools/
六、縮寫釋義
ADC: Apple Developer Center
ITC: iTunes Connect