項(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 來(lái)管理多環(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 來(lái)分組和管理不同組合的 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)目的過程中來(lái)選擇不同的configuration,需要用到Xcode Scheme。

2、Xcode Scheme

我們可以在New scheme中來(lái)創(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)建配置文件),我們可以使用它來(lái)為 Project 或 Target 定義一組 Build Setting。由于它是一個(gè)純文本文件,我們可以使用 Xcode 以外的其他文本編輯器來(lái)修改,而且可以保存到 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)境來(lái)區(qū)別展示出來(lái)。

二、fastlane打包

概述

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

1、fastlane安裝

建議使用rbenv來(lái)管理fastlane和cocoapods,但電腦中一直是ruby直接安裝的,就按直接安裝的順序來(lái)說吧。

打開終端

  • 確認(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 - 用來(lái)配置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)完成,接下來(lái)就是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

就可以打包成功啦?。。。?/p>

三、Jenkins集成

概述

在可以成功使用fastlane進(jìn)行自動(dòng)化打包之后,接下來(lái)進(jìn)行第三步,通過Jenkins來(lái)進(jìn)行配置,做到通過選擇環(huán)境參數(shù),進(jìn)行打包。這里Jenkins的安裝以及其他插件的下載等一系列操作就不做說明了,可以自行百度。主要是來(lái)看怎么通過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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容