iOS中使用Fastlane實(shí)現(xiàn)自動(dòng)化打包和發(fā)布

簡(jiǎn)介

Fastlane是一套使用Ruby寫(xiě)的自動(dòng)化工具集庵朝,用于iOS和Android的自動(dòng)化打包吗冤、發(fā)布等工作又厉,可以節(jié)省大量的時(shí)間。

Fastlane

Github:https://github.com/fastlane/fastlane
官網(wǎng):https://fastlane.tools/
文檔:https://docs.fastlane.tools/

在寫(xiě)這篇文章的時(shí)候椎瘟,他在Github上已經(jīng)有15000+ star覆致。

安裝

1、首先要安裝正確的 Ruby 版本肺蔚。在終端窗口中用下列命令來(lái)確認(rèn):

ruby -v

2煌妈、然后檢查 Xcode 命令行工具是否安裝。在終端窗口中輸入命令:

xcode-select --install

如果未安裝宣羊,終端會(huì)開(kāi)始安裝璧诵,如果報(bào)錯(cuò)誤:
command line tools are already installed, use "Software Update" to install updates.代表已經(jīng)安裝。

3仇冯、以上依賴(lài)配置好之后就可以通過(guò) rubygem 進(jìn)行安裝了:

$ sudo gem install fastlane

安心等待一會(huì)之宿,fastlane就安裝完成了。

初始化

打開(kāi)終端苛坚,cd到你的工程目錄比被,然后執(zhí)行fastlane init

$ cd to/your/ios/project 
$ fastlane init
[14:21:43]: Detected iOS/Mac project in current directory...
[14:21:43]: This setup will help you get up and running in no time.
[14:21:43]: fastlane will check what tools you're already using and set up
[14:21:43]: the tool automatically for you. Have fun! 
[14:21:43]: Created new folder './fastlane'.
[14:21:43]: $ xcodebuild -showBuildSettings -project ./xxx.xcodeproj
[14:21:48]: Your Apple ID (e.g. fastlane@krausefx.com): xxx@xxx.xom
[14:21:54]: Verifying that app is available on the Apple Developer Portal and iTunes Connect...
[14:21:54]: Starting login with user 'xxx@xxx.com'

+----------------+--------------------------------------+
|                    Detected Values                    |
+----------------+--------------------------------------+
| Apple ID       | xxx@xxx.com                    |
| App Name       | xxx                            |
| App Identifier | com.xxx.xxx                |
| Project        | /Users/lisong/Desktop/xxx/x  |
|                | xx.xcodeproj                     |
+----------------+--------------------------------------+

[14:22:06]: Please confirm the above values (y/n)
y
[14:22:09]: Created new file './fastlane/Appfile'. Edit it to manage your preferred app metadata information.
[14:22:09]: Loading up 'deliver', this might take a few seconds
[14:22:09]: Login to iTunes Connect (xxx@xxx.com)
[14:22:13]: Login successful

+-----------------------+------------------------+
|             deliver 2.30.1 Summary             |
+-----------------------+------------------------+
| screenshots_path      | ./fastlane/screenshots |
| metadata_path         | ./fastlane/metadata    |
| username              | xxx@xxx.com      |
| app_identifier        | com.xxx.xxx  |
| edit_live             | false                  |
| platform              | ios                    |
| skip_binary_upload    | false                  |
| skip_screenshots      | false                  |
| skip_metadata         | false                  |
| force                 | false                  |
| submit_for_review     | false                  |
| automatic_release     | false                  |
| dev_portal_team_id    | WKR87TTKML             |
| overwrite_screenshots | false                  |
+-----------------------+------------------------+

[14:22:21]: Writing to 'fastlane/metadata/zh-Hans/description.txt'
...
[14:22:21]: Writing to 'fastlane/metadata/review_information/notes.txt'
[14:22:21]: Successfully created new configuration files.
[14:22:22]: Successfully downloaded large app icon
[14:22:22]: Downloading all existing screenshots...
[14:22:27]: Downloading existing screenshot '1_iphone4_1.1.jpg' for language 'zh-Hans'
···
[14:22:34]: Downloading existing screenshot '5_iphone6_5.5.jpg' for language 'zh-Hans'
[14:22:34]: Successfully downloaded all existing screenshots
[14:22:34]: Successfully created new Deliverfile at path 'fastlane/Deliverfile'
[14:22:34]: $ xcodebuild -list -project ./xxx.xcodeproj
[14:22:35]: 'snapshot' not enabled.
[14:22:35]: 'cocoapods' enabled.
[14:22:35]: 'carthage' not enabled.
[14:22:35]: Created new file './fastlane/Fastfile'. Edit it to manage your own deployment lanes.
[14:22:35]: fastlane will collect the number of errors for each action to detect integration issues
[14:22:35]: No sensitive/private information will be uploaded
[14:22:35]: Learn more at https://github.com/fastlane/fastlane#metrics
[14:22:35]: Successfully finished setting up fastlane

