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í)行有問題。