1. 前言
應(yīng)公司項(xiàng)目要求,需要自動(dòng)化打包不同App,為了避免重復(fù)性的工作和節(jié)省時(shí)間,以下是研究和學(xué)習(xí)Fastlane的一些記錄和總結(jié),希望可以為初學(xué)者提供一些幫助。
1.1. 依賴環(huán)境:
Xcode7 +
macOS or Linux with Ruby 2.0.0 +
2. Fastlane簡介
Fastlane 是一套使用Ruby寫的自動(dòng)化工具集,為iOS 和 Android 開發(fā)者提供的自動(dòng)化構(gòu)建工具,它可以幫助開發(fā)者將 App 打包、簽名、測試、發(fā)布、信息整理、提交 App Store 等工作完整的連接起來,實(shí)現(xiàn)完全自動(dòng)化的工作流。
fastlane 強(qiáng)大之處就在于其提供的工具全,基本可以覆蓋打包測試發(fā)布的所有流程,如下圖:
fastlane 的每一個(gè)工具都對應(yīng)一個(gè) Ruby 腳本,用來執(zhí)行某一特定的任務(wù),而最妙的是可以通過配置文件將不同的工具靈活的結(jié)合在一起,從而形成一個(gè)完整的自動(dòng)化流程,實(shí)現(xiàn)一鍵上傳 ITC,從而縮短用于構(gòu)建發(fā)布的時(shí)間。比如我需要完成一套發(fā)布流程:
#發(fā)布到AppStore
lane :release do
#增加build版本號,需要先配置build setting
increment_build_number
#pod資源更新
cocoapods
#打包
gym
#發(fā)布到AppStore
deliver(force: true)
#發(fā)布testflight測試
testflight
end
2.2. Fastlane組件
- 測試
- scan => 自動(dòng)運(yùn)行測試工具,并且可以生成漂亮的HTML報(bào)告
- 證書,配置文件
- cert => 自動(dòng)創(chuàng)建管理iOS代碼簽名證書
-
sigh => 一聲嘆息啊,這么多年和
Provisioning Profile
戰(zhàn)斗過無數(shù)次??偸怯羞@樣那樣的問題導(dǎo)致配置文件過期或者失效。sigh
是用來創(chuàng)建、更新、下載、修復(fù)Provisioning Profile
的工具。 - pem => 自動(dòng)生成、更新推送配置文件
-
match => 一個(gè)新的證書和配置文件管理工具。我會(huì)另寫一篇文章專門介紹這個(gè)工具。他會(huì)所有需要用到的證書傳到git私有庫上,任何需要配置的機(jī)器直接用
match
同步回來就不用管證書問題了,小團(tuán)隊(duì)福音啊!
- 截圖
- 編譯
- shenzhen => 當(dāng)年大名鼎鼎的自動(dòng)編譯工具,現(xiàn)在已經(jīng)被棄用了
- gym => Fastlane家族的自動(dòng)化編譯工具,和其他工具配合的非常默契
- 發(fā)布
-
TestFlight
管理 - 輔助工具
-
spaceship => 為
pilot
,boarding
和deliver
等工具提供和 iTC 和 ADC 的交互API。spaceship
本來是個(gè)獨(dú)立的項(xiàng)目,后來被Fastlane
收編進(jìn)來 -
WatchBuild => 是一個(gè)獨(dú)立的iTC監(jiān)控工具,開啟
WatchBuild
可以監(jiān)控iTC上的文件狀態(tài),彈出MacOS自帶的Notification
-
spaceship => 為
- Android
- supply => 自動(dòng)上傳到Google Play工具(如果有時(shí)間,我想把國內(nèi)提供API的Android Store都寫個(gè)插件自動(dòng)上傳,這個(gè)問題從10年我剛開始工作就覺得是個(gè)痛點(diǎn))
- screengrab => Android的自動(dòng)截圖工具
3.安裝
3.1 安裝正確的Ruby版本,需要2.0及以上版本:
ruby -v
3.2 檢查 Xcode CLT 是否安裝:
xcode-select --install
##如果已經(jīng)安裝,出現(xiàn)command line tools are already installed, use "Software Update" to install updates.出現(xiàn)command line tools are already installed, use "Software Update" to install updates.
3.3 安裝 fastlane:
sudo gem install fastlane
執(zhí)行命令時(shí),輸入用戶密碼
3.4 檢查版本 fastlane:
fastlane --version
3.5 初始化配置
$ cd 項(xiàng)目目錄
$ fastlane init
- 期間會(huì)讓你輸入 Apple ID 賬號密碼(這個(gè)信息會(huì)存在鑰匙串中,后續(xù)使用無需再輸入密碼)
- 會(huì)檢測當(dāng)前的 app identifier 是否在 ADC 中
- 會(huì)檢測當(dāng)前 app 是否在 ITC 中
- 如果已經(jīng)在 ADC 和 ITC 中創(chuàng)建相應(yīng)的信息,那么過程會(huì)很順利
接下來會(huì)問你這個(gè)app是否需要在iTC和ADC中創(chuàng)建(上一步中如果選擇y
會(huì)自動(dòng)檢測是否需要?jiǎng)?chuàng)建),fastlane會(huì)調(diào)用produce
進(jìn)行初始化,如果現(xiàn)在還不想創(chuàng)建,也可以之后再運(yùn)行fastlane produce init
進(jìn)行這個(gè)流程。如果不執(zhí)行produce
的流程,deliver
的流程也會(huì)被掠過,當(dāng)然之后也可以fastlane deliver init
運(yùn)行完全一樣的流程。
3.6 Fastlane 初始化完成后,工程目錄下會(huì)自動(dòng)生成 fastlane
文件夾,如下所示:
fastlane
├── Appfile
├── Deliverfile
├── Fastfile
├── metadata
│ ├── copyright.txt
│ ├── en-US
│ │ ├── description.txt
│ │ ├── keywords.txt
│ │ ├── marketing_url.txt
│ │ ├── name.txt
│ │ ├── privacy_url.txt
│ │ ├── release_notes.txt
│ │ └── support_url.txt
│ ├── primary_category.txt
│ ├── primary_first_sub_category.txt
│ ├── primary_second_sub_category.txt
│ ├── secondary_category.txt
│ ├── secondary_first_sub_category.txt
│ ├── secondary_second_sub_category.txt
│ └── zh-Hans
│ ├── description.txt
│ ├── keywords.txt
│ ├── marketing_url.txt
│ ├── name.txt
│ ├── privacy_url.txt
│ ├── release_notes.txt
│ └── support_url.txt
└── screenshots
├── README.txt
├── en-US
│ ├── 一堆png圖片
其他:
這里肯定會(huì)被創(chuàng)建的是
Appfile
和Fastfile
。如果Deliverfile
,screenshots
和metadata
目錄沒被創(chuàng)建,可以運(yùn)行deliver init
重新初始化,在執(zhí)行deliver init
的過程中,會(huì)同步iTC中的所有語言的元數(shù)據(jù)和截圖。fastlane的配置會(huì)要求輸入開發(fā)者賬號密碼,所有的密碼都加密保存在系統(tǒng)的Keychain里
Matchfile: match 這個(gè)action的配置文件,fastlane match init 自動(dòng)生成,存放git地址等
推薦使用Sublime Text工具打開
cd fastlane
open -a /Applications/Sublime\ Text.app/ Appfile Deliverfile Fastfile
操作步驟:在Sublime Text 工作窗口,點(diǎn)擊右下角Plain Text區(qū)域,出現(xiàn)的下拉菜單中選擇Ruby,或者在sublime的菜單中,找到View——>Syntax中選擇ruby,即可高亮代碼。
4. fastlane 文件配置
fastlane 的各文件解釋如下:
- Appfile:用于指定 app_identifier, apple_id, team_id
- Fastfile:配置管理 lane
- Deliverfile:配置應(yīng)用在 ITC 中的各種信息,和 ICC 中的數(shù)據(jù)是一一對應(yīng)的
- metadata:包含應(yīng)用在 ITC 中的各種信息
- screenshots:包含截圖數(shù)據(jù)
4.1 配置 Fastfile
fastlane_version "2.14.2"
default_platform :ios
platform :ios do
# 當(dāng)前任務(wù)的描述
desc "Creating a code signing certificate and provisioning profile"
# 任務(wù)名稱
lane :provision do
# 創(chuàng)建 ITC 中的 App 信息
produce(
app_name: 'AD_Demo',
language: 'zh-Hans',
app_version: '1.0',
sku: 'com.3code.ADDemo.Test'
)
# 使用證書創(chuàng)建私鑰及簽名
cert
# 每次運(yùn)行時(shí)創(chuàng)建新的配置文件
sigh(force: true)
end
error do |lane, exception|
end
# 拍照
desc "Take screenshots"
lane :screenshot do
snapshot
end
#完成后,會(huì)自動(dòng)打開screenshots.html文件查看
desc "Create ipa"
lane :build do
increment_build_number
gym
end
# 提交
desc "Upload to App Store and submit for review"
lane :upload do
deliver(
submit_for_review: true
)
end
# 一鍵搞定
desc "Provision, take screenshots, build and upload to App Store"
lane :do_everything do
provision
screenshot
build
upload
end
end
如果想創(chuàng)建 ad hoc 配置文件,需要指定sigh(adhoc: true).更多的信息參見:
4.2 配置 metadata 文件夾
需要注意的是,metadata 和 Deliverfile,都可以配置 ITC 的數(shù)據(jù),但后者優(yōu)先級高
下文先在 metadata 文件夾中進(jìn)行配置用于演示,在文末會(huì)刪除 metadata 中的配置文本,全部配置在 Deliverfile 中.
- 在 metadata 文件夾中創(chuàng)建分級文件:itunes_rating_config.json,這個(gè)和 ICC 中的分級是對應(yīng)的.
{"CARTOON_FANTASY_VIOLENCE": 0,
"REALISTIC_VIOLENCE": 0,
"PROLONGED_GRAPHIC_SADISTIC_REALISTIC_VIOLENCE": 0,
"PROFANITY_CRUDE_HUMOR": 0,
"MATURE_SUGGESTIVE": 0,
"HORROR": 2,
"MEDICAL_TREATMENT_INFO": 0,
"ALCOHOL_TOBACCO_DRUGS": 0,
"GAMBLING": 0,
"SEXUAL_CONTENT_NUDITY": 0,
"GRAPHIC_SEXUAL_CONTENT_NUDITY": 0,
"UNRESTRICTED_WEB_ACCESS": 0,
"GAMBLING_CONTESTS": 0
}
此處配置參見官方文檔
- 將 App 圖標(biāo)添加至文件夾中
4.3 Snapshot 截圖和 XCTest
命令行輸入:
fastlane snapshot init
生成名為Snapfile的文件,修改內(nèi)容為:
# A list of devices you want to take the screenshots from
devices([
"iPhone 5",
"iPhone 6",
"iPhone 6 Plus"
])
# A list of supported languages
languages([
'en-US',
'fr-FR'
])
# Where should the resulting screenshots be stored?
output_directory "./fastlane/screenshots"
# Clears previous screenshots
clear_previous_screenshots true
# Latest version of iOS
ios_version '10.1'
然后打開 Xcode 工程,添加截圖設(shè)置(需要增加 UITest, 因?yàn)榻貓D是在 UITest 時(shí)截取的):
\\ 1)在項(xiàng)目添加UI測試,已經(jīng)添加略過
\\ 2)將./fastlane/SnapshotHelper.swift 添加到UI測試中
\\ 3)打開 XXXUITests.swift ,刪除setUp和tearDown方法,然后在其中添加以下代碼testExample:
let app = XCUIApplication()
setupSnapshot(app)
app.launch()
app.buttons["next"].tap()
snapshot("01firstPage") // 此處截圖
app.buttons["back"].tap()
snapshot("02secondPage") // 此處截圖
4.3 配置 Deliverfile
其實(shí)上傳 ITC 最主要的文件是 Deliverfile,配置好 Deliverfile 后,可以刪除 metadata 文件夾中的文本配置.最終配置如下圖:
[圖片上傳失敗...(image-748b97-1520214221473)]
以下是主要的配置,更多更詳細(xì)的請戳文件,里面有詳細(xì)的注釋,拿來即可使用
# 1 app_identifier
app_identifier "com.3code.ADDemo"
# 2 用戶名,Apple ID電子郵件地址
username "Apple ID電子郵件地址"
# 3 支持語言
supportedLanguages = {
"cmn-Hans" => "zh-Hans"
}
# 4 app 名稱
name({
'zh-Hans' => "ADDemo"
})
# 5 描述
description({
'zh-Hans' => "簡體中文版"
})
# 6 提交審核信息
submission_information({
export_compliance_encryption_updated: false,
export_compliance_uses_encryption: false,
content_rights_contains_third_party_content: false,
add_id_info_uses_idfa: false
})
# 7 應(yīng)用審核小組的聯(lián)系信息 app 審核信息
app_review_information(
first_name: "name",
last_name: "name",
phone_number: "手機(jī)號",
email_address: "email",
demo_user: "測試賬號用戶名",
demo_password: "測試賬號密碼",
notes: "noting"
)
# 8 copyright
copyright "#{Time.now.year} 3code"
#
5. 插件
Fastlane的插件是一個(gè)或者一組action
的打包,單獨(dú)發(fā)布在fastlane之外。Fastlane Plugin 指南
#查看所有插件
fastlane search_plugins
# 安裝方法
fastlane add_plugin [name]
#常用插件
fastlane add_plugin versioning
fastlane add_plugin firim
fastlane add_plugin pgyer
使用 Fastlane 上傳 App 到蒲公英(https://www.pgyer.com/doc/view/fastlane)
fastlane-plugin-versioning: 用來修改build版本號和version版本號。Fastlane內(nèi)嵌的action
increment_build_number
使用的是蘋果提供的agvtool
,agvtool
在更改Build的時(shí)候會(huì)改變所有target的版本號。這時(shí)如果你在一個(gè)工程里有多個(gè)產(chǎn)品的話,每次編譯,所有的Build都要加1,最后就不知道高到哪里去了。
有了fastlane-plugin-versioning
不僅可以指定target增加Build,當(dāng)然也可以直接設(shè)定Version。
6. 環(huán)境變量Environment Variables
有時(shí)候我們希望把賬號信息、更新描述和版本號等信息單獨(dú)放在一個(gè)配置文件。在這里Fastlane給我們提供了相應(yīng)的解決方案。
我們可以在工程目錄下創(chuàng)建一個(gè)名為 .env
的文件,自定義所需的臨時(shí)變量,然后Fastlane的三個(gè)配置文件(Appfile
、Deliverfile
和Fastfile
)分別從.env
文件中讀取配置信息。
關(guān)于ENV用法可參考以下鏈接:
https://docs.fastlane.tools/advanced/#environment-variables
https://github.com/bkeepers/dotenv
.env
文件為影藏文件,可使用如下命令查看:
Finder 默認(rèn)不顯示隱藏文件,創(chuàng)建 .env 文件后,若需查看,需要執(zhí)行兩條命令來開啟隱藏文件的顯示:
$ defaults write com.apple.finder AppleShowAllFiles -boolean true;
$ killall Finder
ls -a
下面給出的 .env
文件配置可做參考:
#APP唯一標(biāo)識符
APP_IDENTIFIER = "xxx.xxx.TestGitProject"
#發(fā)布版本號
APP_VERSION_RELEASE = "1.1.0"
#新版本修改記錄
RELEASE_NOTES = "1) 升級測試第一行\(zhòng)n2) 升級測試第二行"
#蒲公英 更新描述
PGY_UPDATE_DESCRIPTION = "fastlane自動(dòng)打包上傳測試"
#自動(dòng)提交審核
SUBMIT_FOR_REVIEW = false
#審核通過后立刻發(fā)布
AUTOMATIC_RELEASE = false
#蘋果開發(fā)者賬號
APPLE_ID = "xxx@xxx.xxx"
#蘋果開發(fā)者帳號密碼
FASTLANE_PASSWORD = "xxxxxx"
#套裝ID
TEAM_ID = "94xxxxx02"
#應(yīng)用名稱
SCHEME_NAME = "TestGitProject"
#APP元數(shù)據(jù)及截圖存放路徑
METADATA_PATH = "./metadata/TestGitProject"
SCREENSHOTS_PATH = "./screenshots/TestGitProject"
#APP元數(shù)據(jù)及截圖下載時(shí),直接覆蓋原有數(shù)據(jù),不詢問
DELIVER_FORCE_OVERWRITE = true
Appfile
、Deliverfile
和Fastfile
配置文件修改如下:
Appfile
:
app_identifier ENV['APP_IDENTIFIER'] # The bundle identifier of your app
apple_id ENV['APPLE_ID'] # Your Apple email address
team_id ENV['TEAM_ID'] # Developer Portal Team ID
Deliverfile
:
app_identifier ENV['APP_IDENTIFIER'] # The bundle identifier of your app
username ENV['APPLE_ID'] # your Apple ID user
Fastfile
:
desc "發(fā)布 測試版本 到 蒲公英"
lane :beta_pgy do
gym(scheme: ENV['SCHEME_NAME'],
export_method: "ad-hoc",
silent: true, # 隱藏沒有必要的信息
clean: true # 在構(gòu)建前先clean
)
pgyer(api_key: ENV['PGY_API_KEY'],
user_key: ENV['PGY_USER_KEY'],
update_description: ENV['PGY_UPDATE_DESCRIPTION'],
password: "123456",
install_type: "2")
end
參考鏈接: