項(xiàng)目中實(shí)現(xiàn)多環(huán)境配置+fastlane+fir+Jenkins總結(jié)

一党饮、實(shí)現(xiàn)多環(huán)境配置

概述

在項(xiàng)目中,分了開發(fā)驳庭、測(cè)試刑顺、預(yù)生產(chǎn)、生產(chǎn)四個(gè)環(huán)境饲常,之前切換環(huán)境蹲堂,是在項(xiàng)目中的配置類中,用一個(gè)宏定義贝淤,進(jìn)行環(huán)境的切換柒竞,每次切換環(huán)境都要修改代碼,有時(shí)還會(huì)被開發(fā)人員提交到Git中播聪,造成代碼問題和沖突朽基。所以就有了對(duì)項(xiàng)目工程進(jìn)行多環(huán)境配置的需求。

實(shí)現(xiàn)

使用 Build Configuration 和 Xcode Scheme 來管理多環(huán)境离陶,進(jìn)而構(gòu)建出不同環(huán)境版本的 App稼虎。為什么?因?yàn)檫@兩個(gè)是目前管理成本最低的辦法枕磁。

1渡蜻、Build Configuration

當(dāng)我們?cè)?Xcode 上新建一個(gè)項(xiàng)目的時(shí)候,Xcode 會(huì)自動(dòng)生成兩個(gè) Configuration:Debug和Release计济。Debug 用于日常的本地開發(fā)茸苇,Release 用于構(gòu)建和分發(fā) App。
而在我們的項(xiàng)目沦寂,除了Release環(huán)境学密,還另外創(chuàng)建了三個(gè)環(huán)境,對(duì)應(yīng)不同的后臺(tái)服務(wù)器環(huán)境传藏,分別為Development腻暮、Test、PreRelease毯侦。


image.png

Build Configuration就是一組 Build Setting哭靖。 我們可以通過 Build Configuration 來分組和管理不同組合的 Build Setting 集合,然后傳遞給 Xcode 構(gòu)建系統(tǒng)進(jìn)行編譯侈离。

例如:Architecture就可以根據(jù)configuration的環(huán)境進(jìn)行不同的配置


image.png

設(shè)置好了Build Configuration试幽,需要在構(gòu)建項(xiàng)目的過程中來選擇不同的configuration,需要用到Xcode Scheme卦碾。

2铺坞、Xcode Scheme

我們可以在New scheme中來創(chuàng)建新的Scheme起宽,我們創(chuàng)建了四個(gè)不同的Scheme


image.png

然后在Edit Scheme中,為每個(gè)Scheme選擇不同的Configuration


image.png

為了構(gòu)建出不同環(huán)境版本的 App济榨,我們需要經(jīng)常為各個(gè) Build Configuration 下的 Build Setting 設(shè)置不一樣的值坯沪。 在這其中,使用好 xcconfig 配置文件就顯得非常重要擒滑。

3腐晾、xcconfig

xcconfig也叫作 Build configuration file(構(gòu)建配置文件),我們可以使用它來為 Project 或 Target 定義一組 Build Setting橘忱。由于它是一個(gè)純文本文件赴魁,我們可以使用 Xcode 以外的其他文本編輯器來修改,而且可以保存到 Git 進(jìn)行統(tǒng)一管理钝诚。 這樣遠(yuǎn)比我們?cè)?Xcode 的 Build Settings 界面上手工修改要方便很多,而且還不容易出錯(cuò)榄棵。

我們創(chuàng)建了不同環(huán)境的xcconfig文件


image.png

在xcconfig文件中凝颇,我們進(jìn)行如下設(shè)置:

#include "BaseTarget.xcconfig"

PRODUCT_BUNDLE_NAME = $(inherited) 開發(fā)
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) DEVELOPMENT

其中PRODUCT_BUNDLE_NAME需要在info.plist中進(jìn)行更改:


image.png

GCC_PREPROCESSOR_DEFINITIONS這個(gè)在build setting中進(jìn)行設(shè)置:


image.png

這里是為了在代碼中進(jìn)行后臺(tái)服務(wù)器等環(huán)境的配置:

#define NetworkMacro_h

#if DISTRIBUTION
    //生產(chǎn)服務(wù)器
#endif

#if PRERELEASE
    //預(yù)生產(chǎn)服務(wù)器
#endif

#if TEST
    //測(cè)試服務(wù)器
#endif

