78 lines
2.6 KiB
Bash
Executable File
78 lines
2.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# scripts/release.sh — 发版脚本: bump 版本号 → 提交 → 打 tag → 推送
|
|
# 用法: ./scripts/release.sh patch|minor|major
|
|
set -euo pipefail
|
|
|
|
VERSION_FILE="EvoScientist/_version.py"
|
|
|
|
# ── 参数检查 ──
|
|
BUMP="${1:-}"
|
|
if [[ -z "$BUMP" ]]; then
|
|
cat <<USAGE
|
|
用法: ./scripts/release.sh patch|minor|major
|
|
|
|
示例:
|
|
./scripts/release.sh patch # 0.1.19 → 0.1.20 (bug 修复 / 小改动)
|
|
./scripts/release.sh minor # 0.1.19 → 0.2.0 (新功能, 向后兼容)
|
|
./scripts/release.sh major # 0.1.19 → 1.0.0 (破坏性改动)
|
|
|
|
发版前请先提交所有代码改动 (git status 应为空)。
|
|
USAGE
|
|
exit 1
|
|
fi
|
|
|
|
# ── 环境检查 ──
|
|
[[ -f "$VERSION_FILE" ]] || { echo "✗ 找不到 $VERSION_FILE"; exit 1; }
|
|
git rev-parse --is-inside-work-tree >/dev/null 2>&1 || { echo "✗ 不在 git 仓库内"; exit 1; }
|
|
|
|
BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
[[ "$BRANCH" != "HEAD" ]] || { echo "✗ 处于 detached HEAD, 请先切到分支"; exit 1; }
|
|
|
|
# 工作区必须干净 —— 发版提交只应包含版本号改动, 不混入其他代码
|
|
if ! git diff --quiet || ! git diff --cached --quiet; then
|
|
echo "✗ 工作区有未提交改动, 请先提交:"
|
|
git status --short
|
|
echo
|
|
echo "提示: 先 git add + git commit 你的代码改动, 再运行本脚本。"
|
|
exit 1
|
|
fi
|
|
|
|
# ── 计算新版本号 ──
|
|
current=$(grep -oE '[0-9]+\.[0-9]+\.[0-9]+' "$VERSION_FILE" | head -1)
|
|
[[ -n "$current" ]] || { echo "✗ $VERSION_FILE 里找不到版本号"; exit 1; }
|
|
|
|
IFS='.' read -r major minor patch <<< "$current"
|
|
case "$BUMP" in
|
|
major) major=$((major+1)); minor=0; patch=0 ;;
|
|
minor) minor=$((minor+1)); patch=0 ;;
|
|
patch) patch=$((patch+1)) ;;
|
|
*) echo "✗ 无效参数: $BUMP (用 patch|minor|major)"; exit 1 ;;
|
|
esac
|
|
new="$major.$minor.$patch"
|
|
|
|
[[ "$current" != "$new" ]] || { echo "✗ 版本号没变 ($current)"; exit 1; }
|
|
|
|
echo "▶ $current → $new (分支: $BRANCH)"
|
|
|
|
# ── 改版本号 (兼容 macOS/Linux) ──
|
|
if [[ "$(uname)" == "Darwin" ]]; then
|
|
sed -i '' "s/__version__ = \"$current\"/__version__ = \"$new\"/" "$VERSION_FILE"
|
|
else
|
|
sed -i "s/__version__ = \"$current\"/__version__ = \"$new\"/" "$VERSION_FILE"
|
|
fi
|
|
grep -q "__version__ = \"$new\"" "$VERSION_FILE" || { echo "✗ 版本号替换失败, 检查 $VERSION_FILE 格式"; exit 1; }
|
|
|
|
# ── 提交 + 打 tag + 推送 ──
|
|
git add "$VERSION_FILE"
|
|
git commit -m "Bump version to $new" >/dev/null
|
|
git tag -a "v$new" -m "Release v$new"
|
|
git push origin "$BRANCH"
|
|
git push origin "v$new"
|
|
|
|
echo
|
|
echo "✓ 发布完成"
|
|
echo " 版本: $new"
|
|
echo " Tag: v$new"
|
|
echo " 分支: $BRANCH"
|
|
echo " 提交: $(git rev-parse --short HEAD)"
|