#!/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 镜像"