#if DEVELOPMENT
    //開發(fā)服務(wù)器
#endif

至此,我們就將項(xiàng)目中的多環(huán)境配置好了疹鳄,再打包時(shí)拧略,我們只需要選擇不同的Scheme,就可以生成不同環(huán)境的包了瘪弓,并且app 名字 logo等信息也可以根據(jù)不同環(huán)境來區(qū)別展示出來垫蛆。

二、fastlane打包

概述

配置好了項(xiàng)目中的多環(huán)境腺怯,下一步就是要進(jìn)行自動(dòng)打包處理袱饭,之前用過shell腳本來進(jìn)行打包,這次學(xué)習(xí)了fastlane工具呛占,來進(jìn)行自動(dòng)打包的處理虑乖。

1、fastlane安裝

建議使用rbenv來管理fastlane和cocoapods晾虑,但電腦中一直是ruby直接安裝的疹味,就按直接安裝的順序來說吧。

打開終端

  • 確認(rèn)是否安裝了Xcode命令行工具
xcode-select  --install
  • 如果用的是mac自帶的ruby帜篇,需要 sudo權(quán)限
sudo gem install fastlane
  • 如果報(bào)錯(cuò):ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/commander
sudo gem install -n /usr/local/bin fastlane
2糙捺、fastlane配置

進(jìn)入到項(xiàng)目跟目錄下,注意每個(gè)項(xiàng)目都需要單獨(dú)的初始化一遍fastlane

fastlane init

在包含xxx.xcodeproj的項(xiàng)目目錄下執(zhí)行笙隙,會(huì)生成一個(gè)fastlane目錄洪灯,目錄之下有兩個(gè)文件Fastfile 打包信息文件 和 Appfile app賬號(hào)信息


image.png
  • Appfile - 用來配置app_identifier app_id team_id信息
app_identifier "xxxxxxxx" # App的bundle identifier
apple_id("xxxx@xx.com") # 你的Apple ID
itc_team_id "xxxxxxx" # App Store Connect Team ID
team_id("xxxx") # Developer Portal Team ID
  • Fastfile - 配置自動(dòng)化腳本
    稍后會(huì)詳細(xì)寫明自動(dòng)化腳本
3、fastlane蒲公英以及fir插件安裝
fastlane add_plugin versioning
  • 安裝fir插件
sudo fastlane add_plugin firim
sudo gem install -n /usr/local/bin fir-cli
  • 安裝蒲公英插件
sudo fastlane add_plugin pgyer
  • 如果遇到報(bào)錯(cuò)
sudo fastlane -n /usr/local/bin add_plugin pgyer

這樣操作之后在fastlane文件夾下面逃沿,會(huì)生成一個(gè)Pluginfile文件婴渡,內(nèi)容如下:

# Autogenerated by fastlane
#
# Ensure this file is checked in to source control!

gem 'fastlane-plugin-versioning'
gem 'fastlane-plugin-firim'
gem 'fastlane-plugin-pgyer'
4幻锁、fastlane腳本

至此fastlane打包準(zhǔn)備工作已經(jīng)完成,接下來就是fastlane的腳本边臼,直接如下所示:

# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
#     https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
#     https://docs.fastlane.tools/plugins/available-plugins
#

# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane

default_platform(:iOS)

SCHEME = ""
SCHEME_NAME = "JCJD"
IPA_TIME = Time.now.strftime("%Y%m%d%H%M")
PLIST_INFO_VERSION = get_version_number(target: "#{SCHEME_NAME}")
OUTPUT_DIRECTORY = "./packages"
ENV_PREFIX= ""
OUTPUT_NAME = ""
FIRIM_API_TOKEN = ""
PGY_API_KEY = ""
PGY_USER_KEY = ""