在 "Your Apple ID" 這一步輸入蘋(píng)果開(kāi)發(fā)者賬號(hào)。在“Please confirm the above values”這一步泼舱,確認(rèn)信息等缀,沒(méi)問(wèn)題輸入 y。然后娇昙,fastlane 會(huì)進(jìn)行一系列的初始化操作尺迂,包括下載 App Store 上的元數(shù)據(jù)和截屏文件。

等待初始化完成之后冒掌,工程目錄下就多了一個(gè) fastlane目錄噪裕,其內(nèi)容如下:


fastlane目錄

咱們來(lái)看兩個(gè)主要的,Appfile和Fastfile宋渔。

Appfile

Appfile用來(lái)存放app_identifier州疾,apple_idteam_id了解詳情皇拣,它的格式是這樣的:

app_identifier "com.xxx.xxx" # app的bundle identifier
apple_id "xxx@xxx.com" # 你的Apple ID

team_id "XXXXXXXXXX" # Team ID
···

你也可以為每個(gè)lane(后面會(huì)講到)提供不同的 app_identifier, apple_idteam_id严蓖,例如:

app_identifier "com.aaa.aaa"
apple_id "aaa@aaa.com"
team_id "AAAAAAAAAA"

for_lane :inhouse do
  app_identifier "com.bbb.bbb"
  apple_id "bbb@bbb.com"
  team_id "AAAAAAAAAA"
end

這里就是為Fastfile中定義的:inhouse設(shè)置單獨(dú)的信息。

Fastfile

Fastfile管理你所創(chuàng)建的 lane氧急, 了解詳情颗胡。它的格式是這樣的:

···
# 自動(dòng)更新fastlane 工具
# update_fastlane

#需要的fastlane的最小版本,在每次執(zhí)行之后會(huì)檢查是否有新版本吩坝,如果有會(huì)在最后末尾追加新版本提醒
fastlane_version "2.30.1"

#默認(rèn)使用平臺(tái)是 ios毒姨,也就是說(shuō)文件可以定義多個(gè)平臺(tái)
default_platform :ios

platform :ios do
  before_all do
    # ENV["SLACK_URL"] = "https://hooks.slack.com/services/..."
    cocoapods

  end

  desc "Runs all the tests"
  lane :test do
    scan
  end

  desc "提交一個(gè)新的Beta版本到 Apple TestFlight"
  desc "This will also make sure the profile is up to date"
  lane :beta do
    # match(type: "appstore") # more information: https://codesigning.guide
    gym(scheme: "Docment") # Build your app - more options available
    pilot

    # sh "your_script.sh"
  end

  desc "部署一個(gè)新版本到App Store"
  lane :release do
    # match(type: "appstore")
    # snapshot
    gym(scheme: "Docment") # Build your app - more options available
    deliver(force: true)
    # frameit
  end

  # 你可以定義自己的lane

  #執(zhí)行l(wèi)ane成功后的回調(diào)
  after_all do |lane|
    # slack(
    #   message: "Successfully deployed new App Update."
    # )
  end

  # 如果流程發(fā)生異常會(huì)走這里并終止
  error do |lane, exception|
    # slack(
    #   message: exception.message,
    #   success: false
    # )
  end
end

我們也可以定義一個(gè)自己的lane:

  desc "企業(yè)版"
  lane :inHouse do
  gym(scheme: "XXX",
      export_method:"enterprise",
      output_directory:"./build", # 打包后的 ipa 文件存放的目錄
      output_name:"XXX.ipa"  # ipa 文件名
   )
  end

