利用fastlane進(jìn)行項(xiàng)目的自動(dòng)化構(gòu)建

fastlane

在一個(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)建配置:

  1. 自動(dòng)化截圖
  2. 自動(dòng)創(chuàng)建TestFlight測試版發(fā)布項(xiàng)目
  3. 自動(dòng)創(chuàng)建Appstore發(fā)布項(xiàng)目
  4. 手動(dòng)設(shè)置自己需要任務(wù)的配置

第一次創(chuàng)建可以選擇第三項(xiàng),它會(huì)自動(dòng)檢測當(dāng)前項(xiàng)目的App NameApp bundleID并輸出在控制臺(tái),若信息有誤可以在確認(rèn)信息的時(shí)候選擇n然后去配置文件中手動(dòng)編輯。接著會(huì)詢問是否需要在ITUADC中創(chuàng)建項(xiàng)目,若選擇了y會(huì)生成類似下圖的目錄結(jié)構(gòu),其中AppfileFastfile這兩個(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存放的是你appbundleID以及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)行證書的傳遞,這種方式效率又低管理又不方便。

fastlanematch命令就提供了一套基于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è)matchfileFastfile同級,其中的內(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如圖:

image

完全不用自己手動(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

matchprovision profile下載到本地,sigh在打包之前確認(rèn)對應(yīng)使用的provision profile

用法如下:

sync_code_signing(type: "appstore", 
                  readonly: true, 
            app_identifier: AppID)

3.gym-編譯打包工具

action就是對應(yīng)的XcodeArchive操作

# 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替換為firimpgyer插件提供的上傳方法即可。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容