# Jenkins Deploy

> ABC Jenkins 项目发布技能。支持智能参数推断和交互式触发 Jenkins 构建，自动获取 Git 分支和标签信息。当用户请求"发布 Jenkins"、"触发构建"、"部署项目"、"Jenkins 发布"或类似操作时触发此技能。需要环境变量 JENKINS_USER 和 JENKINS_TOKEN。

- Skill: `abcfed/jenkins-deploy` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add abcfed/jenkins-deploy`
- Raw SKILL.md: https://api.skillmd.com/api/skills/abcfed/jenkins-deploy/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: abcfed (https://skillmd.com/u/abcfed)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/abcfed/jenkins-deploy

---


# ABC Jenkins 发布技能

交互式触发 Jenkins 构建，支持智能参数推断（自动解析分支名、环境推断）和实时状态监控。

## 前置条件

1. `JENKINS_USER` 环境变量已设置（Jenkins 用户名）
2. `JENKINS_TOKEN` 环境变量已设置（Jenkins API Token）
3. 当前在 Git 仓库中（用于自动获取分支和标签）

## 安装

```bash
npx add-skill https://github.com/ABCFed/claude-marketplace/tree/main/skills/jenkins-deploy
```

## 准备

```bash
# 编辑 ~/.zshrc 或 ~/.bashrc
export JENKINS_USER="your_jenkins_username"
export JENKINS_TOKEN="your_jenkins_api_token"
source ~/.zshrc
```

## 使用流程

### 方式一：两阶段部署（推荐，进度可见）

**步骤 1：触发构建（返回 JSON）**

```bash
python scripts/jenkins_deploy.py \
  <project_name> \
  --trigger-only-no-monitor \
  --yes \
  --params "<json>"
```

**返回 JSON：**
```json
{
  "queue_id": 161484,
  "full_name": "abc-his/test/PcFeatureTest",
  "project_name": "PcFeatureTest",
  "build_url": "http://ci.abczs.cn/job/abc-his/job/test/job/PcFeatureTest/"
}
```

**步骤 2：启动后台监控**

**Claude Code（使用 run_in_background=true）：**
```bash
# 在 Claude Code 中使用 Bash 工具，设置 run_in_background=true
python scripts/jenkins_deploy.py \
  --monitor-only \
  --full-name abc-his/test/PcFeatureTest \
  --queue-id 161484 \
  --display-name PcFeatureTest
```

**其他 AI 工具或终端（使用 nohup）：**
```bash
nohup python scripts/jenkins_deploy.py \
  --monitor-only \
  --full-name abc-his/test/PcFeatureTest \
  --queue-id 161484 \
  --display-name PcFeatureTest > /dev/null 2>&1 &
```

**重要说明：**
- 监控任务作为**后台任务**运行，**不阻塞主对话/终端**
- Claude Code：进度显示在后台任务输出中
- 其他工具：使用 `nohup` 实现后台运行，构建完成后会收到系统通知
- 用户可以继续进行其他操作

**监控输出示例：**
```
📊 开始监控构建: PcFeatureTest
   Queue ID: 161484
   项目: abc-his/test/PcFeatureTest

