@@ -1,166 +1,223 @@
#!/usr/bin/bash
# ==============================================================================
# WinBoLL 应用发布脚本
# 功能: 检查Git源码状态 → 编译Stage Release包 → 添加WinBoLL标签 → 提交并推送源码
# 依赖: build.properties、app_update_description.txt( 项目根目录下)
# 使用:./script_name.sh <APP_NAME>
# 作者:豆包&ZhanGSKen<zhangsken@qq.com>
# ==============================================================================
# 检查是否指定了将要发布的应用名称
# 使用 `-z` 命令检查变量是否为空
# ==================== 常量定义 ====================
# 脚本退出码
EXIT_CODE_SUCCESS = 0
EXIT_CODE_ERR_NO_APP_NAME = 2
EXIT_CODE_ERR_WORK_DIR = 1
EXIT_CODE_ERR_GIT_CHECK = 1
EXIT_CODE_ERR_ADD_WINBOLL_TAG = 1
# Gradle 任务(正式发布)
GRADLE_TASK_PUBLISH = "assembleStageRelease"
# Gradle 任务(调试用,注释备用)
# GRADLE_TASK_DEBUG="assembleBetaDebug"
# ==================== 函数定义 ====================
# 检查Git源码是否已完全提交( 无未提交变更)
# 返回值: 0=已完全提交, 1=存在未提交变更
function checkGitSources( ) {
# 配置Git安全目录( 解决权限问题)
git config --global --add safe.directory " $( pwd ) "
# 检查是否有未提交的变更
if [ [ -n $( git diff --stat) ] ] ; then
echo "[ERROR] Git源码存在未提交变更, 请先提交所有修改! "
return 1
fi
echo "[INFO] Git源码检查通过: 所有变更已提交。"
return 0
}
# 询问是否添加GitHub Workflows标签( 当前逻辑注释, 保留扩展能力)
# 返回值: 1=用户选择是, 0=用户选择否
function askAddWorkflowsTag( ) {
read -p "是否添加GitHub Workflows标签? (Y/n) " answer
if [ [ $answer = ~ ^[ Yy] $ ] ] ; then
return 1
else
return 0
fi
}
# 添加WinBoLL正式标签
# 参数:$1=应用名称(项目根目录名)
# 返回值: 0=标签添加成功, 1=标签已存在/添加失败
function addWinBoLLTag( ) {
local app_name = $1
local build_prop_path = " ${ app_name } /build.properties "
# 从build.properties中提取publishVersion
local publish_version = $( grep -o "publishVersion=.*" " ${ build_prop_path } " | awk -F '=' '{print $2}' )
if [ [ -z ${ publish_version } ] ] ; then
echo " [ERROR] 未从 ${ build_prop_path } 中提取到publishVersion配置! "
return 1
fi
echo " [INFO] 从 ${ build_prop_path } 读取到publishVersion: ${ publish_version } "
# 构造WinBoLL标签( 格式: <APP_NAME>-v<publishVersion>)
local tag = " ${ app_name } -v ${ publish_version } "
echo " [INFO] 准备添加WinBoLL标签: ${ tag } "
# 检查标签是否已存在
if [ [ " $( git tag -l ${ tag } ) " = = " ${ tag } " ] ] ; then
echo " [ERROR] WinBoLL标签 ${ tag } 已存在! "
return 1
fi
# 添加带注释的标签( 注释来自app_update_description.txt)
git tag -a " ${ tag } " -F " ${ app_name } /app_update_description.txt "
echo " [INFO] WinBoLL标签 ${ tag } 添加成功! "
return 0
}
# 添加GitHub Workflows Beta标签( 当前逻辑注释, 保留扩展能力)
# 参数:$1=应用名称(项目根目录名)
# 返回值: 0=标签添加成功, 1=标签已存在/添加失败
function addWorkflowsTag( ) {
local app_name = $1
local build_prop_path = " ${ app_name } /build.properties "
# 从build.properties中提取baseBetaVersion
local base_beta_version = $( grep -o "baseBetaVersion=.*" " ${ build_prop_path } " | awk -F '=' '{print $2}' )
if [ [ -z ${ base_beta_version } ] ] ; then
echo " [ERROR] 未从 ${ build_prop_path } 中提取到baseBetaVersion配置! "
return 1
fi
echo " [INFO] 从 ${ build_prop_path } 读取到baseBetaVersion: ${ base_beta_version } "
# 构造Workflows标签( 格式: <APP_NAME>-v<baseBetaVersion>-beta)
local tag = " ${ app_name } -v ${ base_beta_version } -beta "
echo " [INFO] 准备添加Workflows标签: ${ tag } "
# 检查标签是否已存在
if [ [ " $( git tag -l ${ tag } ) " = = " ${ tag } " ] ] ; then
echo " [ERROR] Workflows标签 ${ tag } 已存在! "
return 1
fi
# 添加带注释的标签( 注释来自app_update_description.txt)
git tag -a " ${ tag } " -F " ${ app_name } /app_update_description.txt "
echo " [INFO] Workflows标签 ${ tag } 添加成功! "
return 0
}
# ==================== 主流程开始 ====================
echo "============================================="
echo " WinBoLL 应用发布脚本"
echo "============================================="
# 1. 检查应用名称参数是否指定
if [ -z " $1 " ] ; then
echo " No APP name specified : $0 "
exit 2
echo " [ERROR] 未指定应用名称!使用方式: ${ 0 } <APP_NAME> "
exit ${ EXIT_CODE_ERR_NO_APP_NAME }
fi
APP_NAME = $1
echo " [INFO] 待发布应用名称: ${ APP_NAME } "
## 定义相关函数
## 检查 Git 源码是否完全提交了, 完全提交就返回0
function checkGitSources {
#local input="$1 "
#echo "The string is: $input"
git config --global --add safe.directory ` pwd `
if [ [ -n $( git diff --stat) ] ]
then
local result = "Source is no commit completely."
echo $result
# 脚本调试时使用
#return 0
# 正式检查源码时使用
return 1
fi
local result = "Git Source Check OK."
echo $result
return 0
}
function askAddWorkflowsTag {
read answer
if [ [ $answer = ~ ^[ Yy] $ ] ] ; then
#echo "You chose yes."
return 1
else
#echo "You chose no."
return 0
fi
}
function addWinBoLLTag {
# 就读取脚本 .winboll/winboll_app_build.gradle 生成的 publishVersion。
# 如果文件中有 publishVersion 这一项,
# 使用grep找到包含"publishVersion="的那一行, 然后用awk提取其后的值
PUBLISH_VERSION = $( grep -o "publishVersion=.*" $1 /build.properties | awk -F '=' '{print $2}' )
echo " < $1 /build.properties publishVersion : ${ PUBLISH_VERSION } > "
## 设新的 WinBoLL 标签
# 脚本调试时使用
#tag="projectname-v7.6.4-test1"
# 正式设置标签时使用
tag = $1 "-v" ${ PUBLISH_VERSION }
echo " < WinBoLL Tag To: $tag > " ;
# 检查是否已经添加了 WinBoLL Tag
if [ " $( git tag -l ${ tag } ) " = = " ${ tag } " ] ; then
echo -e " < WinBoLL Tag ${ tag } exist! > "
return 1 # WinBoLL标签重复
fi
# 添加WinBoLL标签
git tag -a ${ tag } -F $1 /app_update_description.txt
return 0
}
function addWorkflowsTag {
# 就读取脚本 .winboll/winboll_app_build.gradle 生成的 baseBetaVersion。
# 如果文件中有 baseBetaVersion 这一项,
# 使用grep找到包含"baseBetaVersion="的那一行, 然后用awk提取其后的值
BASE_BETA_VERSION = $( grep -o "baseBetaVersion=.*" $1 /build.properties | awk -F '=' '{print $2}' )
echo " < $1 /build.properties baseBetaVersion : ${ BASE_BETA_VERSION } > "
## 设新的 workflows 标签
# 脚本调试时使用
#tag="projectname-v7.6.4-beta"
# 正式设置标签时使用
tag = $1 "-v" ${ BASE_BETA_VERSION } -beta
echo " < Workflows Tag To: $tag > " ;
# 检查是否已经添加了工作流 Tag
if [ " $( git tag -l ${ tag } ) " = = " ${ tag } " ] ; then
echo -e " < Github Workflows Tag ${ tag } exist! > "
return 1 # 工作流标签重复
fi
# 添加工作流标签
git tag -a ${ tag } -F $1 /app_update_description.txt
return 0
}
## 开始执行脚本
echo -e "Current dir : \n" ` pwd `
# 检查当前目录是否是项目根目录
if [ [ -e $1 /build.properties ] ] ; then
echo " The $1 /build.properties file exists. "
echo -e "Work dir correctly."
else
echo " The $1 /build.properties file does not exist. "
echo "尝试进入根目录"
# 进入项目根目录
# 2. 检查并切换到项目根目录( 确保build.properties存在)
echo " [INFO] 当前工作目录: $( pwd ) "
if [ [ ! -e " ${ APP_NAME } /build.properties " ] ] ; then
echo " [WARNING] 当前目录不存在 ${ APP_NAME } /build.properties, 尝试切换到上级目录... "
cd ..
echo " [INFO] 切换后工作目录: $( pwd ) "
fi
## 本脚本需要在项目根目录下执行
echo -e "Current dir : \n" ` pwd `
# 检查当前目录是否是项目根目录
if [ [ -e $1 /build.properties ] ] ; then
echo " The $1 /build.properties file exists. "
echo -e "Work dir correctly."
# 验证最终工作目录是否正确
if [ [ ! -e " ${ APP_NAME } /build.properties " ] ] ; then
echo " [ERROR] 工作目录错误! ${ APP_NAME } /build.properties 文件不存在。 "
exit ${ EXIT_CODE_ERR_WORK_DIR }
fi
echo " [INFO] 工作目录验证通过: ${ APP_NAME } /build.properties 存在。 "
# 3. 检查Git源码状态
echo "---------------------------------------------"
echo " 步骤1: 检查Git源码状态"
echo "---------------------------------------------"
checkGitSources
if [ [ $? -ne ${ EXIT_CODE_SUCCESS } ] ] ; then
echo "[ERROR] Git源码检查失败, 脚本终止! "
exit ${ EXIT_CODE_ERR_GIT_CHECK }
fi
# 4. 编译Stage Release版本APK
echo "---------------------------------------------"
echo " 步骤2: 编译Stage Release APK"
echo "---------------------------------------------"
echo " [INFO] 开始执行Gradle任务: ${ GRADLE_TASK_PUBLISH } "
# 调试用(注释正式任务,启用调试任务)
# bash gradlew :${APP_NAME}:${GRADLE_TASK_DEBUG}
bash gradlew :${ APP_NAME } :${ GRADLE_TASK_PUBLISH }
if [ [ $? -ne ${ EXIT_CODE_SUCCESS } ] ] ; then
echo "[ERROR] Gradle编译任务失败! "
exit 1
fi
echo "[INFO] Stage Release APK编译成功! "
# 5. 添加WinBoLL正式标签
echo "---------------------------------------------"
echo " 步骤3: 添加WinBoLL标签"
echo "---------------------------------------------"
addWinBoLLTag ${ APP_NAME }
if [ [ $? -ne ${ EXIT_CODE_SUCCESS } ] ] ; then
echo "[ERROR] WinBoLL标签添加失败, 脚本终止! "
exit ${ EXIT_CODE_ERR_ADD_WINBOLL_TAG }
fi
# 6. ( 可选) 添加GitHub Workflows标签( 当前逻辑注释, 保留扩展能力)
# echo "---------------------------------------------"
# echo " 步骤4: 添加Workflows标签( 可选) "
# echo "---------------------------------------------"
# echo "是否添加GitHub Workflows Beta标签? (Y/n) "
# askAddWorkflowsTag
# nAskAddWorkflowsTag=$?
# if [[ ${nAskAddWorkflowsTag} -eq 1 ]]; then
# addWorkflowsTag ${APP_NAME}
# if [[ $? -ne ${EXIT_CODE_SUCCESS} ]]; then
# echo "[ERROR] Workflows标签添加失败, 脚本终止! "
# exit 1
# fi
# fi
# 7. 清理更新描述文件
echo "---------------------------------------------"
echo " 步骤5: 清理更新描述文件"
echo "---------------------------------------------"
echo "" > " ${ APP_NAME } /app_update_description.txt "
echo " [INFO] 已清空 ${ APP_NAME } /app_update_description.txt "
# 8. 提交并推送源码与标签
echo "---------------------------------------------"
echo " 步骤6: 提交并推送源码"
echo "---------------------------------------------"
git add .
git commit -m " < ${ APP_NAME } > 开始新的Stage版本开发。 "
echo "[INFO] 源码提交成功,开始推送..."
# 推送源码到远程仓库
git push origin
# 推送标签到远程仓库
git push origin --tags
if [ [ $? -eq ${ EXIT_CODE_SUCCESS } ] ] ; then
echo "[INFO] 源码与标签推送成功!"
else
echo "The $1 /build.properties file does not exist. "
echo -e "Work dir error."
echo "[ERROR] 源码与标签推送失败! "
exit 1
fi
# 检查源码状态
result = $( checkGitSources)
if [ [ $? -eq 0 ] ] ; then
echo $result
# 如果Git已经提交了所有代码就执行标签和应用发布操作
# ==================== 主流程结束 ====================
echo "============================================="
echo " WinBoLL 应用发布完成!"
echo "============================================="
exit ${ EXIT_CODE_SUCCESS }
# 预先询问是否添加工作流标签
#echo "Add Github Workflows Tag? (yes/No)"
#result=$(askAddWorkflowsTag)
#nAskAddWorkflowsTag=$?
#echo $result
# 发布应用
echo "Publishing WinBoLL APK ..."
# 脚本调试时使用
#bash gradlew :$1:assembleBetaDebug
# 正式发布
bash gradlew :$1 :assembleStageRelease
echo "Publishing WinBoLL APK OK."
# 添加 WinBoLL 标签
result = $( addWinBoLLTag $1 )
echo $result
if [ [ $? -eq 0 ] ] ; then
echo $result
# WinBoLL 标签添加成功
else
echo -e " ${ 0 } : addWinBoLLTag $1 \n ${ result } \nAdd WinBoLL tag cancel. "
exit 1 # addWinBoLLTag 异常
fi
# 添加 GitHub 工作流标签
#if [[ $nAskAddWorkflowsTag -eq 1 ]]; then
# 如果用户选择添加工作流标签
#result=$(addWorkflowsTag $1)
#if [[ $? -eq 0 ]]; then
# echo $result
# 工作流标签添加成功
#else
#echo -e "${0}: addWorkflowsTag $1\n${result}\nAdd workflows tag cancel."
#exit 1 # addWorkflowsTag 异常
#fi
#fi
## 清理更新描述文件内容
echo "" > $1 /app_update_description.txt
# 设置新版本开发参数配置
# 提交配置
git add .
git commit -m " < $1 >Start New Stage Version. "
echo "Push sources to git repositories ..."
# 推送源码到所有仓库
git push origin && git push origin --tags
else
echo -e " ${ 0 } : checkGitSources\n ${ result } \nShell cancel. "
exit 1 # checkGitSources 异常
fi