iOS shell實(shí)現(xiàn)自動(dòng)打包修改網(wǎng)絡(luò)環(huán)境祷蝌、自動(dòng)命名并上傳svn

iOS shell實(shí)現(xiàn)自動(dòng)打包修改網(wǎng)絡(luò)環(huán)境玷氏、自動(dòng)命名并上傳svn

設(shè)計(jì)自動(dòng)打包的原因

對(duì)于多個(gè)項(xiàng)目的情況下,測(cè)試包要的頻繁,而且手動(dòng)切換網(wǎng)絡(luò)的時(shí)候,有時(shí)可能寫錯(cuò)了還不知道,對(duì)于我們iOS來說,我們的線上包和測(cè)試包是不一樣的證書有區(qū)別,防止測(cè)試看的包和我們打的線上包不一致的情況發(fā)生,自動(dòng)打包就尤為重要,省區(qū)自動(dòng)命名導(dǎo)出上傳svn等沒有智商的工作.自動(dòng)打包方便了我們,我今天講的是使用xcode自帶的xcodebuild來打包,使用它來做打包的原因是,成本低,不用在安裝一些第三方插件什么的.

1修改網(wǎng)絡(luò)環(huán)境

修改網(wǎng)絡(luò)環(huán)境 參數(shù)網(wǎng)絡(luò)環(huán)境

將網(wǎng)絡(luò)全局文件修改為如下方式進(jìn)行網(wǎng)絡(luò)切換 我是放在ServiceConstant這個(gè)文件中,你可以自定義文件

// 在此處切換環(huán)境變量 1:生產(chǎn)環(huán)境 2:預(yù)發(fā)布環(huán)境 3:測(cè)試環(huán)境外 4:測(cè)試環(huán)境內(nèi) 
#define APPType 1
#if APPType == 1 // 生產(chǎn)cs
#define kAPPBaseUrl       @""
#elif APPType == 2 // 預(yù)發(fā)布
#define kAPPBaseUrl        @""
#elif APPType == 3 // 測(cè)試 外
#define kAPPBaseUrl        @“”          
#else          //測(cè)試 內(nèi)
#define kAPPBaseUrl        @“”  
#endif

modifyServicehost(){
    #判斷參數(shù)是否為空
    if [ ! -n "$1" ]
    then
    echo "請(qǐng)輸入?yún)?shù):網(wǎng)絡(luò)環(huán)境:1:生產(chǎn)環(huán)境 2:預(yù)發(fā)布環(huán)境 3:測(cè)試環(huán)境外 4:測(cè)試環(huán)境內(nèi) 5:appstore線上環(huán)境" 
    exit
    fi

    xhlhost=${1}
    #-gt    檢測(cè)左邊的數(shù)是否大于右邊的滩援,如果是炉擅,則返回 true。
    #-lt    檢測(cè)左邊的數(shù)是否小于右邊的羡榴,如果是碧查,則返回 true。
    if [[ $xhlhost -gt 5 || $xhlhost -lt 1 ]]
    then
    echo "請(qǐng)輸入?yún)?shù):網(wǎng)絡(luò)環(huán)境:1:生產(chǎn)環(huán)境 2:預(yù)發(fā)布環(huán)境 3:測(cè)試環(huán)境外 4:測(cè)試環(huán)境內(nèi) 5:appstore線上環(huán)境" 
    exit
    fi

    modifyHost=$xhlhost
    if [ $xhlhost == 5 ];then #線上appStore環(huán)境
        modifyHost=1
    fi

    #修改網(wǎng)絡(luò)環(huán)境
    echo $modifyHost
    for ServiceConstant in 1 2 3 4
    do
    #修改網(wǎng)絡(luò)狀態(tài),Constant/ServiceConstant.h自己的文件路徑
    sed -i "" "s/#define APPType ${ServiceConstant}/#define APPType ${modifyHost}/g" ${projectName}/Constant/ServiceConstant.h
    done

    severPath=''
    case $xhlhost in
    1)  severPath='生產(chǎn)環(huán)境'
    ;;
    2)  severPath='預(yù)發(fā)布環(huán)境'
    ;;
    3)  severPath='測(cè)試環(huán)境'
    ;;
    4)  severPath='測(cè)試環(huán)境'
    ;;
    5)  severPath='appstore線上環(huán)境'
    ;;
    esac
    #檢測(cè)網(wǎng)絡(luò)是否成功
    if [ `grep -c "#define APPType $modifyHost" ${projectName}/Constant/ServiceConstant.h` -eq '0' ]; then
        echo "網(wǎng)絡(luò)沒有修改成功.請(qǐng)檢查ServiceConstant.h文件"
        exit
    else
        echo '網(wǎng)絡(luò)環(huán)境切換:'$severPath'  成功'
    fi
    #調(diào)用打包
    iosBuildIpa $xhlhost
}

