推荐一个自动化打包的工具套件,提供一个运行良好的持续部署流程,只需要运行一个简单的命令就可以触发这个流程。下面是Github地址
https://github.com/fastlane/fastlane
出于初始化的时候需要账号密码,所以只是简单的使用它打包了项目,后续贴出fastlane的实践步骤。
当然了,根据自己的需求写了一个打包以及上传的脚本,大致思路为:
1.使用xcodebuild进行打包
2.备份打包过程中的文件
3.上传打包文件到公司服务器
现在就上面几个步骤贴出完整步骤(由于涉及公司名称,所以有些地方修改了下名称):
1.由于涉及到自动生成plist文件等,所以单独拿出来一个文件放配置信息,
iOS_Config.sh :
software-package^https://app.xxxxxx.com/app/TestProject/iOS/^提示内容^1.222^software^com.chenzhe.test^/xx/yy/TestProject/iOS^/xx/plist/TestProject
software-package , software 这两个不用修改,plist文件里面需要的
https://app.xxxxxx.com/app/TestProject/iOS/ 这是ipa包存放的前缀地址
提示内容,1.222,com.chenzhe.test 这三个分别是企业证书下载时弹出的提示文本,plist文件中app的版本号,plist文件中app的BundleID
/xx/yy/TestProject/iOS,/xx/plist/TestProject 这两个分别代表ipa的服务器绝对地址和plist文件的绝对地址
以上配置对于企业证书打包很重要,因为会自动生成plist文件,对于Store的只需要最后打出的ipa包即可。
2.配置启动脚本,因为要与真正的打包脚本分开,所以,iOS_Build.sh是单独的shell脚本,传入参数后触发打包脚本。
iOS_Build.sh
#/bin/bash
#cd到项目目录下
cd $4
#检查以及修改配置文件信息,可注释
`open serviceConfig.sh`;
echo "检查完毕并立即执行?y/n";
read result;
if [ "$result" != "y" ]
then
echo '无效命令,请重新运行';
exit;
fi
#开始执行打包脚本
echo "/*** 打包中,请勿关闭...";
source $4/iOS_Archive.sh $1 $2 $3 $4 $5;
echo "*** 打包结束,可关闭/";
大致步骤为打开配置文件信息进行核对,当然不需要的话可以自行注释掉,然后就传入基本参数进行脚本打包。
3.执行打包脚本
iOS_Archive.sh
#!/bin/bash
#1.工程名 2.当前工程描述文件名称 3.打包后的IPA名 4.脚本所在目录地址(也就是项目路径) 5.commit号,后续开放
#################################################配置信息#################################################
#获取当前用户名以及时间戳
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参数)
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 打包文件备份实际存放路径
ipaPath="$basePath/IOSProject/$1/$timeVar"
#提示用户信息,5秒后进行打包
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" "项目版本号: ${argsArray[3]}";
printf "\e[31m %-50s\e[0m\n" "项目路径: $4";
printf "\e[31m %-50s\e[0m\n" "ipa文件所在服务器路径: ${argsArray[1]}$plistName.ipa";
printf "\e[31m %-50s\e[0m\n" "plist文件所在服务器路径: ${argsArray[1]}$plistName.plist";
printf "\e[31m %-50s\e[0m\n" "下载描述信息: ${argsArray[2]}";
echo "请确认信息,5秒后开始打包......";
sleep 5;
#################################################打包工作#################################################
#删除可能存在的缓存包
rm -rf "./$3.ipa"
rm -rf "./$3.plist"
rm -rf "./$timeVar.xcarchive"
#使用xcodebuild进行打包,默认采取静默方式,有额外需求自行添加(比如有多个Target的项目,自行添加-target等等)
#workspace 工作空间
#scheme 项目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那两行,上面的基本工作就是配置基本路径信息,比如备份文件存储的地址等,红色提示用户打包基本信息进行核对,然后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";
#创建原目录文件夹
mkdir -p "$toolArchivePath/toolArchives/$1/$timeVar"
然后是打包后的后续操作了,比如上传到服务器上或者分发到别的渠道等:
#################################################分发项目包#################################################
#供用户选择
Excute_Page=(
[0]='1'
[1]='2'
)
Excute_Handler=(
[0]='上传到SFTP服务器'
[1]='退出'
)
Excute_Count=${#Excute_Page[@]}
#输出用户选项
screen_echo() {
printf "%-7s |" '序号'
printf "%-30s\n" '执行操作'
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
#创建备份目录
mkdir -p $ipaPath
read -p '请输入要登陆的服务器序号(非以上选项都以退出处理): ' Excute_Number
echo ${Excute_Number};
#执行用户选择
if [ ${Excute_Number} -eq '1' ];
then
#上传ipa plist等文件到服务器上
`$4/iOS_Dispatch.sh ${argsArray[6]} $4 $plistName ${argsArray[7]}`
elif [ ${Excute_Number} -eq '2' ];
then
`open $ipaPath`
else
echo "输入错误,退出";
`open $ipaPath`
fi
#################################################后续收尾工作################################################
#拷贝文件到备份目录下去
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"
暂时只满足了上传到服务器和直接打开下载包地址的功能,如果有自己分发渠道的可以自行添加选项:
Excute_Handler=(
[0]='上传到SFTP服务器'
[1]='退出'
)
4.上传到服务器
由于第三步用户已经选择了上传到服务器,这里只需要实现自己的上传脚本即可,后面的脚本命令就不贴出来了。
以上基本就简单实现了基本的打包以及分发的功能,不是很完善,后续有时间会持续更新。
差点忘了,因为我是上传到我们公司的ftp服务器上,所以推荐一个mac的软件
brew install lftp
如果你是升级到新系统或者Sierra这些,而且brew 也搜索不到lftp的话,可以使用:
brew install homebrew/boneyard/lftp