diff --git a/.winboll/bashPublishAPKAddTag.sh b/.winboll/bashPublishAPKAddTag.sh index d210d28..082dc7e 100644 --- a/.winboll/bashPublishAPKAddTag.sh +++ b/.winboll/bashPublishAPKAddTag.sh @@ -1,166 +1,223 @@ #!/usr/bin/bash +# ============================================================================== +# WinBoLL 应用发布脚本 +# 功能:检查Git源码状态 → 编译Stage Release包 → 添加WinBoLL标签 → 提交并推送源码 +# 依赖:build.properties、app_update_description.txt(项目根目录下) +# 使用:./script_name.sh +# 作者:豆包&ZhanGSKen +# ============================================================================== -# 检查是否指定了将要发布的应用名称 -# 使用 `-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标签(格式:-v) + 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标签(格式:-v-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} " + 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 diff --git a/README.md b/README.md index ec445dc..1eac983 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,11 @@ ## ☁ ☁ ☁ WinBoLL APP ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ # ☁ ☁ WinBoLL Studio Android 应用开源项目。☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ # ☁ ☁ ☁ WinBoLL 网站地址 https://www.winboll.cc/ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ -# ☁ ☁ ☁ WinBoLL 源码地址 ☁ ☁ ☁ ☁ ☁ ☁ ☁ -# ☁ ☁ ☁ GitHub 源码地址 ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ -# ☁ ☁ ☁ 码云 源码地址 ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ - +# ☁ ☁ ☁ WinBoLL 源码地址 ☁ ☁ ☁ ☁ ☁ ☁ ☁ +# ☁ ☁ ☁ GitHub 源码地址 ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ +# ☁ ☁ ☁ 码云 源码地址 ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ +# ☁ ☁ ☁ 在 jitpack.io 托管的 APPBase 类库源码 ☁ ☁ ☁ ☁ +# ☁ ☁ ☁ 在 jitpack.io 托管的 AES 类库源码 ☁ ☁ ☁ ☁ ## WinBoLL 提问 同样是 /sdcard 目录,在开发 Android 应用时, 能否实现手机编译与电脑编译的源码同步。 @@ -154,3 +155,11 @@ $ bash gradlew assembleBetaDebug $ bash gradlew assembleStageDebug ### 若是 winboll.properties 文件的 [ExtraAPKOutputPath] 属性设置了路径。编译器也会复制一份 APK 到这个路径。 + +# 应用版本号命名方式 +## statge 渠道 +V<应用开发环境编号><应用功能变更号><应用调试阶段号> +如:APPBase_15.7.0 +## beta 渠道 +V<应用开发环境编号><应用功能变更号><应用调试阶段号>-beta<调试编译计数>_<调试编译时间(分钟+秒钟)> +如:APPBase_15.9.6-beta8_5413 diff --git a/winboll/build.properties b/winboll/build.properties index da6c214..0bd08a6 100644 --- a/winboll/build.properties +++ b/winboll/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun Dec 07 03:42:32 HKT 2025 -stageCount=8 +#Wed Dec 31 20:28:06 HKT 2025 +stageCount=9 libraryProject= baseVersion=15.11 -publishVersion=15.11.7 +publishVersion=15.11.8 buildCount=0 -baseBetaVersion=15.11.8 +baseBetaVersion=15.11.9