fastlane 的安裝和使用

什么是 Fastlane

????Fastlane 是一整套的客戶端 CI 工具集合,替代開發(fā)者處理構建和發(fā)布 App 中繁瑣的任務,可以非常快速簡單的搭建一個自動化發(fā)布服務,并且支持Android,iOS,MacOS挽放。Fastlane本身沒有一套特殊語法,使用的 Ruby 語言蔓纠。

Fastlane 的能力

Fastlane 的安裝

????fastlane可以通過多種方式安裝腿倚。首選方法是使用Bundler纯出。fastlane 也可以直接通過 Homebrew 安裝(如果在 macOS 上)。

可以使用 macOS 的系統(tǒng) Ruby敷燎,但不建議這樣做暂筝,因為它可能難以管理依賴關系,并且會導致沖突硬贯。

fastlane 需要設置一些環(huán)境變量才能正確運行焕襟。

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

RVM + Ruby + Bundler

????不推薦使用系統(tǒng) Ruby,可以通過 RVM 的方式安裝 Ruby饭豹,fastlane支持 Ruby 2.5 或更高版本鸵赖。驗證當前使用的是哪個 Ruby 版本:

ruby --version
ruby 2.6.8p205 (2021-07-07 revision 67951) [x86_64-darwin21]

????建議使用bundler并定義對fastlaneGemfile的依賴畏吓。這將清楚地定義要使用的fastlane版本及其依賴關系,還將加快fastlane的執(zhí)行速度卫漫。

  • 在項目的根目錄中創(chuàng)建一個./Gemfile 文件,存放下面內(nèi)容

    source "https://rubygems.org"
    gem "fastlane"
    
  • 運行bundle update 并添加 ./Gemfile./Gemfile.lock 到版本控制

  • 每次運行fastlane時肾砂,使用 bundle exec fastlane [lane]

  • 在您的 CI 上列赎,添加bundle install為第一個構建步驟

  • 要更新 fastlane,只需運行bundle update fastlane

Homebrew

brew install fastlane

系統(tǒng) Ruby

sudo gem install fastlane

Fastlane 的接入

  1. 項目接入 Fastlane

    fastlane init
    
  2. 自定義 fastlane 以生成屏幕截圖镐确,或自動分發(fā)新版本等等包吝。

     What would you like to use fastlane for?
     # 為 App Store 生成本地化的 iOS 屏幕截圖 
    1. ??  Automate screenshots 
    # 自動部署至 TestFlight
    2. ????  Automate beta distribution to TestFlight
    # 自動部署至 App Store
    3. ??  Automate App Store distribution
    # 手動設置項目以自動化任務
    4. ??  Manual setup - manually setup your project to automate your tasks
    
  3. fastlane 創(chuàng)建了所有必需的文件

    # 存儲自動化配置 編輯需要的 lanes 和 actions (https://docs.fastlane.tools/actions)
    Generated Fastfile at path `./fastlane/Fastfile`
    # App 信息
    Generated Appfile at path `./fastlane/Appfile`
    Gemfile and Gemfile.lock at path `Gemfile`
    

Fastlane Lanes

????fastlane 根據(jù) Fastfile 文件中定義的 lane 的內(nèi)容,lane 可以視為函數(shù)源葫,在 lane 的作用域里可以調(diào)用其它私有 lane诗越,也可以調(diào)用多個 action 完成自動化任務,一個簡單的 Fastfile 示例如下:

lane :beta do |options|
  build(release: false)
  upload_to_testflight
end

lane :release do |options|
  capture_screenshots
  build(release: true)
  upload_to_app_store       # Upload the screenshots and the binary to iTunes
  slack                     # Let your team-mates know the new version is live
end
# 私有 lane
private_lane :build do |options|
  increment_build_number
  build_app
end

執(zhí)行 lane

????想執(zhí)行這些任務息堂,需要在終端中執(zhí)行下面命令:

fastlane [lane] key:value key2:value2

傳遞參數(shù)

????上面示例的參數(shù) key 和 key2嚷狞,可以通過 options 訪問,例如傳遞 build_number

fastlane [deploy] build_number:2 
lane :deploy do |options|
  # ...
  # ...
  increment_build_number(build_number: options[:build_number])
  # ...
end

上下文

????在不同的 action 中進行通信

lane_context[SharedValues::VARIABLE_NAME_HERE]

before_each 和 after_each

# before_each在調(diào)用任何 lane 之前都會執(zhí)行
before_each do |lane, options|
  # ...
end
# after_each在調(diào)用任何 lane 之后都會執(zhí)行
after_each do |lane, options|
  # ...
end

before_all 和 after_all

# before_each在調(diào)用所有 lane 之前執(zhí)行一次
before_all do |lane, options|
  # ...
end
# after_each在調(diào)用所用 lane 之后執(zhí)行一次
after_all do |lane, options|
  # ...