iOS使用xcodebuild打包

創(chuàng)建2個(gè)pilst表,一個(gè)表示appStore的,一個(gè)表示develpent開發(fā)環(huán)境的


image.png

image.png

image.png

image.png
#自動(dòng)打包腳本 參數(shù)網(wǎng)絡(luò)環(huán)境
iosBuildIpa(){
    xhlhost=$1
    echo $xhlhost
    # 刪除build包
    if [[ -d build ]]; then
    rm -rf build -r
    fi

    #工程名
    project_name=$projectName

    #打包模式 Debug/Release
    development_mode=Debug

    #scheme名
    scheme_name=$projectName
    appStoreExport=$projectPath/AppStoreExportOptionsPlist.plist
    #plist文件所在路徑
    if [ $xhlhost == 5 ]
    then #線上appStore環(huán)境
        exportOptionsPlistPath=$appStoreExport
        echo 'appstore線上包正在打.....'
    else
        exportOptionsPlistPath=$projectPath/DevelopmentExportOptionsPlist.plist
        echo '測(cè)試包正在打.....'
    fi


    #導(dǎo)出.ipa文件所在路徑
    exportFilePath=~/Desktop/XHL_AAU/${appName}`date +%Y-%m-%d`'-ipa'

    echo '*** 正在 清理工程 ***'
    xcodebuild \
    clean -configuration ${development_mode} -quiet  || exit
    echo '*** 清理完成 ***'


    echo '*** 正在 編譯工程 For '${development_mode}
    xcodebuild \
    archive -workspace ${project_name}.xcworkspace \
    -scheme ${scheme_name} \
    -configuration ${development_mode} \
    -archivePath build/${project_name}.xcarchive  || exit
    echo '*** 編譯完成 ***'


    echo '*** 正在 打包 ***'
    xcodebuild -exportArchive -archivePath build/${project_name}.xcarchive \
    -configuration ${development_mode} \
    -exportPath ${exportFilePath} \
    -exportOptionsPlist ${exportOptionsPlistPath} \
    -quiet || exit

    if [ -e $exportFilePath/$scheme_name.ipa ]; then
        echo "*** .ipa文件已導(dǎo)出 ***"
#        cd ${exportFilePath}
#        echo "*** 開始上傳.ipa文件 ***"
        echo ${exportFilePath} "包名"
        echo $exportFilePath/$scheme_name.ipa "ipa路徑"
        if [[ $xhlhost == 5 || $xhlhost == 1 ]]
            then
            #備份dSYM
            archive_path=build/${project_name}.xcarchive
        dsym_path=${archive_path}/dSYMs/${project_name}.app.dSYM/Contents/Resources/DWARF/${project_name}
            cp -R "${dsym_path}" "${exportFilePath}/${project_name}.dSYM"
        fi
#        #此處上傳分發(fā)應(yīng)用
#        echo "*** .ipa文件上傳成功 ***"
    else
        echo "*** 創(chuàng)建.ipa文件失敗 ***"
    fi
    echo '*** 打包完成 ***'
    renameIpa $xhlhost $exportFilePath/$scheme_name.ipa

    #線上環(huán)境同時(shí)導(dǎo)出一個(gè)線上包
    if [ $xhlhost == 1 ]
        then #線上appStore環(huán)境
            echo '*** 正在 打appStore包 ***'
            xcodebuild -exportArchive -archivePath build/${project_name}.xcarchive \
            -configuration ${development_mode} \
            -exportPath ${exportFilePath}/'appstore' \
            -exportOptionsPlist ${appStoreExport} \
            -quiet || exit
            echo '*** appstore包打包完成 ***'
            renameIpa 5 ${exportFilePath}/'appstore'/$scheme_name.ipa
        fi
    # 刪除build包
    if [[ -d build ]]; then
    rm -rf build -r
    fi
}

