推薦一個(gè)自動(dòng)化打包的工具套件穷躁,提供一個(gè)運(yùn)行良好的持續(xù)部署流程法挨,只需要運(yùn)行一個(gè)簡(jiǎn)單的命令就可以觸發(fā)這個(gè)流程全闷。下面是Github地址
https://github.com/fastlane/fastlane
出于初始化的時(shí)候需要賬號(hào)密碼蔼水,所以只是簡(jiǎn)單的使用它打包了項(xiàng)目,后續(xù)貼出fastlane的實(shí)踐步驟。
當(dāng)然了蚤假,根據(jù)自己的需求寫了一個(gè)打包以及上傳的腳本栏饮,大致思路為:
1.使用xcodebuild進(jìn)行打包
2.備份打包過程中的文件
3.上傳打包文件到公司服務(wù)器
現(xiàn)在就上面幾個(gè)步驟貼出完整步驟(由于涉及公司名稱,所以有些地方修改了下名稱):
1.由于涉及到自動(dòng)生成plist文件等磷仰,所以單獨(dú)拿出來一個(gè)文件放配置信息袍嬉,
iOS_Config.sh :
software-package^https://app.xxxxxx.com/app/TestProject/iOS/^提示內(nèi)容^1.222^software^com.chenzhe.test^/xx/yy/TestProject/iOS^/xx/plist/TestProject
software-package , software 這兩個(gè)不用修改,plist文件里面需要的
https://app.xxxxxx.com/app/TestProject/iOS/ 這是ipa包存放的前綴地址
提示內(nèi)容灶平,1.222伺通,com.chenzhe.test 這三個(gè)分別是企業(yè)證書下載時(shí)彈出的提示文本,plist文件中app的版本號(hào)民逼,plist文件中app的BundleID
/xx/yy/TestProject/iOS泵殴,/xx/plist/TestProject 這兩個(gè)分別代表ipa的服務(wù)器絕對(duì)地址和plist文件的絕對(duì)地址
以上配置對(duì)于企業(yè)證書打包很重要,因?yàn)闀?huì)自動(dòng)生成plist文件拼苍,對(duì)于Store的只需要最后打出的ipa包即可笑诅。
2.配置啟動(dòng)腳本,因?yàn)橐c真正的打包腳本分開疮鲫,所以吆你,iOS_Build.sh是單獨(dú)的shell腳本,傳入?yún)?shù)后觸發(fā)打包腳本俊犯。
iOS_Build.sh
#/bin/bash
#cd到項(xiàng)目目錄下
cd $4
#檢查以及修改配置文件信息妇多,可注釋
`open serviceConfig.sh`;
echo "檢查完畢并立即執(zhí)行?y/n";
read result;
if [ "$result" != "y" ]
then
echo '無效命令,請(qǐng)重新運(yùn)行';
exit;
fi
#開始執(zhí)行打包腳本
echo "/***? ? ? ? ? ? ? ? ? ? ? ? ? 打包中,請(qǐng)勿關(guān)閉...";
source $4/iOS_Archive.sh $1 $2 $3 $4 $5;
echo "***? ? ? ? ? ? ? ? ? ? ? ? ? ? 打包結(jié)束,可關(guān)閉/";
大致步驟為打開配置文件信息進(jìn)行核對(duì)燕侠,當(dāng)然不需要的話可以自行注釋掉者祖,然后就傳入基本參數(shù)進(jìn)行腳本打包。
3.執(zhí)行打包腳本
iOS_Archive.sh
#!/bin/bash
#1.工程名 2.當(dāng)前工程描述文件名稱 3.打包后的IPA名 4.腳本所在目錄地址(也就是項(xiàng)目路徑) 5.commit號(hào)绢彤,后續(xù)開放
#################################################配置信息#################################################
#獲取當(dāng)前用戶名以及時(shí)間戳
userName=`whoami`
timeVar=`date +%Y-%m-%d-%H-%M`
#獲取配置信息
aTemp=""
filePath=`pwd`
plistName=$3
while read line
do
aTemp=$line
done < "$filePath/iOS_Config.sh"
IFS='^'
argsArray=($line)
#basePath 打包文件備份根路徑
#toolArchivePath 將Archive文件保存到原目錄七问,比如說友盟做崩潰日志收集等使用(如果Xcode改名的話自己一定要修改下面的Xcode參數(shù))
basePath="/Users/$userName/Desktop"
toolArchivePath="/Users/$userName/Library/Developer/Xcode"
if [ ! -d "/Users/$userName/Desktop" ]
then
basePath="/Users/admin/Desktop";
toolArchivePath="/Users/admin/Library/Developer/Xcode"
fi
#ipaPath 打包文件備份實(shí)際存放路徑
ipaPath="$basePath/IOSProject/$1/$timeVar"
#提示用戶信息,5秒后進(jìn)行打包
printf "\e[31m %-50s\e[0m\n" "打包工程名:? ? ? ? ? ? ? ? ? ? ? ? $1";
printf "\e[31m %-50s\e[0m\n" "BundleID:? ? ? ? ? ? ? ? ? ? ? ? ? ${argsArray[5]}";
printf "\e[31m %-50s\e[0m\n" "描述文件名稱:? ? ? ? ? ? ? ? ? ? ? $2";
printf "\e[31m %-50s\e[0m\n" "項(xiàng)目版本號(hào):? ? ? ? ? ? ? ? ? ? ? ? ${argsArray[3]}";
printf "\e[31m %-50s\e[0m\n" "項(xiàng)目路徑:? ? ? ? ? ? ? ? ? ? ? ? ? $4";
printf "\e[31m %-50s\e[0m\n" "ipa文件所在服務(wù)器路徑:? ? ? ? ? ? ${argsArray[1]}$plistName.ipa";
printf "\e[31m %-50s\e[0m\n" "plist文件所在服務(wù)器路徑:? ? ? ? ? ${argsArray[1]}$plistName.plist";
printf "\e[31m %-50s\e[0m\n" "下載描述信息:? ? ? ? ? ? ? ? ? ? ? ${argsArray[2]}";
echo "請(qǐng)確認(rèn)信息,5秒后開始打包......";
sleep 5;
#################################################打包工作#################################################
#刪除可能存在的緩存包
rm -rf "./$3.ipa"
rm -rf "./$3.plist"
rm -rf "./$timeVar.xcarchive"
#使用xcodebuild進(jìn)行打包,默認(rèn)采取靜默方式,有額外需求自行添加(比如有多個(gè)Target的項(xiàng)目茫舶,自行添加-target等等)
#workspace 工作空間
#scheme 項(xiàng)目Scheme
#archivePath Archive路徑
xcodebuild clean build -configuration Release -workspace "$1.xcworkspace" -scheme $1 -archivePath "./$timeVar.xcarchive" archive;
xcodebuild -exportArchive -exportFormat IPA -archivePath "./$timeVar.xcarchive" -exportPath "./$3.ipa" -exportProvisioningProfile $2;
除了xcodebuild那兩行械巡,上面的基本工作就是配置基本路徑信息,比如備份文件存儲(chǔ)的地址等饶氏,紅色提示用戶打包基本信息進(jìn)行核對(duì)讥耗,然后archive以及生成ipa文件。
然后生成plist文件:
#生成plist文件initPlist() {echo "">> "$plistName.plist"echo "">> "$plistName.plist"echo "">> "$plistName.plist"echo "">> "$plistName.plist"echo "items">> "$plistName.plist"echo "">> "$plistName.plist"echo "">> "$plistName.plist"echo "assets">> "$plistName.plist"echo "">> "$plistName.plist"echo "">> "$plistName.plist"echo "kind">> "$plistName.plist"echo "${argsArray[0]}">> "$plistName.plist"echo "url">> "$plistName.plist"echo "${argsArray[1]}$plistName.ipa">> "$plistName.plist"echo "">> "$plistName.plist"echo "">> "$plistName.plist"echo "metadata">> "$plistName.plist"echo "">> "$plistName.plist"echo "bundle-identifier">> "$plistName.plist"echo "${argsArray[5]}">> "$plistName.plist"echo "bundle-version">> "$plistName.plist"echo "${argsArray[3]}">> "$plistName.plist"echo "kind">> "$plistName.plist"echo "${argsArray[4]}">> "$plistName.plist"echo "title">> "$plistName.plist"echo "${argsArray[2]}">> "$plistName.plist"echo "">> "$plistName.plist"echo "">> "$plistName.plist"echo "">> "$plistName.plist"echo "">> "$plistName.plist"echo "">> "$plistName.plist"echo "}">> "$plistName.plist"}
initPlist $plistName "$filePath/$plistName.plist";
#創(chuàng)建原目錄文件夾
mkdir -p "$toolArchivePath/toolArchives/$1/$timeVar"
然后是打包后的后續(xù)操作了疹启,比如上傳到服務(wù)器上或者分發(fā)到別的渠道等:
#################################################分發(fā)項(xiàng)目包#################################################
#供用戶選擇
Excute_Page=(
[0]='1'
[1]='2'
)
Excute_Handler=(
[0]='上傳到SFTP服務(wù)器'
[1]='退出'
)
Excute_Count=${#Excute_Page[@]}
#輸出用戶選項(xiàng)
screen_echo() {
printf "%-7s |" '序號(hào)'
printf "%-30s\n" '執(zhí)行操作'
for((i=0; i<$Excute_Count; ++i))
do
printf "\e[31m %-5s\e[0m" `expr $i + 1`
printf "\033[36m %-30s \033[0m\n" "${Excute_Handler[$i]}"
done
}
screen_echo
#創(chuàng)建備份目錄
mkdir -p $ipaPath
read -p '請(qǐng)輸入要登陸的服務(wù)器序號(hào)(非以上選項(xiàng)都以退出處理): ' Excute_Number
echo ${Excute_Number};
#執(zhí)行用戶選擇
if [ ${Excute_Number} -eq '1' ];
then
#上傳ipa plist等文件到服務(wù)器上
`$4/iOS_Dispatch.sh ${argsArray[6]} $4 $plistName ${argsArray[7]}`
elif [ ${Excute_Number} -eq '2' ];
then
`open $ipaPath`
else
echo "輸入錯(cuò)誤,退出";
`open $ipaPath`
fi
#################################################后續(xù)收尾工作################################################
#拷貝文件到備份目錄下去
cp "$4/$3.ipa" $ipaPath
cp "$4/$3.plist" $ipaPath
cp -R "$4/$timeVar.xcarchive" $ipaPath
cp -R "$4/$timeVar.xcarchive" "$toolArchivePath/toolArchives/$1/$timeVar"
#刪除文件
rm -rf "$4/$3.ipa"
rm -rf "$4/$3.plist"
rm -rf "$4/$timeVar.xcarchive"
暫時(shí)只滿足了上傳到服務(wù)器和直接打開下載包地址的功能古程,如果有自己分發(fā)渠道的可以自行添加選項(xiàng):
Excute_Handler=(
[0]='上傳到SFTP服務(wù)器'
[1]='退出'
)
4.上傳到服務(wù)器
由于第三步用戶已經(jīng)選擇了上傳到服務(wù)器,這里只需要實(shí)現(xiàn)自己的上傳腳本即可喊崖,后面的腳本命令就不貼出來了挣磨。
以上基本就簡(jiǎn)單實(shí)現(xiàn)了基本的打包以及分發(fā)的功能菲宴,不是很完善,后續(xù)有時(shí)間會(huì)持續(xù)更新趋急。
差點(diǎn)忘了,因?yàn)槲沂巧蟼鞯轿覀児镜膄tp服務(wù)器上势誊,所以推薦一個(gè)mac的軟件
brew install lftp
如果你是升級(jí)到新系統(tǒng)或者Sierra這些呜达,而且brew 也搜索不到lftp的話,可以使用:
brew install homebrew/boneyard/lftp