iOS自動(dòng)打包流程

由于公司業(yè)務(wù)所以上網(wǎng)查詢了一些關(guān)于iOS自動(dòng)打包流程.

一種是以shell腳本為主的打包需纳,一種是以jenkins作為服務(wù)器自動(dòng)打包.

在兩種腳本都適配過(guò)之后硫椰,發(fā)現(xiàn)jenkins過(guò)于操作過(guò)于復(fù)雜(不論是從學(xué)習(xí)的成本還是打包上,都過(guò)于復(fù)雜還不如喝杯奶茶靜靜等待Xcode-Project-Archive這個(gè)自帶的打包.所以本文不介紹jenkins方式.

直接進(jìn)入主題shell打包磁餐,沖沖沖.

shell腳本打包(0成本學(xué)習(xí).

教程環(huán)境篇

由于本文照顧從零開始的iOS小白所以會(huì)教一些環(huán)境配置子漩,HomeBrew,RVM舆蝴,Ruby谦絮,F(xiàn)ir-Cli如果安裝了可以直接跳過(guò).直接看后面的打包步驟。

  • 首先安裝HomeBrew,打開你的終端輸入並回車.
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

如果出現(xiàn)終端出現(xiàn)這個(gè)錯(cuò)誤
curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
請(qǐng)?jiān)囋嚳磦€(gè)人熱點(diǎn)(我連接公司網(wǎng)絡(luò)會(huì)出現(xiàn)洁仗,但是使用了個(gè)人熱點(diǎn)是沒(méi)有問(wèn)題的.
或者嘗試另一位簡(jiǎn)書大神的方案安裝homebrew報(bào)錯(cuò)

  • 之後我們安裝RVM层皱,我在嘗試的過(guò)程發(fā)現(xiàn)坑還挺多的.
    這個(gè)是官網(wǎng)的安裝流程.
    RVM在線安裝
  • 在線安裝 打開終端輸入並回車(筆者失敗了.)
gpg --keyserver [hkp://pool.sks-keyservers.net](hkp://pool.sks-keyservers.net) --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

如果提示gpg: 從公鑰服務(wù)器接收失敗:No route to host
則是可能因?yàn)槟銢](méi)有安裝gpg.
請(qǐng)使用

brew install gpg

brew reinstall gnupg

重新安裝

但是筆者還是失敗赠潦,所以選擇放棄了.

  • 離線安裝方式
    RVM離線安裝

  • 離線安裝 打開終端依次輸入並回車

curl -sSL https://github.com/rvm/rvm/tarball/stable -o rvm-stable.tar.gz
mkdir rvm && cd rvm
tar --strip-components=1 -xzf ../rvm-stable.tar.gz
./install --auto-dotfiles
source ~/.rvm/scripts/rvm
上面的命令依次是選擇離線包-創(chuàng)建文件夾-解包-安裝-加載環(huán)境
  • 接著我們開始利用rvm安裝ruby

這個(gè)命令可以用查看當(dāng)前ruby版本.

rvm list known

下載指定版本2.4.0版本

rvm install 2.4.0

默認(rèn)版本2.4.0

rvm user 2.4.0 --default

如果不行的話也可以使用HomeBrew安裝指令

brew install ruby

檢查是否安裝成功

rvm - v

成功將會(huì)返回當(dāng)前版本號(hào).
例如:rvm 1.29.9 (manual) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]

  • 緊接著安裝Fir-Cli即可,打開終端輸入並回車.
sudo gem install -n /usr/local/bin fir-cli
自動(dòng)打包篇

首先我們需要自己寫關(guān)於shell腳本的,創(chuàng)建一個(gè).sh文件.

#!/bin/bash
# iOS打包腳本
# author: senfor
# version: 1.0
# Update: 2019.12.9

#name,version
function recordArchiveLog() {
#   打包Log路徑
LogPath="${WorkPath}/archive.log"

#   上次打包時(shí)間
RecordTime=$(head -1 $LogPath)
#   獲取git記錄
Git_log=$(git log --pretty=format:"%h - %an, %ad : %s"  --since="${RecordTime}")

echo -e "\n\n----------------------------------------------------">>"${LogPath}"
echo -e "[$1] [$2] [$APP_BuildVersion] \n[$(date)]">>"${LogPath}"
echo -e '----------------------------------------------------'>>"${LogPath}"
#   更新Log記錄時(shí)間
UpdateTime=$(date +%Y-%m-%dT%H:%M:%S | sed 's/-0/-/g')
sed -i "" "s/$RecordTime/$UpdateTime/g" "${LogPath}"

if [[ -z $Git_log ]];
then
echo "Git_log is empty."
else
echo "Git_log is not empty."
#   寫入到日志
echo -e "${Git_log}" >> "${LogPath}"
fi

}


#-------------------------   變量定義  -------------------------

Targets_Name="redEvnStore"