任务开始执行 (Build #11122)
📦 构建号: #11122
⏳ 监控构建进度...
   需要取消时，请告诉我: "取消构建 #11122"

⏳ [███████████░░░░░░░░░░░░░░░] 42% (125s)
...
✅ PcFeatureTest 构建成功!
```

## 参数说明

### --trigger-only-no-monitor 模式（触发构建）

| 参数 | 必填 | 说明 |
|------|------|------|
| `project_name` | ✓ | Jenkins 项目名称（如 PcFeatureTest） |
| `--trigger-only-no-monitor` | ✓ | 仅触发构建，不启动监控，返回 JSON |
| `--yes` | ✓ | 跳过交互式确认 |
| `--params` | ✓ | JSON 格式的完整构建参数 |

### --monitor-only 模式

| 参数 | 必填 | 说明 |
|------|------|------|
| `--monitor-only` | ✓ | 后台监控模式 |
| `--full-name` | ✓ | 项目完整路径（如 abc-his/test/PcFeatureTest） |
| `--queue-id` | ✓ | 队列 ID |
| `--display-name` | ✓ | 项目显示名称（用于通知） |

## 完整示例

### 测试环境发布

```bash
# 步骤 1: 触发构建
python scripts/jenkins_deploy.py \
  PcFeatureTest \
  --trigger-only-no-monitor \
  --yes \
  --params '{"repoTag":"pc-t2025.53.19","tapdId":"1167459320001118371","featureNo":"70"}'

# 返回 JSON:
# {"queue_id": 161484, "full_name": "abc-his/test/PcFeatureTest", ...}

# 步骤 2: 启动后台监控
# Claude Code: 直接运行（会使用 run_in_background=true）
# 其他工具: 添加 nohup 和 & 放到后台
python scripts/jenkins_deploy.py \
  --monitor-only \
  --full-name abc-his/test/PcFeatureTest \
  --queue-id 161484 \
  --display-name PcFeatureTest
```

### 开发环境发布

```bash
python scripts/jenkins_deploy.py \
  staticPcOwn \
  --trigger-only-no-monitor \
  --yes \
  --params '{"repoBranch":"hotfix/xxx-1167459320001118371"}'
```

## 其他命令

```bash
# 列出所有项目
python scripts/jenkins_deploy.py --list --all

# 列出当前仓库相关的项目（自动过滤）
python scripts/jenkins_deploy.py --list

# 停止指定构建号
python scripts/jenkins_deploy.py --stop <build_number>
```

## 测试与验证

每次修改技能后，建议按以下流程验证：

### 快速测试命令

```bash
# 自动化运行所有测试用例
python scripts/run_tests.py
```

### 手动测试

**1. 参数验证（必做）**
```bash
python scripts/jenkins_deploy.py \
  PcFeatureTest \
  --validate \
  --params '{"repoTag":"pc-t2025.53.19","featureNo":"70"}'
```

**2. 模拟运行（必做）**
```bash
python scripts/jenkins_deploy.py \
  PcFeatureTest \
  --dry-run \
  --params '{"repoTag":"pc-t2025.53.19","featureNo":"70"}'
```

**详细测试用例**：参见 [test-cases.md](references/test-cases.md)

## 工作流程（推荐模式）

```
┌─────────────────────────────────────────────────────────────┐
│ 1. Claude Code: 使用 AskUserQuestion 收集参数               │
│    其他 AI 工具: 通过对话收集参数                            │
│    - 项目名称                                               │
│    - Git 分支 / 标签                                         │
│    - TAPD ID（从分支名自动解析）                             │
│    - featureNo（如果项目有此参数，**必填**）                 │
│    - 其他构建参数                                            │
└─────────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────────┐
│ 2. 调用脚本 --trigger-only 模式                            │
│    - 传递完整的 JSON 参数                                    │
│    - 直接触发 Jenkins API                                   │
└─────────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────────┐
│ 3. 返回构建信息                                            │
│    - Queue ID                                               │
│    - 构建页面 URL                                           │
└─────────────────────────────────────────────────────────────┘
```

## 智能参数推断

| 参数 | 推断规则 | 示例 |
|------|---------|------|
| `repoBranch` | 当前 Git 分支 | `hotfix/盘点页面增加备注及搜索-1167459320001118371` |
| `repoTag` | 最新 Git 标签 | `pc-f2026.05.48` |
| `tapdId` / `tapdid` | 从分支名自动解析（标准化流程：分支名末尾的数字） | `1167459320001118371` |
| `execType` | 有 tag=deploy，无 tag=build | 有 tag → `deploy` |
| `featureNo` | **必填（当项目有此参数时）**，需用户明确指定 | `1122044681001112866` |
| `envNo` | 部分项目需要，需用户明确指定 | `001` |

### TAPD ID 自动解析

标准化流程下，分支名格式为 `feature/xxx-{TAPD_ID}` 或 `hotfix/xxx-{TAPD_ID}`：

```
分支名：hotfix/盘点页面增加备注及搜索-1167459320001118371
                                         └────────────────────┘
                                          自动提取 TAPD ID
```

无需手动配置，发布时会自动填充到 `tapdId` 或 `tapdid` 参数。

**⚠️ 重要**：
- `featureNo`（功能编号）：**当项目有此参数时必填**，需由用户提供
- `envNo`（环境编号）：部分项目需要，需由用户提供

## 支持的参数类型

| 参数类型 | 说明 | 交互方式 |
|---------|------|---------|
| `StringParameterDefinition` | 文本输入 | 直接输入或回车使用默认值 |
| `ChoiceParameterDefinition` | 下拉选择 | 显示选项列表，输入编号选择 |
| `PT_CHECKBOX` | 复选框多选 | 显示选项列表，输入逗号分隔的编号 |
| `BooleanParameterDefinition` | 布尔值 | y/n 选择 |
| `WReadonlyStringParameterDefinition` | 只读参数 | 自动使用，不可修改 |

## 常见项目类型

**详细项目参数参考**：参见 [projects.md](references/projects.md)

### 1. PcFeatureTest (测试环境发布)

**用途**：使用标签发布到测试环境

**关键参数**：
- `repoTag`：发布标签（如 `pc-t2025.53.19`）
- `tapdId`：TAPD 需求 ID（自动从分支名解析）
- `featureNo`：**功能编号（必填）**，需用户提供
- `buildEnv`：固定为 `test`

**示例**：
```bash
python scripts/jenkins_deploy.py \
  PcFeatureTest \
  --trigger-only \
  --params '{"repoTag":"pc-f2026.05.48","tapdId":"1167459320001118371","featureNo":"1122044681001112866"}'
```

### 2. staticPcOwn (开发环境发布)

**用途**：使用分支发布到开发环境

**关键参数**：
- `repoBranch`：发布分支（如 `hotfix/xxx-1167459320001118371`）
- `dockerTag`：Docker 镜像标签（默认 `latest`）
- `buildEnv`：固定为 `dev`

**示例**：
```bash
python scripts/jenkins_deploy.py staticPcOwn
```

### 3. static-mf-deepseek (微服务发布)

**用途**：微服务项目发布，支持多区域部署

**关键参数**：
- `projectRootDir`：项目子目录（如 `packages/mf-deepseek`）
- `deployZone`：部署区域（复选框：`primary` / `standby`）
- `repoBranch`：发布分支

**示例**：
```bash
python scripts/jenkins_deploy.py static-mf-deepseek
```

## 缓存机制

**缓存位置：** `scripts/cache/jobs.json`

**缓存策略：**
- 首次运行：从 Jenkins API 获取 542 个项目并缓存
- 后续运行：直接使用缓存（速度快）
- 强制刷新：使用 `--refresh` 参数

**手动清除缓存：**
```bash
rm scripts/cache/jobs.json
```

## 支持的 Jenkins 环境

| 环境 | Dev | Test |
|------|-----|------|
| abc-his | ✓ | ✓ |
| abc-bis | ✓ | ✓ |
| abc-cooperation | ✓ | ✓ |
| abc-global | ✓ | ✓ |
| abc-oa | ✓ | ✓ |
| mira | ✓ | ✓ |

## 错误处理

| 场景 | 处理方式 |
|------|---------|
| 未配置认证 | 提示设置 `JENKINS_USER` 和 `JENKINS_TOKEN` |
| 项目不存在 | 列出可用项目 |
| 缺少 featureNo | **如果项目有此参数，必须提示用户提供** |
| 构建失败 | 显示构建 URL 和日志链接 |
| 参数验证失败 | 提示正确格式 |
| 网络超时 | 提示检查网络连接 |

## 触发关键词

Jenkins、发布、部署、构建、Deploy、Build、CI/CD

