Xcode8下基于Shell脚本的自动化打包及上传fir

最近源于项目迭代比较空闲,在这里总结下 xcode8执行xcodebuild自动化打包的实现,提高测试开发效率

自动化打包方式

1、shell 脚本执行
2、基于Jenkins的自动化打包
3、fastlane
这里我只用第一种方式 去实现...

以下执行脚本文件

该脚本在网上下载的,需要根据自己的环境去配置,包括rvm

#!/bin/sh
echo "~~~~~~~~~~~~~~~~开始执行脚本~~~~~~~~~~~~~~~~"
####################################################################
###################工程信息以及最下面的蒲公英信息########################
#工程名 获取工程名
PROJECTNAME=`find . -name *.xcodeproj | awk -F "[/.]" '{print $(NF-1)}'` #项目名称
#需要编译的 targetName Scheme
TARGET_NAME="weLianAppDev"
# ADHOC 内测
#证书名#描述文件  比如你是手动管理证书,改你相应的id
#ADHOCCODE_SIGN_IDENTITY="Z5FDR82ZVP"
#ADHOCPROVISIONING_PROFILE_NAME="f2b59a5a-85a5-4187-9f9b-676d56a13196"

#如果是自定管理证书  则填空,网上有人说 xcode8自动化打包只能手动管理,不清楚原因,我这里赋空值是没问题的
ADHOCCODE_SIGN_IDENTITY=""
ADHOCPROVISIONING_PROFILE_NAME=""

#AppStore证书名#描述文件
APPSTORECODE_SIGN_IDENTITY="V6JKEEZATW"
APPSTOREADHOCPROVISIONING_PROFILE_NAME="xxxxxx-xxxx-xxxx-xxxxxxxxxxxx"

#是否是工作空间
ISWORKSPACE=true
####################################################################

#证书名
CODE_SIGN_IDENTITY=${ADHOCCODE_SIGN_IDENTITY}
#描述文件
PROVISIONING_PROFILE_NAME=${ADHOCPROVISIONING_PROFILE_NAME}

# 开始时间
beginTime=`date +%s`
DATE=`date '+%Y-%m-%d-%T'`

#编译模式 工程默认有 Debug Release 
CONFIGURATION_TARGET=Release
#编译路径
BUILDPATH=~/Desktop/${TARGET_NAME}_${DATE}
#archivePath
ARCHIVEPATH=${BUILDPATH}/${TARGET_NAME}.xcarchive
#输出的ipa目录
IPAPATH=${BUILDPATH}

#导出ipa 所需plist
ADHOCExportOptionsPlist=./ADHOCExportOptionsPlist.plist
AppStoreExportOptionsPlist=./AppStoreExportOptionsPlist.plist

ExportOptionsPlist=${ADHOCExportOptionsPlist}

# 是否上传FIR
UPLOADFIR=false

echo "~~~~~~~~~~~~~~~~选择打包方式~~~~~~~~~~~~~~~~"
echo "      1 ad-hoc (默认)"
echo "      2 AppStore "

# 读取用户输入并存到变量里
read parameter
sleep 0.5
method="$parameter"

# 判读用户是否有输入 
if [ -n "$method" ]
then
    if [ "$method" = "1" ]
    then 
    CODE_SIGN_IDENTITY=${ADHOCCODE_SIGN_IDENTITY}
    PROVISIONING_PROFILE_NAME=${ADHOCPROVISIONING_PROFILE_NAME}
    ExportOptionsPlist=${ADHOCExportOptionsPlist}
    elif [ "$method" = "2" ]
    then
    CODE_SIGN_IDENTITY=${APPSTORECODE_SIGN_IDENTITY}
    PROVISIONING_PROFILE_NAME=${APPSTOREADHOCPROVISIONING_PROFILE_NAME}
    ExportOptionsPlist=${AppStoreExportOptionsPlist}
    else
    echo "参数无效...."
    exit 1
    fi
else
    ExportOptionsPlist=${ADHOCExportOptionsPlist}
fi

echo "~~~~~~~~~~~~~~~~是否上传FIR~~~~~~~~~~~~~~~~"
echo "      1 不上传 (默认)"
echo "      2 上传 "
read para
sleep 0.5

if [ -n "$para" ]
then
    if [ "$para" = "1" ]
    then 
    UPLOADFIR=false
    elif [ "$para" = "2" ]
    then
    UPLOADFIR=true
    else
    echo "参数无效...."
    exit 1
    fi
else
    UPLOADFIR=false
fi

