iOS 脚本打包上传蒲公英通知钉钉

1,852 阅读3分钟

前言

App在提测后经常需要给测试打包,每次Archive这样打包是很浪费时间的,在这个打包的过程中还有好几个按钮需要选择点击,整体还是很麻烦的。所以可以采用运行脚本来一键打包,直接上传蒲公英,通知相应的钉钉群,发送下载ipa包的二维码并且@对应的同学。

有以下两种方式实现脚本打包

一、手动配置exportOptions.plist,然后运行脚本打包

  • 配置exportOptions.plist

可以先手动打包一次,然后在导出ipa包的时就看到有这个文件,然后在这个文件中增加一个字典provisioningProfiles,key是Bundle Identifier,value是描述文件的名称。把修改好的文件放在和xcodeproj文件同级的目录,然后添加到项目Supporting Files文件夹下。

截屏2021-11-04 下午10.18.19.png

  • 配置脚本
# 使用方法:
# 1.将该脚本放在工程目录下(在.xcworkspace文件or .xcodeproj文件上级目录)
# 2.根据项目情况修改对应的参数
# 3.首先在终端cd到当前工程,然后直接把脚本拖进终端点enter即可

# 打包时间
time="`date +%Y-%m-%d-%H-%M-%S`"
echo ${time}

# 项目scheme名称
project_scheme="SchemeDemo"

# 指定项目下build编译目录
build_dir="../build"

# 指定项目下archive编译目录
temp_archive_dir=${build_dir}/archive/temp.xcarchive

# 指定ipa的输出目录
ipa_dir=${build_dir}/ipa

# 配置蒲公英KEY
api_key=""

# 配置蒲公英更新描述信息
pgyer_desc="增加了XX功能,修复了XX bug"

# 清理项目 build目录
echo "cleaning..."
if [ -d ${build_dir} ]
then
rm -rf ${build_dir}
echo -e "\n CLEAN ARCHIVE FILE SUCCEED \n"
fi

# build
# -UseModernBuildSystem=NO 表示不使用当前的编译系统

echo "archiving..."
echo ${project_scheme}
echo ${temp_archive_dir}

# 编译
xcodebuild archive -workspace ${project_scheme}.xcworkspace -scheme ${project_scheme} -archivePath ${temp_archive_dir} -configuration Debug -UseModernBuildSystem=NO

# 打包ipa
echo "exporting..."
echo ${ipa_dir}/${time}
xcodebuild -exportArchive -archivePath ${temp_archive_dir}  -exportPath  ${ipa_dir}/${time} -exportOptionsPlist exportOptions.plist

#上传蒲公英
echo "uploading..."
ipa=${build_dir}/ipa/${time}/${project_scheme}.ipa
curl -F 'file=@'${ipa} -F '_api_key='${api_key}  -F 'buildUpdateDescription='${pgyer_desc} https://www.pgyer.com/apiv2/app/upload

#通知钉钉@对应的同学,同样通知到企业微信也是可以的
qrUrl="上传蒲公英包的URL"
#对应钉钉群设置机器人,Webhook地址
curl 'https://oapi.dingtalk.com/robot/send?access_token=' 
 -H 'Content-Type: application/json' 
 -d '{
     "msgtype": "markdown",
     "markdown": {
         "title":"新包",
         "text": "#### iOS新包 \n > \n > ![screenshot]('${qrUrl}')"
     } ,
      "at": {
          "atMobiles": [
              "艾特谁填写谁的手机号码"
          ]
      }
 }'

echo -e "\n UPLOAD TO PGYER SUCCEED \n"

二、直接根据脚本一键打包

#!/bin/sh

# 使用方法:
# step1: 将该脚本放在工程的根目录下(在.xcodeproj或者.xcworkspace文件同级目录)
# step2: 根据情况修改下面的参数
# step3: 打开终端,执行脚本,直接把脚本拖进终端,按下enter键即可

# =============项目自定义部分(自定义好下列参数后再执行该脚本)=================== #

echo "请选择打包方式 ? [ 1:development 2:ad-hoc ]"
read number
while([[ $number != 1 ]] && [[ $number != 2 ]])
do
echo "Error! Should enter 1 or 2"
echo "请选择打包方式 ? [ 1:development 2:ad-hoc]"

read number
done

# 工程名称(必填)
workspace_name=""

# 指定项目的scheme名称,必填
scheme_name="${workspace_name}-Test"

# 指定要打包编译的方式 : Debug、Release。必填
build_configuration="Release"

# method,打包的方式。方式分别为 development, ad-hoc 。必填
method="development"

# 项目的bundleID,手动管理Profile时必填
bundle_identifier="*****"

# 下面两个参数只是在手动指定Pofile文件的时候用到,如果使用Xcode自动管理Profile,直接留空就好
#(跟method对应的)mobileprovision文件名,需要先双击安装.mobileprovision文件.手动管理Profile时必填

