iOS 自動化發佈 Fastlane 本地構建 IPA 並分發

此篇文章相關代碼已經上傳至 GitHub,相關代碼請移步 build_ios_appios

iOS 自動化發佈測試包到 fir.im,以及自動打包上傳 AppStore 並提交審覈...

公司項目都是在 Jenkins 上部署的,打包分發一鍵完成,可有時候 Jenkins 出問題,這就很差玩了,要排查問題仍是挺費勁的,各類問題(公司產品線比較多,各個產品使用的 Xcode 版本不一致,有的是自動簽名,有的須要 profile,打包成功但上傳失敗),總之,最後的結果都是failuregit

儘管測試已經掌握打包祕籍,再也不須要麻煩開發,但鑑於這種失敗failure狀況下,測試人員,跑過來仍是會打擾開發的,還有就是另外一種狀況,開發人員已經解決了這個(多個)問題以後,想當即讓測試驗證,這個時候,就須要在終端terminal敲上一段代碼./fastlane/build_app.sh,喝口水,去趟衛生間,搞定~github

廢話很少說~shell

環境配置

官網安裝 有兩種方式 gem,brewswift

首先必須確認已經安裝xcode命令行工具,若是沒有,使用如下命令xcode

xcode-select --installruby

接下來,就是安裝*fastlane*,使用下面的命令bash

[sudo] gem install fastlane -NVapp

或者使用homebrew,我的推薦使用iphone

brew cask install fastlane

設置 fastlane,體驗自動化打包上傳 App Store

在你的工程目錄下,切記必定是和 *.xcodeproj 同級目錄下, ruby 使用 fastlane init swift 使用 fastlane init swift

接下來會讓你選擇須要的功能模板

1. 📸  Automate screenshots 自動截屏
2. 👩‍✈️  Automate beta distribution to TestFlight 自動分發beta至TestFlight
3. 🚀  Automate App Store distribution 自動上傳IPA到App Store
4. 🛠  Manual setup - manually setup your project to automate your tasks 不使用模板,本身去寫自動打包腳本
複製代碼

筆者先使用第三個模板 ,接下來也是選擇,就直接最後結果吧,完成後,以下面的文件結構

直接使用命令fastlane release,接下來會自動打包,若是項目工程配置沒有問題,就成功了


ok~ 使用模板固然不能知足個人需求的

本文的重點

  • 對 Xcode 項目,編寫一個腳本實現自動打包 ipa 文件
  • 上傳到 fir.im,以供測試人員下載安裝
  • 上傳 itunesconnect 提交審覈

1. 準備工做

前面咱們xcode-selectfastlane這兩個工具都已經安裝完成,接下來還須要安裝 fir-cli

gem install fir-cli

安裝完成後,咱們開始編寫腳本,這裏須要注意的是,本腳本是基於fastlanefir-cli,來完成任務的

fastlane 自己自帶打包ipa、上傳App Store提交審覈、上傳 fir-cli這個主要是將fastlane打包的測試ipa,上傳到fir.im供測試下載安裝

2. 腳本編寫

這個 fastlane 文件夾是在執行 fastlane init 後自動生成的,做者在此基礎上進行修改,其中 build_app.shrepublish.shappstore.envcommon.envdev.env 這幾個文件是筆者本身添加的

└── fastlane
    ├── Appfile           // Appfile用來存放app_identifier,apple_id和team_id
    ├── Deliverfile       // 配置應用在 ITC 中的各類信息,和 ICC 中的數據是一一對應的
    ├── Fastfile          // fastlane 所執行的任務lane文件(核心)
    ├── Gymfile           // fastlane 編譯打包ipa的配置文件
    ├── README.md
    ├── appstore.env      // 上傳至App Store的環境配置文件
    ├── build_app.sh      // 腳本執行命令 ./build_app.sh
    ├── common.env        // 通用環境配置文件
    ├── dev.env           // 編譯測試版本ipa的環境配置文件
    ├── ipa_build         // ipa輸出文件夾(自動生成)
            └──// 編譯好的ipa文件
    ├── metadata          // 執行fastlane deliver init 後自動從itunseconnet上獲取
            └──// 提交App Store審覈的一些元數據信息,包含應用在 ITC 中的各類信息
    ├── report.xml
    ├── republish.sh      // 針對於build_app.sh上傳fir.im失敗狀況,再次上傳ipa至fir.im
    └── screenshots       // 執行fastlane deliver init 後自動從itunseconnet上獲取
            └──// 提交App Store審覈的app宣傳截圖數據