###############获取版本号,bundleID info.plist 必须存在
infoPlist="${PROJECTNAME}/${TARGET_NAME}-Info.plist"
bundleVersion=`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $infoPlist`
bundleIdentifier=`/usr/libexec/PlistBuddy -c "Print CFBundleIdentifier" $infoPlist`
bundleBuildVersion=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $infoPlist`

echo "~~~~~~~~~~~~~~~~开始编译~~~~~~~~~~~~~~~~~~~"

if [ $ISWORKSPACE = true ]
then
# 清理 避免出现一些莫名的错误
xcodebuild clean -workspace ${PROJECTNAME}.xcworkspace \
-configuration \
${CONFIGURATION} -alltargets

#开始构建
xcodebuild archive -workspace ${PROJECTNAME}.xcworkspace \
-scheme ${TARGET_NAME} \
-archivePath ${ARCHIVEPATH} \
-configuration ${CONFIGURATION_TARGET} \
CODE_SIGN_IDENTITY="${CODE_SIGN_IDENTITY}" \
PROVISIONING_PROFILE="${PROVISIONING_PROFILE_NAME}"
else
# 清理 避免出现一些莫名的错误
xcodebuild clean -xcodeproj ${PROJECTNAME}.xcodeproj \
-configuration \
${CONFIGURATION} -alltargets

#开始构建
xcodebuild archive -xcodeproj ${PROJECTNAME}.xcodeproj \
-scheme ${TARGET_NAME} \
-archivePath ${ARCHIVEPATH} \
-configuration ${CONFIGURATION_TARGET} \
CODE_SIGN_IDENTITY="${CODE_SIGN_IDENTITY}" \
PROVISIONING_PROFILE="${PROVISIONING_PROFILE_NAME}"
fi

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`

# 苹果对rvm 2.3.0 2.2.4 不支持
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
rvm use system
xcodebuild -exportArchive \
-archivePath ${ARCHIVEPATH} \
-exportOptionsPlist ${ExportOptionsPlist} \
-exportPath ${IPAPATH}

# source ./xcodesafe.sh -exportArchive \
# -archivePath ${ARCHIVEPATH} \
# -exportOptionsPlist ${ExportOptionsPlist} \
# -exportPath ${IPAPATH}

echo "~~~~~~~~~~~~~~~~检查是否成功导出ipa~~~~~~~~~~~~~~~~~~~"
IPAPATH=${IPAPATH}/${TARGET_NAME}.ipa
if [ -f "$IPAPATH" ]
then
echo "导出ipa成功......"
open $BUILDPATH
else
echo "导出ipa失败......"
# 结束时间
endTime=`date +%s`
echo "$ArchiveTime"
echo "导出ipa时间$[ endTime - beginTime ]秒"
exit 1
fi

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

echo "~~~~~~~~~~~~~~~~配置信息~~~~~~~~~~~~~~~~~~~"
ReadPath=$BUILDPATH/README
if [ -f "$ReadPath" ]
then
echo "README 已存在."
else
touch $ReadPath
echo "README 创建成功"
fi

echo "开始执行脚本时间: ${DATE}"  >> $ReadPath
echo "TARGET_NAME scheme: ${TARGET_NAME}"  >> $ReadPath
echo "编译模式: ${CONFIGURATION_TARGET}"  >> $ReadPath
echo "导出ipa配置: ${ExportOptionsPlist}"  >> $ReadPath
echo "打包文件路径: ${ARCHIVEPATH}"  >> $ReadPath
echo "导出ipa路径: ${IPAPATH}"  >> $ReadPath
echo "ipa大小:" `ls -l $IPAPATH | awk '{ print $5,$9 }'` >> $ReadPath
echo "版本号:${bundleVersion}" >> $ReadPath

echo "$ArchiveTime"  >> $ReadPath
echo "$ExportTime"  >> $ReadPath

cat $ReadPath

# 上传FIR 
if [ $UPLOADFIR = true ]
then
# 必须 复原 ruby 的版本 否则fir 失效
    rvm default
    echo "~~~~~~~~~~~~~~~~上传ipa到Fir.com~~~~~~~~~~~~~~~~~~~"
    firAppId=567cf766748aac3a8800001a
    firToken=0a9b84dbc15d70c88a0c7bd3a71c77d2
    echo ${IPAPATH}
    
    fir p ${IPAPATH}
    clog=`cat ${ReadPath}`
    curl -X PUT --data "changelog=$clog" http://fir.im/api/v2/app/$firAppId?token=$firToken

    if [ $? = 0 ]
    then
    echo "~~~~~~~~~~~~~~~~上传Fir成功~~~~~~~~~~~~~~~~~~~"
    else
    echo "~~~~~~~~~~~~~~~~上传Fir失败~~~~~~~~~~~~~~~~~~~"
    fi
fi
exit 1

几个问题

  • 脚本证书配置
    在 build seting里 我证书签名 都是选的xcode8 自动管理
  • xcodebuild 在rvm 在OS X exportArchieve 失败问题,下面会有写

http://www.jianshu.com/p/bd4c22952e01
https://wx.abbao.cn/a/4808-923b964d08d406e5.html
https://inkiu0.gitbooks.io/codenote/content/xcode8zidong_da_bao_qu_diao_automaticallymanag_md.html
http://www.jianshu.com/p/ce60368ea768
http://www.jianshu.com/p/b3dcfa8ddf63

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

推荐阅读更多精彩内容