對(duì)導(dǎo)出的ipa包進(jìn)行重命名,我們這里是要求的時(shí)間—V版本號(hào)—構(gòu)建號(hào)—環(huán)境

原理:將ipa解壓,取出里面的plist表獲取版本號(hào)和構(gòu)建號(hào),重命名

#修改文件名 第一個(gè)參數(shù)網(wǎng)絡(luò)環(huán)境,第二個(gè)參數(shù)ipa路徑
renameIpa(){
    #腳本接收一個(gè)參數(shù)是ipa路徑
    severHost=$1
    #ipa路徑
    IPA_FILE=$2
    #解壓路徑
    IPA_DIR=.ipaTemp

    #刪除臨時(shí)解包目錄
    if [ -d "$IPA_DIR" ]; then
        echo "rm ipatemp"
        rm -rf "${IPA_DIR}"
    else
        echo "mkdir ipatemp"
        mkdir -p "${IPA_DIR}"
    fi

    #解包IPA
    if [[ -f "$IPA_FILE" ]]; then
    echo "unzip $IPA_FILE begin ..."
    unzip -q "$IPA_FILE" -d "$IPA_DIR"
    if [[ $? != 0 ]]; then
    echo "unzip $IPA_FILE failed"
    exit 2
    else
    echo "unzip $IPA_FILE successed"
    fi
    fi

    # 定位到*.app目錄
    appDir="$IPA_DIR/Payload/`ls "$IPA_DIR/"Payload`"
    infoPlist="${appDir}/Info.plist"
    echo $appDir
    echo ${infoPlist}

    #構(gòu)建號(hào)
    CFBundleVersion=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" $infoPlist`
    echo 'CFBundleVersion:'$CFBundleVersion
    #版本號(hào)
    CFBundleShortVersionString=`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" $infoPlist`
    echo 'CFBundleShortVersionString:'$CFBundleShortVersionString


    ls_date=`date +%Y%m%d`
    echo $ls_date
    severStr='' #ipa環(huán)境命名
    case $severHost in
    1)  severStr='prod_1'
    ;;
    2)  severStr='ready_1'
    ;;
    3)  severStr='test_1'
    ;;
    4)  severStr='test_1'
    ;;
    5)  severStr='prod' #appstore線上環(huán)境
    ;;
    esac
    ipaName=$ls_date"_V"${CFBundleShortVersionString}'_'${CFBundleVersion}'_'$severStr'.ipa'
    echo $ipaName
    echo $IPA_FILE

    newIpaName=$(dirname "$IPA_FILE")
    newIpaPath="$newIpaName/$ipaName" #命名后的文件
    echo $newIpaName
    echo $newIpaPath
    mv -f "$IPA_FILE" $newIpaPath

#    if [ ! -f "$newIpaPath" ];then
#        echo '重命名成功 $newIpaPath'
#    else
#        echo "重命名失敗"
#        exit
#    fi
    echo '重命名成功'
    rm -rf "${IPA_DIR}"
    uploadSvn $severHost $newIpaPath
}

上傳svn或者蒲公英

#上傳svn路徑
#第一個(gè)個(gè)參數(shù)網(wǎng)絡(luò)環(huán)境,第二個(gè)參數(shù)本地ipa路徑
uploadSvn(){
    echo '上傳svn.......'
    severHost=$1 #網(wǎng)絡(luò)環(huán)境地址 正式環(huán)境,測(cè)試環(huán)境,預(yù)發(fā)布
    ipaPath=$2
    severPath='' #ipa路徑
    case $severHost in
        1)  severPath='生產(chǎn)環(huán)境'
        ;;
        2)  severPath='預(yù)發(fā)布環(huán)境'
        ;;
        3)  severPath='測(cè)試環(huán)境'
        ;;
        4)  severPath='測(cè)試環(huán)境'
        ;;
        esac
    ipaFile=${ipaPath##*/} #獲取目錄下的文件
    echo $ipaFile
    echo $severPath
    if [ $severHost == 5 ];then #線上appStore環(huán)境
        svnPath="" svn appStore線上路徑
    else
        svnPath=“”svn路徑 測(cè)試路徑
    fi
    echo $svnPath
    svn delete -m "修改文件"  $svnPath
    svn import -m "New Import" $ipaPath $svnPath
    echo '上傳svn成功'
    echo "請(qǐng)到${svnPath}查看"

    #自動(dòng)上傳到蒲公英

#    curl -F "file=@${IPANAME}.ipa" -F "uKey=USER_KEY" -F "_api_key=API_KEY" https://qiniu-storage.pgyer.com/apiv1/app/upload
#    USER_KEY='d9382d83bcdf6e5ce6e4361e9e63bbeb'
#    API_KEY='1c9264c3a4e879976950a3f4787cd396'
#    curl -F "file=@{$ipaPath}" \
#    -F "uKey={$USER_KEY}" \
#    -F "_api_key={$API_KEY}" \
#    https://www.pgyer.com/apiv1/app/upload
}

