chore: 添加标签发布脚本,CI 改为标签触发

- 添加 scripts/release_tag.sh 版本标签发布脚本
- 修改 CI 工作流触发方式:分支 → 标签
- 默认从 release/v0.0.1 开始自动递增

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
This commit is contained in:
D8D Developer
2026-03-20 07:01:09 +00:00
parent fafef0e034
commit d49cce1c37
2 changed files with 132 additions and 5 deletions

127
scripts/release_tag.sh Executable file
View File

@@ -0,0 +1,127 @@
#!/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/ 前缀(如果用户输入的是纯版本号)
if [[ ! $VERSION =~ ^release/ ]]; then
VERSION="release/$VERSION"
echo "📌 自动添加前缀,最终标签: $VERSION"
fi
# 创建标签
echo "🏷️ 创建标签 $VERSION..."
git tag "$VERSION"
# 推送标签
echo "📤 推送标签到远程仓库..."
git push gitea "$VERSION"
echo ""
echo "🎉 发布流程已启动!"
echo "📋 标签: $VERSION"
echo "🔗 Gitea Actions 将自动构建和发布 Docker 镜像"