更新節(jié)點:2019-05-15
由于fastlane更新頻繁,已更新到
2.105.22.122.0更新內(nèi)容:fastlane新變化、fastlane新問題、fastlane遺留問題解決
2020-04-21 更新
大部分細節(jié)都類似,有一個繞過兩步驗證的更新一下, 其實你開一個有上傳權(quán)限的子賬號 就可以繞過兩步驗證,子賬號沒有強制要求兩步驗證。
05-15新版本內(nèi)容變化,大致沒太多改動,一些新細節(jié)整理一下
1、用swift初始化Fastlane (beta)
1、To have your Fastfile
configuration written in Swift (Beta) DOC
看描述就很清楚知道,這是使用swift來替代之前的ruby編寫腳本文件,縮減學習成本, 只要你懂swift就可以寫lane去跑對應(yīng)的事件。
2、Open the file located at [project]/fastlane/swift/FastlaneRunner/FastlaneRunner.xcodeproj
to configure your lanes in Fastfile.
其實本質(zhì)上就是一個工程,如上,官方在fastlane目錄下放置了對應(yīng)swift工程,我們可以通過工程進行l(wèi)anes的開發(fā)。簡單測試了一下,lane被具象化為一個對象,所有你希望可以終端執(zhí)行的lane,swift方法名以Lane結(jié)尾就可以:myLane、yourLane。
fastlane init swift
得到的fastfile(選擇了自動提示的 Automate beta distribution to TestFlight):
import Foundation
class Fastfile: LaneFile {
func betaLane() {
desc("Push a new beta build to TestFlight")
incrementBuildNumber(xcodeproj: "xxx.xcodeproj")
buildApp(workspace: "xxx.xcworkspace", scheme: "xxx")
uploadToTestflight(username: "xxx@xx.com")
}
}
3、Run fastlane <laneName>
in your terminal to execute fastlane.
終端命令操作沒有太大改變, lane調(diào)用的時候可以忽略尾部后綴Lane。 參數(shù)傳遞方式如下:
fastlane [lane] key:value key2:value2
fastlane deploy submit:false build_number:24
class Fastfile: LaneFile {
func deployLane(withOptions options:[String: String]?) {
// ...
if let submit = options?["submit"], submit == "true" {
// Only when submit is true
}
// ...
incrementBuildNumber(buildNumber: options?["build_number"])
// ...
}
}
2、Running Tests
run_tests action ,具體詳情可以 執(zhí)行 fastlane action run_tests 查看。可以配合CI執(zhí)行單元測試,并且還可以提交測試結(jié)果到一些平臺: fastlane actions.
3、Deployment
打包具體變化不大,原來的actions 做了一些Alias (對安卓的支持力度加大,很多東西需要區(qū)分)
gym => build_ios_app | build_app
gradle => build_android_app
4、 關(guān)于兩步驗證的問題
老樣子,沒有什么進步,依然是specific password 和cookies 進行一個月的保存,還是需要每個月更新。
用手機再注冊一個蘋果賬號(不要通過appid網(wǎng)站注冊),把這個賬號掛在主賬號下面作為子賬號,并且開通權(quán)限,這樣就默認不會又兩步驗證。
fastlane 介紹
fastlane是用Ruby語言編寫的一套自動化工具集和框架,每一個工具實際都對應(yīng)一個Ruby腳本,用來執(zhí)行某一個特定的任務(wù),而fastlane核心框架則允許使用者通過類似配置文件的形式,將不同的工具有機而靈活的結(jié)合在一起,從而形成一個個完整的自動化流程。比如我需要完成一套發(fā)布流程:
#發(fā)布到AppStore
lane :release do
#增加build版本號,需要先配置build setting
increment_build_number
#pod資源更新
cocoapods
#打包
gym
#發(fā)布到AppStore
deliver(force: true)
#發(fā)布testflight測試
testflight
end
依賴環(huán)境:
- Xcode7 + (本文:xcode 9.3)
- macOS or Linux with Ruby 2.0.0 + (本文:ruby 2.4.0 )
本文版本:
fastlane版本:2.53.1 已更新到 2.105.2
文檔地址:
安裝:
[sudo] gem install fastlane
如果用的是mac自帶的ruby,需要 sudo權(quán)限
使用: sudo gem install fastlane
如果報錯:ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/commander
使用: sudo gem install -n /usr/local/bin fastlane
初始化:
在項目根目錄下,初始化Fastlane:
fastlane init
新版本安裝的時候出現(xiàn)了下面的分支選擇,按要求選擇就行
1. ?? Automate screenshots
2. ????? Automate beta distribution to TestFlight (自動testfilght型配置)
3. ?? Automate App Store distribution (自動發(fā)布型配置)
4. ?? Manual setup - manually setup your project to automate your (需要手動配置內(nèi)容)
fastlane操作改變后我們再了解一下有哪些配置文件:
Appfile: 存儲有關(guān)開發(fā)者賬號相關(guān)信息
Fastfile: 核心文件,主要用于 命令行調(diào)用和處理具體的流程,lane相對于一個方法或者函數(shù)
Deliverfile: deliver工具的配置文件
metadata: 元數(shù)據(jù)文件夾
Matchfile: Match操作對應(yīng)的配置文件
screenshots: 截圖文件夾
除開手動配置項,fastlane 會要求填寫Apple ID,選擇你的Team(如果有多個) 然后fastlane會自動檢測當前目錄下項目的App Name和App Identifier、Project。然后自行確認并按流程執(zhí)行。
常用命令:
- fastlane actions: 展示所有有效action列表
- fastlane action [action_name]: 展示一個action的詳細說明,使用方法等
- fastlane lanes: 展示fastfile中的所有l(wèi)ane
- fastlane list: 展示fastfile中的所有的有效的lane
- fastlane new_action: 創(chuàng)建一個新的action
- fastlane env: 打印fastlane、ruby環(huán)境,一般提bug到issue的時候會要求提供
生命周期:
執(zhí)行順序 | 方法名 | 說明 |
---|---|---|
1 | before_all | 在執(zhí)行 lane 之前只執(zhí)行一次 |
2 | before_each | 每次執(zhí)行 lane 之前都會執(zhí)行一次 |
3 | lane | 自定義的任務(wù) |
4 | after_each | 每次執(zhí)行 lane 之后都會執(zhí)行一次 |
5 | after_all | 在執(zhí)行 lane 成功結(jié)束之后執(zhí)行一次 |
6 | error | 在執(zhí)行上述情況任意環(huán)境報錯都會中止并執(zhí)行一次 |
其他:
1.如果Deliverfile、screenshots和metadata沒有自動生成,通過deliver init 可以重新初始化
2.fastlane的配置會要求輸入開發(fā)者賬號密碼,通過spaceship與Apple交互,并會產(chǎn)生一份有效期一個月的cookies文件:文件地址: ~/.fastlane/spaceship/[email]/cookie (兩步驗證問題)
3.Matchfile: match 這個action的配置文件,fastlane match init 自動生成,存放git地址等
fastlane 使用
lane的使用
lane是fastfile中的方法定義標簽,可以理解為swift中定義一個函數(shù),前面的 func。fastlane 都是基于ruby,所以fastfile中也是使用ruby語法的。
定義一個簡單的無參lane
lane :package
puts "這是一個lane"
end
定義一個帶參的lane,在fastfile中option類似于一個字典集。我們可以通過 option[:configuration] 取其中value
lane :package do |option|
configuration = option[:configuration]
puts configuration
end
//lane的調(diào)用
package(configuration: 'Release', export_method: 'ad-hoc')
Action
除開我們自定義fastfile中的方法,fastlane還提供了很多已經(jīng)寫好的獨立的方法庫,也就是Actions。
Action是Fastlane自動化流程中的最小執(zhí)行單元,直觀上來講就是Fastfile腳本中的一個個命令,而這些命令背后都對應(yīng)一個用Ruby編寫的腳本。
到目前為止,F(xiàn)astlane的工具集大約包含180多個Action,基本上涵蓋了打包,簽名,測試,部署,發(fā)布,庫管理等等移動開發(fā)中涉及到的內(nèi)容。
fastlane actions : 查看action列表
fastlane action action_name:查看具體action 描述
常用Action
Action列表文檔: Actions
我們常用的主要包括下面幾部分,其他action的使用可以參考官方文檔:
- scan => 自動運行測試工具,并且可以生成漂亮的HTML報告
- match => 一個新的證書和配置文件管理工具。把所有需要用到的證書傳到git私有庫上,任何需要配置的機器直接用match同步回來就不用管證書問題了
- gym => Fastlane家族的自動化編譯工具,和其他工具配合的非常默契
- deliver => 自動上傳截圖,APP的元數(shù)據(jù),二進制(ipa)文件到iTunes Connect
- pilot => 管理TestFlight的測試用戶,上傳二進制文件
- spaceship => 為pilot,boarding和deliver等工具提供和 iTC 和 ADC 的交互API。spaceship本來是個獨立的項目,后來被Fastlane收編進來 非官方的iTunes Connect JSON API的文檔
常用Action使用
scan
release情況下無法正常運行scan,需要手動去Build Setting中更改enable Testability 在release 下的狀態(tài),改為 yes才可以運行。但是官方不建議做release下開啟,Test一般在development configuration 下執(zhí)行。
match
一個新的證書和配置文件管理工具。它會把所有需要用到的證書傳到git私有庫上,任何需要配置的機器直接用match同步回來就不用管證書問題了。保證大家用的都是同一份。不過我們一般都是一臺機器需要用到distribution證書,所以意義不大。
1.match只認識通過match方式創(chuàng)建的pp文件 證書,其他方式創(chuàng)建的不予理會。
2.使用match 需要先撤銷現(xiàn)在的證書。
3.如果蘋果端的證書,pp文件已刪除,那么遠端git上的文件也會失效,并且在重新match的時候會失敗,好像就只能刪光 git端內(nèi)容,重新match一遍。
常用參數(shù):
git_url : 指定對應(yīng)git地址
git_branch : 指定對應(yīng)branch
type :請求文件類型, appstore, adhoc, development, enterprise
app_identifier : app_bundle_identify
clone_branch_directly : 只更新對應(yīng)branch,只有在存在這個branch時才生效
force_for_new_devices : 如果設(shè)備devices列表更新了,就強制更新配置概要文件
verbose :打印出額外的信息和所有的命令
gym
常用參數(shù):
scheme :指定打的哪個scheme
project :指定project (未使用cocopods)
workspace :指定workspace (使用cocopods)
clean :打包前clean
xcargs : 附加一些參數(shù)傳遞給xcodebuild 如: xcargs: 'DEBUG_INFORMATION_FORMAT="dwarf-with-dsym"',
export_method :出包方法 app-store, ad-hoc, package, enterprise, development
configuration : 指定構(gòu)建App的配置 Release、Debug、自定義
output_directory : 輸出目錄
output_name :輸出名稱
include_symbols :是否包含調(diào)試符號
include_bitcode :是否開啟bitcode
純swift工程打包,在非appstore證書下簽出來的包都缺少一個swiftsupport文件夾,里面放的是swift的支持庫。
deliver
用于直接發(fā)包到appstore,可以選擇跳過圖片和元數(shù)據(jù)上傳,只提包,后面再配圖和數(shù)據(jù):如下 skip_screenshots 和 skip_metadata 參數(shù)
deliver(
ipa: "#{OUTPUT_DIRECTORY}" + "/" + "#{IPA_NAME}",
skip_screenshots: true,
skip_metadata: true
)
pilot
用于發(fā)布testflight內(nèi)部測試,屬于testflight action的別名
常用參數(shù):
ipa :要提交的包地址
team_name、team_id :如果有多個team 用于區(qū)分team
skip_waiting_for_build_processing : 在提交完成后的等待是否跳過,一般跳過
changelog
testflight(
ipa : '../xx.ipa'
)
spaceship [常見問題官方解釋]
spaceship其實一般fastfile中不會使用到,但是由于涉及到與ADC的通信,會出現(xiàn)一些奇奇怪怪的問題,所以對它也要有一點了解。
當?shù)谝淮问褂胒astlane安裝的時候,會要求輸入賬號密碼核實你的身份來連接ADC,這個時候你提供的登錄驗證會處理為會話存到 spaceship 的 cookie,會話大概一個月有效期,一個月后失效,通常我們只有在打包失敗后才會發(fā)現(xiàn)這個問題。
上面提到的這些action都是常用的,正常打包流程必不可少的部分,還有一些常用于輔助作用的Action
-
resign :重新簽名
fastlane sigh resign dev.ipa --signing_identity "證書ID" -p “dev.mobileprovision"
get_info_plist_value :獲取info.plist中得某個key的值
set_info_plist_value :設(shè)置info.plist中得某個key的值
increment_build_number :自動遞增項目build號
increment_version_number :自動遞增項目版本號
get_version_number: 獲取版本號(新fastlane版本不能再添加scheme參數(shù),只需要target即可)
以上兩個都需要先配置好xcode, 配置文檔
自定義Action
由于開發(fā)需求各自不同,已有的action不滿足的情況下,F(xiàn)astlane支持定義自己的Action。Fastlane為我們提供了現(xiàn)成的模板,即使你對Ruby的語法不熟悉,也沒有關(guān)系,F(xiàn)astlane是開源的嘛,可以直接下載源碼看看別人的Action是怎么寫的就知道了,我們可以在這個目錄下找到所有的Action文件:
假設(shè),我們針對pod的執(zhí)行創(chuàng)建一個action來針對下面三種情況的執(zhí)行
pod install --no-repo-update (避免master repo的每次更新耗時)
pod update --no-repo-update (避免master repo的每次更新耗時)
pod repo update XXX (私有repo的更新)
自定義Action的流程大約如下,首先,我們在終端中執(zhí)行命令:
fastlane new_action
然后根據(jù)提示,在命令行中敲入action的名字pod,然后Fastlane會在當前目錄的actions文件夾中幫我們創(chuàng)建了一個pod.rb的Ruby文件 (此處只有部分代碼)
module Fastlane
module Actions
module SharedValues
POD_CUSTOM_VALUE = :POD_CUSTOM_VALUE
end
class PodAction < Action
def self.run(params)
UI.message "Parameter API Token: #{params[:api_token]}"
end
......
def self.available_options
# Define all options your action supports.
end
......
可以看到,自定義的Action都是隸屬于Fastlane/Actions這個module,并且繼承自Action這個父類。雖然模板中的內(nèi)容還挺多,不過不用擔心,大部分內(nèi)容都是一些簡單的文本描述,對于我們來說只需要重點關(guān)注這兩個方法就行:
- self.run方法:這里放置的是實際的業(yè)務(wù)處理代碼。
- self.available_options方法:這里聲明需要對外暴露出的參數(shù),沒有聲明的參數(shù)在執(zhí)行過程中無法使用。
最終寫完結(jié)果如下:
module Fastlane
module Actions
module SharedValues
POD_INSTALL_CUSTOM_VALUE = :POD_INSTALL_CUSTOM_VALUE
end
class PodInstallAction < Action
def self.run(params)
repo = "-no-repo-update"
command = []
command << "pod install"
if params[:repo_update]
repo = "--repo-update"
end
command << repo
if params[:verbose]
command << "--verbose"
end
result = Actions.sh(command.join(' '))
UI.success(command.join(' ') + " Successfully ")
return result
end
def self.description
"pod install action"
end
def self.details
"verbose / repo-update"
end
def self.available_options
[
FastlaneCore::ConfigItem.new(key: :verbose,
description: "Allow output detail in console",
optional: true,
is_string: false,
default_value: false),
FastlaneCore::ConfigItem.new(key: :repo_update,
description: "Allow output detail in console",
optional: true,
is_string: false,
default_value: false)
]
end
def self.output
end
def self.return_value
end
def self.authors
["yang"]
end
def self.is_supported?(platform)
platform == :ios
end
end
end
end
Action引用機制
遠程引用
# 遠程Git引用:
import_from_git(url: 'https://github.com/xilankong/ruby', branch: 'master')
# 復(fù)寫發(fā)布項目的lane
lane :do_deliver_app do |options|
# ...
end
本地引用
import "../GeneralFastfile"
actions_path '../custom_actions_folder/'
lane :appstore do |options|
# ...
end
Plugin
我們在使用Fastlane的時候常常會遇到這樣的場景:
- 我的自定義Action需要在多個內(nèi)部項目中使用
- 我覺得這個自定義Action很不錯,想共享給其他的團隊使用
此時,拷貝粘貼雖然可以解決問題,但并不是一個聰明的方案。將Action發(fā)布到Fastlane的官方倉庫倒是一個不錯的選擇,但是官方倉庫本身對Action的要求比較高,并不會接收非通用性的Action,即使接收了,整個發(fā)布周期也會比較長,而且以后無論是升級還是Bug修復(fù),都依賴Fastlane本身的發(fā)版,大大降低了靈活性。
所以從1.93開始,F(xiàn)astlane提供了一種Plugin的機制來解決這種問題。大家可以理解為:Plugin就是在Action的基礎(chǔ)上做了一層包裝,這個包裝巧妙的利用了RubyGems這個相當成熟的Ruby庫管理系統(tǒng),所以其可以獨立于Fastlane主倉庫進行查找,安裝,發(fā)布和刪除。
我們甚至可以簡單的認為:Plugin就是RubyGem封裝的Action,我們可以像管理RubyGems一樣來管理Fastlane的Plugin。
但是,如果為了多項目共享任務(wù),或者共享fastfile,可以通過Action的遠程引用機制。所以Plugin不過多介紹。
持續(xù)化打包還需要的Action
1.monkey
2.ftp 提交遠程服務(wù)器 (已解決)
3.測試日志解析
4.jira提交bug
5.自動打framework (已解決)
常見問題
1、gem源問題
gem ruby源已更新為 https://gems.ruby-china.com,本機版本2.7.7
$ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
$ gem sources -l
https://gems.ruby-china.com
# 確保只有 gems.ruby-china.com
2、ruby版本必須高于2.0,測試本機2.0也無效,所以最好2.0+
以下是之前2.3.1正常安裝的時候的操作:
rvm安裝
curl -L get.rvm.io | bash -s stable
安裝成功后、啟用rvm
source ~/.bashrc
source ~/.bash_profile
測試安裝結(jié)果
rvm -v
升級ruby
rvm install 2.3.1
查看安裝的所有ruby
rvm list
切換ruby
rvm use 2.3.1
設(shè)置rvm默認版本
rvm --default 2.3.1
fastlane 安裝:
sudo gem install -n /usr/local/bin fastlane
在10.13上安裝ruby 2.4.0的時候出現(xiàn)一個問題,由于ssl3的無問題,ruby鏡像一直無法下載
No binary rubies available for: osx/10.13/x86_64/ruby-2.4.0.
ruby curl: (35) error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
初步懷疑ssl問題,但具體解決方案沒找到
選擇離線安裝的辦法
3、Jenkins 環(huán)境 RVM未激活問題
比如Mac自帶的Ruby版本不符合你的需求,一般會使用RVM重新裝一個Ruby版本,但是這樣導(dǎo)致
Jenkins中獲取不到在目標服務(wù)器安裝的最新RVM 和 ruby、fastlane、cocoapods等
解決方案 :
~/.bashrc 、~/.zshrc 、~/.zlogin 內(nèi)容
PATH=$PATH:$HOME/.rvm/bin
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM
在jenkins執(zhí)行腳本內(nèi) 啟用RVM:
source $HOME/.rvm/scripts/rvm
或者 source ~/.bashrc
解決辦法二:
新版本的Jenkins可以安裝 RVM 插件,具體可以百度,然后配置里填寫上你打包機當前用戶配置的RVM版本即可
4、關(guān)于開啟兩步驗證如何全自動化問題
開啟兩步驗證后,提交testfilght或者appstore會出現(xiàn)如下提示,要求手動確認并 輸入6位code
Two Factor Authentication for account 'xxxxx@xx.com' is enabled
If you're running this in a non-interactive session (e.g. server or CI)
check out https://github.com/fastlane/fastlane/tree/master/spaceship#2-step-verification
Please enter the 6 digit code:
這樣明顯影響全自動化提交操作。
解決方案:
fastlane提供的兩步驗證解決方案:
1.訪問 https://appleid.apple.com/account/manage
2.生成一個 APP-SPECIFIC PASSWORDS,保留生成的特殊密碼
3.使用環(huán)境變量提供這個密碼給fastlane: FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD
4.執(zhí)行fastlane spaceauth -u user@email.com,生成session cookie。
5.通過環(huán)境變量FASTLANE_SESSION 提供session cookies。
配置地方:
打包機:~/.bash_profile 中,配置 FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD 和 FASTLANE_SESSION
例如:
export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=特殊密碼
export FASTLANE_SESSION=session cookie
本機使用的是Item2 /bin/zsh 所以配置在 ~/.bash_profile
Jenkins:配置對應(yīng)環(huán)境變量即可
還有一個小伙伴告知另一個配置方式
ENV["FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD"] = "xxxxxx"
這個和環(huán)境變量配置是一個意思,但是涉及密碼寫在配置文件里面
但是,本文測試一個月后發(fā)現(xiàn)依然失效,最后選擇的方案是開設(shè)一個未開啟兩步驗證的賬號作為開發(fā)賬號的子賬號專門用來打包。
如有不過期方式,歡迎補充
6、fastlane gym produces error: method `to_plist' not defined in Array #11503
在執(zhí)行g(shù)ym的時候出現(xiàn)如上問題,或者跑fastlane action gym的時候出現(xiàn)
解決辦法:終端命令
rvm @global do gem uninstall fastlane
rvm all do gem uninstall fastlane
gem uninstall fastlane
gem install fastlane
sudo gem install fastlane (jenkins權(quán)限問題)
例子:
rvm @global do gem uninstall fastlane
Select gem to uninstall:
1. fastlane-2.47.0
2. fastlane-2.49.0
3. fastlane-2.51.0
4. fastlane-2.53.1
5. fastlane-2.55.0
6. fastlane-2.57.2
7. fastlane-2.58.0
8. fastlane-2.62.1
9. fastlane-2.85.0
10. fastlane-2.86.2
11. All versions
> 11
Successfully uninstalled fastlane-2.47.0
Successfully uninstalled fastlane-2.49.0
Successfully uninstalled fastlane-2.51.0
Successfully uninstalled fastlane-2.53.1
Successfully uninstalled fastlane-2.55.0
Successfully uninstalled fastlane-2.57.2
Successfully uninstalled fastlane-2.58.0
Successfully uninstalled fastlane-2.62.1
Successfully uninstalled fastlane-2.85.0
Remove executables:
bin-proxy, fastlane
in addition to the gem? [Yn] y
Removing bin-proxy
Removing fastlane
Successfully uninstalled fastlane-2.86.2
[10:42:40] young:~ $ rvm all do gem uninstall fastlane
Select gem to uninstall:
1. fastlane-2.80.0
2. fastlane-2.85.0
3. All versions
> 3
Successfully uninstalled fastlane-2.80.0
Remove executables:
bin-proxy, fastlane
in addition to the gem? [Yn] y
Removing bin-proxy
Removing fastlane
Successfully uninstalled fastlane-2.85.0
[10:42:55] young:~ $ gem uninstall fastlane
[10:43:01] young:~ $ gem install fastlane
Fetching: fastlane-2.86.2.gem (100%)
Successfully installed fastlane-2.86.2
Parsing documentation for fastlane-2.86.2
Installing ri documentation for fastlane-2.86.2
Done installing documentation for fastlane after 23 seconds
1 gem installed
7、附錄一份簡單的fastfile文件,涉及到私密數(shù)據(jù)部分地方會符號代替, 與fastlane無關(guān)的部分會刪除,本文用的是Jenkins + fastlane + apphost ,以下提供部分fastfile文件、Jenkins shell、本地腳本fastlane.sh
fastfile 部分
#聲明
APP_NAME = “XXX”
WORKSPACE = “XXX.xcworkspace"
SCHEME = “XXX”
IPA_TIME = Time.now.strftime("%Y%m%d_%H%M")
OUTPUT_DIRECTORY = "packages"
APP_INFO_PLIST_PATH = ‘./XXX/Info.plist'
ENV_PREFIX=""
IPA_NAME = ""
platform :ios do
#
before_all do
xcode_select "/Applications/Xcode.app"
FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT = "40"
end
#debug包
lane :iosDebug do
ENV_PREFIX="debug_"
EXPORT_METHOD = "development"
package(configuration: "Debug")
end
#release包
lane :iosRelease do
ENV_PREFIX="adhoc_"
EXPORT_METHOD = "ad-hoc"
package(configuration: "Release")
end
#發(fā)布包
lane :iosAppStore do
ENV_PREFIX="appstore_"
EXPORT_METHOD = "app-store"
package(configuration: "Release")
end
#打包函數(shù)
lane :package do |option|
cocoapods
PLIST_INFO_VERSION = get_version_number(target: "#{SCHEME}")
PLIST_BUILD_VERSION = get_info_plist_value(path: "#{APP_INFO_PLIST_PATH}", key: 'CFBundleVersion')
IPA_NAME = "#{ENV_PREFIX}" + "#{APP_NAME}_" + "#{IPA_TIME}_" + "#{PLIST_INFO_VERSION}" +"_#{PLIST_BUILD_VERSION}"+ ".ipa"
#打包
gym(
scheme: "#{SCHEME}",
export_method: "#{EXPORT_METHOD}",
configuration: option[:configuration],
output_directory: "#{OUTPUT_DIRECTORY}",
include_symbols: true,
include_bitcode: false,
xcargs: 'DEBUG_INFORMATION_FORMAT="dwarf-with-dsym"',
output_name: "#{IPA_NAME}",
export_xcargs: "-allowProvisioningUpdates"
)
xcclean(
workspace: "#{WORKSPACE}",
scheme: "#{SCHEME}"
)
end
Jenkins部分腳本
#!/bin/bash -l
sh ./script/fastlane.sh "Debug"
fastlane.sh部分腳本
#解決ArgumentError - invalid byte sequence in US-ASCII錯誤
#修改終端語言、地區(qū)等國際化環(huán)境變量
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export PATH=$PATH:/usr/local/bin
#更換ruby環(huán)境,對應(yīng)的修改有 打包機下面的 .bashrc .zshrc .zlogin
source $HOME/.rvm/scripts/rvm #source ~/.bashrc
#解鎖keychain,是其它工具可以訪問證書,解鎖后設(shè)置keychain關(guān)閉時間為1小時, xxx為用戶名
security -v unlock-keychain -p "xxx" "/Users/xxx/Library/Keychains/login.keychain"
security set-keychain-settings -t 3600 -l "/Users/xxx/Library/Keychains/login.keychain"
/usr/local/bin/pod update --verbose --no-repo-update
# fastlane profile
if [[ $1 == "Debug" ]]; then
fastlane iosDebug
elif [[ $1 == "Release" ]]; then
fastlane iosRelease
elif [[ $1 == "TestFlight" ]]; then
fastlane iosTestFlight
elif [[ $1 == "AppStore" ]]; then
fastlane iosAppStore
fi