此篇文章相關程式碼已經上傳至 GitHub,相關程式碼請移步 build_ios_app
iOS 自動化釋出測試包到 fir.im,以及自動打包上傳 AppStore 並提交稽核...
公司專案都是在 Jenkins 上部署的,打包分發一鍵完成,可有時候 Jenkins 出問題,這就不好玩了,要排查問題還是挺費勁的,各種問題(公司產品線比較多,各個產品使用的 Xcode 版本不一致,有的是自動簽名,有的需要 profile,打包成功但上傳失敗),總之,最後的結果都是failure
。
儘管測試已經掌握打包祕籍,不再需要麻煩開發,但鑑於這種失敗failure
情況下,測試人員,跑過來還是會打擾開發的,還有就是另一種情況,開發人員已經解決了這個(多個)問題之後,想立即讓測試驗證,這個時候,就需要在終端terminal
敲上一段程式碼./fastlane/build_app.sh
,喝口水,去趟衛生間,搞定~
廢話不多說~
環境配置
首先必須確認已經安裝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 不使用模板,自己去寫自動打包指令碼
複製程式碼
筆者先使用第三個模板 ,接下來也是選擇,就直接最後結果吧,完成後,如下面的檔案結構
直接使用命令fastlane release
,接下來會自動打包,如果專案工程配置沒有問題,就成功了
ok~ 使用模板當然不能滿足我的需求的
本文的重點
- 對 Xcode 專案,編寫一個指令碼實現自動打包 ipa 檔案
- 上傳到 fir.im,以供測試人員下載安裝
- 上傳 itunesconnect 提交稽核
1. 準備工作
前面我們xcode-select
和fastlane
這兩個工具都已經安裝完成,接下來還需要安裝 fir-cli
gem install fir-cli
安裝完成後,我們開始編寫指令碼,這裡需要注意的是,本指令碼是基於fastlane
、fir-cli
,來完成任務的
fastlane
本身自帶打包ipa、上傳App Store提交稽核、上傳
fir-cli
這個主要是將fastlane
打包的測試ipa,上傳到fir.im
供測試下載安裝
2. 指令碼編寫
這個 fastlane
資料夾是在執行 fastlane init
後自動生成的,作者在此基礎上進行修改,其中 build_app.sh
、republish.sh
、appstore.env
、common.env
、dev.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
檔案,screenshots
和metadata
目錄沒被建立,可以執行deliver init來建立; - 如果你不想修改metadata某些項的資訊,直接把對應的檔案刪除即可,或者刪除整個目錄,將需要修改的內容放在
Deliverfile
; - 如果不想更改截圖,可以把整個截圖目錄刪除;
- 如果
Deliverfile
內配置了screenshots
和metadata
相關資訊,則會忽略掉screenshots
和metadata
目錄下對應的資訊; - 所有這些表單項也可以在
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
最後:謝謝你願意花費時間來閱讀此篇文章~,希望會對你有所幫助!