ForcePilot/scripts/bump-version.sh
Wenjie Zhang be39d118fd chore(release): bump version to 0.6.1
- 单一版本来源:__version__ 改为从 pyproject.toml 动态读取
- Docker Compose 镜像标签环境变量化 (${YUXI_VERSION:-0.6.1})
- info.template.yaml 版权信息支持版本号动态注入
- 测试断言改为动态比较,不再硬编码版本号
- 新增 bump-version.sh 发版脚本,一键同步所有版本位置
- 更新 changelog.md,记录 v0.6.1 变更内容
2026-04-24 19:32:16 +08:00

153 lines
6.1 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
set -euo pipefail
# =============================================================================
# Yuxi 版本号升级脚本
# =============================================================================
# 用法: ./scripts/bump-version.sh <新版本号>
# 示例: ./scripts/bump-version.sh 0.6.2
#
# 该脚本从 backend/package/pyproject.toml 读取当前版本,
# 自动同步所有需要硬编码版本号的位置。
# =============================================================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
# 检查参数
if [ $# -ne 1 ]; then
echo "用法: $0 <新版本号>"
echo "示例: $0 0.6.2"
exit 1
fi
NEW_VERSION="$1"
# 验证版本号格式(支持 x.y.z 或 x.y.z.devN
if [[ ! "$NEW_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(\.[a-zA-Z0-9]+)?$ ]]; then
echo "错误: 版本号格式无效,期望格式如 0.6.2 或 0.6.2.dev1"
exit 1
fi
# 读取当前版本号(以 backend/package/pyproject.toml 为 SSOT
PYPROJECT_FILE="${PROJECT_ROOT}/backend/package/pyproject.toml"
if [ ! -f "$PYPROJECT_FILE" ]; then
echo "错误: 找不到 ${PYPROJECT_FILE}"
exit 1
fi
CURRENT_VERSION=$(grep -E '^version\s*=\s*"' "$PYPROJECT_FILE" | head -1 | sed -E 's/^version\s*=\s*"([^"]+)".*/\1/')
if [ -z "$CURRENT_VERSION" ]; then
echo "错误: 无法从 ${PYPROJECT_FILE} 读取当前版本号"
exit 1
fi
if [ "$CURRENT_VERSION" = "$NEW_VERSION" ]; then
echo "当前版本已经是 ${NEW_VERSION},无需更新"
exit 0
fi
echo "准备将版本号从 ${CURRENT_VERSION} 升级到 ${NEW_VERSION}"
echo "受影响的文件:"
echo " - backend/package/pyproject.toml"
echo " - backend/pyproject.toml"
echo " - web/package.json"
echo " - docker-compose.yml"
echo " - docker-compose.prod.yml"
echo " - backend/uv.lock"
echo " - README.md"
echo " - docs/intro/quick-start.md"
echo ""
read -rp "确认继续? [y/N] " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "已取消"
exit 0
fi
# -----------------------------------------------------------------------------
# 1. 更新 Python 包版本 (backend/package/pyproject.toml)
# -----------------------------------------------------------------------------
echo "→ 更新 backend/package/pyproject.toml"
sed -i -E "s/^version = \"[^\"]+\"/version = \"${NEW_VERSION}\"/" \
"${PROJECT_ROOT}/backend/package/pyproject.toml"
# -----------------------------------------------------------------------------
# 2. 更新后端工作区版本 (backend/pyproject.toml)
# -----------------------------------------------------------------------------
echo "→ 更新 backend/pyproject.toml"
sed -i -E "s/^version = \"[^\"]+\"/version = \"${NEW_VERSION}\"/" \
"${PROJECT_ROOT}/backend/pyproject.toml"
# -----------------------------------------------------------------------------
# 3. 更新前端版本 (web/package.json)
# -----------------------------------------------------------------------------
echo "→ 更新 web/package.json"
sed -i -E "s/\"version\": \"[^\"]+\"/\"version\": \"${NEW_VERSION}\"/" \
"${PROJECT_ROOT}/web/package.json"
# -----------------------------------------------------------------------------
# 4. 更新 Docker Compose 镜像标签默认值
# -----------------------------------------------------------------------------
echo "→ 更新 docker-compose.yml"
sed -i -E "s/\\\$\{YUXI_VERSION:-[^}]+\}/\${YUXI_VERSION:-${NEW_VERSION}}/g" \
"${PROJECT_ROOT}/docker-compose.yml"
echo "→ 更新 docker-compose.prod.yml"
sed -i -E "s/\\\$\{YUXI_VERSION:-[^}]+\}/\${YUXI_VERSION:-${NEW_VERSION}}/g" \
"${PROJECT_ROOT}/docker-compose.prod.yml"
# -----------------------------------------------------------------------------
# 5. 更新 uv.lock 中的项目版本号
# -----------------------------------------------------------------------------
echo "→ 更新 backend/uv.lock"
# yuxi 包版本
sed -i -E "/^name = \"yuxi\"$/{n;s/^version = \"[^\"]+\"/version = \"${NEW_VERSION}\"/;}" \
"${PROJECT_ROOT}/backend/uv.lock"
# yuxi-workspace 版本
sed -i -E "/^name = \"yuxi-workspace\"$/{n;s/^version = \"[^\"]+\"/version = \"${NEW_VERSION}\"/;}" \
"${PROJECT_ROOT}/backend/uv.lock"
# -----------------------------------------------------------------------------
# 6. 更新文档中的版本引用
# -----------------------------------------------------------------------------
# 只替换 git clone 命令中的版本标签(确保总是指向最新版本)
# 发布历史记录(如 [2026/04/01] v0.6.1 版本发布)不修改,保持为历史版本记录
echo "→ 更新 README.md"
sed -i -E "s/(git clone --branch v)[0-9]+\.[0-9]+\.[0-9]+/\1${NEW_VERSION}/g" \
"${PROJECT_ROOT}/README.md"
echo "→ 更新 docs/intro/quick-start.md"
sed -i -E "s/(git clone --branch v)[0-9]+\.[0-9]+\.[0-9]+/\1${NEW_VERSION}/g" \
"${PROJECT_ROOT}/docs/intro/quick-start.md"
# -----------------------------------------------------------------------------
# 7. 验证
# -----------------------------------------------------------------------------
echo ""
echo "版本号升级完成,验证结果:"
echo ""
echo " backend/package/pyproject.toml:"
grep -E "^version = \"" "${PROJECT_ROOT}/backend/package/pyproject.toml" | head -1 | sed 's/^/ /'
echo " backend/pyproject.toml:"
grep -E "^version = \"" "${PROJECT_ROOT}/backend/pyproject.toml" | head -1 | sed 's/^/ /'
echo " web/package.json:"
grep -E '"version"' "${PROJECT_ROOT}/web/package.json" | head -1 | sed 's/^/ /'
echo " docker-compose.yml (api):"
grep -E "image: yuxi-api:" "${PROJECT_ROOT}/docker-compose.yml" | head -1 | sed 's/^/ /'
echo " docker-compose.prod.yml (web):"
grep -E "image: yuxi-web:" "${PROJECT_ROOT}/docker-compose.prod.yml" | head -1 | sed 's/^/ /'
echo ""
echo "后续步骤:"
echo " 1. 检查 git diff 确认修改无误"
echo " 2. 基于 [Roadmap](docs/develop-guides/roadmap.md) 整理后,更新到 docs/develop-guides/changelog.md"
echo " 3. git add . && git commit -m 'chore(release): bump version to ${NEW_VERSION}'"
echo " 4. git tag v${NEW_VERSION}"
echo " 5. git push origin main --tags"