platform :iOS do


  #開發(fā)環(huán)境包
  lane :Development do
    SCHEME = ""
    ENV_PREFIX=""
    EXPORT_METHOD = "development"
    package(configuration: "Development")
  end

  #測(cè)試環(huán)境包
  lane :Test do
    SCHEME = "JCJDDevelopment"
    ENV_PREFIX="JCJD_Test"
    EXPORT_METHOD = "development"
    package(configuration: "Test")
  end

  #預(yù)生產(chǎn)環(huán)境包
  lane :PreRelease do
    SCHEME = "JCJDPreRelease"
    ENV_PREFIX="JCJD_PreRelease"
    EXPORT_METHOD = "development"
    package(configuration: "PreRelease")
  end

  #生產(chǎn)環(huán)境包
  lane :Release do
    SCHEME = "JCJDRelease"
    ENV_PREFIX="JCJD_Release"
    EXPORT_METHOD = "store"
    package(configuration: "Release")
  end


  lane :package do |option|
    
    #導(dǎo)出名稱
    OUTPUT_NAME = "#{ENV_PREFIX}_#{PLIST_INFO_VERSION}_#{IPA_TIME}.ipa"

    puts "#{OUTPUT_NAME}"

    gym(
        export_method: "#{EXPORT_METHOD}", #這里填寫導(dǎo)出方式 包括app-store, ad-hoc, package, enterprise, development
        configuration: option[:configuration],
        scheme: "#{SCHEME}",
        output_directory: "#{OUTPUT_DIRECTORY}",
        output_name: "#{OUTPUT_NAME}",
        export_xcargs: "-allowProvisioningUpdates",
        clean: true
    )

    case option[:configuration]
    when 'PreRelease'
      #打包成功后直接上傳到蒲公英
      pgyer(api_key: "#{PGY_API_KEY}", user_key: "#{PGY_USER_KEY}", update_description: "更新預(yù)生產(chǎn)包")
    else
      #打包成功后直接上傳到fir.im
      firim(firim_api_token: "#{FIRIM_API_TOKEN}")
    end

  end

end

在終端中哄尔,執(zhí)行fastlane腳本:

fastlane PreRelease

就可以打包成功啦!DⅰA虢印!

三臼予、Jenkins集成

概述

在可以成功使用fastlane進(jìn)行自動(dòng)化打包之后鸣戴,接下來進(jìn)行第三步,通過Jenkins來進(jìn)行配置粘拾,做到通過選擇環(huán)境參數(shù)窄锅,進(jìn)行打包。這里Jenkins的安裝以及其他插件的下載等一系列操作就不做說明了缰雇,可以自行百度入偷。主要是來看怎么通過Jenkins進(jìn)行參數(shù)的選擇配置,從而指揮fastlane實(shí)現(xiàn)自動(dòng)化打包械哟。

步驟
  • 下載安裝Git Parameter Plug-In插件

    image.png

  • 創(chuàng)建一個(gè)新項(xiàng)目后疏之,勾選This project is parameterized

  • Add Parameters中選擇添加Git Parameter,并按如下圖設(shè)置:


    image.png
  • Add Parameter中暇咆,再選擇Choice Parameter锋爪,配置如下:


    image.png
  • 在Git中,添加Add Branch爸业,如下圖:


    image.png
  • 最后執(zhí)行fastlane腳本


    image.png
構(gòu)建

選擇Build with Parameters其骄,進(jìn)行構(gòu)建:


image.png

大功告成~!

參考資料:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沃呢,一起剝皮案震驚了整個(gè)濱河市年栓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌薄霜,老刑警劉巖某抓,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惰瓜,居然都是意外死亡否副,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門崎坊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來备禀,“玉大人,你說我怎么就攤上這事∏” “怎么了赋续?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)另患。 經(jīng)常有香客問我纽乱,道長(zhǎng),這世上最難降的妖魔是什么昆箕? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任鸦列,我火速辦了婚禮,結(jié)果婚禮上鹏倘,老公的妹妹穿的比我還像新娘薯嗤。我一直安慰自己,他們只是感情好纤泵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布骆姐。 她就那樣靜靜地躺著,像睡著了一般夕吻。 火紅的嫁衣襯著肌膚如雪诲锹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天涉馅,我揣著相機(jī)與錄音,去河邊找鬼黄虱。 笑死稚矿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捻浦。 我是一名探鬼主播晤揣,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼朱灿!你這毒婦竟也來了昧识?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤盗扒,失蹤者是張志新(化名)和其女友劉穎跪楞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侣灶,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甸祭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褥影。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片池户。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出校焦,到底是詐尸還是另有隱情赊抖,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布寨典,位于F島的核電站氛雪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏凝赛。R本人自食惡果不足惜注暗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望墓猎。 院中可真熱鬧捆昏,春花似錦、人聲如沸毙沾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽左胞。三九已至寇仓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烤宙,已是汗流浹背遍烦。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躺枕,地道東北人服猪。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拐云,于是被迫代替她去往敵國和親罢猪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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