end

error

# 執(zhí)行失敗會走 error
error do |lane, exception, options|
  #...
end

for_lane 和 for_plateform

#for_lane 當命令行上調(diào)用的名稱與塊指定的名稱匹配時荣堰,將調(diào)用塊床未。
locales ['en-US', 'fr-FR', 'ja-JP']
for_lane :screenshots_english_only do
  locales ['en-US']
end

#for_platform 根據(jù)調(diào)用 fastlane 的平臺提供類似的控制。
for_platform :mac do
  app_identifier "com.forplatform.mac"

  for_lane :release do
    app_identifier "com.forplatform.mac.forlane.release"
  end
end

Fastlane Actions

????fastlane 的工具叫做 action 振坚,每一個 action 都對應一個具體的任務薇搁。命令執(zhí)行的底層并不是自己實現(xiàn)的,而是調(diào)用其他的插件或者工具執(zhí)行的渡八。比如說啃洋,fastlane 中的 gym 工具只是 xcodebuild 和 xcpretty 工具的一個封裝,調(diào)用的其實還是 xcodebuild 中的打包命令屎鳍,因此參數(shù)也是一樣的宏娄。下面介紹幾個常用的 action:

構建

Action 描述
gymbuild_app 構建和簽名 App
build_ios_app 和 build_app 一致逮壁,只針對 iOS
cocoapods 運行 cocoapods
xcclean 使用 xcodebuild clean 清理工程
xcodebuild绝编、xcbuild 使用 xcodebuild 命令構建和簽名App
xcarchive 使用 xcodebuild archive 命令歸檔
xcexport 使用 xcodebuild -exportArchive 命令導出

工程修改

Action 描述
increment_build_number 自增 build 號
set_info_plist_value 設置 info.plist 的值
update_plist 更改指定 plist 的內(nèi)容

發(fā)布

Action 描述
deliverappstore貌踏、upload_to_app_store 發(fā)布到 Appstore十饥,需要用戶認證信息參考文檔-驗證

證書、描述文件的管理

Action 描述
match祖乳、sync_code_signing 通過Git 同步證書和描述文件

文檔

Action 描述
appledoc 生成指定文件的 appledoc 文檔

step_name

fastlane 支持為每一個 action 指定 :step_name逗堵,用作該次動作的名稱,避免使用多次相同動作造成的歧義眷昆。

build_ios_app(step_name: '構建 iOS App')

Fastlane 環(huán)境變量

????fastlane 還有一個 --env選項允許加載環(huán)境特定.env文件蜒秤,其存儲位置在 fastlane 文件夾汁咏。.env 環(huán)境變量文件的命名約定是.env.<environment>,其加載順序是 .env作媚、.env.default.env.app1攘滩。例如,在 fastlane 文件夾中存儲了.env.beta纸泡、.env.appstore.env漂问。

fastlane <lane-name> --env beta 將加載 .env 和 .env.beta

Fastlane 自動化構建項目

????在如何使用命令行自動化構建項目中描述了如何通過 Xcode 命令行工具實現(xiàn),其實 fastlane 流程與其相同女揭,并且 fastlane 減少了開發(fā)者對底層的調(diào)用蚤假,從而達到只需要編寫 Fastfile 就能完成自動化構建項目。

  1. 配置 .env 文件吧兔,如果有多個環(huán)境或者構建需求可以選擇配置環(huán)境變量磷仰,僅供參考

    .env.development

    FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT = 40
    WORKSPACE=xxx.xcworkspace 
    SCHEME=xxx
    OUTPUT_DIRECTORY=xxx
    BUILDLOG_PATH=xxx
    FIR_API_TOKEN=xxx
    
  2. 配置 Fastfile文件

    platform :ios do
      
      before_all do
         ENV["FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT"] = "40"
         cocoapods{
          repo_update:true
        }
      end
    
    
      desc "Upload to fir.im"
      lane :uploadfir do |options|
        #add actions here
        match(
          type: "adhoc", 
          readonly: true
        )
        buildProject(
          export_method:"ad-hoc",
          configuration:"xxx"
        )
        fir_cli(api_token:ENV['FIR_API_TOKEN'], skip_update_icon:true) 
      end
    
      desc "Upload to appstore"
      lane :uploadappstore do |options|
        match(
          type: "appstore", 
          readonly: true
        )
        buildProject(
          export_method:"app-store",
          configuration:"xxx"
        )
        upload_to_app_store(
          skip_metadata: true,
          skip_screenshots: true
        )
      end
    
      #hidden from lanes,list,docs
      desc "Build Project"
      private_lane :buildProject do |options|
        #add actions here
        schemeName = ENV['SCHEME']
        build_ios_app(
          step_name: '構建 iOS App',
          clean:true,
          xcpretty_utf:true,
          scheme: ENV['SCHEME'],
          workspace: ENV['WORKSPACE'],
          # 指定輸出文件夾
          output_directory:ENV['OUTPUT_DIRECTORY'],
          # 指定構建日子路徑
          buildlog_path:ENV['BUILDLOG_PATH'],
          configuration:options[:configuration],
          export_method:options[:export_method],
          # 可以指定 ExportOptionsList
          #export_options:{
            #provisioningProfiles:{
              # ENV["APP_BUNDLEID"] => ENV["APP_PROFILE_NAME"],
            #},
            #method:ENV['EXPORT_METHOD'],
            #signingCertificate:ENV['SIGNINGCERTIFICATE'],
            #teamID:ENV['TEAMID']
          #}
        )
      end
    end
    
  1. 執(zhí)行

    bundle exec fastlane ios uploadfir --env development
    