其中一個(gè)lane就是一個(gè)任務(wù),里面是一個(gè)個(gè)的action組成的工作流钉寝。
利用目前支持的工具可以做所有包含自動(dòng)化和可持續(xù)化構(gòu)建的每個(gè)環(huán)節(jié)弧呐,例如:

  • scan 自動(dòng)化測(cè)試工具闸迷,很好的封裝了 UnitTest
  • sigh 針對(duì)于 iOS 項(xiàng)目開(kāi)發(fā)證書(shū)和 Provision file 的下載工具
  • match 同步團(tuán)隊(duì)每個(gè)人的證書(shū)和 Provision file 的超贊工具
  • gym 針對(duì)于 iOS 編譯打包生成 ipa 文件
  • deliver 用于上傳應(yīng)用的二進(jìn)制代碼,應(yīng)用截屏和元數(shù)據(jù)到 App Store
  • snapshot 可以自動(dòng)化iOS應(yīng)用在每個(gè)設(shè)備上的本地化截屏過(guò)程

執(zhí)行

定義完lane之后怎么執(zhí)行呢俘枫?打開(kāi)終端腥沽,切換到項(xiàng)目的根目錄:執(zhí)行fastlane lane'name就可以了。成功之后會(huì)在相應(yīng)的路徑下生成ipa文件今阳,如果報(bào)錯(cuò)的話(huà)就根據(jù)錯(cuò)誤信息好好查看文檔

其他

1盾舌、這里是官方提供的一些例子蘸鲸。
2妖谴、想了解fastlane命令的話(huà)可以執(zhí)行$ fastlane --help
3、查看可用任務(wù)的列表酌摇,可以執(zhí)行命令$ fastlane lanes
4、fastlane也提供了很多插件方便我們使用妙痹,例如pgyer(發(fā)布app到蒲公英)鼻疮。我們也可以打完包直接傳到蒲公英上怯伊,具體的可以看蒲公英提供的文檔
如果你感覺(jué)有些插件不符合自己的情況判沟,你甚至可以自定義插件
5耿芹、多個(gè) lane 的話(huà)實(shí)際上是可以相互調(diào)用的挪哄,這個(gè)其實(shí)特別實(shí)用。例如:

default_platform :ios

platform :ios do

  lane :prepare do
    cocoapods
    match
  end


  desc 'fastlane build'   'fastlane build type:adhoc'
  lane :build do |options|
    # 調(diào)用上面的 prepare 任務(wù)
    prepare

    case options[:type]
    when 'adhoc'
      adhoc
    else
      appstore
    end
  end


  lane : adhoc do
  ···
  end

  lane : appstore do
  ···
  end

end

6砸彬、我們可以在 Fastfile 文件中添加一個(gè)函數(shù)來(lái)設(shè)置version號(hào)和build號(hào)斯入。

default_platform :ios

def prepare_version(options)
    increment_version_number(
        version_number: options[:version]
    )

    increment_build_number(
        build_number: options[:build]
    )
end

然后可以在一個(gè)lane中使用這個(gè)函數(shù):

lane :appstore do |options|
   ···
    prepare_version(options)
   ···
end

然后執(zhí)行這個(gè)lane的時(shí)候:

$ fastlane appstore version:2.4.0 build:2.0

好啦,先說(shuō)到這里吧刻两,F(xiàn)astlane能做的事情還有很多,大家可以去好好看看文檔滋迈,研究一些高級(jí)的用法吧!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幕侠,一起剝皮案震驚了整個(gè)濱河市赔退,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌硕旗,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件创译,死亡現(xiàn)場(chǎng)離奇詭異墙基,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)残制,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)立砸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人颗祝,你說(shuō)我怎么就攤上這事恼布。” “怎么了折汞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵爽待,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我堕伪,道長(zhǎng),這世上最難降的妖魔是什么蹄梢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮而咆,結(jié)果婚禮上幕袱,老公的妹妹穿的比我還像新娘氮凝。我一直安慰自己记罚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布障癌。 她就那樣靜靜地躺著辩尊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摄欲。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天我注,我揣著相機(jī)與錄音迟隅,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呀伙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播箫锤,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼雨女,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了馏臭?” 一聲冷哼從身側(cè)響起讼稚,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绕沈,失蹤者是張志新(化名)和其女友劉穎帮寻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體浅蚪,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烫罩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年嗡髓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饿这。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡长捧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出串结,到底是詐尸還是另有隱情,我是刑警寧澤卧蜓,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布把敞,位于F島的核電站,受9級(jí)特大地震影響奋早,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜愤炸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一掉奄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绰姻,春花似錦、人聲如沸狂芋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屡萤。三九已至,卻和暖如春招拙,著一層夾襖步出監(jiān)牢的瞬間措译,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工规哪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留塌衰,地道東北人诉稍。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓杯巨,卻偏偏與公主長(zhǎng)得像努酸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蚊逢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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