什么是 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 的接入
-
項目接入 Fastlane
fastlane init
-
自定義 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
-
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 | 描述 |
---|---|
gym、build_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 | 描述 |
---|---|
deliver、appstore貌踏、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
就能完成自動化構建項目。
-
配置
.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
-
配置
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
-
執(zhí)行
bundle exec fastlane ios uploadfir --env development
Fastlane 管理證書和描述文件
????fastlane match是codesigning.guide 概念的實現(xiàn)。match創(chuàng)建所有必需的證書和配置文件境蔼,并將它們通過 openssl 加密后存儲在單獨的 git 存儲庫中灶平。每個有權訪問所選存儲的團隊成員都可以使用這些憑據(jù)進行代碼簽名。match 還會自動修復損壞和過期的憑據(jù)箍土,這是跨團隊共享簽名憑據(jù)的最簡單方法民逼。
接入
準備好一個 Git 倉庫
-
項目中初始化,建議使用 SSH
fastlane match init
-
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
) 路徑立莉。