在工作中经常需要打包给测试人员测试,用Xcode 打包项目编译太慢,一次打包可能需要十来分钟,于是就想到了自动化打包。我的打包流程是Xcode打包 -> 上传到蒲公英 -> 通知到钉钉群。我没有使用Fastlane
或者jenkins
,因为大部分都是我自己打包,并且打包比较频繁,所以就没有使用。在这个过程也遇到不少问题,下面也会分享给大家。
流程
我使用的是shell
脚本自动化打包。
一、Xcode打包
1. 配置plist文件
provisioningProfiles: key是bundle id ,value是打包证书名称
teamID: 账号ID,可以不用配置
这些配置一定要对应上,否则会出错。
2. Xcode打包
清理工程 -> 编译工程 -> 导出ipa
echo '正在清理工程'
xcodebuild \
clean -configuration ${development_mode} -quiet || exit
echo '清理完成'
echo '正在编译工程:'${development_mode}
xcodebuild \
archive -workspace ${project_path}/${project_name}.xcworkspace \
-scheme ${scheme_name} \
-configuration ${development_mode} \
-archivePath ${build_path}/${project_name}.xcarchive -quiet || exit
echo '编译完成'
echo '开始ipa打包'
xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive \
-configuration ${development_mode} \
-exportPath ${exportIpaPath} \
-exportOptionsPlist ${exportOptionsPlistPath} \
-quiet || exit
二、上传蒲公英
我使用的是api2.0
,其他参数配置可以去蒲公英官网查看。
RESPONSE=$(curl -F "file=@$exportIpaPath/$product_name.ipa" -F "uKey=${user_key}" -F "_api_key=${api_key}" -F "updateDescription=${update_desc}" https://www.pgyer.com/apiv2/app/upload)
三、通知钉钉群
通知钉钉群需要配置机器人参数,钉钉开放平台有详细介绍。
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "markdown",
"markdown": {
"title":"xxxx",
"text":"![screenshot]('"$appQRCodeURL"') \n **版本:** '"$appVersion"' (build '"$appBuildVersion"') \n **环境:** '"$envir_desc"' \n **说明:** '"$update_desc"'"
}
}'
注意:
title
需要包含关键词
全部代码
#使用方法
if [ ! -d ./IPADir ];
then
mkdir -p IPADir;
fi
#工程绝对路径
project_path=/Users/shark/Desktop/APP
echo "环境:"
read envir_desc
echo "更新内容:"
read update_desc
#工程名
project_name=APP
#scheme名
scheme_name=APP
product_name=APP
#打包模式 Debug/Release
development_mode=Release
#蒲公英参数
user_key=xxx
api_key=xxx
current_path=$(cd `dirname $0`; pwd)
#build文件夹路径
build_path=${current_path}/build
#plist文件所在路径
exportOptionsPlistPath=${current_path}/exportTest.plist
#导出.ipa文件所在路径
exportIpaPath=${current_path}/IPADir/${development_mode}
##json解析函数
function jsonParse() { # $1 $2 json lable
JSON_CONTENT=$1
KEY='"'$2'":'
echo ${JSON_CONTENT} | awk -F ${KEY} '{print $2}' | awk -F '"' '{print $2}'
}
##删除斜杠'\'
function trimSlash() {
TEXT=$1
echo ${TEXT//'\'/''}
}
echo "第一步,进入项目工程文件"
cd $project_path
echo '正在清理工程'
xcodebuild \
clean -configuration ${development_mode} -quiet || exit
echo '清理完成'
echo '正在编译工程:'${development_mode}
xcodebuild \
archive -workspace ${project_path}/${project_name}.xcworkspace \
-scheme ${scheme_name} \
-configuration ${development_mode} \
-archivePath ${build_path}/${project_name}.xcarchive -quiet || exit
echo '编译完成'
echo '开始ipa打包'
xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive \
-configuration ${development_mode} \
-exportPath ${exportIpaPath} \
-exportOptionsPlist ${exportOptionsPlistPath} \
-quiet || exit
if [ -e $exportIpaPath/$product_name.ipa ]; then
echo 'ipa包已导出'
echo '发布ipa包到 =============蒲公英平台============='
RESPONSE=$(curl -F "file=@$exportIpaPath/$product_name.ipa" -F "uKey=${user_key}" -F "_api_key=${api_key}" -F "updateDescription=${update_desc}" https://www.pgyer.com/apiv2/app/upload)
if [ $? -eq 0 ];then
echo "=============提交蒲公英成功 ============="
appQRCodeURL=$(trimSlash $(jsonParse "${RESPONSE}" "buildQRCodeURL"))
appVersion=$(jsonParse "${RESPONSE}" "buildVersion")
appBuildVersion=$(jsonParse "${RESPONSE}" "buildBuildVersion")
#通知到钉钉群 将xxxxxxxx替换为真实access_token `title`需要包含关键词
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "markdown",
"markdown": {
"title":"xxxx",
"text":"![screenshot]('"$appQRCodeURL"') \n **版本:** '"$appVersion"' (build '"$appBuildVersion"') \n **环境:** '"$envir_desc"' \n **说明:** '"$update_desc"'"
}
}'
else
echo "=============提交蒲公英失败 ============="
fi
#open $exportIpaPath
else
echo 'ipa包导出失败 '
fi
echo '打包ipa完成 '
exit 0