mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-22 16:43:35 +00:00
feat: 添加自动版本发布功能
- 新增 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 <noreply@anthropic.com>
This commit is contained in:
147
.github/AUTO_RELEASE_GUIDE.md
vendored
Normal file
147
.github/AUTO_RELEASE_GUIDE.md
vendored
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
# 自动版本发布指南
|
||||||
|
|
||||||
|
## 📋 概述
|
||||||
|
|
||||||
|
本项目配置了自动版本发布功能,每次推送到 `main` 分支时会自动递增版本号并创建 GitHub Release。
|
||||||
|
|
||||||
|
## 🚀 工作原理
|
||||||
|
|
||||||
|
### 自动版本递增规则
|
||||||
|
|
||||||
|
- **版本格式**: `v<major>.<minor>.<patch>` (例如: 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/<owner>/<repo>/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)
|
||||||
15
.github/WORKFLOW_USAGE.md
vendored
15
.github/WORKFLOW_USAGE.md
vendored
@@ -30,6 +30,18 @@
|
|||||||
**触发条件:**
|
**触发条件:**
|
||||||
- 创建版本标签(如 `v1.0.0`)
|
- 创建版本标签(如 `v1.0.0`)
|
||||||
|
|
||||||
|
### 3. 自动版本发布 (`auto-release.yml`)
|
||||||
|
|
||||||
|
**功能:**
|
||||||
|
- 自动递增版本号(patch 版本)
|
||||||
|
- 自动创建版本标签
|
||||||
|
- 生成 GitHub Release
|
||||||
|
- 更新 CHANGELOG.md
|
||||||
|
|
||||||
|
**触发条件:**
|
||||||
|
- 推送到 `main` 分支(自动触发)
|
||||||
|
- 忽略纯文档更新
|
||||||
|
|
||||||
## 📝 版本发布流程
|
## 📝 版本发布流程
|
||||||
|
|
||||||
### 1. 常规更新(推送到 main)
|
### 1. 常规更新(推送到 main)
|
||||||
@@ -43,6 +55,8 @@ git push origin main
|
|||||||
**结果:**
|
**结果:**
|
||||||
- 自动构建并推送 `latest` 标签到 Docker Hub
|
- 自动构建并推送 `latest` 标签到 Docker Hub
|
||||||
- 更新 `main` 标签
|
- 更新 `main` 标签
|
||||||
|
- **自动递增版本号并创建 Release**(例如:v1.0.1 → v1.0.2)
|
||||||
|
- 生成更新日志
|
||||||
|
|
||||||
### 2. 版本发布
|
### 2. 版本发布
|
||||||
|
|
||||||
@@ -109,6 +123,7 @@ git commit -m "docs: 更新文档 [skip ci]"
|
|||||||
|
|
||||||
## 📚 相关文档
|
## 📚 相关文档
|
||||||
|
|
||||||
|
- [自动版本发布指南](.github/AUTO_RELEASE_GUIDE.md)
|
||||||
- [Docker Hub 配置指南](.github/DOCKER_HUB_SETUP.md)
|
- [Docker Hub 配置指南](.github/DOCKER_HUB_SETUP.md)
|
||||||
- [GitHub Actions 文档](https://docs.github.com/en/actions)
|
- [GitHub Actions 文档](https://docs.github.com/en/actions)
|
||||||
- [Docker 官方文档](https://docs.docker.com/)
|
- [Docker 官方文档](https://docs.docker.com/)
|
||||||
132
.github/workflows/auto-release.yml
vendored
Normal file
132
.github/workflows/auto-release.yml
vendored
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user