Xcode8下基于Shell腳本的自動化打包及上傳fir

最近源于項目迭代比較空閑,在這里總結(jié)下 xcode8執(zhí)行xcodebuild自動化打包的實現(xiàn),提高測試開發(fā)效率

自動化打包方式

1、shell 腳本執(zhí)行
2、基于Jenkins的自動化打包
3、fastlane
這里我只用第一種方式 去實現(xiàn)...

以下執(zhí)行腳本文件

該腳本在網(wǎng)上下載的,需要根據(jù)自己的環(huán)境去配置,包括rvm

#!/bin/sh
echo "~~~~~~~~~~~~~~~~開始執(zhí)行腳本~~~~~~~~~~~~~~~~"
####################################################################
###################工程信息以及最下面的蒲公英信息########################
#工程名 獲取工程名
PROJECTNAME=`find . -name *.xcodeproj | awk -F "[/.]" '{print $(NF-1)}'` #項目名稱
#需要編譯的 targetName Scheme
TARGET_NAME="weLianAppDev"
# ADHOC 內(nèi)測
#證書名#描述文件  比如你是手動管理證書,改你相應(yīng)的id
#ADHOCCODE_SIGN_IDENTITY="Z5FDR82ZVP"
#ADHOCPROVISIONING_PROFILE_NAME="f2b59a5a-85a5-4187-9f9b-676d56a13196"

#如果是自定管理證書  則填空,網(wǎng)上有人說 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 "參數(shù)無效...."
    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 "參數(shù)無效...."
    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
# 清理 避免出現(xiàn)一些莫名的錯誤
xcodebuild clean -workspace ${PROJECTNAME}.xcworkspace \
-configuration \
${CONFIGURATION} -alltargets

#開始構(gòu)建
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
# 清理 避免出現(xiàn)一些莫名的錯誤
xcodebuild clean -xcodeproj ${PROJECTNAME}.xcodeproj \
-configuration \
${CONFIGURATION} -alltargets

#開始構(gòu)建
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 "~~~~~~~~~~~~~~~~檢查是否構(gòu)建成功~~~~~~~~~~~~~~~~~~~"
# xcarchive 實際是一個文件夾不是一個文件所以使用 -d 判斷
if [ -d "$ARCHIVEPATH" ]
then
echo "構(gòu)建成功......"
else
echo "構(gòu)建失敗......"
rm -rf $BUILDPATH
exit 1
fi
endTime=`date +%s`
ArchiveTime="構(gòu)建時間$[ 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失敗......"
# 結(jié)束時間
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 創(chuàng)建成功"
fi

echo "開始執(zhí)行腳本時間: ${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.itdecent.cn/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.itdecent.cn/p/ce60368ea768
http://www.itdecent.cn/p/b3dcfa8ddf63

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容