:demo: 文档更新

This commit is contained in:
csh 2025-11-02 19:40:26 +08:00
parent a21adb9fcc
commit c0aef0f531
2 changed files with 66 additions and 814 deletions

View File

@ -39,11 +39,11 @@
包含内容:
- 🔄 `changelog_and_release.yml` - 自动更新 CHANGELOG和自动创建Release
- 💡 工作流配置说明
- 🔧 如何使用和定制
- 🔄 案例:`changelog_and_release.yml` - 自动更新 CHANGELOG 和自动创建 Release
👉 **两个实用的 Actions 工作流,可直接复制使用**
👉 **实用的 Actions 工作流,可直接复制使用**
---

View File

@ -1,880 +1,132 @@
# 📦 Tag Release Automation
# Workflow
自动生成 CHANGELOG 并创建 Release 的一体化工作流,**支持语义版本号SemVer和内容叠加**
本目录包含 Gitea Actions 的自动化工作流示例,展示如何使用 Gitea Actions 实现 CI/CD 自动化
---
## 📂 文件位置
## 📂 文件结构
```txt
.gitea/workflows/
└── changelog-and-release.yaml # CHANGELOG 生成 + Release 创建
├── changelog-and-release.yml # CHANGELOG 生成 + Release 创建
└── ... # 更多 workflow 待添加
```
---
## 🚀 快速开始
## 🎯 功能列表
### 1⃣ 配置 Gitea Token
### ✅ 已实现
#### 生成 Token
#### 1. 📦 自动发布工作流 (`changelog-and-release.yml`)
1. 登录 Gitea → 右上角头像 → **设置 (Settings)** → **应用 (Applications)**
2. 点击 **生成新令牌 (Generate New Token)**
3. 配置权限:
- ✅ **repo** - 完整的仓库访问权限(必需)
4. 复制生成的 Token 只显示一次)
**功能**:在推送 tag 时自动生成 CHANGELOG 并创建 Release
#### 添加 Secret
**特性**
**推荐方式:仓库级别配置**
- 🏷️ 自动识别语义版本号SemVer
- 📝 智能生成 CHANGELOG 条目
- 🔄 支持多个开发版本内容叠加
- 👥 自动提取贡献者列表
- 🚀 创建 GitHub/Gitea Release
- 📎 上传附件到 Release
- 🏷️ 自动识别 Pre-release 标记
1. 进入仓库 → **设置 (Settings)****Actions** → **Secrets**
2. 点击 **新建 Secret (New Secret)**
3. 填写:
- **名称**`GITEA_TOKEN`
- **值**:粘贴刚才的 token
4. 点击 **保存**
💡 **提示**:如果有多个仓库需要使用,可以在个人设置中添加全局 Secret
### 2⃣ 部署 Workflow
**触发方式**
```bash
# 创建目录
mkdir -p .gitea/workflows
# 复制文件(将文件重命名为 changelog-and-release.yaml
cp changelog-and-release.yaml .gitea/workflows/
# 提交
git add .gitea/workflows/
git commit -m "ci: add changelog and release automation"
git push origin main
```
### 3⃣ 自定义配置
打开 `changelog-and-release.yaml`,找到 **⚙️ Configuration** 步骤(约第 10-60 行),所有配置都在这里:
```yaml
- name: ⚙️ Configuration
id: config
run: |
# ========================================
# 📝 自定义配置区域 - 在此修改所有配置
# ========================================
# 📌 语义版本号规范 (SemVer)
# 格式: MAJOR.MINOR.PATCH[-prerelease]
#
# 示例: 1.0.0, 1.1.0, 1.1.1, 1.0.0-beta1, 2.0.0-rc1
#
# ⚠️ 重要规则:
# 1. 开发版本以 .0 开始 (如 1.0.0-beta1, 不是 1.0.1-beta1)
# 2. 多个开发版本会累加到同一 CHANGELOG 区域 (推荐使用 strip 模式)
# 3. CHANGELOG 内容是叠加而非覆盖
#
# 📖 详细规范请参考: CONVENTIONS.md
# Gitea 服务器地址(用于生成头像链接)
GITEA_SERVER="https://git.mytsl.cn"
# CHANGELOG 配置
CHANGELOG_SECTION_TITLE="### :pencil: What's Changed"
CHANGELOG_CONTRIBUTORS_TITLE="### :busts_in_silhouette: Contributors"
# CHANGELOG 版本号处理方式
# - "full": 使用完整 tag 名称1.0.0-beta → ## :bookmark: 1.0.0-beta
# - "strip": 去除 pre-release 后缀1.0.0-beta1 → ## :bookmark: 1.0.0
# ⚠️ 推荐使用 "strip" 模式以支持多个开发版本叠加到同一CHANGELOG区域
CHANGELOG_VERSION_MODE="strip"
# Release 配置
RELEASE_TITLE="{version}" # 可用变量: {version}
# Pre-release 配置
# - "false": 正式版本(会被标记为 latest
# - "true": 预发布版本(会被标记为 pre-release
# - "auto": 自动判断(根据 tag 名称中是否包含 alpha/beta/rc
RELEASE_PRERELEASE_MODE="auto"
# Draft 配置(是否创建为草稿)
RELEASE_IS_DRAFT="false" # true 或 false
# 需要忽略的提交模式
IGNORE_PATTERNS=(
"^Merge "
"^:memo: Auto update CHANGELOG"
"\[skip ci\]"
"\[ci skip\]"
"^style: "
"^chore: format"
)
# Git 提交消息格式
COMMIT_MESSAGE=":memo: Auto update CHANGELOG for {version} [skip ci]"
# 额外要上传到 Release 的文件
ADDITIONAL_RELEASE_FILES="" # 例如: "README.md LICENSE"
```
#### 常见配置示例
**修改 Gitea 服务器地址**
```bash
GITEA_SERVER="https://your-gitea.com"
```
**修改 CHANGELOG 标题为中文**
```bash
CHANGELOG_SECTION_TITLE="### :pencil: 变更内容"
CHANGELOG_CONTRIBUTORS_TITLE="### :busts_in_silhouette: 贡献者"
```
**配置 CHANGELOG 版本号处理方式**
```bash
# ⭐ 推荐strip 模式(支持内容叠加)
CHANGELOG_VERSION_MODE="strip"
# 所有相同前缀的版本共享同一个 CHANGELOG 区域,内容累积
# 1.0.0-beta1 → ## :bookmark: 1.0.0
# 1.0.0-beta2 → ## :bookmark: 1.0.0 (追加内容)
# 1.0.0 → ## :bookmark: 1.0.0 (追加内容)
# 方式 2: full 模式(每个 tag 独立条目)
CHANGELOG_VERSION_MODE="full"
# 每个 tag 都有独立的 CHANGELOG 条目
# 1.0.0-beta1 → ## :bookmark: 1.0.0-beta1
# 1.0.0-beta2 → ## :bookmark: 1.0.0-beta2
# 1.0.0 → ## :bookmark: 1.0.0
```
**推荐使用 `strip` 模式的原因**
1. ✅ **支持内容叠加** - 多个开发版本的提交累积在一起
2. ✅ **避免重复** - 所有版本的改动集中在一个区域
3. ✅ **完整历史** - 正式发布时 CHANGELOG 已包含所有开发阶段的提交
4. ✅ **符合最佳实践** - 大多数开源项目的做法
**strip 模式工作流程示例**
```bash
# 1. 推送第一个 beta 版本
git push origin 1.0.0-beta1
# → CHANGELOG: ## :bookmark: 1.0.0(创建新区域,添加 beta1 的提交)
# → Release: 1.0.0-beta1 (Pre-release 🏷️)
# 2. 推送第二个 beta 版本
git push origin 1.0.0-beta2
# → CHANGELOG: ## :bookmark: 1.0.0(叠加 beta2 的提交到现有区域)
# → Release: 1.0.0-beta2 (Pre-release 🏷️)
# 3. 推送 rc 版本
git push origin 1.0.0-rc1
# → CHANGELOG: ## :bookmark: 1.0.0(继续叠加 rc1 的提交)
# → Release: 1.0.0-rc1 (Pre-release 🏷️)
# 4. 推送正式版本
git push origin 1.0.0
# → CHANGELOG: ## :bookmark: 1.0.0(叠加正式版的提交,现在包含完整历史)
# → Release: 1.0.0 (Latest ✅)
```
**生成的 CHANGELOG 示例**(叠加模式):
```markdown
## :bookmark: 1.0.0
### :pencil: What's Changed
- :sparkles: Add user authentication (来自 beta1)
- :sparkles: Add profile page (来自 beta1)
- :bug: Fix login redirect (来自 beta2)
- :sparkles: Add password reset (来自 beta2)
- :memo: Update documentation (来自 rc1)
- :bug: Fix validation error (来自正式版)
### :busts_in_silhouette: Contributors
[所有版本的贡献者,自动去重]
---
```
**修改 Release 标题**
```bash
RELEASE_TITLE="{version}" # → 1.0.0
RELEASE_TITLE="v{version}" # → v1.0.0
RELEASE_TITLE="Release {version}" # → Release 1.0.0
RELEASE_TITLE="🎉 {version}" # → 🎉 1.0.0
```
**配置 Pre-release 标记**
```bash
# 方式 1: 自动判断(推荐)
RELEASE_PRERELEASE_MODE="auto"
# tag 包含 alpha/beta/rc/pre/preview/dev/test → Pre-release 🏷️
# 其他 tag → Latest (Stable) ✅
# 方式 2: 始终标记为正式版本
RELEASE_PRERELEASE_MODE="false"
# 所有 Release 都标记为 Latest ✅
# 方式 3: 始终标记为预发布版本
RELEASE_PRERELEASE_MODE="true"
# 所有 Release 都标记为 Pre-release 🏷️
```
**示例效果**
```bash
# auto 模式下:
1.0.0 → Latest ✅
1.0.0-beta1 → Pre-release 🏷️
1.0.0-rc1 → Pre-release 🏷️
1.0.0-alpha1 → Pre-release 🏷️
1.0.0.dev → Pre-release 🏷️
```
**创建为草稿**
```bash
RELEASE_IS_DRAFT="true" # Release 创建后不会立即发布,需要手动发布
```
**添加更多忽略的提交类型**
```bash
IGNORE_PATTERNS=(
"^Merge "
"^:memo: Auto update CHANGELOG"
"\[skip ci\]"
"^test: " # 添加:忽略测试
"^docs: " # 添加:忽略文档
"^refactor: " # 添加:忽略重构
)
```
**上传额外的文件到 Release**
```bash
ADDITIONAL_RELEASE_FILES="README.md LICENSE docs/guide.pdf"
```
**自定义提交消息**
```bash
COMMIT_MESSAGE="docs: update CHANGELOG for {version}"
COMMIT_MESSAGE="chore(release): update CHANGELOG [{version}]"
```
### 4⃣ 创建 Release
#### 完整开发流程示例
```bash
# === 第一阶段Alpha 内部测试 ===
git commit -m ":sparkles: Add user authentication"
git tag 1.0.0-alpha1
git push origin 1.0.0-alpha1
git commit -m ":sparkles: Add user profile"
git tag 1.0.0-alpha2
git push origin 1.0.0-alpha2
# === 第二阶段Beta 公开测试 ===
git commit -m ":bug: Fix login redirect"
git tag 1.0.0-beta1
git push origin 1.0.0-beta1
git commit -m ":sparkles: Add password reset"
git tag 1.0.0-beta2
git push origin 1.0.0-beta2
# === 第三阶段RC 发布候选 ===
git commit -m ":memo: Update documentation"
git tag 1.0.0-rc1
git push origin 1.0.0-rc1
# === 第四阶段:正式发布 ===
git tag 1.0.0
git push origin 1.0.0
# === 后续版本 ===
# 新增功能(向后兼容)
git commit -m ":sparkles: Add email notifications"
git tag 1.1.0
git push origin 1.1.0
# Bug 修复
git commit -m ":bug: Fix email sending"
git tag 1.1.1
git push origin 1.1.1
# 破坏性变更
git commit -m ":boom: Change API format"
git tag 2.0.0
git push origin 2.0.0
```
🎉 完成!工作流会自动:
**文件**[changelog-and-release.yml](.gitea/workflows/changelog_and_release.yml)
1. ✅ 加载自定义配置
2. ✅ 生成/叠加 CHANGELOG 条目
3. ✅ 合并并去重贡献者
4. ✅ 提交并推送到 main 分支
5. ✅ 创建 Release自动识别 Pre-release
6. ✅ 上传 CHANGELOG.md 及额外文件
💡 **详细配置**:查看 `changelog-and-release.yml` 文件顶部的 `env` 区域,所有配置项都有详细注释说明
---
## 📋 工作原理
### 🔜 待扩展
### 触发条件
更多自动化场景:
**推送数字开头的 tag**
```bash
# ✅ 会触发
git push origin 1.0.0
git push origin 1.1.0-beta1
git push origin 2.0.0-rc1
# ❌ 不会触发(不是数字开头)
git push origin v1.0.0
git push origin release-1.0
```
### 执行流程
```txt
Tag Push (1.0.0-beta1)
⚙️ 加载配置参数
📂 检出代码
🤖 检查是否为 bot 提交
📋 检查版本是否已存在1.0.0
↓ 已存在 → 叠加模式
↓ 不存在 → 创建新条目
📝 生成 CHANGELOG 条目
├─ 提取旧的提交记录(如果存在)
├─ 提取旧的贡献者(如果存在)
├─ 追加新的提交记录
├─ 合并并去重贡献者
└─ 生成完整的条目
📤 提交并推送
🗑️ 删除旧 Release
🚀 创建新 Release
├─ 使用配置的标题格式
├─ 自动识别 Pre-release
└─ 上传配置的附件列表
✅ 完成
```
### 版本号处理逻辑
#### Strip 模式(推荐)
```txt
Tag: 1.0.0-beta1
↓ strip 处理
CHANGELOG Version: 1.0.0
检查 1.0.0 是否存在?
├─ 不存在 → 创建新区域
└─ 已存在 → 叠加内容
Tag: 1.0.0-beta2
↓ strip 处理
CHANGELOG Version: 1.0.0
检查 1.0.0 是否存在?
└─ 已存在 → 叠加内容(保留 beta1 的提交)
Tag: 1.0.0
↓ strip 处理
CHANGELOG Version: 1.0.0
检查 1.0.0 是否存在?
└─ 已存在 → 叠加内容(保留所有之前的提交)
```
### 配置加载日志示例
执行时会显示配置摘要:
```txt
======================================
⚙️ Loading workflow configuration
======================================
📋 Configuration Summary:
🏷️ Tag version: 1.0.0-beta1
📝 CHANGELOG version: 1.0.0
🌐 Gitea Server: https://git.mytsl.cn
📄 CHANGELOG Title: ### :pencil: What's Changed
🚀 Release Title: 1.0.0-beta1
🏷️ Pre-release: yes (auto-detected: 1.0.0-beta1 contains pre-release keyword)
📄 Draft: false
💬 Commit Message: :memo: Auto update CHANGELOG for 1.0.0-beta1 [skip ci]
📎 Additional Files: README.md LICENSE
✅ Configuration loaded successfully
```
### 生成的内容示例
#### CHANGELOG.md叠加模式
```markdown
## :bookmark: 1.0.0
### :pencil: What's Changed
- :sparkles: Add user authentication ([a1b2c3d](链接)) by @developer1
- :sparkles: Add user profile ([e4f5g6h](链接)) by @developer1
- :bug: Fix login redirect ([i7j8k9l](链接)) by @developer2
- :sparkles: Add password reset ([m0n1o2p](链接)) by @developer2
### :busts_in_silhouette: Contributors
<a href="https://git.mytsl.cn/developer1">
<img src="https://git.mytsl.cn/developer1.png" alt="developer1" width="35" height="35" />
</a>
<a href="https://git.mytsl.cn/developer2">
<img src="https://git.mytsl.cn/developer2.png" alt="developer2" width="35" height="35" />
</a>
---
```
#### Release
- **标题**:根据 `RELEASE_TITLE` 生成(例如:`1.0.0-beta1` 或 `v1.0.0-beta1`
- **标记**
- `RELEASE_PRERELEASE_MODE="auto"` → 根据 tag 名称自动判断
- `RELEASE_PRERELEASE_MODE="false"` → Latest ✅
- `RELEASE_PRERELEASE_MODE="true"` → Pre-release 🏷️
- **内容**CHANGELOG 中该版本的完整内容(包含所有叠加的提交)
- **附件**`CHANGELOG.md` + `ADDITIONAL_RELEASE_FILES` 中的文件
**Latest Release 示例**
```txt
✅ Latest
1.0.0 ← RELEASE_TITLE
### :pencil: What's Changed
- :sparkles: Add user authentication ([a1b2c3d](链接))
- :sparkles: Add user profile ([e4f5g6h](链接))
- :bug: Fix login redirect ([i7j8k9l](链接))
- :sparkles: Add password reset ([m0n1o2p](链接))
### :busts_in_silhouette: Contributors
[所有贡献者头像]
```
**Pre-release 示例**
```txt
🏷️ Pre-release
1.0.0-beta1 ← RELEASE_TITLE
### :pencil: What's Changed
- :sparkles: Add user authentication ([a1b2c3d](链接))
- :sparkles: Add user profile ([e4f5g6h](链接))
```
---
## 🎨 配置示例库
### 示例 1标准 SemVer 配置(推荐)
```bash
GITEA_SERVER="https://git.example.com"
CHANGELOG_SECTION_TITLE="### :pencil: What's Changed"
CHANGELOG_CONTRIBUTORS_TITLE="### :busts_in_silhouette: Contributors"
CHANGELOG_VERSION_MODE="strip" # 支持内容叠加
RELEASE_TITLE="{version}"
RELEASE_PRERELEASE_MODE="auto" # 自动识别 beta/rc 等
COMMIT_MESSAGE=":memo: Auto update CHANGELOG for {version} [skip ci]"
```
### 示例 2中文环境
```bash
GITEA_SERVER="https://git.example.com"
CHANGELOG_SECTION_TITLE="### :pencil: 变更内容"
CHANGELOG_CONTRIBUTORS_TITLE="### :busts_in_silhouette: 贡献者"
CHANGELOG_VERSION_MODE="strip"
RELEASE_TITLE="版本 {version}"
RELEASE_PRERELEASE_MODE="auto"
COMMIT_MESSAGE="文档: 更新 CHANGELOG [{version}] [skip ci]"
```
### 示例 3详细记录
```bash
GITEA_SERVER="https://git.example.com"
CHANGELOG_SECTION_TITLE="### :clipboard: What's Changed in This Version"
CHANGELOG_CONTRIBUTORS_TITLE="### :heart: Special Thanks To"
CHANGELOG_VERSION_MODE="strip"
RELEASE_TITLE="Release {version}"
RELEASE_PRERELEASE_MODE="auto"
RELEASE_IS_DRAFT="false"
COMMIT_MESSAGE=":memo: Automated CHANGELOG update for version {version} [skip ci]"
ADDITIONAL_RELEASE_FILES="README.md LICENSE CHANGELOG.md docs/MIGRATION.md"
IGNORE_PATTERNS=(
"^Merge "
"^:memo: Auto update CHANGELOG"
"\[skip ci\]"
"^Bump version"
"^style: "
"^chore: format"
"^chore: lint"
"^test: "
"^docs: update readme"
)
```
### 示例 4开发分支始终 Pre-release
```bash
GITEA_SERVER="https://git.example.com"
CHANGELOG_SECTION_TITLE="### :test_tube: Development Changes"
CHANGELOG_CONTRIBUTORS_TITLE="### :busts_in_silhouette: Contributors"
CHANGELOG_VERSION_MODE="strip"
RELEASE_TITLE="Dev Build {version}"
RELEASE_PRERELEASE_MODE="true" # 始终标记为 pre-release
COMMIT_MESSAGE=":test_tube: Update CHANGELOG for dev build {version} [skip ci]"
```
### 示例 5草稿模式
```bash
GITEA_SERVER="https://git.example.com"
CHANGELOG_SECTION_TITLE="### :pencil: What's Changed"
CHANGELOG_CONTRIBUTORS_TITLE="### :busts_in_silhouette: Contributors"
CHANGELOG_VERSION_MODE="strip"
RELEASE_TITLE="{version}"
RELEASE_PRERELEASE_MODE="auto"
RELEASE_IS_DRAFT="true" # 创建为草稿
COMMIT_MESSAGE=":memo: Auto update CHANGELOG for {version} [skip ci]"
```
---
## 📖 版本号最佳实践
### 快速参考
**版本演进示例**
```txt
0.1.0 → 0.2.0 → 1.0.0 (首个稳定版) → 1.1.0 (新功能) → 1.1.1 (Bug修复) → 2.0.0 (破坏性变更)
```
**何时递增版本号**
- **MAJOR**:不兼容的 API 修改、破坏性变更
- **MINOR**:新增功能但保持向后兼容
- **PATCH**Bug 修复、安全补丁
**Pre-release 版本命名**
```bash
1.0.0-alpha1 # 内部测试,可能不稳定
1.0.0-beta1 # 公开测试,功能基本完成
1.0.0-rc1 # 发布候选,准备正式发布
```
**版本号检查清单**
- [ ] 格式:`MAJOR.MINOR.PATCH` (不要 `v` 前缀)
- [ ] 开发版本以 `.0` 开始 (如 `1.0.0-beta1`)
- [ ] Pre-release 后缀完整 (`beta1` 不是 `b1`)
- [ ] `CHANGELOG_VERSION_MODE` 设置为 `"strip"`
📖 **详细说明请参考**[CONVENTIONS.md](./CONVENTIONS.md) - 包含完整的 SemVer 规范、更新规则和示例
- 🧪 **自动测试** - 推送代码时运行单元测试
- 🏗️ **自动构建** - 构建并发布 Docker 镜像
- 📊 **代码质量** - 运行代码检查和静态分析
- 🌐 **自动部署** - 部署到生产环境
- 📧 **通知集成** - 发送构建结果到 Slack/邮件
- 🔐 **安全扫描** - 依赖漏洞扫描
---
## ❓ 常见问题
### Q1: 为什么推荐使用 strip 模式
### Q1: 如何配置 Token
**原因**
**步骤**
1. **支持内容叠加** - 多个开发版本的提交会累积在同一个 CHANGELOG 区域
2. **完整的开发历史** - 正式发布时CHANGELOG 已包含所有开发阶段的提交
3. **避免重复** - 不需要为每个 beta/rc 版本创建独立的 CHANGELOG 条目
4. **便于阅读** - 所有相关的变更集中在一起
1. Gitea → 设置 → 应用 → 生成新令牌
2. 权限:勾选 **repo**
3. 仓库 → Settings → Actions → Secrets → 添加 Secret
4. 名称:`WORKFLOW`,值:你的 Token
**对比**
```bash
# Strip 模式
1.0.0-beta1, 1.0.0-beta2, 1.0.0 → 所有提交在 ## :bookmark: 1.0.0
# Full 模式
1.0.0-beta1 → ## :bookmark: 1.0.0-beta1
1.0.0-beta2 → ## :bookmark: 1.0.0-beta2
1.0.0 → ## :bookmark: 1.0.0
```
💡 **提示**:一个 Token 即可完成所有操作Git + API
---
### Q2: 如何修改配置?
**所有配置都在第一个步骤中**,只需编辑 `changelog-and-release.yaml`**⚙️ Configuration** 步骤即可。
修改后提交推送:
```bash
git add .gitea/workflows/changelog-and-release.yaml
git commit -m "ci: update workflow configuration"
git push
```
下次推送 tag 时会使用新配置。
---
### Q3: 版本号格式错误会怎样?
**常见错误**
```bash
❌ v1.0.0 # 不应该有 v 前缀
❌ 1.0.1-beta1 # 开发版本应该从 .0 开始
❌ 1.0.0beta1 # 缺少连字符
❌ 1.0.0-b1 # 后缀应该完整写 beta1
```
**影响**
- 工作流仍会执行
- 但可能无法正确识别为 Pre-release
- CHANGELOG 版本号可能不符合预期
---
### Q4: 如何查看 CHANGELOG 是否正确叠加?
**检查步骤**
1. 查看 CHANGELOG.md 文件
2. 找到对应的版本区域(如 `## :bookmark: 1.0.0`
3. 确认包含所有 beta/rc 版本的提交
**示例**
```markdown
## :bookmark: 1.0.0
### :pencil: What's Changed
- 提交 1来自 1.0.0-beta1
- 提交 2来自 1.0.0-beta1
- 提交 3来自 1.0.0-beta2
- 提交 4来自 1.0.0-rc1
- 提交 5来自 1.0.0
```
---
### Q5: 贡献者重复怎么办?
**不用担心!** 工作流会自动去重贡献者。
如果同一个人在多个版本都有贡献,他们的头像只会出现一次。
---
### Q6: Workflow 没有触发?
### Q2: `changelog_and_release` 没有触发?
**检查清单**
- [ ] Workflow 文件在 `.gitea/workflows/` 目录
- [ ] 文件名`changelog-and-release.yaml`(或 `.yml`
- [ ] Tag 格式正确(数字开头,如 `1.0.0``1.0.0-beta1`
- [ ] Runner 已部署并正常运行
- [ ] 仓库已启用 Actions
- [ ] GITEA_TOKEN 已正确配置
- [ ] Workflow 文件在 `.gitea/workflows/` 目录
- [ ] 文件名正确(如 `changelog-and-release.yml`
- [ ] Token 已正确配置Secret 名称为 `WORKFLOW`
- [ ] Tag 格式正确(数字开头,如 `1.0.0`
- [ ] Gitea Actions 已启用
- [ ] Runner 正常运行
---
### Q7: 提示 "GITEA_TOKEN not found"
### Q3: `changelog_and_release` 版本号格式有要求吗?
**原因**Token 未正确配置
**解决方法**
1. 确认已添加名为 `GITEA_TOKEN` 的 Secret
2. 确认 Token 具有 `repo` 权限
3. 尝试重新生成并配置 Token
---
### Q8: CHANGELOG 没有更新?
**可能原因**
1. 没有新的有效提交
2. 所有提交都匹配了 `IGNORE_PATTERNS` 中的规则
3. 版本已存在且是 bot 提交
**检查方法**
推荐使用**语义化版本号SemVer**
```bash
# 查看两个 tag 之间的提交
git log $(git describe --tags --abbrev=0 @^)..@ --oneline --no-merges
✅ 推荐格式:
1.0.0 # 正式版本
1.0.0-beta1 # 预发布版本
# 检查 workflow 日志中的 "Found X valid commits"
❌ 不推荐:
v1.0.0 # 不要使用 v 前缀
1.0.0-b1 # 后缀要完整
```
详细规范请参考 workflow 文件中的注释说明。
---
### Q9: 如何跳过自动化
### Q4: 如何查看执行日志?
在 commit 消息中添加 `[skip ci]`
```bash
git commit -m "docs: update readme [skip ci]"
```
**注意**Tag 推送无法跳过,因为 workflow 在 tag 推送时触发
仓库 → Actions → 点击对应的 workflow 运行记录 → 查看详细日志
---
### Q10: 什么时候使用 full 模式
### Q5: Token 权限不足怎么办?
**使用场景**
确保 Token 具有以下权限:
- 你希望每个 tag 都有独立的 CHANGELOG 条目
- 不需要累积开发版本的提交
- 每个版本的变更需要完全独立
- ✅ **repo** - 完整仓库访问权限
- 用于读取代码
- 用于推送提交
- 用于创建 Release
**大多数情况下,推荐使用 strip 模式。**
如果还是失败,尝试重新生成 Token。
---
### Q11: Release 标记Latest/Pre-release是如何工作的
## 🤝 贡献
**GitHub/Gitea 的自动标记规则**
1. **Latest最新稳定版**
- 自动标记给最新的非 pre-release 版本
- 显示绿色的 "Latest" 标签 ✅
2. **Pre-release预发布版**
- 通过 API 设置 `prerelease: true`
- 显示橙色的 "Pre-release" 标签 🏷️
- 不会被标记为 Latest
**auto 模式识别的关键词**
- `alpha`, `beta`, `rc`, `pre`, `preview`, `dev`, `test`
**示例**
```bash
1.0.0 → Latest ✅
1.0.0-beta1 → Pre-release 🏷️
1.0.0-rc1 → Pre-release 🏷️
1.1.0 → Latest ✅ (1.0.0 变为旧版本)
```
欢迎提交更多实用的 Workflow 示例!
---
## 🔍 调试技巧
### 查看配置加载情况
每次执行都会在日志开头显示配置摘要:
```
======================================
⚙️ Loading workflow configuration
======================================
📋 Configuration Summary:
🏷️ Tag version: 1.0.0-beta1
📝 CHANGELOG version: 1.0.0
🌐 Gitea Server: https://git.mytsl.cn
📝 CHANGELOG Title: ### :pencil: What's Changed
🚀 Release Title: 1.0.0-beta1
🏷️ Pre-release: yes (auto-detected)
💬 Commit Message: :memo: Auto update CHANGELOG for 1.0.0-beta1 [skip ci]
📎 Additional Files: none
```
### 本地测试配置
提取 Configuration 步骤中的 bash 代码,在本地运行测试:
```bash
#!/bin/bash
# 模拟环境变量
export github_ref_name="1.0.0-beta1"
# 复制你的配置
GITEA_SERVER="https://git.mytsl.cn"
CHANGELOG_VERSION_MODE="strip"
RELEASE_TITLE="{version}"
COMMIT_MESSAGE=":memo: Auto update CHANGELOG for {version} [skip ci]"
# 测试版本处理
VERSION="$github_ref_name"
if [[ "$CHANGELOG_VERSION_MODE" == "strip" ]]; then
CHANGELOG_VERSION=$(echo "$VERSION" | sed -E 's/-(alpha|beta|rc|pre|preview|dev|test)[0-9]*$//')
echo "Tag: $VERSION → CHANGELOG: $CHANGELOG_VERSION"
fi
# 测试变量替换
RELEASE_TITLE="${RELEASE_TITLE//\{version\}/$VERSION}"
COMMIT_MSG="${COMMIT_MESSAGE//\{version\}/$VERSION}"
echo "Release Title: $RELEASE_TITLE"
echo "Commit Message: $COMMIT_MSG"
```
### 验证版本号格式
```bash
# 测试版本号是否符合规范
version="1.0.0-beta1"
# 检查是否数字开头
if [[ "$version" =~ ^[0-9] ]]; then
echo "✅ 格式正确"
else
echo "❌ 版本号必须以数字开头"
fi
# 检查是否包含 pre-release 标识
if [[ "$version" =~ (alpha|beta|rc|pre|preview|dev|test) ]]; then
echo "🏷️ 将被识别为 Pre-release"
else
echo "✅ 将被识别为 Latest"
fi
```
---
## 📄 许可 MIT