Fastlane + Bugly自動化部署測試包

jouryck發表於2017-03-10

對一個iOS開發者而言,當你專心利用一個週期快速開發了一個版本時,在上線之前總是面臨不斷對內或對外發布測試版本需求。而這個過程中,應用釋出和證書管理基本上都是最令人頭疼的問題,好在證書的問題已經在XCode 8.0中得到充分自動化管理,基本不需要額外接入。而打包則無法避免的要走向如下重複的流程:

  • 修改測試版本號
  • 修改Build版本號
  • 執行Archive
  • 選擇Adhoc匯出IPA安裝包檔案
  • 上傳Bugly測試平臺
  • 分享測試連結二維碼

如上流程是極為繁瑣枯燥且毫無技術含量可言,而當一個小的需求發生變化甚至是一處小的文案的修改,你都要按照如上再次重新Rebuild. 簡直是扼殺工程師的寶貴時間. 如果你跟我一樣飽受部署的痛苦,我想Fastlane也許是你的救星.


FastLane

初次邂逅Fastlane是其去年5月份,當我看到完全有一個工具能夠完全自動化這個流程,異常的興奮。

Fastlane + Bugly自動化部署測試包


Fastlane本身包含兩大模組,一個是其核心部分,另外一個就是Action了。Action是Fastlane自動化流程中的最小執行單元,直觀上來講就是Fastfile指令碼中的一個個命令,比如:git_pull,deliver,pod_install等等,而這些命令背後都對應其實是一個用Ruby編寫的指令碼。

Fastlane 是一套用 Ruby 編寫的 iOS 命令列工具集(後來也支援了 Android),主要元件包括:

  • match / cert / sigh 協助管理程式碼簽名
  • pem 自動生成 APNs 證書
  • scan 自動化測試
  • gym 自動化編譯並打包生成簽名的 .ipa 檔案
  • snapshot / frameit 協助處理 iOS 螢幕快照
  • pilot 上傳和管理 TestFlight
  • deliver 將應用及其它資訊上傳到 App Store

而正是這些顆粒度極小的Action,根據自己需求組合成一個自動化的鏈條。我猜想,Fastlane的作者們在專案的早期甚至規劃的階段,應該就考慮到了這一點:在實際開發中,自動化的業務場景太多,每個團隊可能都有自己的獨特需求,單靠一兩個人的力量是無法滿足的,所以如何將涉及到實際業務的功能開發,用優雅的方式交給開源社群中龐大工程師們來維護,成為Fastlane架構中需要重點考慮的內容。所以你可以看到官方Actions文件中包含大約170多個Action,這些Action大部分來自開源社群貢獻。


安裝

首先確保Xcode命令列工具是最新版本的:

xcode-select --install複製程式碼

安裝Fastlane:

sudo gem install fastlane -NV複製程式碼

找到工程檔案目錄下執行:

fastlane init複製程式碼

在執行“Your Apple ID" 這一步輸入蘋果開發者賬號,fastlane 會自動獲取工程檔名,目錄等其他資料。這一步“Please confirm the above values”,確認資訊,沒問題則輸入 y。然後,fastlane 會進行一系列的初始化操作,包括下載 App Store 上的後設資料和截圖檔案。等待初始化完成之後,工程目錄下就多了一個 fastlane目錄:

$ cd fastlane && ls
Appfile            Fastfile           metadata           report.xml
Deliverfile        README.md          screenshots複製程式碼

檔案目錄:

  • metadata目錄下存放整個後設資料檔案,包括關鍵詞、版本更新日誌、圖示等.
  • screenshots目錄下存放應用截圖
  • Appfile檔案記錄App的 bundle ID、Apple ID、Team ID三種資訊.
  • Fastfile指令碼的核心執行檔案.有幾個預設的選項,可直接使用.
  • report檔案時每次執行fastlane時生成報告.

安裝fastlane成功後,首先拆解我們需要自動化的兩個流程:

  • 自動打包成Adhoc的安裝包ipa檔案
  • 通過fastlane自動上傳到bugly

很多肯定問為什麼不合併成一步,其實完全是可以的,只是上傳bugly需要額外單獨設定對應版本一些描述資訊。我為了方便自己控制,拆分成了兩步.


自動化打包

自動化打包使用最多就是Fastlane中gym這個Action, 轉為打包而生, 安裝gym這個元件:

sudo gem install gym複製程式碼

cd專案根目錄, 建立自動打包指令碼:

vim gym.sh複製程式碼

輸入指令碼內容:

