iso自动化打包脚本编写总结

背景介绍

入职到公司一年多来,公司的业务逐渐步入正轨,定制的产品也是越来越多,从刚开始的基础版本,一直到最近的各种定制包,其中一个项目就有6个定制包,而且定制包还在不断的增加中,从前都是测试手动一个一个打包,打包用的mini本身配置低,打包很慢,打个包运气好等个十几分钟,人要一直守在电脑前,上次上线,测试需要将所有版本先打包出来测试一遍,然后再上传到appstore,就光打包就占用了一上午的时间,还导致测试一个人力的浪费,要是测试出现bug,又要重复上述过>程,而且联想到以后其他项目也有这种情况,所以自动化研发已是必不可少。

研发过程

网上自动化脚本很多,之前使用过一个打包脚本,但是这个打包脚本只能打一个包,可以上传fir测试,但是上传不了appstore,为了解决上面的问题,花了大概一下午的时间,查找资料学习shell脚本语法,在之前脚本的基础上,添加了for循环实现批量打包,同时为了方便测试进行个性化打包,又对脚本进行了优化,实现了执行脚本时 可以选择

  • 批量打包上传appstore
  • 批量打包上传fir 测试
  • 批量打包放到桌面指定文件夹
  • 单独打某个定制版的包

废话不多说,直接上脚本,要修改的变量我也在脚本开头单独标出。其他看备注即可。

#! bin/bash
#Author:Bruce http://www.heyuan110.com
#Update Date:2015.06.23
#Use:命令行进入目录直接执行sh Build+DeployToFir.sh即可完成打包发布到fir.im

echo "~~~~~~~~~~~~~~~~开始执行脚本~~~~~~~~~~~~~~~~"

#-------------------------脚本配置信息------------------------------------
beginTime=`date +%s`
DATE=`date '+%Y-%m-%d-%T'`
#需要编译的 targetName数组
array_tagName=(
"SoocQiPei"
"东方瑞艺"
"中程在线"
"智融在线"
"博智教育"
"四海华辰"
"青龙农信"

)

#需要编译的 证书数组
array_profileNames=(
"企培_发布"
"东方瑞艺_发布"
"中程在线_发布"
"e融_发布"
"博智教育_发布"
"四海华辰_发布"
"青龙农信_发布"
)

#生成的ipa包名(上传appstore的ipa包名不允许有中文)
array_ipaName=(
"SoocQiPei"
"dongfangruiyi"
"zhongchengzaixian"
"zhirongzaixian"
"bozhijianyu"
"sihaihuachen"
"qinglongnongxin"

)
#工程名称
PROJECT_NAME="SoocQiPei"
#编译模式 工程默认有 Debug Release 
CONFIGURATION_TARGET=Release
#证书名
CODE_SIGN_IDENTITY="iPhone Distribution: xxxxxxx Stock Co., Ltd. (xxxxxxx)"
#苹果账号
AppleID="xxxxxxxxxxxxx"
AppleIDPWD="xxxxxxxxxxx"
#fir账号(自己去fir查看账号的token)
counttoken="xxxxxxxxxxxxxxx"
#fir账号下的appid(每个app有个id)
array_apptokens=(
"xxxxxxxxxxxxxxxxxxxxxxxx" #企培
"xxxxxxxxxxxxxxxxxxxxxxxx" #东方瑞艺
"xxxxxxxxxxxxxxxxxxxxxxxx" #中程在线
"xxxxxxxxxxxxxxxxxxxxxxxx" #e融
"xxxxxxxxxxxxxxxxxxxxxxxx" #博智教育
"xxxxxxxxxxxxxxxxxxxxxxxx" #四海华辰
"xxxxxxxxxxxxxxxxxxxxxxxx" #青龙农信
)
#导出ipa 所需plist
ADHOCExportOptionsPlist=./ADHOCExportOptionsPlist.plist
AppStoreExportOptionsPlist=./AppStoreExportOptionsPlist.plist


