#!/bin/bash
logBase() {
echo -e "\033[36m $* \033[0m"
}
logFail() {
echo -e "\033[31m $* \033[0m"
}
logTitle() {
echo -e "\033[37m ============== $* ============== \033[0m"
}
execCommand() {
echo "$@"
result=$(eval $@)
}
logBase "更新描述内容:"
read -e update_desc
logBase "请选择打包方式 ? [ 1:ad-hoc 2:development ]"
read number
logBase "请选择发送钉钉群 ? [ 1:研发钉群 2:产品钉群 3:钉群同步发]"
read dingNum
buildType="ipa"
pgyerURL="https://www.pgyer.com"
api_key="蒲公英ApiKey"
workspace_name="WorkspaceName"
scheme_name="${workspace_name}"
build_configuration="Release"
method="ad-hoc"
bundle_identifier="Bundle Identifier"
bundle_identifier_Notification="Bundle Identifier Notification"
mobileprovision_name="MobileprovisionNameAdhoc"
mobileprovision_name_Notification="NotificationMobileprovisionNameAdhoc"
export_path="导出文件夹路径"
export_options_plist_path="$export_path/ExportOptions.plist"
export_archive_path="$export_path/$scheme_name.xcarchive"
project_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
if [ $number == 2 ]; then
build_configuration="Debug"
method="development"
mobileprovision_name="MobileprovisionNameDev"
mobileprovision_name_Notification="NotificationMobileprovisionNameDev"
else
build_configuration="Release"
method="ad-hoc"
mobileprovision_name="MobileprovisionNameAdhoc"
mobileprovision_name_Notification="NotificationMobileprovisionNameAdhoc"
fi
logBase "scheme_name = ${scheme_name}"
logBase "method = ${method}"
logBase "build_configuration = ${build_configuration}"
logBase "bundle_identifier = ${bundle_identifier}"
logBase "mobileprovision_name = ${mobileprovision_name}"
logBase "mobileprovision_name_Notification = ${mobileprovision_name_Notification}"
logBase "project_dir = ${project_dir}"
logBase "export_path = ${export_path}"
logBase "export_archive_path = ${export_archive_path}"
logBase "export_options_plist_path = ${export_options_plist_path}"
logTitle "项目构建"
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}
if [ -d "$export_archive_path" ]; then
logBase "项目构建成功 🚀 🚀 🚀"
else
logFail "项目构建失败 😢 😢 😢"
exit 1
fi
logTitle "ExportOptions配置"
if [ -f ${export_options_plist_path} ]; then
logBase "${export_options_plist_path}文件存在,进行删除"
rm -f ${export_options_plist_path}
fi
/usr/libexec/PlistBuddy -c "Add :provisioningProfiles:${bundle_identifier} String ${mobileprovision_name}" $export_options_plist_path
/usr/libexec/PlistBuddy -c "Add :provisioningProfiles:${bundle_identifier_Notification} String ${mobileprovision_name_Notification}" $export_options_plist_path
/usr/libexec/PlistBuddy -c "Add :signingStyle String manual" $export_options_plist_path
/usr/libexec/PlistBuddy -c "Add :method string ${method}" $export_options_plist_path
/usr/libexec/PlistBuddy -c "Add :compileBitcode bool false" $export_options_plist_path
logTitle "导出ipa文件"
xcodebuild -exportArchive -archivePath ${export_archive_path} -exportPath ${export_path} -exportOptionsPlist ${export_options_plist_path} -allowProvisioningUpdates
file="${export_path}/DisplayName.ipa"
if [ -f "$file" ]; then
logBase "导出 ${file} 包成功 🎉 🎉 🎉 "
open $export_path
else
logFail "导出 ${file} 包失败 😢 😢 😢"
exit 1
fi
if [ -f "$export_options_plist_path" ]; then
logBase "${export_options_plist_path}文件存在,准备删除"
rm -f $export_options_plist_path
fi
logBase "打包总用时: ${SECONDS}s"
logTitle "获取凭证"
command="curl -s"
[ -n "$api_key" ] && command="${command} --form-string '_api_key=${api_key}'";
[ -n "$buildType" ] && command="${command} --form-string 'buildType=${buildType}'";
command="${command} http://www.pgyer.com/apiv2/app/getCOSToken";
execCommand $command
[[ "${result}" =~ \"endpoint\":\"([\:\_\.\/\\A-Za-z0-9\-]+)\" ]] && endpoint=`echo ${BASH_REMATCH[1]} | sed 's!\\\/!/!g'`
[[ "${result}" =~ \"key\":\"([\.a-z0-9]+)\" ]] && key=`echo ${BASH_REMATCH[1]}`
[[ "${result}" =~ \"signature\":\"([\=\&\_\;A-Za-z0-9\-]+)\" ]] && signature=`echo ${BASH_REMATCH[1]}`
[[ "${result}" =~ \"x-cos-security-token\":\"([\_A-Za-z0-9\-]+)\" ]] && x_cos_security_token=`echo ${BASH_REMATCH[1]}`
if [ -z "$key" ] || [ -z "$signature" ] || [ -z "$x_cos_security_token" ] || [ -z "$endpoint" ]; then
logFail "获取凭证 😢 😢 😢"
exit 1
fi
logTitle "上传文件"
file_name=${file##*/}
execCommand "curl -s -o /dev/null -w '%{http_code}' \
--form-string 'key=${key}' \
--form-string 'signature=${signature}' \
--form-string 'x-cos-security-token=${x_cos_security_token}' \
--form-string 'x-cos-meta-file-name=${file_name}' \
-F 'file=@${file}' ${endpoint}"
if [ $result -ne 204 ]; then
logFail "上传蒲公英失败 😢 😢 😢"
exit 1
fi
logTitle "检查结果"
for i in {1..60}; do
execCommand "curl -s http://www.pgyer.com/apiv2/app/buildInfo?_api_key=${api_key}\&buildKey=${key}"
[[ "${result}" =~ \"code\":([0-9]+) ]] && code=`echo ${BASH_REMATCH[1]}`
if [ $code -eq 0 ]; then
logBase $result
break
else
sleep 1
fi
done
appVersion=$(echo ${result} | jq -r '.data.buildVersion')
appQRCodeURL=$(echo ${result} | jq -r '.data.buildQRCodeURL')
appShortcutUrl=$(echo ${result} | jq -r '.data.buildShortcutUrl')
appBuildVersion=$(echo ${result} | jq -r '.data.buildBuildVersion')
if [ ! -n "$appQRCodeURL" ]; then
logFail "检查结果失败 😢 😢 😢"
exit 1
fi
logTitle "发通知到钉钉群"
singleURL="$pgyerURL/$appShortcutUrl"
talkReq() {
curl $* \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "actionCard",
"actionCard": {
"title":"title",
"text":" \n\n ### '"${update_desc}"' \n\n 环境:'"${build_configuration}"' 版本:'"${appVersion}"'('"${appBuildVersion}"')",
"btnOrientation": "0",
"singleTitle" : "Go Go Go",
"singleURL" : "'"${singleURL}"'"
}
}'
}
if [ $dingNum == 1 ];then
talkReq '研发钉群机器人webhokurl'
elif [ $dingNum == 2 ]; then
talkReq '产品钉群机器人webhokurl'
else
talkReq '研发钉群机器人webhokurl'
talkReq '产品钉群机器人webhokurl'
fi
logBase "\n#### '"${update_desc}"' \n> 环境:'"${build_configuration}"' 版本:'"${appVersion}"'('"${appBuildVersion}"') \n> 短链接:'"${singleURL}"' \n"