fastlane使用說明書

更新節(jié)點:2019-05-15

由于fastlane更新頻繁,已更新到 2.105.2 2.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

Actions列表

4、 關(guān)于兩步驗證的問題

老樣子,沒有什么進步,依然是specific password 和cookies 進行一個月的保存,還是需要每個月更新。

Two-Step

用手機再注冊一個蘋果賬號(不要通過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

文檔地址:

Doc

安裝:

[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文件:

Action_rbs

假設(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)注這兩個方法就行:

  1. self.run方法:這里放置的是實際的業(yè)務(wù)處理代碼。
  2. 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的時候常常會遇到這樣的場景:

  1. 我的自定義Action需要在多個內(nèi)部項目中使用
  2. 我覺得這個自定義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問題,但具體解決方案沒找到

選擇離線安裝的辦法

離線安裝Ruby

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

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