#   獲取腳本文件存放路徑
ShellPath=$(cd "$(dirname "$0")"; pwd)
readonly ShellPath

#  .xcodeproj所在路徑
WorkPath="${ShellPath}"
readonly WorkPath

#   plist文件路徑
PlistFile_Path="${WorkPath}/${Targets_Name}/Info.plist"
readonly PlistFile_Path

#   APP名
APP_DisplayName=$(/usr/libexec/PlistBuddy -c "Print CFBundleDisplayName" $PlistFile_Path)
readonly APP_DisplayName

#   APP版本
APP_Version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" ${PlistFile_Path})
#   構(gòu)建版本號(hào)
APP_BuildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" ${PlistFile_Path})

#IPA包文件夾名
IPA_Name=`date +%Y-%m-%d_%H-%M`
#   打包路徑
IPA_Path="${WorkPath}/build_release_${IPA_Name}"
#   打包開始時(shí)間
Archive_Start_Time=`date +%s`
SLEEP_TIME=0.3


#-------------------------   變量定義  -------------------------

#-------------------------   代碼執(zhí)行  -------------------------

#echo -e "\033[36;1m 內(nèi)容 \033[0m"
#  配置編譯模式
echo -e "\033[36;1m 請(qǐng)選擇 編譯模式 (輸入序號(hào), 按回車即可) \033[0m"
echo -e "\033[36;1m 1. Debug \033[0m"
echo -e "\033[36;1m 2. Release \033[0m"
read parameter
sleep ${SLEEP_TIME}
Build_Configuration_Selectd="${parameter}"

# 判讀用戶是否有輸入
if [[ "${Build_Configuration_Selectd}" == "1" ]]; then
Configuration="Debug"
elif [[ "${Build_Configuration_Selectd}" == "2" ]]; then
Configuration="Release"
else
echo -e "\033[31m \n您輸入 BUILD_CONFIGURATION 參數(shù)無(wú)效!!!\n \033[0m"
exit 1
fi


#   配置是否上傳蒲公英
echo -e "\033[36;1m 請(qǐng)選擇 是否上傳蒲公英 (輸入序號(hào), 按回車即可) \033[0m"
echo -e "\033[36;1m 1. 上傳 \033[0m"
echo -e "\033[36;1m 2. 不上傳 \033[0m"
read parameter
sleep ${__SLEEP_TIME}
UploadPGYER="${parameter}"

# 拷貝項(xiàng)目代碼到工作目錄
cd $ShellPath
TEMP_F="temp"
echo -e "\033[36;1m (0x04)-->配置工程文件路徑... \033[0m"

Project_Name=$(ls | grep xcodeproj | awk -F.xcodeproj '{print $1}')
#創(chuàng)建IPA文件夾
mkdir -p $IPA_Path

if [[ -z $Project_Name ]]; then
echo -e "\033[31m ERROR-錯(cuò)誤401:找不到需要編譯的工程,編譯APP中斷. \033[0m"
exit 401
fi

echo ""

# 編譯打包
#打包完的程序目錄
App_Dir="${IPA_Path}/${Targets_Name}.app"
#dSYM的路徑
DSYM_Dir="${IPA_Path}/${Targets_Name}.app.dSYM"

#編譯工程
echo -e "\033[36;1m (0x08)-->開始編譯叫胖,耗時(shí)操作,請(qǐng)稍等... \033[0m"
xcodebuild -configuration "${Configuration}" -workspace "${ShellPath}/${Project_Name}".xcworkspace -scheme "${Targets_Name}" -arch arm64 ONLY_ACTIVE_ARCH=NO TARGETED_DEVICE_FAMILY=1 DEPLOYMENT_LOCATION=YES CONFIGURATION_BUILD_DIR="${IPA_Path}" clean build

#查詢編譯APP是否成功
if [ ! -d "${App_Dir}" ]; then
echo ""
echo -e "\033[31m --> ERROR-錯(cuò)誤501:找不到編譯生成的APP, 編譯APP失敗. \033[0m"
exit 1
else
echo -e "\033[36;1m (0x08) 編譯APP完成! √ \033[0m"
fi

echo ""
echo -e "\033[36;1m (0x09)-->開始打包請(qǐng)稍等... \033[0m"
echo ""

IPA_APP_DIR="${ShellPath}/${APP_DisplayName}_${APP_Version}_${IPA_Name}"
mkdir "${IPA_APP_DIR}"

#創(chuàng)建打包生成目錄
IPA_BuildPath="${IPA_APP_DIR}/${APP_DisplayName}_v${APP_Version}_build${APP_BuildVersion}.ipa"
APP_PATH="${IPA_APP_DIR}/${APP_DisplayName}_${APP_Version}.app"
SYM_PATH="${APP_PATH}.dSYM"

cd "${IPA_APP_DIR}"
mkdir "Payload"
cp -r "${App_Dir}" "Payload"
zip -r "${IPA_BuildPath}" "Payload"