複製代碼

下面咱們來講說這幾個文件裏面的內容 代碼已經上傳至 GitHub,若是使用請移步 build_ios_app,若是覺着對你幫助,那就順手給個 star 吧😄

Appfile

Appfile 用來存放 app_identifier,apple_id 和 team_id,這個文件按照你的 app 信息配置很久沒問題

app_identifier "com.xxx.xxx" # app的bundle identifier
apple_id "xxx@xxx.com" # 你的Apple ID
 
itc_team_id "XXXXXXXXXX" # iTunes Connect Team ID
team_id "XXXXXXXXXX" # Team ID
···
複製代碼

Fastfile

配置管理 lane 任務

#默認使用平臺是 ios,也就是說文件能夠定義多個平臺
default_platform(:ios)

platform :ios do
	before_all do
		# 設置代碼簽名:自動
		enable_automatic_code_signing
		# 跟新構建版本號
		increment_build_number(
			build_number: ENV["build_number"]
		)
	end

	desc "build a test App "
	lane :beta do
		 # 調用 gym 打測試包
		 gym(
		 	configuration:"Debug",
		 	export_method:"development"
		 )
	end

	desc "build a release App "
	lane :release do

	 # 調用 gym 打發布包
	 gym(
	 	configuration:"Release",
	 	export_method:"app-store"
	 	)

	 # 上傳至 iTunes Connect
	 deliver(
        #注意:submit_for_review這個true是提交審覈,false不提交
	 	# skip_binary_upload: true,
	 	submit_for_review: true,
	 	)
	end
	
	after_all do |lane|
	end

	error do |lane, exception|
	end
end
複製代碼

Gymfile

Gymfile 配置打包 ipa 信息,詳細更多參數列表參照 gym/parameters

scheme("xxx")
sdk("iphoneos")  
output_name("xxx.ipa") 
output_directory("./fastlane/ipa_build")
clean(true) 
include_bitcode(false) 
include_symbols(true) 
export_xcargs("allowProvisioningUpdates") 
複製代碼

Deliver

Deliverfile 配置上傳 ITC 信息,上傳下載元數據信息,上傳二進制 ipa 以及提交審覈,詳細更多參照 deliver/parameters

Deliver能夠徹底管理與iTC的交互。其中包括:

上傳和下載多語言截圖 上傳和下載多語言元數據 上傳二進制文件

PS:

  • 若是Deliverfile文件,screenshotsmetadata目錄沒被建立,能夠運行deliver init來建立;
  • 若是你不想修改metadata某些項的信息,直接把對應的文件刪除便可,或者刪除整個目錄,將須要修改的內容放在Deliverfile
  • 若是不想更改截圖,能夠把整個截圖目錄刪除;
  • 若是Deliverfile內配置了screenshotsmetadata相關信息,則會忽略掉screenshotsmetadata目錄下對應的信息;
  • 全部這些表單項也能夠在Deliverfile中指定,Deliverfile中指定的項優先級比文件高
# 若是選擇提交審覈,請認真對照如下參數選項,根據自家App實際狀況配置,若是配置錯誤,將不能提交成功
submission_information({
export_compliance_available_on_french_store: false,
export_compliance_contains_proprietary_cryptography: false,
export_compliance_contains_third_party_cryptography: false,
export_compliance_is_exempt: false,
export_compliance_uses_encryption: false,
export_compliance_app_type: nil,
export_compliance_encryption_updated: false,
export_compliance_compliance_required: false,
export_compliance_platform: "ios",
content_rights_contains_third_party_content: false,
content_rights_has_rights: false,
add_id_info_limits_tracking: true,
add_id_info_serves_ads: true,
add_id_info_tracks_action: false,
add_id_info_tracks_install: false,
add_id_info_uses_idfa: true
});
複製代碼

shell腳本

  • build_app.sh 自動化構建分發的命令執行文件
  • republish.sh 上傳fir.im失敗狀況,再次上傳ipa至fir.im命令
  • common.env 腳本通用環境變量配置文件
  • appstore.env 上傳至App Store的環境配置文件
  • dev.env 編譯測試版本ipa的環境配置文件

build_app.sh

#!/bin/bash 
### 參數傳遞
## $1 : beta=開發測試包, release=App Store 發版
## 若是未指定參數,缺省爲開發測試包

export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

## 環境初始化
if [ -z $1 ]; then
	AppENV="beta"
else
	AppENV=$1
fi

