Files
claude-relay-service/.github/workflows/auto-release.yml
shaw 04c65da21f fix: 修复 GitHub Action 版本同步死循环问题
- 移除工作流开始时的VERSION同步步骤,避免产生新提交导致无限循环
- 修改变更检查逻辑,忽略仅修改VERSION文件的提交
- 在工作流结束时确保VERSION文件与最新release同步
- 解决了VERSION文件追不上releases版本的问题

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-24 00:02:29 +08:00

267 lines
10 KiB
YAML
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.

name: Auto Release on Push to Main
on:
push:
branches:
- main
paths-ignore:
- '**.md'
- 'docs/**'
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
auto-release:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Get latest tag
id: get_latest_tag
run: |
# 获取最新的版本标签
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
echo "Latest tag: $LATEST_TAG"
echo "latest_tag=$LATEST_TAG" >> $GITHUB_OUTPUT
# 提取版本号部分(去掉 v 前缀)
VERSION=${LATEST_TAG#v}
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Calculate next version
id: next_version
run: |
VERSION="${{ steps.get_latest_tag.outputs.version }}"
# 分割版本号为 major.minor.patch
IFS='.' read -r -a version_parts <<< "$VERSION"
MAJOR="${version_parts[0]:-0}"
MINOR="${version_parts[1]:-0}"
PATCH="${version_parts[2]:-0}"
# 递增 patch 版本号
NEW_PATCH=$((PATCH + 1))
NEW_VERSION="${MAJOR}.${MINOR}.${NEW_PATCH}"
NEW_TAG="v${NEW_VERSION}"
echo "New version: $NEW_VERSION"
echo "New tag: $NEW_TAG"
echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT
echo "new_tag=$NEW_TAG" >> $GITHUB_OUTPUT
- name: Install git-cliff
run: |
wget -q https://github.com/orhun/git-cliff/releases/download/v1.4.0/git-cliff-1.4.0-x86_64-unknown-linux-gnu.tar.gz
tar -xzf git-cliff-1.4.0-x86_64-unknown-linux-gnu.tar.gz
chmod +x git-cliff-1.4.0/git-cliff
sudo mv git-cliff-1.4.0/git-cliff /usr/local/bin/
- name: Generate changelog
id: changelog
run: |
# 获取自上次标签以来的提交,如果 git-cliff 输出包含 [unreleased],则移除它
CHANGELOG=$(git-cliff --config .github/cliff.toml --unreleased --strip header || echo "- 代码优化和改进")
# 移除 [unreleased] 标记
CHANGELOG=$(echo "$CHANGELOG" | sed 's/\[unreleased\]//g' | sed '/^$/d')
echo "content<<EOF" >> $GITHUB_OUTPUT
echo "$CHANGELOG" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Check if there are changes to release
id: check_changes
run: |
# 检查自上次标签以来是否有新的提交排除只修改VERSION文件的提交
LATEST_TAG="${{ steps.get_latest_tag.outputs.latest_tag }}"
if [ "$LATEST_TAG" = "v0.0.0" ]; then
echo "has_changes=true" >> $GITHUB_OUTPUT
else
# 获取除了VERSION文件外的其他文件变更
CHANGED_FILES=$(git diff --name-only $LATEST_TAG..HEAD | grep -v "^VERSION$" || true)
if [ -n "$CHANGED_FILES" ]; then
echo "Found changes in files other than VERSION:"
echo "$CHANGED_FILES"
echo "has_changes=true" >> $GITHUB_OUTPUT
else
echo "No significant changes found (only VERSION file changed)"
echo "has_changes=false" >> $GITHUB_OUTPUT
fi
fi
- name: Create and push tag
if: steps.check_changes.outputs.has_changes == 'true'
run: |
NEW_TAG="${{ steps.next_version.outputs.new_tag }}"
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git tag -a "$NEW_TAG" -m "Release $NEW_TAG"
git push origin "$NEW_TAG"
- name: Create Release
if: steps.check_changes.outputs.has_changes == 'true'
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ steps.next_version.outputs.new_tag }}
name: Release ${{ steps.next_version.outputs.new_version }}
body: |
## 🐳 Docker 镜像
```bash
docker pull ${{ secrets.DOCKERHUB_USERNAME || 'weishaw' }}/claude-relay-service:${{ steps.next_version.outputs.new_tag }}
docker pull ${{ secrets.DOCKERHUB_USERNAME || 'weishaw' }}/claude-relay-service:latest
```
## 📦 主要更新
${{ steps.changelog.outputs.content }}
## 📋 完整更新日志
查看 [所有版本](https://github.com/${{ github.repository }}/releases)
---
*此版本由 GitHub Actions 自动发布*
draft: false
prerelease: false
generate_release_notes: true
- name: Update VERSION file
if: steps.check_changes.outputs.has_changes == 'true'
run: |
# 强制更新 VERSION 文件为最新版本
echo "${{ steps.next_version.outputs.new_version }}" > VERSION
# 检查是否有更改
if git diff --quiet VERSION; then
echo "VERSION file already up to date"
else
git add VERSION
echo "Updated VERSION file to ${{ steps.next_version.outputs.new_version }}"
fi
- name: Commit VERSION update
if: steps.check_changes.outputs.has_changes == 'true'
run: |
# 提交 VERSION 更新
if git diff --quiet VERSION; then
echo "No changes to VERSION"
else
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add VERSION
git commit -m "chore: update VERSION to ${{ steps.next_version.outputs.new_version }} for ${{ steps.next_version.outputs.new_tag }} [skip ci]"
git push origin main
fi
# Docker 构建和推送步骤
- name: Set up QEMU
if: steps.check_changes.outputs.has_changes == 'true'
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
if: steps.check_changes.outputs.has_changes == 'true'
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
if: steps.check_changes.outputs.has_changes == 'true'
uses: docker/login-action@v3
with:
registry: docker.io
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push Docker image
if: steps.check_changes.outputs.has_changes == 'true'
uses: docker/build-push-action@v5
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/claude-relay-service:${{ steps.next_version.outputs.new_tag }}
${{ secrets.DOCKERHUB_USERNAME }}/claude-relay-service:latest
${{ secrets.DOCKERHUB_USERNAME }}/claude-relay-service:${{ steps.next_version.outputs.new_version }}
labels: |
org.opencontainers.image.version=${{ steps.next_version.outputs.new_version }}
org.opencontainers.image.created=${{ steps.next_version.outputs.created }}
org.opencontainers.image.revision=${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Send Telegram Notification
if: steps.check_changes.outputs.has_changes == 'true' && env.TELEGRAM_BOT_TOKEN != '' && env.TELEGRAM_CHAT_ID != ''
env:
TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
continue-on-error: true
run: |
VERSION="${{ steps.next_version.outputs.new_version }}"
TAG="${{ steps.next_version.outputs.new_tag }}"
REPO="${{ github.repository }}"
# 获取更新内容并限制长度
CHANGELOG="${{ steps.changelog.outputs.content }}"
CHANGELOG_TRUNCATED=$(echo "$CHANGELOG" | head -c 1000)
if [ ${#CHANGELOG} -gt 1000 ]; then
CHANGELOG_TRUNCATED="${CHANGELOG_TRUNCATED}..."
fi
# 构建消息内容
MESSAGE="🚀 *Claude Relay Service 新版本发布!*"$'\n'$'\n'
MESSAGE+="📦 版本号: \`${VERSION}\`"$'\n'$'\n'
MESSAGE+="📝 *更新内容:*"$'\n'
MESSAGE+="${CHANGELOG_TRUNCATED}"$'\n'$'\n'
MESSAGE+="🐳 *Docker 部署:*"$'\n'
MESSAGE+="\`\`\`bash"$'\n'
MESSAGE+="docker pull weishaw/claude-relay-service:${TAG}"$'\n'
MESSAGE+="docker pull weishaw/claude-relay-service:latest"$'\n'
MESSAGE+="\`\`\`"$'\n'$'\n'
MESSAGE+="🔗 *相关链接:*"$'\n'
MESSAGE+="• [GitHub Release](https://github.com/${REPO}/releases/tag/${TAG})"$'\n'
MESSAGE+="• [完整更新日志](https://github.com/${REPO}/releases)"$'\n'
MESSAGE+="• [Docker Hub](https://hub.docker.com/r/weishaw/claude-relay-service)"$'\n'$'\n'
MESSAGE+="#ClaudeRelay #Update #v${VERSION//./_}"
# 使用 jq 构建 JSON 并发送
jq -n \
--arg chat_id "${TELEGRAM_CHAT_ID}" \
--arg text "${MESSAGE}" \
'{
chat_id: $chat_id,
text: $text,
parse_mode: "Markdown",
disable_web_page_preview: false
}' | \
curl -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d @-
- name: Ensure VERSION file is in sync
if: always()
run: |
# 在工作流结束时确保VERSION文件与最新tag同步
LATEST_TAG=$(git tag --sort=-version:refname | head -1 || echo "v0.0.0")
if [ "$LATEST_TAG" != "v0.0.0" ]; then
LATEST_VERSION=${LATEST_TAG#v}
CURRENT_VERSION=$(cat VERSION 2>/dev/null || echo "0.0.0")
if [ "$CURRENT_VERSION" != "$LATEST_VERSION" ]; then
echo "Updating VERSION file to match latest release: $CURRENT_VERSION -> $LATEST_VERSION"
echo "$LATEST_VERSION" > VERSION
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add VERSION
git commit -m "chore: sync VERSION file with release $LATEST_TAG [skip ci]" || echo "No changes to commit"
git push origin main || echo "Nothing to push"
else
echo "VERSION file is already in sync: $CURRENT_VERSION"
fi
fi