Fastlane 基礎打包配置

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, 需要在 Gemfilefastlane初始化的時候創(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'
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耐齐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蒋情,更是在濱河造成了極大的恐慌埠况,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棵癣,死亡現(xiàn)場離奇詭異辕翰,居然都是意外死亡,警方通過查閱死者的電腦和手機狈谊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門喜命,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人河劝,你說我怎么就攤上這事壁榕。” “怎么了赎瞎?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵牌里,是天一觀的道長。 經(jīng)常有香客問我煎娇,道長二庵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任缓呛,我火速辦了婚禮催享,結果婚禮上,老公的妹妹穿的比我還像新娘哟绊。我一直安慰自己因妙,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布票髓。 她就那樣靜靜地躺著攀涵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洽沟。 梳的紋絲不亂的頭發(fā)上以故,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音裆操,去河邊找鬼怒详。 笑死炉媒,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的昆烁。 我是一名探鬼主播吊骤,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼静尼!你這毒婦竟也來了白粉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鼠渺,失蹤者是張志新(化名)和其女友劉穎鸭巴,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體系冗,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡奕扣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了掌敬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惯豆。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奔害,靈堂內(nèi)的尸體忽然破棺而出楷兽,到底是詐尸還是另有隱情,我是刑警寧澤华临,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布芯杀,位于F島的核電站,受9級特大地震影響雅潭,放射性物質發(fā)生泄漏揭厚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一扶供、第九天 我趴在偏房一處隱蔽的房頂上張望筛圆。 院中可真熱鬧,春花似錦椿浓、人聲如沸太援。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽提岔。三九已至,卻和暖如春笋敞,著一層夾襖步出監(jiān)牢的瞬間碱蒙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工夯巷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留振亮,地道東北人巧还。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像坊秸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子澎怒,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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

  • 毋庸置疑褒搔,Jenkins對我們打包的幫助還是很大的——被測試的同學追著要IPA包的日子終于一去不復返了。但作為追求...
    iOS逆向開發(fā)閱讀 1,546評論 2 10
  • fastlane運行所需要的環(huán)境: OS X 10.9以上 Ruby 2.0 以上 Xcode 擁有一個開發(fā)者賬號...
    阿姣_0405閱讀 2,962評論 0 4
  • 毋庸置疑喷面,Jenkins對我們打包的幫助還是很大的——被測試的同學追著要IPA包的日子終于一去不復返了星瘾。但作為追求...
    _VisitorsZsl閱讀 1,155評論 0 4
  • 更新節(jié)點:2019-05-15由于fastlane更新頻繁,已更新到 2.105.2 2.122.0更新內(nèi)容:fa...
    就叫yang閱讀 61,804評論 73 146
  • 距離上次寫iOS 中使用Jenkins進行持續(xù)集成有一段時間了惧辈。毋庸置疑琳状,Jenkins對我們打包的幫助還是很大的...
    有涯逐無涯閱讀 665評論 0 1