|
| 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