#查詢打包是否成功
if [ ! -f "${IPA_BuildPath}" ]; then
echo -e "\033[36;1m ---------------------------------------------------- \033[0m"
echo -e "\033[31m --> ERROR-錯(cuò)誤501:找不到簽名生成的IPA包,打包APP失敗. \033[0m"
exit 1
else
echo -e "\033[36;1m (0x09) 打包APP完成! √ \033[0m"
echo ""
fi

#拷貝過(guò)來(lái).app.dSYM到輸出目錄
mv "${DSYM_Dir}" "${SYM_PATH}"

rm -rf "${IPA_Path}"
date_end='expr date + %s'

times='expr $date_end + $date_starts'

echo -e "\033[36;1m (0x0A)-->Nice Worker! -->打包成功!  GET √ \033[0m"
echo -e "\033[36;1m ---------------------------------------------------- \033[0m"
echo -e "\033[36;1m 本地安裝包--->  ${IPA_APP_DIR} \033[0m"
echo -e "\033[36;1m 耗時(shí): ${times} s \033[0m"
echo -e "\033[36;1m 完成時(shí)間: `date` \033[0m"
echo -e "\033[36;1m ---------------------------------------------------- \033[0m"

#   記錄打包數(shù)據(jù)
recordArchiveLog ${APP_DisplayName} ${APP_Version}
open "${IPA_APP_DIR}"


if [[ "${UploadPGYER}" == "1" ]]; then
#   上傳
#   蒲公英Key
PGYER_User_Key="修改成你的蒲公英KEY"
PGYER_API_Key="修改成你的蒲公英KEY"
#   上傳蒲公英
curl -F "file=@${IPA_BuildPath}" \
-F "uKey=$PGYER_User_Key" \
-F "_api_key=$PGYER_API_Key" \
"http://www.pgyer.com/apiv1/app/upload"

echo -e "\033[36;1m ${IPA_BuildPath} 上傳 ${APP_DisplayName}.ipa 包 到 pgyer 成功 \033[0m"
elif [[ "${UploadPGYER}" == "2" ]]; then
echo "------------------------ 不上傳蒲公英 打包結(jié)束 ------------------------"

echo -e "\033[36;1m ${IPA_BuildPath} ------------------------ 不上傳蒲公英 打包結(jié)束 ------------------------ \033[0m"
else
echo "\n您輸入的參數(shù)無(wú)效!!!\n"
echo -e "\033[31m --> \n您輸入的參數(shù)無(wú)效!!!\n \033[0m"
fi

exit 0
#-------------------------   代碼執(zhí)行  -------------------------

其中你需要修改的為,這個(gè)項(xiàng)目的名

Targets_Name="redEvnStore"

如果你需要上傳到蒲公英則需要修改蒲公英的key

PGYER_User_Key="修改成你的蒲公英KEY"
PGYER_API_Key="修改成你的蒲公英KEY"

之後你把這個(gè).sh文件放到打包工程的目錄下她奥,既和.xcodeproj同一級(jí)的目錄.
準(zhǔn)備完成后
打開你的終端輸入並回車
輸入cd 後把你的工程路徑拖入到終端瓮增,會(huì)自動(dòng)生成路徑

cd 工程目錄.

輸入你的sh名稱怎棱,例如你保存的.sh文件為abc.sh 則終端輸入./abc.sh ,既下方xxx改為abc即可.

./xxx.sh

腳本編譯出現(xiàn)錯(cuò)誤集合(不定時(shí)更新

xcodebuild報(bào)錯(cuò)

xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

解決如下--打開終端輸入並回車

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

參考
腳本為Jecky丶所寫绷跑,非常感謝.
shell腳本教程
xcodebuild命令

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拳恋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子砸捏,更是在濱河造成了極大的恐慌谬运,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垦藏,死亡現(xiàn)場(chǎng)離奇詭異梆暖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)掂骏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門轰驳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人芭挽,你說(shuō)我怎么就攤上這事滑废。” “怎么了袜爪?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵蠕趁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我辛馆,道長(zhǎng)俺陋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任昙篙,我火速辦了婚禮腊状,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苔可。我一直安慰自己缴挖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布焚辅。 她就那樣靜靜地躺著映屋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪同蜻。 梳的紋絲不亂的頭發(fā)上棚点,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音湾蔓,去河邊找鬼瘫析。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贬循。 我是一名探鬼主播咸包,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼杖虾!你這毒婦竟也來(lái)了诉儒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤亏掀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后泛释,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滤愕,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年怜校,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了间影。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茄茁,死狀恐怖魂贬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裙顽,我是刑警寧澤付燥,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站愈犹,受9級(jí)特大地震影響键科,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漩怎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一勋颖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧勋锤,春花似錦饭玲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至徒恋,卻和暖如春蚕断,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背入挣。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工亿乳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓葛假,卻偏偏與公主長(zhǎng)得像障陶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子聊训,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348