iOS 開發(fā)者快速入門 fastlane

通俗來講,fastlane 是用于 App 自動(dòng)化測(cè)試、打包、發(fā)布的工具,向上一層的抽象概念是我們常聽到的持續(xù)集成 CI (Continuous Integration) /CD (Continuous Delivery) . 當(dāng)前市場上,App 端實(shí)現(xiàn) CI/CD 比較成熟的兩種方式是 Jenkins 和 fastlane. 兩者都是跨平臺(tái)使用,既可以用在 Android ,也可以使用 fastlane 。 Jenkins 基于 java 語言編寫,具有一定的可視化界面。fastlane 基于 Ruby 語言,全部為命令行操作。個(gè)人認(rèn)為命令行的方式,更能彰顯程序猿的身份,所以選擇了 fastlane 來實(shí)現(xiàn) iOS 端的 CI/CD.

fastlane 的官方文檔 https://docs.fastlane.tools/ 中,詳細(xì)介紹了 fastlane 的安裝、配置和使用,但是由于英文文檔的語言差異,閱讀過后在實(shí)踐中,有一些小細(xì)節(jié)需要特別注意,下面就自己在實(shí)際操作中遇到的困難,詳細(xì)記錄一下使用方式。

1 初始化

fastlane 安裝后,需要 cd 到工程所在的目錄,執(zhí)行 fastlane init 命令,然后輸入 4 選擇 Manual setup,然后 2 次回車。如果安裝成功,能在工程目錄的同一級(jí)下,看到新生成的 fastlane 文件夾和 Gemfile 文件:

fastlane 初始化

各個(gè)文件的用途:

Gemfile -----顯示本工程 fastlane 安裝的插件和依賴包;
Gemfile.lock --- 記錄 gem  的版本和倉庫信息;
Appfile ---- 配置 App 的 bundle ID 、version、profile 文件等,以及 AppleID 賬號(hào)相關(guān)等信息;
Fastfile ---- 配置 fastlane 的各種 Action , 本工程使用的 fastlane 命令都在此處配置;

Gemfile 和 Gemfile.lock 兩個(gè)文件的理解,可以參照 cocoapods 的設(shè)置,Gemfile 類別 podfile , 定義了 gem 需要依賴的庫文件;Gemfile.lock 類比 podfile.lock, 定義了 pod 的版本。當(dāng)本地工程的 fastlane 依賴其他插件時(shí),修改 Gemfile 文件,然后運(yùn)行 bundle update 命令,即可更新本地 fastlane 。

2 文件含義

fastlane 運(yùn)行的命令都在 Fastfile 文件中定義, 比如對(duì)工程 testFastlane 定義如下命令:

default_platform(:ios)

platform :ios do
  
  desc "Use test"
  lane :test do   
     scan(
         scheme: testFastlane
         output_directory: "fastlane/tests",
         clean: true
         )
  end 
end

然后在本地目錄下,運(yùn)行命令 fastlane test, 就能對(duì) scheme -> testFastlane 進(jìn)行測(cè)試。注:工程中的 scheme 需要設(shè)置為 shared

3 工具 dotenv

使用 gem 工具 dotenv ,可以為 fastlane 指定環(huán)境變量。

打開 Gemfile 文件,能夠看到 fastlane 默認(rèn)的 gem 源為 https://rubygems.org , 該網(wǎng)站在國內(nèi)訪問不太穩(wěn)定,通常需要更改為國內(nèi)的鏡像網(wǎng)站 https://gems.ruby-china.com/ 。保存后,使用命令 gem install dotenv 命令安裝。

本工程安裝了 dotenv 后,默認(rèn)會(huì)自動(dòng)加載 fastlane 目錄下的 .env 或者 .env.defalut 文件。在 fastlane 目錄下,輸入命令touch .env新建文件,在文件中添加如下內(nèi)容:

XCODE_SCHEME = testFastlane
XCODE_CLEAN = true
EXPORT_OUTPUT_DIRECTORY = fastlane/tests

在 fastfile 文件中就可以使用,以上定義的環(huán)境變量。比如,對(duì)上面的 lane :test 進(jìn)行改造:

default_platform(:ios)

platform :ios do
  
  desc "Use test"
  lane :test do   
     scan(
         scheme: ENV['XCODE_SCHEME'],
         output_directory: ENV['EXPORT_OUTPUT_DIRECTORY'],
         clean: ENV['XCODE_CLEAN']
         )
  end 
end

切換到 fastlane 文件夾所在的上層目錄,使用命令 fastlane test,運(yùn)行結(jié)果通過。在 iOS 打不同包時(shí),如果想要新建多個(gè)環(huán)境,可以在 fastlane 目錄下,新建多個(gè)名稱為 .env.xxx 的環(huán)境文件。然后通過為 fastlane 命令加參數(shù)的方式 fastlane lane命令 --env xxx就能切換到需要的環(huán)境。

