postar-pipe-mcp 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,472 @@
1
+ ---
2
+ name: cd
3
+ description: 自动化 CD 部署命令 - 直接触发 Jenkins 构建执行服务部署。支持单环境部署、多环境批量部署、指定分支部署、多服务批量部署。当用户输入cd、发布、部署、 /cd 指令,或需要部署服务到指定环境时使用。
4
+ constraint: strict
5
+ version: 1.0.0
6
+ ---
7
+
8
+ # CD 自动化部署
9
+
10
+ > ⚠️ **执行约束(CRITICAL)- 必须遵守**
11
+ >
12
+ > 1. **必须完整阅读**:在执行任何操作前,必须完整阅读本 Skill 的所有内容
13
+ > 2. **严格按步骤执行**:必须严格按照下文"执行流程"中的步骤顺序执行,严禁跳过任何步骤
14
+ > 3. **仅执行定义的操作**:只能执行本 Skill 中明确定义的操作,严禁执行其他未指定的操作
15
+ > 4. **验证每一步**:每一步完成后必须验证结果,确认成功后再进行下一步
16
+ > 5. **错误处理**:如遇错误必须立即停止执行并报告,严禁擅自绕过或忽略错误
17
+ > 6. **禁止假设**:不要假设任何配置或状态,必须通过工具调用来确认
18
+ > 7. **顺序执行**:多环境部署时必须按顺序逐个执行,严禁并行处理
19
+ > 8. **交互暂停**:所有涉及用户交互的操作必须暂停执行,等待用户确认后才能继续
20
+
21
+ ## 说明
22
+
23
+ 本指令用于直接触发 Jenkins 构建,执行服务部署。与 `/ci` 命令不同,`/cd` 只负责部署,不负责代码合并。适用于仅需重新部署或部署特定分支的场景。
24
+
25
+ > **⚠️ 重要约束**:
26
+ > - 当 `config.yaml` 中设置 `jenkins.is_current_branch: false` 时,**严禁执行任何本地git命令**获取分支信息
27
+ > - 必须完全跳过分支部署逻辑,让 Jenkins Job 使用其内部配置的固定分支
28
+ > - 违反此约束将导致部署行为与配置意图不符
29
+
30
+ > **⚠️ MCP 名称匹配规则**:
31
+ > - `config.yaml` 中的 Jenkins 配置块名称必须与 `mcp.json` 中的 MCP 名称一致
32
+ > - 例如:`config.yaml` 中有 `jenkins:` 配置块,则对应 `mcp.json` 中的 `jenkins` MCP
33
+ > - 例如:`config.yaml` 中有 `jenkins-prod:` 配置块,则对应 `mcp.json` 中的 `jenkins-prod` MCP
34
+ > - 工具调用时,使用 `mcp_{配置块名称}_*` 格式,如配置块为 `my-jenkins`,则调用 `mcp_my_jenkins_get_all_items`
35
+
36
+ > **⚠️ MCP 智能选择规则(重要)**:
37
+ > - 系统会**优先根据环境参数**选择对应的 MCP,而不是按前缀长度匹配
38
+ > - 当调用 `mcp_jenkins_*` 工具时,系统会:
39
+ > 1. 从参数中提取环境信息(`env`、`fullname` 等)
40
+ > 2. 在 `config.yaml` 中查找包含该环境配置的 Jenkins 配置块
41
+ > 3. 使用对应的 MCP 进行调用
42
+ > - 例如:`/cd dev` 会查找 `config.yaml` 中包含 `dev` 环境配置的 Jenkins 配置块(如 `jenkins`),并使用该 MCP
43
+ > - 例如:`/cd prod` 会查找 `config.yaml` 中包含 `prod` 环境配置的 Jenkins 配置块(如 `jenkins-prod`),并使用该 MCP
44
+ > - 这种机制确保**不同环境使用正确的 Jenkins 实例**,避免 dev 环境调用到 prod Jenkins 的问题
45
+
46
+ > **⚠️ 交互原则**:所有涉及用户交互的操作都会**立即暂停执行**,等待用户完成选择后才能继续,确保部署流程的可控性和准确性。
47
+
48
+ ## 变量配置
49
+
50
+ | 变量 | 简写 | 默认值 | 说明 |
51
+ |------|------|--------|------|
52
+ | `ENV` | `dev`/`test`/`uat`/`dev-api`... | `dev` | 目标环境,支持多选(逗号或空格分隔),如 `dev-api,dev-admin` |
53
+ | `BRANCH` | `branch:分支名` | 当前分支 | 要部署的分支,使用 `branch:分支名` 格式指定 |
54
+
55
+ > **参数解析规则**:
56
+ > 1. 优先匹配简写:`dev`/`test`/`uat`,或带服务后缀的 `dev-api`/`dev-admin` 等
57
+ > 2. 支持多环境批量部署:用逗号或空格分隔多个环境,如 `dev-api,dev-admin` 或 `dev-api dev-admin`
58
+ > 3. 匹配 `branch:` 前缀,提取分支名作为 `BRANCH`
59
+ > 4. 若包含 `=` 则按 `KEY=VALUE` 解析
60
+
61
+ ## 执行流程
62
+
63
+ ### 前置检查: Jenkins MCP 可用性验证
64
+
65
+ 在执行任何步骤前,必须先完成以下验证,**验证通过后才能继续,否则立即停止**:
66
+
67
+ 1. **确定当前环境对应的 MCP 名称**:
68
+ - 扫描 `config.yaml` 中的所有 Jenkins 配置块(如 `jenkins`、`jenkins-prod` 等)
69
+ - 根据当前环境参数,找到包含该环境配置的配置块
70
+ - 使用该配置块的名称作为 MCP 名称,工具调用格式为 `mcp_{配置块名称}_*`
71
+
72
+ 2. 调用只读工具进行可用性检查(random_string="check")
73
+ 3. **判断结果**:
74
+ - 如果返回 `tool not found` 或 `not found MCPHost` 或 `50001` 错误码:**立即停止,禁止执行后续任何步骤**,输出:
75
+ ```
76
+ ❌ Jenkins MCP 不可用,无法执行部署流程
77
+ 请在 MCP 配置中启用 Jenkins MCP 后重试:
78
+ 编辑器设置 → MCP → 启用 Jenkins
79
+ ```
80
+ - 如果返回其他任何结果(含 404、401、数据等):视为 MCP 可用,继续执行
81
+
82
+ ### 步骤 1: 获取部署信息
83
+
84
+ > **⚠️ 必须每次在根目录重新读取 `config.yaml`**:禁止使用上下文缓存,每次执行时都要重新读取项目根目录的 `config.yaml` 文件,不需要在其他目录查找,找不到就提示找不到就行。
85
+ >
86
+ > **⚠️ 分支获取严格约束**:当 `jenkins.is_current_branch: false` 时,**严禁执行任何分支相关命令**(包括 `git branch --show-current`),必须完全跳过分支部署逻辑。
87
+
88
+ 1. **解析多环境参数**:
89
+ - 将用户输入按逗号或空格分割,提取多个 `ENV` 值
90
+ - 例如:`/cd dev-api,dev-admin branch:feature/xxx` → `['dev-api', 'dev-admin']`
91
+ - 例如:`/cd dev-api dev-admin` → `['dev-api', 'dev-admin']`
92
+
93
+ 2. **解析分支参数**:
94
+ - 若用户传入了 `branch:xxx`,提取指定分支名,**跳过分支获取**
95
+ - 若未指定分支,继续下一步
96
+
97
+ 3. **智能发现 Jenkins Job(优先执行)**:
98
+ - 对每个环境,首先尝试在 `config.yaml` 中查找对应配置
99
+ - **若配置存在**:使用配置中的 `fullname` 和 MCP 名称,进入参数处理流程(步骤 2)
100
+ - **若配置不存在(智能发现模式)**:
101
+ 1. **扫描所有 Jenkins MCP**:
102
+ - 读取 `mcp.json` 配置,识别所有可用的 Jenkins MCP(名称包含 `jenkins` 的 MCP)
103
+ - 按 MCP 名称排序,优先尝试 `jenkins`,然后是 `jenkins-prod`、`jenkins-test` 等其他 Jenkins MCP
104
+ 2. **逐个 MCP 精确查找**:
105
+ - 对每个 Jenkins MCP,调用 `mcp_{mcp_name}_get_item` 查询该环境名称对应的 Job
106
+ - **精确查找成功**:
107
+ - 调用 `mcp_{mcp_name}_get_item_config` 获取 Job 配置,解析参数定义
108
+ - **⚠️ 智能发现模式必须用户确认**:由于该 Job 未在 `config.yaml` 中配置,**执行部署前必须暂停并等待用户确认**
109
+ - 展示找到的 Job 信息,让用户确认是否部署:
110
+ ```
111
+ 🔍 智能发现 Jenkins Job
112
+
113
+ 找到未在 config.yaml 中配置的 Job:
114
+ - Job 名称: {fullname}
115
+ - 所属 MCP: {mcp_name}
116
+ - Jenkins URL: {url}
117
+
118
+ ⚠️ 该 Job 未在 config.yaml 中配置,可以修改参数,确认要部署吗?
119
+ - 输入 `yes` 或 `y` 确认部署
120
+ - 输入 `no` 或 `n` 取消部署
121
+
122
+ >
123
+ ```
124
+ - **用户确认后**:
125
+ - **用户明确需要配置参数(如说"我要选择参数")或 Job 有必填参数**:进入步骤 2 的参数交互流程,**一次性展示所有参数**:
126
+ - Choice 类型参数:展示所有选项,标注默认值,让用户选择
127
+ - String 类型参数:展示默认值,用户可回车使用或输入新值
128
+ - 必填参数:标注必填,等待用户输入
129
+ - **用户未指定任何参数且 Job 无必填参数**:
130
+ - Choice 类型参数:默认选择第一个选项
131
+ - String 类型参数:使用 Jenkins 配置的默认值
132
+ - 使用 `buildWithParameters` 模式 + 自动填充的参数触发构建
133
+ - 使用该 Job 所属的 MCP 名称(根据配置块确定)
134
+ - **无需更新 config.yaml**,实现零配置部署
135
+ - **停止扫描其他 MCP**,直接进入下一步
136
+ 3. **所有 MCP 精确查找失败**:
137
+ - **模糊查找**:遍历所有 Jenkins MCP,调用 `mcp_{mcp_name}_query_items` 获取所有 Jobs
138
+ - 合并所有 MCP 的 Jobs 结果,模糊匹配环境名称,可以同时调用 `mcp_{mcp_name}_get_item_config`从 XML 中提取 `<description>` 字段进行模糊匹配
139
+ - **匹配结果处理**:
140
+ - **未匹配到任何 Job**:停止执行,输出提示
141
+ - **匹配到1个或多个 Jobs**:
142
+ 1. 展示带描述的匹配列表,让用户选择其中一个:
143
+ ```
144
+ 找到 {N} 个匹配的 Jenkins Job:
145
+
146
+ | 序号 | Job 名称 | 描述 |
147
+ |------|----------|------|
148
+ | 1 | job-name-1 | Job描述信息 |
149
+ | 2 | job-name-2 | Job描述信息 |
150
+ ...
151
+
152
+ 请输入序号或 Job 名称进行选择:
153
+ >
154
+ ```
155
+ 2. 用户选择后,执行上述"精确查找成功"相同的流程(判断是否需要交互)
156
+ - **显示原则**:Job 名称保持原始英文,不翻译;描述字段直接显示 Jenkins 配置中的原始内容
157
+ ```
158
+ ❌ 未找到与环境 "{ENV}" 匹配的 Jenkins Job
159
+
160
+ 可能的原因:
161
+ 1. Job 名称拼写错误
162
+ 2. 该环境尚未配置 Jenkins Job
163
+ 3. Job 存在于其他 Jenkins 实例(如 jenkins-prod)
164
+
165
+ 解决方案:
166
+ - 检查环境名称拼写
167
+ - 在 config.yaml 中手动配置:jenkins.{ENV}.fullname
168
+ - 确认 Job 是否存在于当前 Jenkins 实例
169
+ ```
170
+
171
+ 4. **确定 MCP 名称和配置块**:
172
+ - 扫描 `config.yaml` 中的所有顶级配置块,识别 Jenkins 相关的配置(包含 `is_current_branch` 和子环境配置的配置块)
173
+ - 根据当前环境参数或智能发现结果,确定配置块名称(如 `jenkins`、`jenkins-prod`、`my-ci` 等)
174
+ - **工具前缀规则**:使用配置块名称作为 MCP 名称,工具调用格式为 `mcp_{配置块名称}_*`
175
+ - 例如:配置块名为 `jenkins` → 调用 `mcp_jenkins_get_all_items`
176
+ - 例如:配置块名为 `jenkins-prod` → 调用 `mcp_jenkins_prod_get_all_items`
177
+
178
+ 5. 从 `config.yaml` 中读取全局配置:
179
+ - `{mcp_name}.is_current_branch` - 是否使用当前分支(默认 `false`)
180
+ - `true`: 用户未指定分支时,才执行 `git branch --show-current` 获取当前分支
181
+ - `false`: 用户未指定分支时,**不执行** `git branch --show-current`,直接使用 Jenkins Job 的固定分支
182
+
183
+ 6. 对每个环境,读取完整的配置信息:
184
+ - `{mcp_name}.{ENV}.fullname` - Jenkins 任务全名(智能发现模式已获取)
185
+ - `{mcp_name}.{ENV}.url` - Jenkins 构建页面 URL(可选)
186
+ - `{mcp_name}.{ENV}.params` - 构建参数(支持占位符,可选)
187
+ - `{mcp_name}.{ENV}.select_options` - 参数选项列表(可选,优先从 Jenkins 获取)
188
+
189
+ 7. **动态获取 Jenkins Job 信息**:
190
+ - 使用确定的 MCP 名称调用对应工具,格式为 `mcp_{mcp_name}_get_item`
191
+ - 提取 `url` 字段作为构建页面链接(若 `config.yaml` 中未配置 `url`)
192
+ - 若获取失败,使用 `https://{jenkins_host}/job/{fullname}/` 作为备用链接
193
+
194
+ 8. **确定部署分支**:
195
+ - **用户指定了分支** → 直接使用指定分支
196
+ - **用户未指定分支,且 `is_current_branch: true`** → 执行 `git branch --show-current` 获取当前分支
197
+ - **用户未指定分支,且 `is_current_branch: false`** → **完全跳过分支部署逻辑,不执行任何分支相关命令**(使用 Jenkins Job 绑定的固定分支)
198
+
199
+ 9. **分支占位符替换**:
200
+ - 若 `params` 中包含 `{branch}` 占位符:
201
+ - 当获取到分支时,替换为确定的分支名
202
+ - 当未获取分支时(`is_current_branch: false` 或用户未指定),**移除包含 `{branch}` 占位符的参数项**
203
+
204
+ ### 步骤 2: 参数处理与交互
205
+
206
+ **参数处理逻辑**:
207
+
208
+ 1. **若 `config.yaml` 中未配置 `params`**(或 `params` 为空对象 `{}`):
209
+ - **使用 `buildWithParameters` 模式触发构建**,传递空对象 `{}`
210
+ - Jenkins 将使用所有参数的默认值进行构建
211
+
212
+ 2. **若 `config.yaml` 中配置了 `params`**:
213
+ - 遍历 `jenkins.{ENV}.params` 中的每个参数
214
+ - **参数值已填写**(非空字符串、非空数组):直接使用该值
215
+ - **参数值为空字符串 `""` 或空数组 `[]`**:进入交互流程,让用户选择
216
+
217
+ **空值参数交互填充**(仅当参数值为空时):
218
+
219
+ **交互执行原则**:
220
+ - **全面暂停**:一旦检测到任何需要交互的参数(包括单环境和多环境),立即暂停所有后续执行流程
221
+ - **等待用户输入**:显示交互界面,等待用户完成选择并提交
222
+ - **用户确认后继续**:只有收到用户明确的选择结果后,才能继续执行
223
+ - **严禁自动选择**:**绝对禁止**在用户未输入的情况下自动选取任何选项(包括第一项、默认项等),必须等待用户明确输入后才能继续
224
+ - **适用范围**:所有涉及用户交互的场景都遵循此原则,包括但不限于:
225
+ - 单环境部署中的参数选择
226
+ - 多环境批量部署中的参数选择
227
+ - 多服务批量部署中的服务选择
228
+ - 任何需要用户决策的配置项
229
+
230
+ **获取参数选项列表(优先级从高到低)**:
231
+
232
+ 1. **优先从 `config.yaml` 的 `select_options` 中查找**
233
+ - 如果在 `jenkins.{ENV}.select_options` 中找到了该参数的选项列表,直接使用
234
+ - **显示原则**:严格按照配置中的原始值显示,不做任何翻译或美化
235
+
236
+ 2. **若配置中没有,自动从 Jenkins Job 获取**
237
+ - 使用确定的 MCP 名称调用对应工具,格式为 `mcp_{mcp_name}_get_item_config`
238
+ - 解析配置中的 `hudson.model.ChoiceParameterDefinition` 参数定义
239
+ - 提取 `choices` 列表作为选项
240
+ - **显示原则**:直接使用从 Jenkins XML 中解析出的原始选项值,保持原样显示
241
+ - **获取成功**:使用该选项列表进行交互
242
+ - **获取失败**(如 Job 不存在、无权限、或该参数不是 Choice 类型):**停止执行**,输出:
243
+ ```
244
+ ❌ 部署中止:参数 {参数名} 值为空,且无法从 Jenkins 获取可选值
245
+
246
+ 可能的原因:
247
+ 1. Jenkins Job 中该参数不是 Choice 类型(无预定义选项)
248
+ 2. Jenkins Job 配置中不存在该参数
249
+ 3. 无法访问 Jenkins Job 配置(检查权限或 fullname 是否正确)
250
+
251
+ 解决方案:
252
+ - 在 config.yaml 的 jenkins.{ENV}.select_options 中手动配置选项列表
253
+ - 或在 jenkins.{ENV}.params 中直接填写该参数值
254
+ ```
255
+
256
+ **交互方式**:
257
+
258
+ - **字符串类型(单选)**:
259
+ ```
260
+ Please select the value for {param_name} (enter the number or name):
261
+ 1. develop ⭐ (default)
262
+ 2. master
263
+ 3. releases/20250918
264
+ ...
265
+ > 1
266
+ ```
267
+ - **数组类型(多选批量部署)**:
268
+ ```
269
+ Please select the value for {param_name} (multiple selection allowed, enter numbers separated by commas):
270
+ 1. build:dev:api
271
+ 2. build:dev:admin
272
+ 3. build:dev:worker
273
+ ...
274
+ > 1,2
275
+ ```
276
+
277
+ > **重要说明**:
278
+ > - 所有选项值直接使用从 Jenkins 配置或 `select_options` 中获取的原始值,**不做任何翻译或格式化处理**
279
+ > - 选项显示保持原样,如 `develop`、`build:dev:noenc`、`/home/gtdev/webs` 等
280
+ > - 提示语可使用中文,但选项值必须保持原始英文
281
+
282
+ **多服务批量部署**:
283
+ 当参数值为数组(`[]` 或预配置数组)时,自动按顺序连续部署多个服务:
284
+ ```yaml
285
+ params:
286
+ BUILD_NAME: [] # 空数组:交互多选
287
+ # 或
288
+ BUILD_NAME: ["build:dev:api", "build:dev:admin"] # 预配置:自动批量部署
289
+ ```
290
+
291
+ **占位符替换**:
292
+ 遍历所有参数值,进行以下替换:
293
+ - `{branch}` → 部署分支
294
+ - `{env}` → 当前环境
295
+
296
+ ### 步骤 3: 触发 Jenkins 构建
297
+
298
+ **多环境批量部署**:
299
+ 当解析出多个环境(如 `['dev-api', 'dev-admin']`)时,**必须按顺序逐个环境执行**,不能并行处理:
300
+
301
+ ```
302
+ 环境1 → 交互(如需要) → 部署 → 完成
303
+
304
+ 环境2 → 交互(如需要) → 部署 → 完成
305
+
306
+ 环境3 → 交互(如需要) → 部署 → 完成
307
+ ```
308
+
309
+ **执行流程**:
310
+ 1. **逐个遍历环境**:一次只处理一个环境,严禁一次性收集所有环境的交互参数
311
+ 2. 对每个环境执行以下部署流程:
312
+ - 输出当前部署进度:`🚀 开始第 {index}/{total} 个部署: {env}...`
313
+ - **读取该环境的 `params` 配置**:
314
+ - 若该环境**未配置 `params`** 或配置为 `{}`:**直接使用 `buildWithParameters` + 空对象 `{}` 触发构建**,使用 Jenkins 默认值,**不进入交互**
315
+ - 若该环境**配置了 `params`**:遍历参数,对空值参数进入交互流程
316
+ - **执行参数处理与交互**(步骤 2):
317
+ - 如果需要交互选择,**必须暂停等待用户完成选择**
318
+ - **只有当前环境部署完成后,才能继续下一个环境**
319
+ - 调用 `mcp_jenkins_build_item`,`build_type` 固定为 `buildWithParameters` 触发构建
320
+ - 等待该环境部署触发成功后,再进入下一个环境
321
+ 3. 所有环境部署完成后,汇总输出所有队列 ID
322
+
323
+ > **⚠️ 重要提醒**:
324
+ > - **严禁一次性收集所有环境的参数**:多环境部署时,不能先问完 dev 的参数,再问 test 的参数,然后一起部署
325
+ > - **必须顺序执行**:只有当前环境完全处理完毕(包括交互、部署触发)后,才能开始下一个环境
326
+ > - **各环境独立**:比如 test 环境未配置 `params` 时,应直接使用 Jenkins 默认值,不需要询问 BUILD_NAME
327
+
328
+ **单环境 - 单服务部署**(参数值为字符串):
329
+ 使用确定的 MCP 名称调用对应工具,格式为 `mcp_{mcp_name}_build_item`
330
+ 参数:
331
+ - `fullname`: Jenkins 任务全名
332
+ - `build_type`: `buildWithParameters`(固定值,所有部署均使用参数化构建)
333
+ - `params`: 处理后的参数对象(**只包含 config.yaml 中明确配置的参数,未配置的参数不传,使用 Jenkins 默认值**)
334
+
335
+ > **参数传递原则**:
336
+ > - `config.yaml` 中配置了具体值的参数 → 传递给 Jenkins(覆盖默认值)
337
+ > - `config.yaml` 中未配置的参数 → 不传递,让 Jenkins 使用其默认值
338
+ > - 例如:只配置了 `BUILD_NAME: "build:dev"`,则只传 `BUILD_NAME`,其他参数(如 `branch_name`)使用 Jenkins 默认值
339
+
340
+ **单环境 - 多服务批量部署**(参数值为数组):
341
+
342
+ **情况1:预配置数组**(如 `BUILD_NAME: ["build:dev:api", "build:dev:admin"]`)
343
+ - 遍历数组,按顺序执行每个服务的部署
344
+ - 逐个替换参数值并触发构建
345
+ - 输出当前部署进度
346
+ - 所有服务部署完成后,汇总输出所有队列 ID
347
+
348
+ **情况2:空数组交互**(如 `BUILD_NAME: []`)
349
+ - **触发交互选择**:显示可选服务列表,等待用户输入
350
+ - **暂停执行**:必须等待用户完成选择并提交后才能继续
351
+ - **用户选择后**:
352
+ 1. 根据用户选择生成服务数组
353
+ 2. 按顺序执行每个选定服务的部署
354
+ 3. 输出部署进度和结果
355
+
356
+ **重要原则**:
357
+ - **交互期间必须暂停**:当触发任何用户交互时,立即停止后续执行流程
358
+ - **等待用户确认**:只有在用户完成交互选择并提交后,才能继续执行部署
359
+ - **防止流程混乱**:避免在用户未完成选择时就进入下一个部署步骤
360
+
361
+ **错误处理 - 分支参数不支持**:
362
+ 若触发构建时返回错误,且错误信息包含分支相关关键字(如 "branch", "BRANCH", "参数错误" 等):
363
+ 1. **输出提示信息**:
364
+ ```
365
+ ⚠️ 部署失败:Jenkins Job 可能不支持分支参数传入
366
+
367
+ 当前配置尝试传入的分支参数:
368
+ - {分支参数名}: {分支值}
369
+
370
+ 可能的原因:
371
+ 1. Jenkins Job 绑定了固定分支,不接受外部传入或分支名不在可选范围
372
+ 2. 分支参数名不正确(如应为 "branch" 而非 "BRANCH")
373
+ 3. Jenkins 用户没有权限触发参数化构建
374
+
375
+ 建议解决方案:
376
+ - 如果 Job 已绑定固定分支:请在 config.yaml 的 jenkins.{ENV}.params 中移除分支参数
377
+ - 如果参数名不正确:请修改 params 中的分支参数名与 Jenkins Job 一致
378
+ - 检查 Jenkins 权限配置
379
+
380
+ 原始错误:{error_message}
381
+ ```
382
+ 2. **停止执行**,等待用户修改配置后重试
383
+
384
+ **错误处理 - 多环境部署中断**:
385
+ 多环境批量部署时,若某个环境部署失败:
386
+ 1. 输出失败环境的错误信息
387
+ 2. 继续部署剩余环境(或根据配置停止,默认继续)
388
+ 3. 最后汇总成功和失败的环境列表
389
+
390
+ ### 步骤 4: 输出结果
391
+
392
+ **单环境部署成功** 输出:
393
+ ```
394
+ ✅ 部署触发成功
395
+
396
+ 📋 部署信息:
397
+ 项目: {project_name}
398
+ 分支: {branch}
399
+ 环境: {env}
400
+ Jenkins 队列 ID: {queue_id}
401
+
402
+ - 🔗 [查看构建进度]({build_url})
403
+ ```
404
+
405
+ **多环境批量部署成功** 输出:
406
+ ```
407
+ ✅ 批量部署触发成功(共 {total} 个环境)
408
+
409
+ 📋 部署信息汇总:
410
+ 分支: {branch}
411
+
412
+ 环境 1: dev-api
413
+ - 项目: {project_name_1}
414
+ - Jenkins 队列 ID: {queue_id_1}
415
+ - 🔗 [查看构建]({build_url_1})
416
+
417
+ 环境 2: dev-admin
418
+ - 项目: {project_name_2}
419
+ - Jenkins 队列 ID: {queue_id_2}
420
+ - 🔗 [查看构建]({build_url_2})
421
+
422
+ ...
423
+ ```
424
+
425
+ 若触发失败,输出错误信息并提示手动触发。
426
+
427
+ ## 使用示例
428
+
429
+ > **⚠️ 重要说明**:
430
+ > 1. 当触发任何交互选择时(如BUILD_NAME为空数组`[]`、参数值为空等),系统会**立即暂停执行**并等待用户输入选择
431
+ > 2. **所有涉及交互的场景都遵循暂停原则**:单环境、多环境、多服务部署中的任何交互都需要用户确认后才能继续
432
+ > 3. 系统**不会自动继续执行后续步骤**,避免在用户未完成选择时进入下一个部署环节
433
+ > 4. **选项显示原则**:交互界面中显示的所有选项值均为原始配置值,不做中文翻译或格式化处理,确保与 Jenkins 配置完全一致
434
+
435
+ ```bash
436
+ # 部署当前分支到 dev 环境(默认)
437
+ /cd
438
+
439
+ # 部署当前分支到 test 环境
440
+ /cd test
441
+
442
+ # 部署指定分支到 dev 环境
443
+ /cd branch:feature/xxx
444
+
445
+ # 部署指定分支到 test 环境
446
+ /cd test branch:bugfix/123
447
+
448
+ # 完整写法
449
+ /cd ENV=uat branch:release/v1.0
450
+
451
+ # ========== 多环境批量部署 ==========
452
+ # 同时部署多个独立 Jenkins Job(逗号分隔)
453
+ /cd dev-api,dev-admin
454
+
455
+ # 同时部署多个服务 + 指定分支
456
+ /cd dev-api,dev-admin,dev-worker branch:feature/xxx
457
+
458
+ # 空格分隔也支持
459
+ /cd dev-api dev-admin
460
+
461
+ # 混合写法
462
+ /cd dev-api,dev-admin branch:release/v1.0
463
+ ```
464
+
465
+ ## 与 /ci 命令的区别
466
+
467
+ | 命令 | 功能 | 适用场景 |
468
+ |------|------|----------|
469
+ | `/ci` | MR 合并 + 可选 Jenkins 构建 | 需要代码合并并部署 |
470
+ | `/cd` | 直接 Jenkins 构建 | 仅需部署,无需合并 |
471
+
472
+ > **建议**:日常开发使用 `/ci` 完成合并+部署;若只想重新部署或部署特定分支,使用 `/cd`。