#!/bin/bash
#計時
SECONDS=0複製程式碼#假設指令碼放置在與專案相同的路徑下複製程式碼project_path=$(pwd)複製程式碼#取當前時間字串新增到檔案結尾複製程式碼now=$(date +"%Y_%m_%d_%H_%M_%S")複製程式碼#指定專案的scheme名稱
scheme="Xitu"複製程式碼#指定要打包的配置名
configuration="Adhoc"複製程式碼#指定打包所使用的輸出方式,目前支援app-store, package, ad-hoc, enterprise, development, 和developer-id,即xcodebuild的method引數複製程式碼export_method='ad-hoc'複製程式碼#指定專案地址
workspace_path="$project_path/Xitu.xcworkspace"複製程式碼#指定輸出路徑
output_path="project_path/APP"複製程式碼#指定輸出歸檔檔案地址
archive_path="$output_path/Xitu${now}.xcarchive"複製程式碼#指定輸出ipa地址
ipa_path="$output_path/Xitu${now}.ipa"複製程式碼#指定輸出ipa名稱
ipa_name="Xitu${now}.ipa"複製程式碼#獲取執行命令時的commit message
commit_msg="$1"複製程式碼#輸出設定的變數值
echo "===workspace path: ${workspace_path}==="
echo "===archive path: ${archive_path}==="
echo "===ipa path: ${ipa_path}==="
echo "===export method: ${export_method}==="
echo "===commit msg: $1==="複製程式碼#先清空前一次build
gym --workspace ${workspace_path} --scheme ${scheme} --clean --configuration ${configuration} --archive_path ${archive_path} --export_method ${export_method} --output_directory ${output_path} --output_name ${ipa_name}

#輸出總用時
echo "===Finished. Total time: ${SECONDS}s==="
複製程式碼

把如上指令碼中Xitu改成你的專案名稱即可. 為指令碼執行提升許可權:

chmod +x gym.sh複製程式碼

執行一下指令碼看一下打包效果:

./gym.sh複製程式碼

執行結果:

Fastlane + Bugly自動化部署測試包

經過572s,Adhoc版本的ipa檔案打包成功,我們在專案根目錄下找到App目錄:

Fastlane + Bugly自動化部署測試包

會發現如上三個檔案. ok.至此自動化打包ipa檔案流程完成. 關於gym這個action呼叫強烈推薦看一下官方文件的呼叫引數,對你除錯過程會非常有幫助.


上傳Bugly

為什麼選擇Bugly呢?其實原因很簡單,他能夠把崩潰發生時頁面訪問路徑和崩潰堆疊資訊自動根據符號表翻譯可以讀懂呼叫程式碼路徑. 在定位異常上更為直觀,而最關鍵的是Bugly官方在外掛版本是支援fastlane的,可以看這個文件.

官方文件提供了兩個比較重要的擴充套件一個是上傳檔案和更新外掛. 首先下載兩個外掛,而如何在fastlane中呼叫者兩個外掛呢?我們知道針對官方定義action, 直接通過fastfile檔案就修改即可,那如何在fastlane中定義自己的action?

步驟很簡單,首先執行:

fastlane new_action複製程式碼

這時命令列會要求你輸入自定義action名字,直接以bugly上傳檔案命名:

upload_app_to_bugly複製程式碼

然後Fastlane會在當前目錄的建立一個名為actions資料夾, 這個資料夾下預設也會建立一個名為upload_app_to_bugly.rb的ruby檔案。而我們要做就是把剛才下載上傳外掛檔案在這個檔案進行替換即可.

自定義action成功,改如何呼叫呢?這是就需要回到fastfile這個檔案了。這個檔案基本是整個fastlane的核心,我在除錯過程花了很多時間浪費它的規則和除錯錯誤解決上。那根據Bugly文件定義在fastfile檔案新增如下程式碼:

Fastlane + Bugly自動化部署測試包

而當你點選api說明你發現這個你根本打不開這個頁面。這樣會導致你根本不知道fastlane這些引數每個引數應該傳什麼值。不過沒關係,經過一番折騰,還是在google上找到關於這篇文件的網頁快照,而快照其實就是上個月20號左右的(可能因為最近控制第三方app在國內內測平臺分發需要身份認證,Tencent繼續這個角度考慮,把介面文件從官方網頁入口隱藏了):

Fastlane + Bugly自動化部署測試包

繼續在快照找到這個上傳介面文件的引數說明:

Fastlane + Bugly自動化部署測試包

as you see. 我們還是弄到fastlane每個引數意義, 這是基於如上參數列修改後的:

Fastlane + Bugly自動化部署測試包

這裡需要額外說明引數就是filepath,這個引數在fastlane定義中一般指向ipa所在的資料夾,後來我除錯過程發現不是,必須是相對於當前工程目錄一個ipa檔案絕對路徑.

ok.到這裡,上傳fastlane自定義已經ok了,讓我們測試一下,let's do it:

fastlane upload複製程式碼

執行結果:

Fastlane + Bugly自動化部署測試包

上傳成功. 登入bugly後臺看一下內測分發:

Fastlane + Bugly自動化部署測試包

上傳成功. 掃二維碼測試安裝,一切正常。同理關於更新外掛流程基本類似這裡就不在贅述了。


小結

如上基於bugly自動打包整個流程,我故意拆分成兩步,目的是方便自己控制,當然你也可以改造成一步自動打包上傳,fastlane本身在fastfile檔案中也是支援呼叫shellscript指令碼的,呼叫很簡單,參考官方文件即可.

well,這個自動化流程基本一開始就不需要你來管了,非常方便.

相關文章