注意的點(diǎn),

1.網(wǎng)絡(luò)請(qǐng)求必須在ServiceConstant.h文件中

2.ServiceConstant.h文件中的網(wǎng)絡(luò)請(qǐng)必須用宏定義域變異判斷操作

#define APPType 4

這句代碼格式不能改,包括空格

3.必須保證項(xiàng)目能跑起來,不報(bào)錯(cuò)

4.在執(zhí)行過程中可能需要輸入你的svn賬號(hào)和密碼

5.保證項(xiàng)目證書環(huán)境


image.png

執(zhí)行打包

1.cd到AAU目錄下

2.執(zhí)行./AAU.sh 中間屏幕就會(huì)一直滾動(dòng)起來,并打印一些日志,注意看是否有錯(cuò)

執(zhí)行完整代碼

cd AAU所在目錄
./AAU.sh 1 //帶參數(shù):1線上,2予發(fā)布,3測(cè)試外網(wǎng),4測(cè)試內(nèi)網(wǎng)這個(gè)可能跟你代碼中自己判斷有區(qū)別,自己對(duì)照

到這一步,所有打包流程都完成了,在svn查看自己包是否打包成功

執(zhí)行中的可能遇到的錯(cuò)誤錯(cuò)誤解決

執(zhí)行./AAU.sh 提示沒有權(quán)限

chmod a+x ./AAU.sh
后面從新執(zhí)行 ./AAU.sh 參數(shù)

xcode-select 報(bào)錯(cuò)
執(zhí)行

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

/Applications/Xcode.app/Contents/Developer是你xcode路徑,請(qǐng)選擇最新xcode路徑

參考:

iOS自動(dòng)化打包 ---- xcodebuild 命令詳解

Xcode命令行腳本打包

XZ_iOS命令行打包和Python腳本打包出現(xiàn)錯(cuò)誤的解決

shell腳本語言學(xué)習(xí)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末校仑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子传惠,更是在濱河造成了極大的恐慌迄沫,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卦方,死亡現(xiàn)場(chǎng)離奇詭異羊瘩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)盼砍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門尘吗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浇坐,你說我怎么就攤上這事睬捶。” “怎么了近刘?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵擒贸,是天一觀的道長。 經(jīng)常有香客問我觉渴,道長介劫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任案淋,我火速辦了婚禮座韵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踢京。我一直安慰自己誉碴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布漱挚。 她就那樣靜靜地躺著翔烁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旨涝。 梳的紋絲不亂的頭發(fā)上蹬屹,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天侣背,我揣著相機(jī)與錄音,去河邊找鬼慨默。 笑死贩耐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的厦取。 我是一名探鬼主播潮太,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼虾攻!你這毒婦竟也來了铡买?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤霎箍,失蹤者是張志新(化名)和其女友劉穎奇钞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漂坏,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡景埃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了顶别。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谷徙。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖驯绎,靈堂內(nèi)的尸體忽然破棺而出完慧,到底是詐尸還是另有隱情,我是刑警寧澤条篷,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布骗随,位于F島的核電站,受9級(jí)特大地震影響赴叹,放射性物質(zhì)發(fā)生泄漏鸿染。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一乞巧、第九天 我趴在偏房一處隱蔽的房頂上張望涨椒。 院中可真熱鬧,春花似錦绽媒、人聲如沸停士。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至要拂,卻和暖如春虏等,著一層夾襖步出監(jiān)牢的瞬間食绿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工锨苏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棺聊。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓伞租,卻偏偏與公主長得像,于是被迫代替她去往敵國和親限佩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子葵诈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354