From edf8c7e348c626dbbcfdb5e38b6a7f2e1697f331 Mon Sep 17 00:00:00 2001 From: shaw Date: Sat, 19 Jul 2025 21:44:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=91=E5=B8=83=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 auto-release.yml 工作流,推送到 main 分支时自动递增版本号 - 自动创建 GitHub Release 和生成更新日志 - 添加 AUTO_RELEASE_GUIDE.md 详细使用指南 - 更新 WORKFLOW_USAGE.md 说明文档 现在每次推送到 main 分支都会自动: 1. 递增 patch 版本号(如 v1.0.1 → v1.0.2) 2. 创建新的 Git 标签和 GitHub Release 3. 生成更新日志并更新 CHANGELOG.md 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .github/AUTO_RELEASE_GUIDE.md | 147 +++++++++++++++++++++++++++++ .github/WORKFLOW_USAGE.md | 15 +++ .github/workflows/auto-release.yml | 132 ++++++++++++++++++++++++++ 3 files changed, 294 insertions(+) create mode 100644 .github/AUTO_RELEASE_GUIDE.md create mode 100644 .github/workflows/auto-release.yml diff --git a/.github/AUTO_RELEASE_GUIDE.md b/.github/AUTO_RELEASE_GUIDE.md new file mode 100644 index 00000000..11c25aed --- /dev/null +++ b/.github/AUTO_RELEASE_GUIDE.md @@ -0,0 +1,147 @@ +# 自动版本发布指南 + +## 📋 概述 + +本项目配置了自动版本发布功能,每次推送到 `main` 分支时会自动递增版本号并创建 GitHub Release。 + +## 🚀 工作原理 + +### 自动版本递增规则 + +- **版本格式**: `v..` (例如: v1.0.2) +- **递增规则**: 每次推送到 main 分支,自动递增 patch 版本号 + - v1.0.1 → v1.0.2 + - v1.0.9 → v1.0.10 + - v1.0.99 → v1.0.100 + +### 触发条件 + +当满足以下条件时,会自动创建新版本: + +1. 推送到 `main` 分支 +2. 有实际的代码变更(不包括纯文档更新) +3. 自上次发布以来有新的提交 + +## 📝 使用方法 + +### 1. 常规开发流程 + +```bash +# 在 dev 分支开发 +git checkout dev +# ... 进行开发 ... +git add . +git commit -m "feat: 添加新功能" +git push origin dev + +# 合并到 main 分支 +git checkout main +git merge dev +git push origin main # 这会触发自动发布 +``` + +### 2. 跳过自动发布 + +如果你的提交不想触发自动发布,在 commit 消息中添加 `[skip ci]`: + +```bash +git commit -m "docs: 更新文档 [skip ci]" +``` + +### 3. 手动控制版本号 + +如果需要发布大版本或中版本更新: + +```bash +# 大版本更新 (1.0.x → 2.0.0) +git tag -a v2.0.0 -m "Major release v2.0.0" +git push origin v2.0.0 + +# 中版本更新 (1.0.x → 1.1.0) +git tag -a v1.1.0 -m "Minor release v1.1.0" +git push origin v1.1.0 +``` + +## 🔧 配置说明 + +### 工作流文件 + +- **位置**: `.github/workflows/auto-release.yml` +- **功能**: + - 获取最新版本标签 + - 计算下一个版本号 + - 生成 changelog + - 创建 GitHub Release + - 更新 CHANGELOG.md 文件 + +### Changelog 生成 + +使用 [git-cliff](https://github.com/orhun/git-cliff) 自动生成更新日志: + +- **配置文件**: `.github/cliff.toml` +- **提交规范**: 遵循 [Conventional Commits](https://www.conventionalcommits.org/) + - `feat:` 新功能 + - `fix:` Bug 修复 + - `docs:` 文档更新 + - `chore:` 其他变更 + - `refactor:` 代码重构 + - `perf:` 性能优化 + +## 📊 查看发布历史 + +1. **GitHub Releases 页面**: + - 访问 `https://github.com///releases` + - 查看所有发布版本和更新内容 + +2. **CHANGELOG.md**: + - 项目根目录的 `CHANGELOG.md` 文件 + - 包含完整的版本历史 + +## ❓ 常见问题 + +### Q: 如何查看当前版本? + +```bash +# 查看最新标签 +git describe --tags --abbrev=0 + +# 查看所有标签 +git tag -l +``` + +### Q: 自动发布失败怎么办? + +1. 检查 GitHub Actions 日志 +2. 确认是否有权限创建标签和发布 +3. 检查是否有语法错误 + +### Q: 如何回滚版本? + +自动发布只是创建标签和 Release,不会影响代码: + +```bash +# 回滚到特定版本 +git checkout v1.0.1 + +# 或者使用 Docker 镜像的特定版本 +docker pull weishaw/claude-relay-service:v1.0.1 +``` + +### Q: 如何修改版本递增规则? + +编辑 `.github/workflows/auto-release.yml` 中的版本计算逻辑: + +```yaml +# 当前是递增 patch 版本 +NEW_PATCH=$((PATCH + 1)) + +# 可以改为递增 minor 版本 +NEW_MINOR=$((MINOR + 1)) +NEW_PATCH=0 +``` + +## 🔗 相关链接 + +- [GitHub Actions 工作流使用指南](./WORKFLOW_USAGE.md) +- [Docker Hub 设置指南](./DOCKER_HUB_SETUP.md) +- [Git Cliff 配置文档](https://git-cliff.org/docs/configuration) \ No newline at end of file diff --git a/.github/WORKFLOW_USAGE.md b/.github/WORKFLOW_USAGE.md index d6eed21a..b4a65780 100644 --- a/.github/WORKFLOW_USAGE.md +++ b/.github/WORKFLOW_USAGE.md @@ -30,6 +30,18 @@ **触发条件:** - 创建版本标签(如 `v1.0.0`) +### 3. 自动版本发布 (`auto-release.yml`) + +**功能:** +- 自动递增版本号(patch 版本) +- 自动创建版本标签 +- 生成 GitHub Release +- 更新 CHANGELOG.md + +**触发条件:** +- 推送到 `main` 分支(自动触发) +- 忽略纯文档更新 + ## 📝 版本发布流程 ### 1. 常规更新(推送到 main) @@ -43,6 +55,8 @@ git push origin main **结果:** - 自动构建并推送 `latest` 标签到 Docker Hub - 更新 `main` 标签 +- **自动递增版本号并创建 Release**(例如:v1.0.1 → v1.0.2) +- 生成更新日志 ### 2. 版本发布 @@ -109,6 +123,7 @@ git commit -m "docs: 更新文档 [skip ci]" ## 📚 相关文档 +- [自动版本发布指南](.github/AUTO_RELEASE_GUIDE.md) - [Docker Hub 配置指南](.github/DOCKER_HUB_SETUP.md) - [GitHub Actions 文档](https://docs.github.com/en/actions) - [Docker 官方文档](https://docs.docker.com/) \ No newline at end of file diff --git a/.github/workflows/auto-release.yml b/.github/workflows/auto-release.yml new file mode 100644 index 00000000..e10e3eda --- /dev/null +++ b/.github/workflows/auto-release.yml @@ -0,0 +1,132 @@ +name: Auto Release on Push to Main + +on: + push: + branches: + - main + paths-ignore: + - '**.md' + - '.github/**' + - 'docs/**' + +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: Generate changelog + id: changelog + uses: orhun/git-cliff-action@v3 + with: + config: .github/cliff.toml + args: --unreleased --strip header + + - name: Check if there are changes to release + id: check_changes + run: | + # 检查自上次标签以来是否有新的提交 + LATEST_TAG="${{ steps.get_latest_tag.outputs.latest_tag }}" + if [ "$LATEST_TAG" = "v0.0.0" ]; then + echo "has_changes=true" >> $GITHUB_OUTPUT + else + CHANGES=$(git rev-list $LATEST_TAG..HEAD --count) + if [ "$CHANGES" -gt 0 ]; then + echo "has_changes=true" >> $GITHUB_OUTPUT + else + 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 }} + + ## 📋 完整更新日志 + + 查看 [CHANGELOG.md](https://github.com/${{ github.repository }}/blob/main/CHANGELOG.md) + + --- + *此版本由 GitHub Actions 自动发布* + draft: false + prerelease: false + generate_release_notes: true + + - name: Update CHANGELOG.md + if: steps.check_changes.outputs.has_changes == 'true' + run: | + # 生成完整的 CHANGELOG + git cliff --config .github/cliff.toml --output CHANGELOG.md + + # 提交 CHANGELOG 更新 + if git diff --quiet CHANGELOG.md; then + echo "No changes to CHANGELOG.md" + else + git add CHANGELOG.md + git commit -m "chore: update CHANGELOG.md for ${{ steps.next_version.outputs.new_tag }} [skip ci]" + git push origin main + fi \ No newline at end of file