Fastlane
fastlane是用Ruby語言編寫的一套自動化工具集和框架核畴,每一個工具實際都對應一個Ruby腳本,用來執(zhí)行某一個特定的任務揍愁,而fastlane核心框架則允許使用者通過類似配置文件的形式,將不同的工具有機而靈活的結合在一起,從而形成一個個完整的自動化流程最域。
主要突出的幾個功能:
- sigh:生成并下載開發(fā)者證書
- produce:在 iTunes Connector 上創(chuàng)建你的應用
- gym:打包你的應用
- snapshot:實現(xiàn)應用截屏并取得圖片
- pilot:將你的應用發(fā)布到 TestFlight 進行測試
- deliver:將你的應用的二進制代碼,截屏和原數(shù)據(jù)等信息上傳到 AppStore
...其實還有很多很突出也很實用的功能,幾乎你能想到的正常的需求都做了锈麸,到目前為止已有共計超過210個actions镀脂。如果還不夠,你還可以尋找額外的plugin忘伞,至少有超過250個額外的plugin你可以使用薄翅。
fastlane - 安裝篇
gem install fastlane
安心等待一會沙兰,fastlane 就安裝完成了。
可能會出現(xiàn) bundle 報錯的問題:
# 本地沒有安裝 bundle
bundle install
# 本地已經(jīng)安裝 bundle
bundle update
fastlane - 初始化篇
進入到工程目錄翘魄,然后執(zhí)行 fastlane 初始化操作:
fastlane init
首先會讓你選擇一下使用 fastlane 的目的鼎天,選擇 4
就好了。
What would you like to use fastlane for?
1. ?? Automate screenshots
2. ????? Automate beta distribution to TestFlight
3. ?? Automate App Store distribution
4. ?? Manual setup - manually setup your project to automate your tasks
之后靜靜等待并且無腦回車熟丸,最后看到一下輸出就代表初始化成功了训措,文件目錄中會多出 Gemfile & Gemfile.lock 這兩個文件 和 fastlane 這個文件夾。
To try your new fastlane setup, just enter and run
[17:23:27]: $ fastlane custom_lane
match - 初始化篇
還是在工程目錄中執(zhí)行 match 初始化操作:
fastlane match init
首先會讓你選擇 match 描述文件和證書存放的地方光羞,選擇 git 倉庫也就是 1
就好了绩鸣。
fastlane match supports multiple storage modes, please select the one you want to use:
1. git
2. google_cloud
然后輸入 git 倉庫的地址,例如 git@xxxxxx/FastlaneProvingProfile.git
Please create a new, private git repository to store the certificates and profiles there
URL of the Git Repo:
接著看到下面的提示語代表 match 初始化完成了纱兑,fastlane 文件夾中會多出一個 Matchfile 文件:
Successfully created './fastlane/Matchfile'. You can open the file using a code editor.
match - 使用篇
有三個不同的命令可以拉取不同環(huán)境下的證書和描述文件:
- 拉取 development 模式下的證書和描述文件
fastlane match development
- 拉取 adhoc 模式下的證書和描述文件
fastlane match adhoc
- 拉取 appstore 模式下的證書和描述文件
fastlane match appstore
Fastlane + Jenkins 配置篇
依賴環(huán)境:
- Xcode10+
- macOS or Linux with Ruby 2.0.0 + (本文:ruby 2.3.4 )
首先看一下已經(jīng)完成 fastlane 配置的目錄結構:
項目根目錄
.
├── Gemfile
├── Gemfile.lock
├── exportOptions_pre.plist
├── exportOptions_release.plist
├── fastlane
│ ├── Appfile # 存儲有關開發(fā)者賬號相關信息
│ ├── Fastfile # 核心文件呀闻,主要用于命令行調用和處理具體的流程,lane 相對于一個方法或者函數(shù)
│ ├── Gymfile # 打包工具相關配置項
│ ├── Deliverfile # 包上傳和提審工具配置項
│ └── Matchfile # 證書和描述文件管理工具配置項
└── ...
1潜慎、如果你的項目中有集成 cocoapods, 需要在 Gemfile (fastlane初始化的時候創(chuàng)建)文件中添加上 pod 配置, 最好順便更新一下 gem 源捡多,避免使用過程中引起不適:
source "https://gems.ruby-china.com"
gem "fastlane"
gem "cocoapods"
2、配置 Appfile 文件(開發(fā)者賬號的相關配置):
# 項目 bundle id
app_identifier("項目 bundle id")
# 蘋果開發(fā)者賬號
apple_id("蘋果開發(fā)者賬號")
# App Store Connect Team ID
itc_team_id("開發(fā)者賬號的 Team ID")
# Developer Portal Team ID
team_id("開發(fā)者賬號的 Team ID")
3铐炫、配置 Matchfile (證書和描述文件工具):
通忱菔郑可以選擇將 match 的證書和描述文件存放在一個 git 倉庫下,需要預先創(chuàng)建一個 git 倉庫來存放證書和描述文件倒信。
# 存放證書和描述文件的 git 倉庫地址科贬,對就是剛剛初始化 Match 時候填寫的倉庫地址
git_url("git@xxxxxx/FastlaneProvingProfile.git")
# 分支名稱(我是使用項目的 bundleID 來命名以區(qū)分多個項目)
git_branch("xxxxxxxxxx")
# 使用 git 服務
storage_mode("git")
# 默認的 match 類型(可以不設置)
type("development") # The default type, can be: appstore, adhoc, enterprise or development
# 項目的 bundle id(數(shù)組的形式)
app_identifier(["xxxxxxxxxx"])
# 有權限修改證書和描述文件的賬號名稱
username("xxxxxxxxxxxxx") # Your Apple Developer Portal username
4、 配置 Gymfile (打包工具):
# 需要打包的 scheme 名稱
scheme("xxxxxx")
# 如果存在多個 workspace 的話需要指定打包的 workspace
workspace("./xxxxxx.xcworkspace")
# 打包的 SDK 版本鳖悠,可以不設置
# sdk("iphoneos9.0")
# 打包之前執(zhí)行 clean 操作
clean(true)
# 是否支持 bitcode榜掌,因為我們項目不支持,我選擇了 false
include_bitcode(false)
5乘综、配置 Fastfile(流程控制工具憎账,支持 ruby 語法):
定義一個簡單的無參 lane
如下:
desc "Push a new beta build to TestFlight"
lane :beta do
# 啥事也不干
end
你可以在一個 lane
中添加不同的 action 去執(zhí)行各種操作。
通過 jenkins
打包完整的 lane
配置如下:
# 配置 jenkins 環(huán)境, 如果使用 Jenkins 打包的話需要設置
def cl_setup_jenkins
setup_jenkins(
unlock_keychain: true,
keychain_path: "鑰匙串的全路徑",
keychain_password: "鑰匙串的密碼"
)
end
# 更新倉庫提交記錄
def cl_git_update
git_submodule_update(
recursive: true,
init: true
)
end
# 更新 pod 倉庫
def cl_pod_update
cocoapods(
podfile: "./Podfile",
repo_update: true,
verbose: true
)
end
# 更新 adhoc 證書
def cl_match_pre
match(
# 證書類型
type: "adhoc",
# 只拉取證書卡辰,不更新 apple connect 上的證書和描述文件
readonly: true
)
end
# 更新 release 證書
def cl_match_release
match(
# 證書類型
type: "appstore",
# 只拉取證書胞皱,不更新 apple connect 上的證書和描述文件
readonly: true
)
end
# release 打包配置
def cl_gym_release
gym(
# 打包的方式
export_method:"app-store",
# 最終輸出的文件目錄
output_directory: "./release_builds",
# 打包相關配置
export_options: "./exportOptions_release.plist",
# 打包使用的 configuration
configuration: "Release",
# 最終輸出的包名
output_name: "xxxxxx"
)
end
# pre 打包配置
def cl_gym_pre
gym(
# 打包的方式
export_method:"ad-hoc",
# 最終輸出的文件目錄
output_directory: "./pre_builds",
# 打包相關配置
export_options: "./exportOptions_pre.plist",
# 打包使用的 configuration
configuration: "Pre",
# 最終輸出的包名
output_name: "xxxxxx"
)
end
# 上傳 appstore 配置
def cl_deliver_release
deliver(
# 即將要上傳包的名稱 (剛剛輸出的包名填的啥就是啥)
ipa: "./release_builds/xxxxxx.ipa",
# 是否跳過上傳截圖
skip_screenshots: true,
# 是否跳過上傳 metadata 文件
skip_metadata: true
)
end
def normal_release
# 更新倉庫提交記錄
cl_git_update
# 更新 pod 倉庫
cl_pod_update
# 更新證書
cl_match_release
# 打包
cl_gym_release
# 上傳 appstore
cl_deliver_release
end
def normal_pre
# 更新倉庫提交記錄
cl_git_update
# 更新 pod 倉庫
cl_pod_update
# 更新證書
cl_match_pre
# 打包
cl_gym_pre
end
default_platform(:ios)
platform :ios do
desc "jenkins 打包發(fā)布到 appstore"
lane :jenkins_release do
cl_setup_jenkins
normal_release
end
desc "本地打包發(fā)布到 appstore"
lane :local_release do
normal_release
end
desc "上傳到打包平臺"
lane :jenkins_pre do
cl_setup_jenkins
normal_pre
end
end
上面我們配置了三個 lane
用于打不同的包,在項目的根目錄執(zhí)行 fastlane [lane_name]
即可執(zhí)行 Fastfile 文件中定義的 lane
九妈;
例子:如果需要在 jenkins 上打線上包朴恳,執(zhí)行 fastlane jenkins_release
;
問題整理:
1、jenkins 打包遇到證書和描述文件找不到的問題
jenkins
上配置的節(jié)點賬戶和打包的 mac 用戶權限不一致允蚣,默認的 keychain
并不是 login.keychain
,需要配置鑰匙串的路徑呆贿,并且解密鑰匙串嚷兔,然后把證書訪問控制設置為允許所有應用程序訪問此項目
setup_jenkins(
unlock_keychain: true,
keychain_path: "/Users/server/Library/Keychains/login.keychain-db",
keychain_password: "2345.Com"
)
2森渐、賬戶開啟了雙重驗證導致上傳 app 包失敗的問題
- 在 appleid.apple.com/account/manage 上生成一個 application specific password 。
- 通過環(huán)境變量
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD
提供這個application specific password冒晰。 - 執(zhí)行
fastlane spaceauth -u [useremail]
同衣,生成session cookie。 - 通過環(huán)境變量
FASTLANE_SESSION
提供 session cookies壶运。
配置如下所示:
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=xxxx-xxxx-xxxx-xxxx
FASTLANE_SESSION='---\n- !ruby/object:HTTP::Cookie\n name: myacinfo\n value: DAWTKNV2bef67707f668179532419ac5dbe088822b502efd13e90e844400cb68e02db5d3b81959d76389d93b7df4a46a60432aa88297a77f7a4183f323f989e262dc51140b95932d4be4fd82c3a7b4f50efc218d3ce600bc1829816015207f1faf6f0ac9ab718419b50c77217cee77353128d85fa4459054518195fcf4d11fc0006a85bf2b51072221b341f2d3d0cc926d6d208865bd35a236a634fff2db06bb7b113480e3af4d03f84347a9c2ddf5a1a1f47dafe419722c2723b5edbbb140bea317af75db4b9ebf1745fe83adc2a9774392454fa6d47b29be685fe20d2fe19967f793010f7ae55477c12bc1654d08bc6bdba20e5017a45c18905bd89f24d086c1822d5436613532633238376133353865346235643332363435613662646266343030636238303338336136MVRYV2\n domain: apple.com\n for_domain: true\n path: "/"\n secure: true\n httponly: true\n expires: \n max_age: \n created_at: 2019-03-04 12:11:26.341152000 +08:00\n accessed_at: 2019-03-04 13:40:40.936401000 +08:00\n- !ruby/object:HTTP::Cookie\n name: dqsid\n value: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJkakxWdzl4MksxOE5OQ0xJU3ViMlF3In0.HYQQz28M8JMzQo8b3fq_PdB-LSKzMHB_PgDoWNCzErk\n domain: olympus.itunes.apple.com\n for_domain: false\n path: "/"\n secure: true\n httponly: true\n expires: \n max_age: 1800\n created_at: &1 2019-03-04 13:40:41.932636000 +08:00\n accessed_at: *1\n'