使用Fastlane對iOS項目持續交付(自動打包)

前言

??作為一名iOS app開發者,在我的工作過程中,基本遵循如下的一個流程:分析需求、UI設計——>設計功能架構——>著手開發——>打測試包——>修復bug、優化功能
  在所有這些工作中,項目打測試包對于一個開發人員來說,可以說是一項無腦又浪費時間的工作,很榮幸的是,我在公司負責iOS項目的打包。
  那么來看看打包的時間都浪費在哪了。來看下打包的流程:Archive項目——>勾選一堆選項及下一步,打包用途、app瘦身、證書——>導出ipa包——>打開蒲公英——>上傳ipa包——>填寫項目描述、安裝密碼——>發布測試包。如此這般下來,真的是被惡心吐了,手動的操作是一方面,另一方面,在進行編譯項目、導出ipa、上傳ipa這些操作時,則需要等待很長時間,只有等待上一步耗時操作完成,才能進行下一步,無疑很浪費時間。
  那么當然會有一種辦法,能為我們解決這個問題,因為懶才是科技進步的第一生產力。

Fastlane

??這里就要引入一個概念了,叫持續集成,引用下百度百科的介紹:

持續集成是一種軟件開發實踐,即團隊開發成員經常集成他們的工作,通常每個成員每天至少集成一次,也就意味著每天可能會發生多次集成。每次集成都通過自動化的構建(包括編譯,發布,自動化測試)來驗證,從而盡早地發現集成錯誤。

??而今天文章的主角就是Fastlane,一套ruby編寫的持續集成工具集。通過Fastlane可以實現自動打包、發布、截取app圖片等工作,而Fastlane可以執行通過ruby代碼或者Fastlane提供的一些工具編寫的腳本來實現這些工作。以下皆以打包發布到蒲公英為例,因為蒲公英為開發者提供了Fastlane的蒲公英插件,允許開發者通過Fastlane上傳ipa包到蒲公英,fir好像也提供了Fastlane的插件,具體沒去了解,如果有使用fir的,可以在回復中補充。

Fastlane

集成流程及使用方法

1、ruby

??因為Fastlane是ruby編寫的,所以我們首先保證電腦的ruby環境有正確安裝,打開終端,輸入如下命令來查看ruby版本。

 ruby -v
查看ruby版本

  這里保證ruby版本在2.0以上就好了。如果低于2.0,就需要升級ruby了,這里不提了,百度谷歌都有教程。

2、安裝Fastlane

??首先安裝Xcode命令行工具,因為編譯、打包等操作,雖然是Fastlane幫我們做的,但本質上還是通過Xcode中的構建工具來完成的。在終端中運行如下命令,則會安裝Xcode命令行工具:

xcode-select --install

??然后安裝Fastlane:

sudo gem install fastlane --verbose

??如果發現最后報了這樣的錯誤:

ERROR:  While executing gem ... (TypeError)
    no implicit conversion of nil into String

??則更新gem版本,然后再次安裝Fastlane:

sudo gem update --system

??如果報錯:

ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /usr/bin directory.

??則嘗試使用如下命令進行安裝:

sudo gem install -n /usr/local/bin fastlane

??如果還安裝失敗。。。去官網看看別的安裝方法吧:Getting started with fastlane for iOS
??為了檢查Fastlane是否成功安裝,可以通過下面的命令來查看Fastlane版本號:

fastlane --version

3、為項目初始化Fastlane

??如果Fastlane正確安裝了,就可以為我們的項目初始化Fastlane了,首先通過終端,CD到項目目錄,也就是項目的.xcodeproj文件所在位置。然后執行Fastlane初始化命令:

fastlane init

??這里如果一直卡在bundle update,那應該就是被墻了,這時候來到項目目錄下,找到Gemfile,打開Gemfile將里面的內容修改為如下:

#source "https://rubygems.org"
source "https://ruby.taobao.org"

gem "fastlane"

??重開終端,運行bundle update就好了。
??然后安裝蒲公英插件,安裝后有個y/n的選擇,選擇y:

fastlane add_plugin pgyer

??初始化結束后,會提示選擇Fastlane的用途,一共是四個選項,我選了最后一個,自定義,然后打開項目目錄,會發現多了一個fastlane文件夾:


fastlane文件夾

  打開文件夾中的Fastfile,里面則是執行自動化打包任務的代碼,這里我是用sublime打開的,在sublime的菜單中,找到View——>Syntax中選擇ruby,即可高亮代碼:


Fastfile里的內容

4、創建一個lane

??Fastlane以lane為單位,去執行一個自動化任務,Fastfile中的代碼如下:

default_platform(:ios)

platform :ios do
  desc "Description of what the lane does"
  lane :custom_lane do
    # add actions here: https://docs.fastlane.tools/actions
  end
end

??lane:custom_lane,代表了一個叫custom_lane的任務,后面的do,則表示需要執行的操作。這里就不講怎么寫代碼了(因為我也不會ruby啊!現用現找就好了),我把我項目中的Fastfile貼上來,講解下Fastfile做了哪些事(見代碼中的注釋):

platform :ios do     #指定持續集成對象的平臺名稱
lane :dev do|options|      #給lane命名
branch = options[:branch]