mobileprovision_name="*****"
if [ $number == 1 ];then
build_configuration="Debug"
method="development"
mobileprovision_name = "****"
else
build_configuration="Release"
method="ad-hoc"
mobileprovision_name="*****"
fi

echo "--------脚本配置参数检查-----------"

echo "workspace_name = ${workspace_name}"
echo "scheme_name = ${scheme_name}"
echo "build_configuration = ${build_configuration}"
echo "method = ${method}"
echo "bundle_identifier = ${bundle_identifier}"
echo "mobileprovision_name = ${mobileprovision_name}"

# ==========脚本的一些固定参数定义(基本不需要修改)======== #

# 获取当前脚本所在目录
script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# 工程根目录
project_dir=$script_dir

# 指定输出导出文件夹路径
export_path="$project_dir/Build"

# 指定输出归档文件路径
export_archive_path="$export_path/$scheme_name.xcarchive"

# 指定输出ipa文件夹路径
export_ipa_path="$export_path/"

# 指定导出ipa包需要用到的plist配置文件的路径
export_options_plist_path="$project_dir/ExportOptions.plist"

echo "--------脚本参数检查-----------"
echo "project_dir = ${project_dir}"
echo "export_path = ${export_path}"
echo "export_archive_path = ${export_archive_path}"
echo "export_ipa_path = ${export_ipa_path}"
echo "export_options_plist_path = ${export_options_plist_path}"

# =======================自动打包部分(无特殊情况不用修改)====================== #

echo "------------------------------------------------------"
echo "\033[32m开始构建项目  \033[0m"

# 进入项目工程目录
cd ${project_dir}

# 指定输出文件目录不存在则创建
if [ -d "$export_path" ];
then rm -rf "$export_path"
fi

# 编译前清理工程
xcodebuild clean -workspace ${workspace_name}.xcworkspace -scheme ${scheme_name} -configuration ${build_configuration}

xcodebuild archive -workspace ${workspace_name}.xcworkspace -scheme ${scheme_name} -configuration ${build_configuration} -archivePath ${export_archive_path}

# 检查是否构建成功
# xcarchive 实际是一个文件夹不是一个文件所以使用 -d 判断

if [ -d "$export_archive_path" ] ; then
    echo "\033[32m项目构建成功 🚀 🚀 🚀  \033[0m"
else
    echo "\033[31m项目构建失败 😢 😢 😢  \033[0m"
    exit 1
fi

echo "------------------------------------------------------"

echo "\033[32m开始导出ipa文件 \033[0m"

# 先删除ExportOptions.plist文件
if [ -f ${export_options_plist_path} ] ; then
    #echo "${export_options_plist_path}文件存在,进行删除"
    rm -f ${export_options_plist_path}
fi

#根据参数生成export_options_plist文件,就是添加了一个字典,字典名称是provisioningProfiles,对应内容key=${bundle_identifier},value=${mobileprovision_name}

/usr/libexec/PlistBuddy -c 'Add :provisioningProfiles:'${bundle_identifier}' string  '${mobileprovision_name}'' $export_options_plist_path
/usr/libexec/PlistBuddy -c 'Add :method string '${method}'' $export_options_plist_path
/usr/libexec/PlistBuddy -c 'Add :compileBitcode bool NO' $export_options_plist_path

xcodebuild -exportArchive -archivePath ${export_archive_path} -exportPath ${export_ipa_path} -exportOptionsPlist ${export_options_plist_path} -allowProvisioningUpdates

# 检查文件是否存在
if [ -f "$export_ipa_path/$scheme_name.ipa" ] ; then

    echo "\033[32m导出 ${scheme_name}.ipa 包成功 🎉  🎉  🎉   \033[0m"
    open $export_path

else
    echo "\033[31m导出 ${scheme_name}.ipa 包失败 😢 😢 😢     \033[0m"
    exit 1

fi

# 删除export_options_plist文件(中间文件)
if [ -f "$export_options_plist_path" ] ; then
    #echo "${export_options_plist_path}文件存在,准备删除"
    rm -f $export_options_plist_path
fi

# 输出打包总用时
echo "\033[36m使用AutoPackageScript打包总用时: ${SECONDS}s \033[0m"

echo -e "\n 打包成功 \n"

# 配置蒲公英KEY
api_key="****"

# 配置蒲公英更新描述信息
pgyer_desc="更新内容"

#上传蒲公英
echo "uploading..."
ipa=${export_ipa_path}${workspace_name}.ipa

curl -F 'file=@'${ipa}'' -F '_api_key='${api_key}''  -F 'buildUpdateDescription='${pgyer_desc}'' https://www.pgyer.com/apiv2/app/upload

exit 0

具体到出包的路径都是可以根据需求修改的,打包上传到fir通知到钉钉也是一样的逻辑。后续会提供其他的自动打包方案,敬请期待!!!