Skip to content

Commit 7e360cf

Browse files
committed
Merge branch '3.6.x'
2 parents f6a3ddb + 6d54fbf commit 7e360cf

File tree

9 files changed

+711
-3
lines changed

9 files changed

+711
-3
lines changed

.claude/commands/release.md

Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
1+
---
2+
name: "release"
3+
description: "执行版本发布流程(SNAPSHOT 替换、Release commit、Tag、发布分支、下一 SNAPSHOT)"
4+
usage: "/release <version>"
5+
---
6+
7+
# Release Command
8+
9+
## 功能说明
10+
11+
执行标准化的版本发布流程,包括 SNAPSHOT 版本替换、创建 Release commit 和 Tag、创建发布分支、以及准备下一个 SNAPSHOT 版本。
12+
13+
**不含构建验证**:仅做版本号替换和 Git 操作。
14+
**不含自动推送**:仅做本地操作,推送由用户手动完成。
15+
16+
## 用法
17+
18+
```bash
19+
/release <version>
20+
```
21+
22+
例如:
23+
```bash
24+
/release 3.6.3
25+
```
26+
27+
## 参数说明
28+
29+
- `<version>`: 发布版本号,格式为 `X.Y.Z`(必需),例如 `3.6.3`
30+
31+
参数来源:`$ARGUMENTS`
32+
33+
## 执行步骤
34+
35+
### 步骤 1:解析并验证参数
36+
37+
`$ARGUMENTS` 中提取版本号。
38+
39+
**版本号格式验证**
40+
- 必须匹配 `X.Y.Z` 格式(X、Y、Z 均为非负整数)
41+
- 如果格式不正确,报错退出:`错误:版本号格式不正确,期望格式为 X.Y.Z(例如 3.6.3)`
42+
43+
**解析版本组件**
44+
- 主版本号 MAJOR = X
45+
- 次版本号 MINOR = Y
46+
- 修订版本号 PATCH = Z
47+
- 下一修订版本号 NEXT_PATCH = Z + 1
48+
- SNAPSHOT 版本 = `X.Y.Z-SNAPSHOT`
49+
- 发布版本 = `X.Y.Z`
50+
- 下一 SNAPSHOT 版本 = `X.Y.(Z+1)-SNAPSHOT`
51+
52+
**确认 SNAPSHOT 存在**
53+
54+
使用 Grep 搜索 `X.Y.Z-SNAPSHOT`
55+
56+
```
57+
Grep(pattern="X.Y.Z-SNAPSHOT")
58+
```
59+
60+
- 如果没有找到任何匹配,报错退出:`错误:未找到 X.Y.Z-SNAPSHOT,请确认当前代码版本是否正确`
61+
- 如果找到匹配,列出所有包含 SNAPSHOT 的文件,告知用户即将替换的范围
62+
63+
### 步骤 2:确认工作区状态
64+
65+
```bash
66+
git status --short
67+
```
68+
69+
- 如果有未提交的更改,**报错退出**`错误:工作区有未提交的更改,请先提交或暂存(git stash)后再执行发布`
70+
- 工作区必须是干净的才能继续
71+
72+
### 步骤 3:全局替换 SNAPSHOT → Release
73+
74+
使用 Grep 搜索所有包含 `X.Y.Z-SNAPSHOT` 的文件:
75+
76+
```
77+
Grep(pattern="X.Y.Z-SNAPSHOT")
78+
```
79+
80+
对于每个匹配的文件,使用 Edit 工具将 `X.Y.Z-SNAPSHOT` 替换为 `X.Y.Z`
81+
82+
```
83+
Edit(
84+
file_path="<matched-file>",
85+
old_string="X.Y.Z-SNAPSHOT",
86+
new_string="X.Y.Z",
87+
replace_all=true
88+
)
89+
```
90+
91+
**覆盖的文件范围**(由 Grep 全局搜索决定,包括但不限于):
92+
- `**/pom.xml` — Maven 版本号和 `<fit.version>` 属性
93+
- `README.md` — 版本标题
94+
- `docs/**/*.md` — 文档中的版本引用
95+
- `*.java` — 源码中硬编码的版本字符串
96+
- `*.js` — fit.js 中的 VERSION 常量
97+
- `package.json` — Node.js 版本号
98+
99+
**替换后验证**
100+
101+
```
102+
Grep(pattern="X.Y.Z-SNAPSHOT")
103+
```
104+
105+
确认没有残留的 `X.Y.Z-SNAPSHOT`。如果仍有残留,继续替换直到全部清除。
106+
107+
### 步骤 4:创建 Release commit
108+
109+
```bash
110+
git add -A && git commit -m "Release X.Y.Z"
111+
```
112+
113+
### 步骤 5:创建轻量标签
114+
115+
```bash
116+
git tag vX.Y.Z
117+
```
118+
119+
### 步骤 6:创建发布分支
120+
121+
```bash
122+
git branch release-X.Y.Z
123+
```
124+
125+
### 步骤 7:回退当前分支到 Release commit 之前
126+
127+
Release commit 和 tag 已经通过 `release-X.Y.Z` 分支保留,现在需要将当前开发分支回退到 Release commit 之前的状态,使下一个 SNAPSHOT commit 与 Release commit 成为**兄弟关系**(共享同一个父节点),而非父子关系。
128+
129+
```bash
130+
git reset --hard HEAD~1
131+
```
132+
133+
执行后,当前分支 HEAD 回到 Release commit 的父节点,而 `release-X.Y.Z` 分支和 `vX.Y.Z` tag 仍然指向 Release commit。
134+
135+
### 步骤 8:全局替换当前 SNAPSHOT → 下一 SNAPSHOT
136+
137+
由于步骤 7 已将工作区回退到 Release commit 之前,文件中的版本号已恢复为 `X.Y.Z-SNAPSHOT`
138+
139+
使用 Grep 搜索所有在步骤 3 中替换过的文件,将 `X.Y.Z-SNAPSHOT` 替换为 `X.Y.(Z+1)-SNAPSHOT`
140+
141+
**重要**:只替换步骤 3 中已知的文件列表,避免误匹配。
142+
143+
对于步骤 3 中每个替换过的文件,使用 Edit 工具:
144+
145+
```
146+
Edit(
147+
file_path="<file-from-step-3>",
148+
old_string="X.Y.Z-SNAPSHOT",
149+
new_string="X.Y.(Z+1)-SNAPSHOT",
150+
replace_all=true
151+
)
152+
```
153+
154+
**替换后验证**
155+
156+
使用 Read 工具抽查几个关键文件(如根 pom.xml),确认版本号已正确更新为 `X.Y.(Z+1)-SNAPSHOT`
157+
158+
### 步骤 9:创建 SNAPSHOT commit
159+
160+
```bash
161+
git add -A && git commit -m "Prepare the next SNAPSHOT version"
162+
```
163+
164+
### 步骤 10:输出总结
165+
166+
输出发布操作的完整总结:
167+
168+
```
169+
✅ 版本发布完成
170+
171+
**发布信息**:
172+
- 发布版本: X.Y.Z
173+
- 下一开发版本: X.Y.(Z+1)-SNAPSHOT
174+
- Release commit: <commit-hash>
175+
- Tag: vX.Y.Z
176+
- 发布分支: release-X.Y.Z
177+
- SNAPSHOT commit: <commit-hash>
178+
179+
**替换文件数**: N 个文件
180+
181+
**后续手动操作**:
182+
183+
1. 推送 Release 分支和 Tag:
184+
git push origin release-X.Y.Z
185+
git push origin vX.Y.Z
186+
187+
2. 推送当前开发分支(下一 SNAPSHOT):
188+
git push origin <current-branch>
189+
190+
3. (可选)在 GitHub 上基于 vX.Y.Z 标签创建 Release
191+
```
192+
193+
## 使用示例
194+
195+
### 示例 1:发布 3.6.3
196+
197+
```bash
198+
/release 3.6.3
199+
```
200+
201+
执行后:
202+
- `3.6.3-SNAPSHOT``3.6.3`(Release commit + tag `v3.6.3` + 分支 `release-3.6.3`
203+
- `3.6.3``3.6.4-SNAPSHOT`(SNAPSHOT commit)
204+
205+
### 示例 2:发布 4.0.0
206+
207+
```bash
208+
/release 4.0.0
209+
```
210+
211+
执行后:
212+
- `4.0.0-SNAPSHOT``4.0.0`(Release commit + tag `v4.0.0` + 分支 `release-4.0.0`
213+
- `4.0.0``4.0.1-SNAPSHOT`(SNAPSHOT commit)
214+
215+
## 注意事项
216+
217+
1. **工作区必须干净**:执行前确保没有未提交的更改
218+
2. **不会自动推送**:所有操作仅在本地完成,推送由用户手动执行
219+
3. **不含构建验证**:建议在发布前已完成 `mvn clean install` 验证
220+
4. **版本号替换范围**:由 Grep 全局搜索决定,确保所有引用都被更新
221+
5. **步骤 7 的替换策略**:仅替换步骤 3 中已知的文件,避免误匹配
222+
223+
## 错误处理
224+
225+
- **版本号格式错误**:提示正确格式并退出
226+
- **SNAPSHOT 不存在**:提示确认当前代码版本并退出
227+
- **工作区不干净**:提示先提交或暂存更改并退出
228+
- **Git 操作失败**:显示错误信息,提示用户手动处理
229+
230+
## 回滚方式
231+
232+
如果发布过程中出错或需要回滚:
233+
234+
```bash
235+
# 删除标签
236+
git tag -d vX.Y.Z
237+
238+
# 删除发布分支
239+
git branch -d release-X.Y.Z
240+
241+
# 回退 commit(回退最近的 1 或 2 个 commit)
242+
git reset --soft HEAD~2
243+
244+
# 恢复工作区
245+
git checkout -- .
246+
```
247+
248+
## 相关命令
249+
250+
- `/commit` - 提交代码
251+
- `/test` - 运行测试
252+
- `/create-pr` - 创建 Pull Request

0 commit comments

Comments
 (0)