#這里我們項目為了區分線上環境和測試環境,而做了兩個target
#關于target區分環境的方法,可以參考我同事的簡書文章http://www.lxweimin.com/p/23cc84d40423
#下面代碼通過在終端輸入1或者其他數字來選擇要打包的target
#puts是ruby中的輸出,gets為獲取終端中輸入的文字,gets需要指定STDIN包中的gets方法,否則會識別為其他包中的gets方法,具體為什么我也不知道
puts "請選擇要打的scheme:(1:項目Target1,else: 項目Target2)"      
scheme = STDIN.gets
#  通過判斷輸入內容,來區分一些打包信息,1后面加\n是因為在終端輸入1再敲回車的時候scheme就包含了回車的內容,所以scheme == "1\n"
if scheme == "1\n" 
#項目中target的名稱,以QQ為例,如果我的target叫QQ,則下面填寫QQ,如果是wechat,就填wechat
  schemeName = "項目Target1"
#打包的用途,也就是app-store, package, ad-hoc, enterprise, development這幾個中的一個,這里我們項目的target1用的是公司帳號,打的是開發包
  export_method = "development"      
 else
  schemeName = "項目Target2"
#這里我們項目的target2用的是企業帳號,打的是企業包
  export_method = "enterprise"      
end

#從蒲公英平臺拿到的api_key和user_key,下面我會講怎么拿到這兩個key,存在下面兩個變量中
api_key = "xxxxxxxxxxxxxxxxxxx"
user_key = "xxxxxxxxxxxxxxxxxxx"



#輸入蒲公英上傳ipa包后輸入的版本描述信息
puts "請輸入版本描述:"
desc = STDIN.gets



puts "開始打包 #{schemeName}"
# 開始打包
gym(
#指定scheme的名字
scheme: "#{schemeName}",
#輸出的ipa名稱
output_name:"#{schemeName}",
# 是否清空以前的編譯信息 true:是
clean:true,
# 指定打包方式,Release 或者 Debug
configuration:"Release",
# 指定打包所使用的輸出方式,目前支持app-store, package, ad-hoc, enterprise, development
export_method:"#{export_method}",
# 指定輸出文件夾,這里會保存我們最后生成的ipa文件,也就是存到了我們上面提到的fastlane文件夾中的build文件夾中
output_directory:"./fastlane/build",
)

puts "開始上傳到蒲公英"
#開始上傳ipa到蒲公英,這里用的是蒲公英提供的插件
#update_description代表更新信息,password代表安裝密碼
pgyer(update_description: "#{desc}", api_key: "#{api_key}", user_key: "#{user_key}", password: "1111", install_type: "2")



#在上傳完ipa后,打開ipa的存放文件夾,起到提示上傳完成的作用
system "open ../fastlane/build"

end
end

??如上代碼,從頭到尾讀下來,其實就是一個很簡單的輸入變量——>定義幾個變量——>調用一個名為gym的打包方法,將定義的變量作為參數傳進去——>調用一個名為pgyer的方法上傳ipa,將前面定義好的變量作為參數傳進去
??至于蒲公英的api_key和user_key,可以在蒲公英官網的我的應用——>之前發布的應用——>API中找到:

api_key和user_key

4、執行腳本

??cd到項目目錄,輸入如下命令來執行我們自己定義的lane,格式如下fastlane+腳本第一行中的platform名+腳本第二行中的lane名

fastlane ios dev

??可以發現Fastlane開始執行任務了,并且符合我們的代碼邏輯:


符合我們的代碼邏輯

??同時可以看到Fastlane在編譯我們的文件,這里執行的是gym方法:


編譯文件

??最后會生成dSYM文件以及ipa:
打包結果

??接下來會繼續上傳ipa到蒲公英:


上傳到蒲公英

  可以看出,gym打包用時275秒,pgyer上傳到蒲公英是58秒,用時一共是5分半,速度是非常快的,而且不需要人為的去進行各種操作。最后打開蒲公英就會發現我們的app已經上傳上去了,而且設置好了下載密碼、版本信息等。

?

一些問題匯總

如果在打包的時候提示如下錯誤,找不到Scheme:



  那么找到xcode的Manage Schemes,然后將你要打包的target的shared勾選上,再打包就可以了:


?

總結與思考

??以上就實現了我們的自動化打包并上傳到蒲公英的功能,可以說是非常方便省時的了,雖然還是需要五分半的時間,但相比之前的各種復雜操作、各種等待,已經是質的飛躍了。
  而Fastlane能做的并不僅限于這些工作,參考Fastlane官方文檔,可以發現很多其他功能:Fastlane文檔,比如自動發布到AppStore,自動上傳app截圖到itunes connect等等,這些功能我暫時還用不上(上線的時候還是要自己把關下,手動好一些,并且上線也不是經常性的),大家可以根據自己的需求找一些資料來嘗試下,本篇文章的主旨還是滿足大家的最基本的需求,也建立在我個人的真實使用場景下。
  另外,由于Fastlane采用ruby編寫,則Fastlane的一個lane任務可以做的定制化,就不止我編寫的那些簡單內容了,當然我也只是為了滿足我個人的需求,所以做了很簡單定制,如果有對ruby感興趣的同學或精通ruby的大神,完全可以對lane任務做更好的定制,比如上傳完后彈出系統提示框,通知我們上傳完成等更便利的功能(上面腳本中已經補充了這一功能)。
  參考文章:
  使用 Fastlane 上傳 App 到蒲公英
  Getting started with fastlane for iOS
  使用 fastlane 實現對 iOS Multi-Target 的一鍵打包部署
  iOS自動化打包發布(Jenkins + Fastlane + GitLab + 蒲公英)
  Ruby 教程

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容