diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml index a0f1b92..9bfda0d 100644 --- a/.gitea/workflows/release.yaml +++ b/.gitea/workflows/release.yaml @@ -1,8 +1,8 @@ name: Docker Build and Push on: push: - branches: - - release/* # 匹配所有 release 开头的分支 + tags: + - "release/v*" # 匹配 release/v 开头的标签 jobs: build-and-push: @@ -14,11 +14,11 @@ jobs: - name: 设置 Docker Buildx uses: docker/setup-buildx-action@v3 - - name: 从分支名中提取版本号 + - name: 从标签中提取版本号 id: extract_version run: | - # 从分支名中提取版本号,例如从 release/v1.0.0 中提取 v1.0.0 - VERSION=$(echo "${{ gitea.ref }}" | sed 's|refs/heads/release/||') + # 从标签中提取版本号,例如从 release/v0.0.1 中提取 v0.0.1 + VERSION=$(echo "${{ gitea.ref }}" | sed 's|refs/tags/release/||') echo "VERSION=$VERSION" >> $GITHUB_ENV echo "提取的版本号:$VERSION" diff --git a/scripts/release_tag.sh b/scripts/release_tag.sh new file mode 100755 index 0000000..f033324 --- /dev/null +++ b/scripts/release_tag.sh @@ -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 " + 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 镜像"