#-------------------------------------------------------------------------------------

echo "请选择上传方式:0 批量打包不上传 1 批量打包上传fir 2 批量打包上传appstore 3 单独打包某个版本"
read answer
array_way=(批量打包不上传 批量打包上传fir 批量打包上传appstore 单独打包某个版本)
echo "你的选择是:${array_way[$answer]}"

#定义打包函数 传入两个参数 $1 tagName  $2证明文件
function archive(){
echo "tag名称----$1 证明文件是------$2"

#描述文件
PROVISIONING_PROFILE_NAME=$2
#需要编译的 targetName
TARGET_NAME=$1
ipa_name=$3
#编译路径
BUILDPATH=~/Desktop/所有的ipa包
#archivePath
ARCHIVEPATH=${BUILDPATH}/${PROJECT_NAME}.xcarchive
#输出的ipa目录
IPAPATH=~/Desktop/所有的ipa包

echo "~~~~~~~~~~~~~~~~开始编译~~~~~~~~~~~~~~~~~~~"
echo "~~~~~~~~~~~~~~~~开始清理~~~~~~~~~~~~~~~~~~~"
# 清理 避免出现一些莫名的错误
xcodebuild clean -workspace ${PROJECT_NAME}.xcworkspace \
-configuration \
${CONFIGURATION} -alltargets

echo "~~~~~~~~~~~~~~~~开始构建~~~~~~~~~~~~~~~~~~~"
#开始构建
xcodebuild archive -workspace ${PROJECT_NAME}.xcworkspace \
-scheme ${TARGET_NAME} \
-archivePath ${ARCHIVEPATH} \
-configuration ${CONFIGURATION_TARGET} \
CODE_SIGN_IDENTITY="${CODE_SIGN_IDENTITY}" \
PROVISIONING_PROFILE="${PROVISIONING_PROFILE_NAME}"

echo "~~~~~~~~~~~~~~~~检查是否构建成功~~~~~~~~~~~~~~~~~~~"
# xcarchive 实际是一个文件夹不是一个文件所以使用 -d 判断
if [ -d "$ARCHIVEPATH" ]
then
echo "构建成功......"
else
echo "构建失败......"
rm -rf $BUILDPATH
exit 1
fi
endTime=`date +%s`
ArchiveTime="构建时间$[ endTime - beginTime ]秒"


echo "~~~~~~~~~~~~~~~~导出ipa~~~~~~~~~~~~~~~~~~~"

beginTime=`date +%s`

xcodebuild -exportArchive \
-archivePath ${ARCHIVEPATH} \
-exportOptionsPlist ${ExportOptionsPlist} \
-exportPath ${IPAPATH}

echo "~~~~~~~~~~~~~~~~检查是否成功导出      ipa~~~~~~~~~~~~~~~~~~~"
IPAPATH=${IPAPATH}/${TARGET_NAME}.ipa
if [ -f "$IPAPATH" ]
then
echo "导出ipa成功......"
#修改ipa名字
mv ~/Desktop/所有的ipa包/${TARGET_NAME}.ipa ~/Desktop/所有的   ipa包/${ipa_name}.ipa
IPAPATH=~/Desktop/所有的ipa包/${ipa_name}.ipa


else
echo "导出ipa失败......"
# 结束时间
endTime=`date +%s`
echo "$ArchiveTime"
echo "导出ipa时间$[ endTime - beginTime ]秒"
exit 1
fi

endTime=`date +%s`
ExportTime="导出ipa时间$[ endTime - beginTime ]秒"


}
#上传fir的 函数 传两个参数 $1账号token   $2 appid
function exportFir(){

export LANG=en_US
export LC_ALL=en_US;
echo "正在上传到fir.im...."
fir p $IPAPATH
changelog=`cat $projectDir/README`
curl -X PUT --data "changelog=$changelog" http://fir.im/api/v2/app/$2?token=$1
echo "\n打包上传更新成功!"
rm -rf $buildAppToDir
rm -rf $projectDir/tmp
}

