#!/bin/bash set -e # Git 自动发布脚本 # 功能:检查分支、工作区,生成 tag,并在 Gitea 上创建 Release # 1. 检查分支 branch=$(git rev-parse --abbrev-ref HEAD) if [ "$branch" != "main" ]; then echo "❌ 错误:请在 main 分支运行,当前是 $branch" exit 1 fi echo "✅ 分支: $branch" # 2. 检查工作区是否干净 if [ -n "$(git status --porcelain)" ]; then echo "❌ 错误:工作区有未提交的更改,请先提交或 stash" git status exit 1 fi echo "✅ 工作区干净" # 3. 更新代码 echo "⬇️ 拉取远程代码..." git fetch origin git pull origin main echo "✅ 已同步最新代码" # 4. 从 release.md 提取版本和说明 if [ ! -f release.md ]; then echo "❌ 未找到 release.md" exit 1 fi VERSION=$(grep "^## v" release.md | tail -n 1 | sed 's/^## //') TAG_MESSAGE=$(awk "/^## $VERSION/{flag=1;next}/^## v/{flag=0}flag" release.md) if [ -z "$VERSION" ]; then echo "❌ release.md 中未找到版本号" exit 1 fi echo "📝 版本号: $VERSION" echo "说明:" echo "$TAG_MESSAGE" # 5. 创建 tag(如已存在则删除后重建) if git rev-parse "$VERSION" >/dev/null 2>&1; then echo "⚠️ 标签 $VERSION 已存在,删除旧标签..." git tag -d "$VERSION" git push origin ":refs/tags/$VERSION" fi git tag -a "$VERSION" -m "$TAG_MESSAGE" echo "✅ 已创建 tag $VERSION" # 6. 推送代码和 tag echo "🚀 推送到远程..." git push origin main git push origin "$VERSION" # 7. 创建 Gitea Release echo "" echo "🌐 创建 Gitea Release..." # 自动解析 GITEA_URL 和 REPO remote_url=$(git config --get remote.origin.url) if [[ "$remote_url" == ssh://git@biboer.cn:21174/* ]]; then # 特殊处理 biboer.cn:21174 的情况,Web 界面在 /gitea 路径下 GITEA_URL="https://biboer.cn/gitea" GITEA_REPO=$(echo "$remote_url" | sed 's|ssh://git@biboer\.cn:21174/||' | sed 's|\.git$||') elif [[ "$remote_url" =~ ^ssh://([^/]+)/([^/]+)/(.+)\.git$ ]]; then GITEA_URL="https://${BASH_REMATCH[1]}" GITEA_REPO="${BASH_REMATCH[2]}/${BASH_REMATCH[3]}" elif [[ "$remote_url" =~ ^([^@]+@[^:]+):([^/]+)/(.+)\.git$ ]]; then # git@biboer.cn:21174/gavin/note-to-mp.git hostport=$(echo "${BASH_REMATCH[1]}" | cut -d@ -f2) GITEA_URL="https://${hostport}" GITEA_REPO="${BASH_REMATCH[2]}/${BASH_REMATCH[3]}" else echo "❌ 无法解析远程地址: $remote_url" exit 1 fi if [ -z "$GITEA_TOKEN" ]; then echo "⚠️ 未设置 GITEA_TOKEN,只推送了 tag,没有创建 Release" exit 0 fi # 使用 jq 生成正确的 JSON JSON_PAYLOAD=$(echo "$TAG_MESSAGE" | jq -R -s -c --arg version "$VERSION" '{ tag_name: $version, name: $version, body: ., draft: false, prerelease: false }') response=$(curl -s -o /dev/null -w "%{http_code}" \ -X POST "$GITEA_URL/api/v1/repos/$GITEA_REPO/releases" \ -H "Content-Type: application/json" \ -H "Authorization: token $GITEA_TOKEN" \ -d "$JSON_PAYLOAD") if [ "$response" -eq 201 ]; then echo "✅ Release 创建成功: $VERSION" else echo "❌ Release 创建失败,HTTP $response" fi echo "" echo "🎉 发布完成!" echo "📦 版本:$VERSION"