Fastlane 管理證書和描述文件

????fastlane match是codesigning.guide 概念的實現(xiàn)。match創(chuàng)建所有必需的證書和配置文件境蔼,并將它們通過 openssl 加密后存儲在單獨的 git 存儲庫中灶平。每個有權訪問所選存儲的團隊成員都可以使用這些憑據(jù)進行代碼簽名。match 還會自動修復損壞和過期的憑據(jù)箍土,這是跨團隊共享簽名憑據(jù)的最簡單方法民逼。

接入

  1. 準備好一個 Git 倉庫

  2. 項目中初始化,建議使用 SSH

    fastlane match init
    
  3. fastlane 會生成一個 Matchfile 在項目的./fastlane 文件夾中涮帘。示例:

    git_url("https://github.com/fastlane/certificates")
    
    app_identifier("tools.fastlane.app")
    username("user@fastlane.tools")
    

初始化

????運行 fastlane match init 后可以運行以下命令來生成新的證書和配置文件:

fastlane match appstore 或者 fastlane match development

配置文件安裝在~/Library/MobileDevice/Provisioning Profiles拼苍,而證書和私鑰安裝在鑰匙串中,并將其通過輸入的密碼對其進行加密后存儲在 Git 庫當中调缨。

Git 存儲內(nèi)容

????首次運行 match 后疮鲫,Git 存儲庫將包含 2 個目錄:

  • certs文件夾包含所有證書及其私鑰
  • profiles文件夾包含所有配置文件

此外,match 創(chuàng)建了一個README.md弦叶。

使用

????要在新機器上設置證書和配置文件俊犯,只需使用以下命令運行相同的命令,通過 readonly 確保它不會創(chuàng)建任何新證書或配置文件伤哺。

fastlane match development --readonly

導入

????通過下面命令可以將以及存在的證書或者描述文件導入并加密到匹配存儲庫中燕侠,可以通過skip_certificate_matching跳過驗證證書

fastlane match import --skip_certificate_matching true

系統(tǒng)將提示需要輸入證書 ( .cer)、私鑰 ( .p12) 和配置文件 (.mobileprovision.provisionprofile) 路徑立莉。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绢彤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蜓耻,更是在濱河造成了極大的恐慌茫舶,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刹淌,死亡現(xiàn)場離奇詭異饶氏,居然都是意外死亡讥耗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門疹启,熙熙樓的掌柜王于貴愁眉苦臉地迎上來古程,“玉大人,你說我怎么就攤上這事喊崖≌跄ィ” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵贷祈,是天一觀的道長。 經(jīng)常有香客問我喝峦,道長势誊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任谣蠢,我火速辦了婚禮粟耻,結果婚禮上,老公的妹妹穿的比我還像新娘眉踱。我一直安慰自己挤忙,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布谈喳。 她就那樣靜靜地躺著册烈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪婿禽。 梳的紋絲不亂的頭發(fā)上赏僧,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音扭倾,去河邊找鬼淀零。 笑死,一個胖子當著我的面吹牛膛壹,可吹牛的內(nèi)容都是我干的驾中。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼模聋,長吁一口氣:“原來是場噩夢啊……” “哼肩民!你這毒婦竟也來了?” 一聲冷哼從身側響起链方,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤此改,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后侄柔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體共啃,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡占调,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了移剪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片究珊。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖纵苛,靈堂內(nèi)的尸體忽然破棺而出剿涮,到底是詐尸還是另有隱情,我是刑警寧澤攻人,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布取试,位于F島的核電站,受9級特大地震影響怀吻,放射性物質發(fā)生泄漏瞬浓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一蓬坡、第九天 我趴在偏房一處隱蔽的房頂上張望猿棉。 院中可真熱鬧,春花似錦屑咳、人聲如沸萨赁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杖爽。三九已至,卻和暖如春紫皇,著一層夾襖步出監(jiān)牢的瞬間掂林,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工坝橡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泻帮,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓计寇,卻偏偏與公主長得像锣杂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子番宁,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容