iOS底層原理_15Xcode自動打包上傳腳本

Xcode自動打包上傳腳本

之前因為項目比較小,也不經(jīng)常發(fā)版,所以一直都是手動打包上傳。最近由于懶的打包的時候一直盯著點東西,再加上上傳時Xcode比較卡,耽誤摸魚,所以就打算研究下腳本打包上傳。
找了比較多的都是打ipa的,因為我們項目使用了Bugly,所以我還是想一次性搞完上傳AppStore、Bugly的。(Bugly之前是有腳本可以自動上傳了,后來改版后必須手動)
腳本里面也有上傳蒲公英的,有需要的自行調試

廢話不多說,上代碼唄~!

#!/bin/sh
# 使用方法
# 1.將shell.sh和附件中的plist,放在一起,新建文件夾為Shell,將這幾文件復制進去,然后復制Shell文件夾到工程的根目錄
# 2.終端cd到Shell下,執(zhí)行腳本 格式為 sh 腳本名字.sh
# 備注 bugly支持 java 1.8.0 不是的自行安裝 https://www.oracle.com/java/technologies/downloads/#java8


# 配置信息
#shell文件夾名默認 Shell
file_name="Shell"

#這里配置完參數(shù)則下方不用進行手動輸入(用于參數(shù)化構建)
#是否歸檔
#parameter_archive="1"
#是否導出IPA
#parameter_export="1"

#是否為工作組/workspace
parameter_workspace="1"
#打包模式
#parameter_configuration="1"

#打包類型
#parameter_type="1"
#上傳類型
#parameter_upload="1"

#是否上傳bugly
#parameter_bugly="1"

#上傳appstore
#賬號
#parameter_username=""
#獨立密碼
#parameter_password=""

# .xcworkspace的名字
workspace_name="XXX"
# 指定項目的scheme名稱(也就是工程的target名稱)
#測試環(huán)境
project_name="XXX"
#正式環(huán)境
#project_name="XXX"


echo "\033[32m****************\n開始自動打包\n****************\033[0m\n"

# ==========自動打包配置信息部分========== #