4 插件

fastlane 功能十分完善,其實(shí)現(xiàn)方式采用了元命令+插件的方式。其中 build 、test、build_ios_app 等都屬于元命令。其他命令,比如自動(dòng)增加版本號(hào)、增加 build 值等,通過插件來添加。fastlane 可以使用的插件,參考https://docs.fastlane.tools/plugins/available-plugins。安裝后, 會(huì)在工程的 Gemfile 文件中記錄。通過 bundle update 可以更新安裝的插件。

以上是我在 fastlane 使用中遇到的坑,尤其是運(yùn)行命令時(shí),需要注意所在的路徑?,F(xiàn)在想來,和 pod 使用時(shí)一樣,只有在 podfile 所在的目錄下,才可以執(zhí)行 install 命令,而 pod 和 fastlane 都是基于 ruby 的工具。所以,如果其他基于 ruby 的工具,應(yīng)該都需要注意路徑的問題。

最后附上自己工程對(duì) fastlane 的配置文件:

fastlane_version "2.126.0"

default_platform(:ios)

platform :ios do

  lane :lint do 
     swiftlint(
         reporter: "html",
         output_file: "fastlane/swiftlint.html",
      ignore_exit_status: true 
         )
  end    

  lane :test do 
  
     scan(
         scheme: ENV['XCODE_SCHEME'], 
         output_directory: "fastlane/tests",
         clean: true
         )
  end 
 lane :build do 

     # cocoapods(
     #      clean: true,
     #      podfile: "Podfile"
     #    )
     # incerment the build number 
     increment_build_number(
         build_number: ENV['CI_JOBENV_ID'],
         xcodeproj: ENV['XCODE_PROJECT']
         )

     # BUILD 
     gym(
         scheme: ENV['XCODE_SCHEME'],
         configuration: ENV['DEVELOP_CONFIGURATION'],
         export_method: ENV['DEVELOP_EXPORT_METHOD'],
     output_directory: "fastlane/build",
         #export_xargs: ENV['DEVELOP_XARGS'],
         silent: true, 
         clean: true,
         #codesigning_identity: "iPhone Developer: Miao Wang (7298FM259A)",
         # export_options: {
        #   method: ENV['EXPORT_METHOD'],
        #      # provisioningProfiles: { 
        #      #            "com.jujinyufu.test" => "com.jujinyufu.test"
        #      #        }
         #  }
         )

  end 
  desc "Archive iOS app" # use with --env for env setting   
  # desc "****3) #{ENV['EXPORT_METHOD']}"
  lane :archive_app do  
    #increment_build_number_in_plist
    build_ios_app(
      workspace: ENV['XCODE_WORKSPACE'],
      configuration: ENV['DEVELOP_CONFIGURATION'],
      scheme: ENV['XCODE_SCHEME'],
      silent: ENV['XCODE_SILENT'],
      clean: ENV['XCODE_CLEAN'],
      output_directory: ENV['EXPORT_OUTPUT_DIRECTORY'], # Destination directory. Defaults to current directory.
      output_name: ENV['EXPORT_OUTPUT_NAME'],       # specify the name of the .ipa file to generate (including file extension)          
      export_options: {
        method: ENV['EXPORT_METHOD'],
        # method: "enterprise",
        # provisioningProfiles: { 
        #   "com.example.bundleid" => "Provisioning Profile Name",
        #   "com.example.bundleid2" => "Provisioning Profile Name 2"
        # }
      }
    )
  end   

  lane :increment_number do
    increment_build_number_in_plist(
      xcodeproj: ENV['XCODE_PROJECT'],
      scheme: ENV['XCODE_SCHEME'],
      build_configuration_name: ENV['DEVELOP_CONFIGURATION'],
    )
  end

  lane :deployFirim do
    firim(firim_api_token: "your firim token")
  end
  desc "Notification" # use with --env for env setting
  lane :notificationMac do |options|
    notification(   
        subtitle: "Finished Building",  
        message: options[:message], 
    )   
  end     
end

還有 env.default 的環(huán)境變量:

XCODE_WORKSPACE = testFastlane.xcworkspace
XCODE_PROJECT = testFastlane.xcodeproj
XCODE_SCHEME = testFastlane
XCODE_CLEAN = true
XCODE_SILENT = true
DEVELOP_CONFIGURATION = Release
DEVELOP_EXPORT_METHOD = development
EXPORT_METHOD = enterprise
EXPORT_ARCHIEVE_PATH = fastlane/archieve
EXPORT_BUILD_PATH = fastlane/build
EXPORT_OUTPUT_DIRECTORY = fastlane/ipa
EXPORT_OUTPUT_NAME = testFastlane

配合托管代碼的 gitlab 配置,fastlane 還能夠順利實(shí)現(xiàn),在提交分支后,自動(dòng)打包。這部分知識(shí),我打算另開一篇。就醬~

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

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

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