Files
claude-api-proxy/scripts/release_tag.sh
D8D Developer df81143d5c
All checks were successful
Docker Build and Push / build-and-push (push) Successful in 2m28s
fix: 修复发布脚本确保添加 v 前缀
2026-03-20 07:07:06 +00:00

132 lines
4.3 KiB
Bash
Executable File
Raw 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.

#!/bin/bash
#!/bin/bash
# 版本标签创建与推送脚本
# 使用方法: ./release_tag.sh 1.0.0 (自动生成 release/v1.0.0)
# ./release_tag.sh v1.0.0 (自动生成 release/v1.0.0)
# ./release_tag.sh release/v1.0.0 (直接使用)
# 查看标签: ./release_tag.sh --list 或 ./release_tag.sh -l
# 从 v0.0.1 开始
set -e
# ECI 容器环境 SSH 配置:自动接受 host key容器重启后 known_hosts 会丢失)
export GIT_SSH_COMMAND="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
# 自动递增版本号的函数
auto_increment_version() {
# 获取远程标签
REMOTE_TAGS=$(git ls-remote --tags gitea 2>/dev/null | grep -v "\^{}" | cut -f 2 | sed 's|refs/tags/||')
# 如果远程标签为空,使用本地标签
if [ -z "$REMOTE_TAGS" ]; then
LATEST_TAG=$(git tag --list "release/v*.*.*" | sort -V | tail -1)
else
LATEST_TAG=$(echo "$REMOTE_TAGS" | grep "^release/v" | sort -V | uniq | tail -1)
fi
# 如果没有找到任何标签,使用默认版本
if [ -z "$LATEST_TAG" ]; then
LATEST_TAG="release/v0.0.1"
>&2 echo "⚠️ 未找到任何 release/v* 标签,使用默认版本: $LATEST_TAG"
fi
# 解析版本号并递增
# 去掉 release/ 前缀
VERSION_ONLY=$(echo "$LATEST_TAG" | sed 's|^release/||')
# 分割版本号并递增最后一位
MAJOR=$(echo "$VERSION_ONLY" | sed 's/^v//' | cut -d. -f1)
MINOR=$(echo "$VERSION_ONLY" | sed 's/^v//' | cut -d. -f2)
PATCH=$(echo "$VERSION_ONLY" | sed 's/^v//' | cut -d. -f3)
# 递增 PATCH 版本
NEW_PATCH=$((PATCH + 1))
# 构建新版本号
NEW_VERSION="release/v${MAJOR}.${MINOR}.${NEW_PATCH}"
>&2 echo "📦 最新版本: $LATEST_TAG"
>&2 echo " 自动递增新版本: $NEW_VERSION"
echo "$NEW_VERSION"
}
# 特殊参数: 查看所有标签(必须在参数检查之前)
if [ "$1" = "--list" ] || [ "$1" = "-l" ]; then
echo "📋 Gitea 所有标签:"
# 尝试获取远程标签,如果失败则使用本地标签
REMOTE_TAGS=$(git ls-remote --tags gitea 2>/dev/null | grep -v "\^{}" | cut -f 2 | sed 's|refs/tags/||')
if [ -z "$REMOTE_TAGS" ]; then
echo "⚠️ 无法获取远程标签,显示本地标签:"
git tag --list | sort -V
else
echo "$REMOTE_TAGS" | sort -V | uniq
fi
exit 0
fi
# 检查参数
if [ $# -eq 0 ]; then
# 没有参数时,自动递增版本号
NEW_VERSION=$(auto_increment_version)
VERSION="$NEW_VERSION"
echo "✅ 自动使用递增的版本号"
echo ""
else
VERSION="$1"
fi
# 验证版本号格式(支持 v1.0.0 或直接 1.0.0 或 release/v1.0.0
if ! [[ $VERSION =~ ^(v?[0-9]+\.[0-9]+\.[0-9]+|release/v[0-9]+\.[0-9]+\.[0-9]+)$ ]]; then
echo "错误: 版本号格式不正确,请使用语义化版本格式"
echo " 支持格式: 1.0.0, v1.0.0, release/v1.0.0"
exit 1
fi
# 检查是否在 Git 仓库中
if ! git rev-parse --is-inside-work-tree > /dev/null 2>&1; then
echo "错误: 当前目录不是 Git 仓库"
exit 1
fi
# 检查是否有未提交的更改
if [ -n "$(git status --porcelain)" ]; then
echo "⚠️ 警告: 工作目录有未提交的更改"
git status
read -p "是否继续发布? [y/N] " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "发布已取消"
exit 1
fi
fi
# 检查远程仓库是否存在
if ! git remote | grep -q "gitea"; then
echo "错误: 未找到名为 'gitea' 的远程仓库"
echo "请添加远程仓库: git remote add gitea <url>"
exit 1
fi
# 获取当前分支
CURRENT_BRANCH=$(git branch --show-current)
echo "🌿 当前分支: $CURRENT_BRANCH"
# 拉取最新代码
echo "📥 拉取最新代码..."
git pull gitea "$CURRENT_BRANCH"
# 自动添加 release/v 前缀(如果用户输入的是纯版本号)
if [[ ! $VERSION =~ ^release/ ]]; then
# 如果版本号没有 v 前缀,添加 v
if [[ ! $VERSION =~ ^v ]]; then
VERSION="v$VERSION"
fi
VERSION="release/$VERSION"
echo "📌 自动添加前缀,最终标签: $VERSION"
fi
# 创建标签
echo "🏷️ 创建标签 $VERSION..."
git tag "$VERSION"
# 推送标签
echo "📤 推送标签到远程仓库..."
git push gitea "$VERSION"
echo ""
echo "🎉 发布流程已启动!"
echo "📋 标签: $VERSION"
echo "🔗 Gitea Actions 将自动构建和发布 Docker 镜像"