#上传appstore -------------------------------------------
function exportAppStore(){

#mini的路径
altoolPath="/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"
#我的电脑路径
#altoolPath="/Users/duanshuai/Desktop/Xcode.app/Contents/Applications/Application_Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"

${altoolPath} --validate-app \
-f ${IPAPATH} \
-u ${AppleID} \
-p ${AppleIDPWD} \
-t ios --output-format xml

if [ $? = 0 ]
then
echo "~~~~~~~~~~~~~~~~验证ipa成功~~~~~~~~~~~~~~~~~~~"
"${altoolPath}" --upload-app \
-f ${IPAPATH} \
-u ${AppleID} \
-p ${AppleIDPWD} \
-t ios --output-format xml

if [ $? = 0 ]
then
echo "~~~~~~~~~~~~~~~~提交AppStore成功~~~~~~~~~~~~~~~~~~~"
else
echo "~~~~~~~~~~~~~~~~提交AppStore失败~~~~~~~~~~~~~~~~~~~"
fi
else
echo "~~~~~~~~~~~~~~~~验证ipa失败~~~~~~~~~~~~~~~~~~~"
fi
}


#开始运行脚本

if [ $answer -eq 0 ]
then
# 批量打包 放到桌面
echo "~~~~~~~~~~~~~~~~批量打包 放到桌面~~~~~~~~~~~~~~~~"
ExportOptionsPlist=${ADHOCExportOptionsPlist}
value=0
for tagName in ${array_tagName[@]}  
do  
archive ${tagName} ${array_profileNames[$value]} $  {array_ipaName[$value]}
let value++ 
done 

elif [ $answer -eq 1 ]
then 
#批量打包上传fir
echo "~~~~~~~~~~~~~~~~批量打包上传fir~~~~~~~~~~~~~~~~"
ExportOptionsPlist=${ADHOCExportOptionsPlist}
value=0
for tagName in ${array_tagName[@]}  
do  
#打包 导出ipa
archive ${tagName} ${array_profileNames[$value]} ${array_ipaName[$value]}
#上传fir
exportFir $counttoken ${array_apptokens[$value]}
let value++ 
done 
elif [ $answer -eq 2 ]
then
#批量打包上传appstore
ExportOptionsPlist=${AppStoreExportOptionsPlist}
for tagName in ${array_tagName[@]}  
do  
#打包 导出ipa
archive ${tagName} ${array_profileNames[$value]} $  {array_ipaName[$value]}
#上传appstore
exportAppStore
let value++ 
done 
echo "~~~~~~~~~~~~~~~~批量打包上传appstore~~~~~~~~~~~~~~~~"
elif [ $answer -eq 3 ]
then
#选择要打包的tag
ExportOptionsPlist=${ADHOCExportOptionsPlist}
echo "选择要打包的tag:0 SoocQiPei  1 东方瑞艺  2 中程在线 3 智融在线 4 博智教育 5 四海华辰 6 青龙农信/n"
read num
echo "是否上传ifr:1 上传 2 不上传/n"
read isfir

archive ${array_tagName[$num]} ${array_profileNames[$num]} ${array_ipaName[$num]}
if [ $isfir -eq 1 ]
then
#上传fir
exportFir $counttoken ${array_apptokens[$num]}

fi
else
echo "~~~~~~~~~~~~~~~~你选错了~~~~~~~~~~~~~~~~"
fi

使用说明

1 将脚本复制到工程目录
2 将ADHOCExportOptionsPlist.plist和 AppStoreExportOptionsPlist.plist文件也添加到工程目录,两个文件内容最后附加。
3 修改脚本里的配置信息
4 最后cd到工程目录,执行 sh 脚本名.sh

附录

adhoc.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>ad-hoc</string>
<key>compileBitcode</key>
<false/>
</dict>
</plist>

appstore.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>app-store</string>
<key>compileBitcode</key>
<false/>
<key>uploadSymbols</key>
<true/>
</dict>
</plist>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容