## 進入當前.sh所在目錄
cd `dirname $0`

# 導入.env文件
if [ $AppENV == "beta" ]; then
	source ./common.env
	# source ./dev.env
else
	source ./common.env
	# source ./appstore.env
fi

# 刪除以前的IPA
rm -r ${app_ipa_file}

# 打包APP
build_app() { 
	echo "+-------------------+-------------------+"
	echo " building... <${AppENV}> ipa"
	echo "+-------------------+-------------------+"
	echo " build number | ${build_number}"
	echo " ipa file | ${app_ipa_file}"
	echo "+-------------------+-------------------+"

	fastlane ${AppENV}
}

# 上傳到fir.im
publish_to_firim(){ 
	echo "+---------------------+------------------+"
	echo " 上傳測試包到 fir.im"
	echo "+---------------------+------------------+"
	echo " ipa file | ${app_ipa_file}"
	echo "+---------------------+------------------+"

	fir login $firim_token
	# fir publish $app_ipa_file --changelog=${git_changelog_file} --short=${firim_short} --qrcode
	fir publish $app_ipa_file  --short=${firim_short} --qrcode
}

if [ $AppENV == "beta" ]; then
	build_app
	publish_to_firim
	open $app_ipa_qrfile
else
	build_app
fi
複製代碼

build_app.sh

#!/bin/bash 
### fir.im 上傳失敗後 執行

export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

## 進入當前.sh所在目錄
cd `dirname $0`

# 導入.env文件
source ./common.env
source ./dev.env

echo "+---------------------+------------------+"
echo " 從新上傳測試包到 fir.im"
echo "+---------------------+------------------+"
echo " ipa file | ${app_ipa_file}"
echo "+---------------------+------------------+"

fir login $firim_token
fir publish $app_ipa_file  --short=${firim_short} --qrcode
複製代碼

common.env

### 通用環境變量
### 能夠根據項目實際狀況進行修改

# Git 修訂記錄日誌文件
git_changelog_file="./change_log.txt"

# 以日期+時間做爲構建版本號,最終格式爲: 月份日期小時分鐘,所有均爲兩位數字,如 12 月 18 日 17:30 打包,則會是 12181730。
export build_number=`date +%m%d%H%M`

# 測試包託管平臺的 TOKEN,爲 fir.im 
firim_token="xxxx" 

# firim 專用的短網址中的短碼
# 設置此短碼將幫助更好的記測試包二維碼網址
firim_short="firim_short"

# 打出的 IPA 包文件保存路徑
app_ipa_file="ipa_build/xxx.ipa"
# 打出的 IPA 包二維碼路徑
app_ipa_qrfile="ipa_build/fir-xxx.png"
複製代碼

appstore.env

### 特定環境變量
### 能夠根據項目實際狀況進行修改

# Provisioning Profile 文件名稱
# 若是開發者賬戶裏有多個項目,則須要指定。
# 開發者賬戶裏僅有一個項目,則能夠爲空,sigh 會自動匹配。
app_profilename=""

# 指定是否爲開發/測試 Provisioning Profile
# 若是打包發佈到 App Store,則須要爲空。
app_profiledev=""
複製代碼

dev.env

### 特定環境變量
### 能夠根據項目實際狀況進行修改

# Provisioning Profile 文件名稱
# 若是開發者賬戶裏有多個項目,則須要指定。
# 開發者賬戶裏僅有一個項目,則能夠爲空,sigh 會自動匹配。
app_profilename="xxx_development"

# 指定是否爲開發/測試 Provisioning Profile
# 若是打包發佈到 App Store,則須要爲空。
app_profiledev="--development"
複製代碼

以上是全部的代碼,使用也是很簡單,下載 代碼,將fastlane文件拖入工程根目錄下,根據本身實際狀況,配置好相關信息,而後在 根目錄 下終端上執行命令:

構建分發測試包

./fastlane/build_app.sh

若是第一次上傳fir.im失敗,嘗試如下命令

./fastlane/republish.sh

打包上傳AppStore

./fastlane/republish.sh release


以上是本次分享的全部內容,若是有疑問,請在下面留言,看到後,我會第一時間回覆,若是文章中有不正確的地方,請指出來,我會及時更正~

代碼已經上傳至GitHub,若是使用請移步build_ios_app,若是覺着對你幫助,那就順手給個star吧😄

Refer

最後:謝謝你願意花費時間來閱讀此篇文章~,但願會對你有所幫助!

相關文章
相關標籤/搜索