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

溫特兒發表於2019-03-16

此篇文章相關程式碼已經上傳至 GitHub,相關程式碼請移步 build_ios_app

iOS 自動化釋出測試包到 fir.im,以及自動打包上傳 AppStore 並提交稽核...

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

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

廢話不多說~

環境配置

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

首先必須確認已經安裝xcode命令列工具,如果沒有,使用以下命令

xcode-select --install

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

[sudo] gem install fastlane -NV

或者使用homebrew,個人推薦使用

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 不使用模板,自己去寫自動打包指令碼
複製程式碼

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

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

直接使用命令fastlane release,接下來會自動打包,如果專案工程配置沒有問題,就成功了

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

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


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

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

相關文章