#返回上一級目錄,進入項目工程目錄
cd ..
configRun() {
    #獲取項目名稱
    #由于我們的項目比較老,改了好幾版,所以名稱比較混亂,這塊我就直接注釋改成自定義了。
    #project_name=$(find . -name *.xcodeproj | awk -F "[/.]" '{print $(NF-1)}')

    #獲取工程plist配置文件 路徑不對自己改下
    info_plist_path="$workspace_name/Info.plist"

    #設置Build版本號(可以不進行設置)
    date=$(date +"%Y%m%d%H%M")
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $date" "$info_plist_path"
    #獲取Build版本號
    bundle_version=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $info_plist_path`

    #獲取BuildID
    #bundle_identifier=`sed -n '/PRODUCT_BUNDLE_IDENTIFIER/{s/PRODUCT_BUNDLE_IDENTIFIER = //;s/;//;s/^[[:space:]]*//;p;q;}' ./$project_name.xcodeproj/project.pbxproj`
        bundle_identifier=`com.neotel.overseas`

    #指定輸出ipa路徑
    export_path_ipa="./$file_name/IPA"
    #指定輸出歸檔文件地址
    export_path_archive="$export_path_ipa/$project_name.xcarchive"
}
configRun

echo "\033[32m****************\n自動打包選擇配置部分\n****************\033[0m\n"

# ==========自動打包可選擇信息部分========== #
# 輸入是否歸檔
archiveConfigRun() {
    echo "\033[36;1m是否是否歸檔(輸入序號, 按回車即可) \033[0m"
    echo "\033[33;1m1. 歸檔 \033[0m"
    echo "\033[33;1m2. 不歸檔 \033[0m"

    if test ${#parameter_archive} == 0 ; then
        #讀取用戶輸入
        read parameter_archive
        sleep 0.5
    fi

    if test "$parameter_archive" == "1" ; then
        echo "\033[32m****************\n您選擇了 歸檔\n****************\033[0m\n"
    elif [ "$parameter_archive" == "2" ]; then
        parameter_configuration="1"
        echo "\033[32m****************\n您選擇了 不歸檔\n****************\033[0m\n"
    else
        echo "\n\033[31;1m****************\n您輸入的參數(shù),無效請重新輸入!!! \n****************\033[0m\n"
        parameter_archive=""
        archiveConfigRun
    fi
}
archiveConfigRun

# 輸入是否導出IPA
exportConfigRun() {
    echo "\033[36;1m是否是導出IPA(輸入序號, 按回車即可) \033[0m"
    echo "\033[33;1m1. 導出IPA \033[0m"
    echo "\033[33;1m2. 不導出IPA \033[0m"

    if test ${#parameter_export} == 0 ; then
        #讀取用戶輸入
        read parameter_export
        sleep 0.5
    fi

    if test "$parameter_export" == "1" ; then
        echo "\033[32m****************\n您選擇了 導出IPA\n****************\033[0m\n"
    elif [ "$parameter_export" == "2" ]; then
        parameter_workspace="1"
        parameter_type="1"
        echo "\033[32m****************\n您選擇了 不導出IPA\n****************\033[0m\n"
    else
        echo "\n\033[31;1m****************\n您輸入的參數(shù),無效請重新輸入!!! \n****************\033[0m\n"
        parameter_export=""
        archiveConfigRun
    fi
}
exportConfigRun

# 輸入是否為工作空間
workspaceRun() {
    echo "\033[36;1m是否是工作空間(輸入序號, 按回車即可) \033[0m"
    echo "\033[33;1m1. 是 \033[0m"
    echo "\033[33;1m2. 否 \033[0m"

    if test ${#parameter_workspace} == 0 ; then
        #讀取用戶輸入
        read parameter_workspace
        sleep 0.5
    fi

    if test "$parameter_workspace" == "1" ; then
        echo "\n\033[32m****************\n將采用:xcworkspace\n****************\033[0m\n"
    elif [ "$parameter_workspace" == "2" ]; then
        echo "\n\033[32m****************\n將采用:xcodeproj\n****************\033[0m\n"
    else
        echo "\n\033[31;1m****************\n您輸入的參數(shù),無效請重新輸入!!! \n****************\033[0m\n"
        parameter_workspace=""
        workspaceRun
    fi
}
workspaceRun

# 輸入打包類型
methodRun() {
    echo "\033[36;1m請選擇打包方式(輸入序號, 按回車即可) \033[0m"
    echo "\033[33;1m1. AdHoc(預發(fā)) \033[0m"
    echo "\033[33;1m2. AppStore(發(fā)布) \033[0m"
    echo "\033[33;1m3. Enterprise(企業(yè)) \033[0m"
    echo "\033[33;1m4. Development(測試) \033[0m\n"

    if test ${#parameter_type} == 0 ; then
        #讀取用戶輸入
        read parameter_type
        sleep 0.5
    fi

    if test "$parameter_type" == "1" ; then
        parameter_type="AdHoc"
    elif [ "$parameter_type" == "2" ]; then
        parameter_type="AppStore"
        parameter_configuration="1"
    elif [ "$parameter_type" == "3" ]; then
        parameter_type="Enterprise"
    elif [ "$parameter_type" == "4" ]; then
        parameter_type="Development"
    else
        echo "\n\033[31;1m****************\n您輸入的參數(shù),無效請重新輸入!!! \n****************\033[0m\n"
        parameter_type=""
        methodRun
    fi

    echo "\033[32m****************\n您選擇了 $parameter_type 打包類型\n****************\033[0m\n"
}
methodRun

# 輸入打包模式
configurationRun() {
    echo "\033[36;1m請選擇打包模式(輸入序號, 按回車即可) \033[0m"
    echo "\033[33;1m1. Release \033[0m"
    echo "\033[33;1m2. Debug \033[0m"

    if test ${#parameter_configuration} == 0 ; then
        #讀取用戶輸入
        read parameter_configuration
        sleep 0.5
    fi

    if test "$parameter_configuration" == "1" ; then
        parameter_configuration="Release"
    elif [ "$parameter_configuration" == "2" ]; then
        parameter_configuration="Debug"
    else
        echo "\n\033[31;1m****************\n您輸入的參數(shù),無效請重新輸入!!! \n****************\033[0m\n"
        parameter_configuration=""
        configurationRun
    fi

    echo "\n\033[32m****************\n打包模式:$parameter_configuration \n****************\033[0m\n"
}
configurationRun


# 輸入上傳類型
publishRun() {
    echo "\033[36;1m請選擇上傳類型(輸入序號, 按回車即可) \033[0m"
    echo "\033[33;1m1. 蒲公英 \033[0m"
    echo "\033[33;1m2. AppStore \033[0m"
    echo "\033[33;1m3. 不上傳 \033[0m"

    if test ${#parameter_upload} == 0 ; then
        #讀取用戶輸入
        read parameter_upload
        sleep 0.5
    fi

    if test "$parameter_upload" == "1" ; then
        echo "\033[32m****************\n您選擇了上傳 蒲公英\n****************\033[0m\n"
    elif [ "$parameter_upload" == "2" ]; then
        echo "\033[32m****************\n您選擇了上傳 AppStore\n****************\033[0m\n"
    elif [ "$parameter_upload" == "3" ]; then
        echo "\033[32m****************\n您選擇了不上傳\n****************\033[0m\n"
    else
        echo "\n\033[31;1m**************** 您輸入的參數(shù),無效請重新輸入!!! ****************\033[0m\n"
        parameter_upload=""
        publishRun
    fi
}
publishRun

# 輸入上傳Bugly
buglyRun() {
    echo "\033[36;1m請選擇是否上傳bugly(輸入序號, 按回車即可)\033[0m"
    echo "\033[33;1m1. 不上傳 \033[0m"
    echo "\033[33;1m2. 上傳 \033[0m"

    if test ${#parameter_bugly} == 0 ; then
        #讀取用戶輸入
        read parameter_bugly
        sleep 0.5
    fi

    if test "$parameter_bugly" == "1" ; then
        echo "\033[32m****************\n您選擇了不上傳 Bugly\n****************\033[0m\n"
    elif [ "$parameter_bugly" == "2" ]; then
        echo "\033[32m****************\n您選擇了上傳 Bugly\n****************\033[0m\n"
    else
        echo "\n\033[31;1m**************** 您輸入的參數(shù),無效請重新輸入!!! ****************\033[0m\n"
        parameter_bugly=""
        buglyRun
    fi
}
buglyRun

# 輸入APPStore信息
appStoreUserNameRun() {
    echo "\033[36;1m請輸入APPStore賬號(輸入完畢, 按回車即可) \033[0m"
    if test ${#parameter_username} == 0 ; then
        #讀取用戶輸入
        read parameter_username
        sleep 0.5
    fi

    echo "\033[36;1m請輸入APPStore獨立密碼(輸入完畢, 按回車即可) \033[0m"
    if test ${#parameter_password} == 0 ; then
        #讀取用戶輸入
        read parameter_password
        sleep 0.5
    fi
}

# 選擇上傳 AppStore
if test "$parameter_upload" == "2" ; then
    appStoreUserNameRun
fi

# 選填蒲公英更新文案
pgyUpdateContent() {
    echo "\033[36;1m請輸入蒲公英更新文案,選填(輸入完畢, 按回車即可) \033[0m"
    #讀取用戶輸入
    read updateDescription
    echo "\n\033[32m****************\n更新文案\n$updateDescription\n****************\033[0m\n"
    sleep 0.5
}

# 選擇上傳 蒲公英
if test "$parameter_upload" == "1" ; then
    pgyUpdateContent
fi

echo "\n\033[32m****************\n打包信息配置完畢,開始進行打包\n****************\033[0m\n"

# 歸檔
archiveRun() {

    if test "$parameter_archive" == "1" ; then

        echo "\n\033[32m****************\n開始清理工程\n****************\033[0m\n"
        #強制刪除舊的文件夾
        rm -rf $export_path_ipa

        #指定輸出文件目錄不存在則創(chuàng)建
        if test -d "$export_path_ipa"; then
            echo $export_path_ipa
        else
            mkdir -pv $export_path_ipa
        fi

        #清理工程
        xcodebuild clean -configuration "$parameter_configuration" -alltargets

        echo "\n\033[32m****************\n清理工程完畢\n****************\033[0m\n"
        echo "\n\033[32m****************\n開始歸檔項目\n****************\033[0m\n"

        if test "$parameter_workspace" == "1" ; then
            #工作空間
            xcodebuild archive \
            -workspace $workspace_name.xcworkspace \
            -scheme $project_name \
            -configuration $parameter_configuration \
            -destination generic/platform=ios \
            -archivePath $export_path_archive
        else
            #不是工作空間
            xcodebuild archive \
            -project $project_name.xcodeproj \
            -scheme $project_name \
            -configuration $parameter_configuration \
            -archivePath $export_path_archive
        fi

    fi

    #檢查是否構建成功
    #xcarchive 實際是一個文件夾不是一個文件所以使用 -d 判斷
    if test -d "$export_path_archive"; then
        echo "\n\033[32m****************\n項目歸檔成功\n****************\033[0m\n"
    else
        echo "\n\033[32m****************\n項目歸檔失敗\n****************\033[0m\n"
        exit 1
    fi
}
archiveRun

# 導出ipa
exportRun() {
    if test "$parameter_export" == "1" ; then
        echo "\033[32m****************\n開始導出ipa\n****************\033[0m\n"
        #刪除之前的IPA
        old_ipa=$(find . -name *.ipa)
        echo $old_ipa
        if test ${#old_ipa} != 0 ; then
            rm -rf $old_ipa
        fi
        #1、打包命令
        #2、歸檔文件地址
        #3、ipa輸出地址
        #4、ipa打包plist文件地址
        xcodebuild -exportArchive \
        -archivePath $export_path_archive \
        -configuration $parameter_configuration \
        -exportPath $export_path_ipa \
        -exportOptionsPlist "./$file_name/${parameter_type}_ExportOptions.plist"
    fi

    #app 名字
    app_name=$(find . -name *.ipa | awk -F "[/.]" '{print $(NF-1)}')
    #app_name="OverSeasAppstore"
    #app 版本號
    version=$(xcodebuild -showBuildSettings | grep MARKETING_VERSION | tr -d 'MARKETING_VERSION =')
    #指定輸出ipa名稱
    ipa_name="$app_name$version($bundle_version)"

    #ipa最終路徑
    path_ipa=$export_path_ipa/$ipa_name.ipa
    #修改ipa文件名稱
    echo "\n\033[32m****************\nmv報錯參數(shù)\n$export_path_ipa/$app_name.ipa \n****************\033[0m\n"
    echo "\n\033[32m****************\nmv報錯參數(shù)\n$path_ipa\n****************\033[0m\n"
    mv $export_path_ipa/$app_name.ipa $path_ipa

    #檢查文件是否存在
    if test -f "$path_ipa"; then
        echo "\n\033[32m****************\n導出 $app_name.ipa 包成功\n****************\033[0m\n"
    else
        echo "\n\033[32m****************\n導出 $app_name.ipa 包失敗\n****************\033[0m\n"
        exit 1
    fi
}
exportRun

echo "\n\033[32m****************\n使用Shell腳本打包完畢\n****************\033[0m\n"

# 上傳ipa
uploadRun() {
    #上傳 蒲公英
    if test "$parameter_upload" == "1" ; then
        echo "\033[32m****************\n開始上傳蒲公英\n****************\033[0m\n"

        curl --request POST \
        -F "file=@$path_ipa" \
        -F "uKey=e5a9331a3fd25bc36646f831e4d42f2d" \
        -F "_api_key=ce1874dcf4523737c9c1d3eafd99164f" \
        -F "updateDescription=$updateDescription" \
        https://upload.pgyer.com/apiv1/app/upload

        echo "\n\033[32m\n****************\n上傳蒲公英完畢\n****************\033[0m\n"
    fi

    #上傳 AppStore
    if test "$parameter_upload" == "2" ; then
        #驗證賬號密碼
        if test ${#parameter_username} != 0 -a ${#parameter_username} != 0 ; then
            echo "\n\033[32m****************\n開始上傳AppStore\n****************\033[0m\n"

            #驗證APP
            xcrun altool --validate-app \
            -f "$path_ipa" \
            -t iOS \
            -u "$parameter_username" \
            -p "$parameter_password" \
            --output-format xml

            #上傳APP
            xcrun altool --upload-app \
            -f "$path_ipa" \
            -t iOS \
            -u "$parameter_username" \
            -p "$parameter_password" \
            --output-format xml

            echo "\n\033[32m****************\n上傳AppStore完畢\n****************\033[0m\n"
        fi
    fi
    #上傳 Bugly
    if test "$parameter_bugly" == "2" ; then
        echo "\033[32m****************\n開始上傳bugly\n****************\033[0m\n"

        bugly_app_id="XXXX"
        bugly_app_key="XXXX"

        #dsym 路徑
        dsymfile_path="$export_path_archive/dSYMs/$app_name.app.dSYM"

        java -jar "./"$file_name"/buglyqq-upload-symbol.jar"  \
        -appid "$bugly_app_id" \
        -appkey "$bugly_app_key" \
        -bundleid "$bundle_identifier"\
        -platform "IOS" \
        -version "$bundle_version" \
        -inputSymbol "$dsymfile_path"
        echo "\033[32m****************\n上傳bugly完畢\n****************\033[0m\n"
    fi
}
uploadRun

注意點:

  • 需要下載上面網(wǎng)站里的整個文件夾并放到項目目錄下。
  • 如果報錯無法打開XXXX.sh的這種,去設置隱私里給開一下。
  • 中途報錯都會有描述原因,可以參照原因修改一下。
  • 注意自己的項target名稱跟workspace名稱。
  • 腳本里面寫注釋的時候需要另起一行,之前直接寫代碼后面,字體雖然變色,但是實際執(zhí)行有問題。

參考文章

下載地址

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

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

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