Ctrl K
ComunidadGuías…

release.sh

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#!/bin/bash
# ============================================================
#  Scout Agent 一键发版脚本
#
#  用法:
#    bash release.sh patch            # 1.0.0.0 -> 1.0.1.0(补丁版)
#    bash release.sh minor            # 1.0.0.0 -> 1.1.0.0(功能版)
#    bash release.sh major            # 1.0.0.0 -> 2.0.0.0(大版本)
#    bash release.sh set 1.2.3.4      # 指定版本号
#    bash release.sh patch --no-build # 只 bump+tag,不构建 exe
#
#  流程:
#    1. version.sh bump/set(VERSION + pyproject.toml 自动同步)
#    2. git 提交 VERSION pyproject.toml
#    3. git 打 tag vX.Y.Z.B 并推送(commit + tag)
#    4. Windows 本机: desktop/build.bat 构建 exe + 压缩为规范名 zip
#       (--no-build 跳过;非 Windows 仅完成 1-3 并提示)
#    5. 有 gh CLI: 自动创建 GitHub Release 并上传 zip 资产
#       没有 gh: 打印手动发 Release 的操作指引
#
#  说明:
#    - exe 用户的升级感知链: Web UI 更新检查(/api/version/check) 对比
#      GitHub Releases 的 tag -> 桌面版弹更新横幅 + 下载链接。
#    - python 源码用户升级: bash update.sh(或 scout update)。
# ============================================================
set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

# ── 参数解析 ──
NO_BUILD=0
ARGS=()
for a in "$@"; do
    case "$a" in
        --no-build) NO_BUILD=1 ;;
        *) ARGS+=("$a") ;;
    esac
done
MODE="${ARGS[0]:-}"
VER="${ARGS[1]:-}"

GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; BLUE='\033[0;34m'; PURPLE='\033[0;35m'; NC='\033[0m'

if [[ -z "$MODE" ]] || { [[ "$MODE" != "set" ]] && [[ ! "$MODE" =~ ^(patch|minor|major)$ ]]; }; then
    echo -e "${RED}用法:${NC} bash release.sh <patch|minor|major|set X.Y.Z[.B]> [--no-build]"
    exit 1
fi

# ── 0. 前置检查 ──
if [[ ! -d ".git" ]]; then
    echo -e "${RED}[x] 不在 Git 仓库中${NC}"; exit 1
fi
if [[ -n "$(git status --porcelain VERSION pyproject.toml 2>/dev/null)" ]]; then
    echo -e "${YELLOW}[!] VERSION/pyproject.toml 有未提交改动,请先处理(git stash / commit)${NC}"
    exit 1
fi

OLD_VERSION="$(cat VERSION | tr -d '[:space:]')"

# ── 1. bump / set(内部自动同步 pyproject.toml)──
if [[ "$MODE" == "set" ]]; then
    [[ -z "$VER" ]] && { echo -e "${RED}[x] set 需要版本号${NC}"; exit 1; }
    bash version.sh set "$VER"
else
    bash version.sh bump "$MODE"
fi
NEW_VERSION="$(cat VERSION | tr -d '[:space:]')"
TAG="v${NEW_VERSION}"
echo ""
echo -e "${GREEN}[1/5] 版本号:${NC} ${PURPLE}${OLD_VERSION} -> ${NEW_VERSION}${NC}"

# ── 2. 提交 ──
git add VERSION pyproject.toml
git commit -m "Bump version to ${NEW_VERSION}" -q
echo -e "${GREEN}[2/5] 已提交:${NC} Bump version to ${NEW_VERSION}"

# ── 3. tag + push ──
if git rev-parse "$TAG" >/dev/null 2>&1; then
    echo -e "${YELLOW}[!] tag ${TAG} 已存在,跳过${NC}"
else
    git tag "$TAG"
fi
PUSHED=0
if git push origin HEAD --tags -q 2>/dev/null; then PUSHED=1; fi
if [[ $PUSHED -eq 1 ]]; then
    echo -e "${GREEN}[3/5] 已推送:${NC} commit + ${TAG}"
else
    echo -e "${YELLOW}[3/5] push 失败(网络/权限?)——稍后手动:${NC} git push origin HEAD --tags"
fi

# ── 4. 构建 exe(仅 Windows 本机)──
ZIP_PATH="dist/scout-agent-${NEW_VERSION}-win-x64.zip"
if [[ $NO_BUILD -eq 0 && "$(uname -s)" == MINGW* || $NO_BUILD -eq 0 && "$(uname -s)" == MSYS* || $NO_BUILD -eq 0 && "$(uname -s)" == CYGWIN* ]]; then
    echo -e "${BLUE}[4/5] 构建 Windows exe(desktop/build.bat)...${NC}"
    cmd //c "desktop\\build.bat" || { echo -e "${RED}[x] 构建失败${NC}"; exit 1; }
    if [[ -d "dist/ScoutDesktop" ]]; then
        powershell -NoProfile -Command "Compress-Archive -Path 'dist/ScoutDesktop/*' -DestinationPath '${ZIP_PATH}' -Force"
        echo -e "${GREEN}[4/5] zip 就绪:${NC} ${ZIP_PATH}"
    fi
else
    echo -e "${YELLOW}[4/5] 跳过 exe 构建${NC}(非 Windows 或 --no-build)"
fi

# ── 5. GitHub Release ──
echo ""
if command -v gh >/dev/null 2>&1; then
    echo -e "${BLUE}[5/5] 创建 GitHub Release ${TAG} ...${NC}"
    if [[ -f "$ZIP_PATH" ]]; then
        gh release create "$TAG" "$ZIP_PATH" --title "Scout Agent ${TAG}" --generate-notes
    else
        gh release create "$TAG" --title "Scout Agent ${TAG}" --generate-notes
    fi
    echo -e "${GREEN}✓ Release 已发布${NC}: https://github.com/core-power/Scout-Agent/releases/tag/${TAG}"
else
    cat <<EOF
${YELLOW}[5/5] 未安装 gh CLI,请手动发 Release:${NC}

  1. 打开 https://github.com/core-power/Scout-Agent/releases/new
  2. 选择 tag: ${TAG}
  3. 标题: Scout Agent ${TAG}
  4. 上传资产: ${ZIP_PATH}(若已构建)
  5. 发布 — 发布后所有客户端的"检查更新"即可感知新版本

  (推荐安装 gh: winget install GitHub.cli 后 gh auth login,
   下次发版本脚本将自动完成此步骤)
EOF
fi

echo ""
echo -e "${GREEN}✓ 发版流程完成:${NC} ${PURPLE}${OLD_VERSION} -> ${NEW_VERSION}${NC}"
echo -e "  - exe 用户: 界面更新横幅 -> 下载新 zip -> 覆盖程序文件夹(数据在 %APPDATA%\\Scout 不受影响)"
echo -e "  - python 用户: bash update.sh 或 scout update"