iOS自动打包流程

由于公司业务所以上网查询了一些关于iOS自动打包流程.

一种是以shell脚本为主的打包,一种是以jenkins作为服务器自动打包.

在两种脚本都适配过之后,发现jenkins过于操作过于复杂(不论是从学习的成本还是打包上,都过于复杂还不如喝杯奶茶静静等待Xcode-Project-Archive这个自带的打包.所以本文不介绍jenkins方式.

直接进入主题shell打包,冲冲冲.

shell脚本打包(0成本学习.

教程環境篇

由于本文照顾从零开始的iOS小白所以会教一些环境配置,HomeBrew,RVM,Ruby,Fir-Cli如果安装了可以直接跳过.直接看后面的打包步骤。

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

如果出現終端出現這個錯誤
curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
請試試看個人熱點(我連接公司網絡會出現,但是使用了個人熱點是沒有問題的.
或者尝试另一位简书大神的方案安装homebrew报错

  • 之後我們安裝RVM,我在嘗試的過程發現坑還挺多的.
    这个是官网的安装流程.
    RVM在線安裝
  • 在線安裝 打開終端輸入並回車(筆者失敗了.)
gpg --keyserver [hkp://pool.sks-keyservers.net](hkp://pool.sks-keyservers.net) --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

如果提示gpg: 从公钥服务器接收失败:No route to host
則是可能因為你沒有安裝gpg.
請使用

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
上面的命令依次是選擇離線包-创建文件夹-解包-安装-加载环境
  • 接著我們開始利用rvm安裝ruby

這個命令可以用查看當前ruby版本.

rvm list known

下載指定版本2.4.0版本

rvm install 2.4.0

默認版本2.4.0

rvm user 2.4.0 --default

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

brew install ruby

檢查是否安裝成功

rvm - v

成功將會返回當前版本號.
例如: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
自動打包篇

首先我們需要自己寫關於shell腳本的,創建一個.sh文件.

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

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

#   上次打包时间
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记录时间
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})
#   构建版本号
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}"
#   打包开始时间
Archive_Start_Time=`date +%s`
SLEEP_TIME=0.3


#-------------------------   变量定义  -------------------------

#-------------------------   代码执行  -------------------------

#echo -e "\033[36;1m 内容 \033[0m"
#  配置编译模式
echo -e "\033[36;1m 请选择 编译模式 (输入序号, 按回车即可) \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 参数无效!!!\n \033[0m"
exit 1
fi


#   配置是否上传蒲公英
echo -e "\033[36;1m 请选择 是否上传蒲公英 (输入序号, 按回车即可) \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}"

# 拷贝项目代码到工作目录
cd $ShellPath
TEMP_F="temp"
echo -e "\033[36;1m (0x04)-->配置工程文件路径... \033[0m"

Project_Name=$(ls | grep xcodeproj | awk -F.xcodeproj '{print $1}')
#创建IPA文件夹
mkdir -p $IPA_Path

if [[ -z $Project_Name ]]; then
echo -e "\033[31m ERROR-错误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)-->开始编译,耗时操作,请稍等... \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-错误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)-->开始打包请稍等... \033[0m"
echo ""

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

#创建打包生成目录
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-错误501:找不到签名生成的IPA包,打包APP失败. \033[0m"
exit 1
else
echo -e "\033[36;1m (0x09) 打包APP完成! √ \033[0m"
echo ""
fi

#拷贝过来.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 耗时: ${times} s \033[0m"
echo -e "\033[36;1m 完成时间: `date` \033[0m"
echo -e "\033[36;1m ---------------------------------------------------- \033[0m"

#   记录打包数据
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 "------------------------ 不上传蒲公英 打包结束 ------------------------"

echo -e "\033[36;1m ${IPA_BuildPath} ------------------------ 不上传蒲公英 打包结束 ------------------------ \033[0m"
else
echo "\n您输入的参数无效!!!\n"
echo -e "\033[31m --> \n您输入的参数无效!!!\n \033[0m"
fi

exit 0
#-------------------------   代码执行  -------------------------

其中你需要修改的為,這個項目的名

Targets_Name="redEvnStore"

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

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

之後你把這個.sh文件放到打包工程的目錄下,既和.xcodeproj同一级的目录.
准备完成后
打開你的終端輸入並回車
輸入cd 後把你的工程路徑拖入到終端,會自動生成路徑

cd 工程目錄.

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

./xxx.sh

脚本编译出现错误集合(不定时更新

xcodebuild报错

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命令

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361