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)境的
#自動(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)境
執(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路徑
參考: