zt-devops-cli 0.1.9__tar.gz → 0.2.0__tar.gz
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.
- zt_devops_cli-0.2.0/PKG-INFO +239 -0
- zt_devops_cli-0.2.0/README.md +228 -0
- {zt_devops_cli-0.1.9 → zt_devops_cli-0.2.0}/pyproject.toml +2 -2
- {zt_devops_cli-0.1.9/src/devops_cli → zt_devops_cli-0.2.0/src/zt_devops_cli}/api.py +143 -2
- {zt_devops_cli-0.1.9/src/devops_cli → zt_devops_cli-0.2.0/src/zt_devops_cli}/cli.py +554 -30
- {zt_devops_cli-0.1.9/src/devops_cli → zt_devops_cli-0.2.0/src/zt_devops_cli}/config.py +1 -1
- zt_devops_cli-0.2.0/src/zt_devops_cli.egg-info/PKG-INFO +239 -0
- {zt_devops_cli-0.1.9 → zt_devops_cli-0.2.0}/src/zt_devops_cli.egg-info/SOURCES.txt +5 -5
- zt_devops_cli-0.2.0/src/zt_devops_cli.egg-info/entry_points.txt +2 -0
- zt_devops_cli-0.2.0/src/zt_devops_cli.egg-info/top_level.txt +1 -0
- zt_devops_cli-0.1.9/PKG-INFO +0 -141
- zt_devops_cli-0.1.9/README.md +0 -130
- zt_devops_cli-0.1.9/src/zt_devops_cli.egg-info/PKG-INFO +0 -141
- zt_devops_cli-0.1.9/src/zt_devops_cli.egg-info/entry_points.txt +0 -2
- zt_devops_cli-0.1.9/src/zt_devops_cli.egg-info/top_level.txt +0 -1
- {zt_devops_cli-0.1.9 → zt_devops_cli-0.2.0}/setup.cfg +0 -0
- {zt_devops_cli-0.1.9/src/devops_cli → zt_devops_cli-0.2.0/src/zt_devops_cli}/__init__.py +0 -0
- {zt_devops_cli-0.1.9/src/devops_cli → zt_devops_cli-0.2.0/src/zt_devops_cli}/auth.py +0 -0
- {zt_devops_cli-0.1.9 → zt_devops_cli-0.2.0}/src/zt_devops_cli.egg-info/dependency_links.txt +0 -0
- {zt_devops_cli-0.1.9 → zt_devops_cli-0.2.0}/src/zt_devops_cli.egg-info/requires.txt +0 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: zt-devops-cli
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: DevOps 平台迭代管理 CLI
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
Requires-Dist: playwright>=1.40.0
|
|
8
|
+
Requires-Dist: requests>=2.31.0
|
|
9
|
+
Requires-Dist: click>=8.1.0
|
|
10
|
+
Requires-Dist: pyyaml>=6.0
|
|
11
|
+
|
|
12
|
+
# DevOps CLI
|
|
13
|
+
|
|
14
|
+
蓝鲸 DevOps(ZTN)平台迭代、任务、缺陷等能力的命令行工具。
|
|
15
|
+
|
|
16
|
+
## 打包
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
uv pip install --upgrade build twine
|
|
20
|
+
uv build
|
|
21
|
+
uv publish dist/*
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 安装
|
|
25
|
+
|
|
26
|
+
**源码安装**
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pip install -e .
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**pip / pipx 安装**
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pipx install zt-devops-cli
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 使用
|
|
39
|
+
|
|
40
|
+
### 全局选项
|
|
41
|
+
|
|
42
|
+
根命令 `zt-devops-cli` 支持:
|
|
43
|
+
|
|
44
|
+
| 选项 | 说明 |
|
|
45
|
+
|------|------|
|
|
46
|
+
| `-p` / `--project` | 默认项目 ID;子命令若再传 `-p` 会覆盖 |
|
|
47
|
+
| `-o` / `--output` | `json`(默认)或 `human`;列表类在 `human` 下为表格,部分写操作在 `human` 下仅输出简短成功信息 |
|
|
48
|
+
|
|
49
|
+
示例:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
zt-devops-cli -o human -p b9f157 bug list --num 1 --size 20
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 登录
|
|
56
|
+
|
|
57
|
+
首次或 cookie 失效时会走浏览器登录流程;成功后将 cookie 写入本地缓存。
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
zt-devops-cli login
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
需要弹出窗口手动登录时(无环境变量自动填表时):
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
zt-devops-cli login --headed
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
无头自动登录依赖环境变量 `ZT_SSO_USERNAME`、`ZT_SSO_PASSWORD`(见 `auth` 模块说明)。
|
|
70
|
+
|
|
71
|
+
### 项目管理
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
zt-devops-cli project list
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### ZTeam 项目
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
zt-devops-cli zteam-project list --project f39507
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 迭代管理
|
|
84
|
+
|
|
85
|
+
**迭代列表**
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
zt-devops-cli sprint list --project k64352
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**迭代提测列表**
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
zt-devops-cli sprint test-list --project b9f157 \
|
|
95
|
+
--search "BSC_V26.701.01" \
|
|
96
|
+
--num 1 \
|
|
97
|
+
--size 10
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
可选筛选:`--result`、`--create-user`、`--create-time`、`--principal`、`--obj-id`(均可重复传入)。
|
|
101
|
+
|
|
102
|
+
**创建迭代**
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
zt-devops-cli sprint create --project k64352 \
|
|
106
|
+
--title "迭代名称" \
|
|
107
|
+
--start-date 2026-04-04 \
|
|
108
|
+
--end-date 2026-05-30 \
|
|
109
|
+
--purpose "迭代目标"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
可选:`--test-start`、`--test-end`。
|
|
113
|
+
|
|
114
|
+
**启用 / 删除 / 完成迭代**
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
zt-devops-cli sprint start --project k64352 --sprint-id <id>
|
|
118
|
+
zt-devops-cli sprint delete --project k64352 --sprint-id <id>
|
|
119
|
+
zt-devops-cli sprint done --project k64352 --sprint-id <id>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 任务管理
|
|
123
|
+
|
|
124
|
+
**查询任务列表(TASK)**
|
|
125
|
+
|
|
126
|
+
必填:`-p`、`--start-date`、`--end-date`。可选:`--creator`、`--num`、`--size`、`--remember` / `--no-remember`(默认 `--no-remember`)。
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
zt-devops-cli task list --project f39507 \
|
|
130
|
+
--start-date 2026-04-01 \
|
|
131
|
+
--end-date 2026-04-30 \
|
|
132
|
+
--creator zt07905
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**创建任务(TASK)**
|
|
136
|
+
|
|
137
|
+
必填:`-p`、`-t`、`--owner`、`--estimate-start`、`--estimate-end`、`--zteam-project-id`(项目 ID 来自 `project list`,ZTeam 项目 ID 来自 `zteam-project list`)。
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
zt-devops-cli task create \
|
|
141
|
+
--project "<project-id>" \
|
|
142
|
+
--title "<任务标题>" \
|
|
143
|
+
--owner zt07905 \
|
|
144
|
+
--estimate-start 2026-04-01 \
|
|
145
|
+
--estimate-end 2026-04-30 \
|
|
146
|
+
--zteam-project-id "<zteam-project-id>"
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
可选:`--model-type-id`、`--priority`、`--editor-type`、`--desc`、`--parent-id`、`--demand-classify`、`--origin-hours`、`--remain-hours`;扩展字段使用 `--field fieldId=value`(可多次)。
|
|
150
|
+
|
|
151
|
+
### 缺陷管理
|
|
152
|
+
|
|
153
|
+
**查询缺陷列表(BUG)**
|
|
154
|
+
|
|
155
|
+
与页面表格筛选一致。必填:`-p`。常用可选:`--num`、`--size`、`--remember` / `--no-remember`(默认 `--no-remember`)、`--operator`(逗号分隔多账号)、`--zteam-project`、`--owner-field` / `--owner`、`--state`(状态 ID,可先 `bug states`)、`--creator`、`--create-date` 或 `--create-start` + `--create-end`。
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
zt-devops-cli bug list --project b9f157 \
|
|
159
|
+
--num 1 \
|
|
160
|
+
--size 20
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**查询缺陷状态可选项**
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
zt-devops-cli bug states --project b9f157
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
默认 `--all`;若与页面不一致可尝试 `--no-all`。
|
|
170
|
+
|
|
171
|
+
**创建缺陷(BUG)**
|
|
172
|
+
|
|
173
|
+
对应 `POST .../issue/{project}`。`--owner` 同时写入经办人与缺陷责任人;迭代、ZTeam、严重程度、分类、发现阶段等使用代码内固定 `fieldId`(与团队抓包一致)。若你们项目字段不同,需改源码中的 `instance_values` 映射。
|
|
174
|
+
|
|
175
|
+
| 选项 | 说明 |
|
|
176
|
+
|------|------|
|
|
177
|
+
| `-p` / `--project` | 项目 ID |
|
|
178
|
+
| `--zteam-project-id` | ZTeam 项目 ID |
|
|
179
|
+
| `--sprint-id` | 关联迭代 ID;可不关联时传空字符串 `""` |
|
|
180
|
+
| `-t` / `--title` | 标题 |
|
|
181
|
+
| `--severity` / `--type` / `--discovery-phase` | 与表单选项的 **value** 一致(非中文展示名) |
|
|
182
|
+
| `--owner` | 账号 |
|
|
183
|
+
| `--priority` | 默认 `CENTRAL` |
|
|
184
|
+
| `--desc` / `--desc-editor-type` | 描述 HTML 与编辑器类型,默认带四段模板 |
|
|
185
|
+
| `--parent-id`、`--model-type-id`、`--demand-classify` | 可选或保持默认 |
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
zt-devops-cli bug create -p b9f157 \
|
|
189
|
+
--zteam-project-id 15678224 \
|
|
190
|
+
--sprint-id 3129a9cd7315457eb2963bfe19919e72 \
|
|
191
|
+
-t "缺陷标题示例" \
|
|
192
|
+
--owner zt07905 \
|
|
193
|
+
--severity 9Clfj3I8fR \
|
|
194
|
+
--type bgEHPFOjFt \
|
|
195
|
+
--discovery-phase vENjmMhXMC
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**缺陷工作流(接受 / 已解决 / 已验证 / 关闭 / 重新打开 / 拒绝)**
|
|
199
|
+
|
|
200
|
+
均调用 `POST .../issue_direction/{project}/next`。各动作对应的 `nextNodeId` 写死在 `api.BUG_DIRECTION_NEXT_NODE_IDS`(与某项目浏览器抓包一致);若你们项目工作流节点不同,需改源码中该表。
|
|
201
|
+
|
|
202
|
+
- **位置参数 `ISSUE_ID`**:缺陷 ID(必填)。
|
|
203
|
+
- **`-p` / `--project`**:可省略,顺序为「子命令 `-p` → 根命令 `-p` → `config.yaml` 的 `default_project`」。
|
|
204
|
+
- **`--operator`**:可省略,逗号分隔多个账号;顺序为「CLI → 环境变量 `ZT_DEVOPS_DEFAULT_OPERATOR` 或 `ZT_DEVOPS_OPERATOR` → `config.yaml` 的 `default_operator`」。
|
|
205
|
+
- **`--comment`**:可选。
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
zt-devops-cli -p b9f157 bug accept <issue-id> --comment '<p>说明</p>'
|
|
209
|
+
zt-devops-cli bug resolve -p b9f157 <issue-id> --operator zt07905
|
|
210
|
+
zt-devops-cli bug verify <issue-id> --operator zt07905,user02
|
|
211
|
+
zt-devops-cli bug close -p b9f157 <issue-id>
|
|
212
|
+
zt-devops-cli bug reopen -p b9f157 <issue-id>
|
|
213
|
+
zt-devops-cli bug reject -p b9f157 <issue-id>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
在 `~/.zt-devops-cli/config.yaml` 中可写:
|
|
217
|
+
|
|
218
|
+
```yaml
|
|
219
|
+
default_project: b9f157
|
|
220
|
+
default_operator: zt07905
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**删除缺陷**
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
zt-devops-cli bug delete -p b9f157 -i <issue-id>
|
|
227
|
+
zt-devops-cli bug delete -p b9f157 -i <issue-id> -y
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
`-y` / `--yes` 跳过交互确认。
|
|
231
|
+
|
|
232
|
+
### 需求管理
|
|
233
|
+
|
|
234
|
+
`issue` 命令组已预留,当前版本无子命令。可用 `zt-devops-cli issue --help` 查看。
|
|
235
|
+
|
|
236
|
+
## 配置
|
|
237
|
+
|
|
238
|
+
- Cookie 缓存:`~/.zt-devops-cli/cookies.json`
|
|
239
|
+
- 配置文件:`~/.zt-devops-cli/config.yaml`(常用键:`default_project` 等同根命令 `-p`;`default_operator` 供缺陷流转子命令在未传 `--operator` 时使用)
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# DevOps CLI
|
|
2
|
+
|
|
3
|
+
蓝鲸 DevOps(ZTN)平台迭代、任务、缺陷等能力的命令行工具。
|
|
4
|
+
|
|
5
|
+
## 打包
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
uv pip install --upgrade build twine
|
|
9
|
+
uv build
|
|
10
|
+
uv publish dist/*
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 安装
|
|
14
|
+
|
|
15
|
+
**源码安装**
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pip install -e .
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**pip / pipx 安装**
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
pipx install zt-devops-cli
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 使用
|
|
28
|
+
|
|
29
|
+
### 全局选项
|
|
30
|
+
|
|
31
|
+
根命令 `zt-devops-cli` 支持:
|
|
32
|
+
|
|
33
|
+
| 选项 | 说明 |
|
|
34
|
+
|------|------|
|
|
35
|
+
| `-p` / `--project` | 默认项目 ID;子命令若再传 `-p` 会覆盖 |
|
|
36
|
+
| `-o` / `--output` | `json`(默认)或 `human`;列表类在 `human` 下为表格,部分写操作在 `human` 下仅输出简短成功信息 |
|
|
37
|
+
|
|
38
|
+
示例:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
zt-devops-cli -o human -p b9f157 bug list --num 1 --size 20
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 登录
|
|
45
|
+
|
|
46
|
+
首次或 cookie 失效时会走浏览器登录流程;成功后将 cookie 写入本地缓存。
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
zt-devops-cli login
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
需要弹出窗口手动登录时(无环境变量自动填表时):
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
zt-devops-cli login --headed
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
无头自动登录依赖环境变量 `ZT_SSO_USERNAME`、`ZT_SSO_PASSWORD`(见 `auth` 模块说明)。
|
|
59
|
+
|
|
60
|
+
### 项目管理
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
zt-devops-cli project list
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### ZTeam 项目
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
zt-devops-cli zteam-project list --project f39507
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 迭代管理
|
|
73
|
+
|
|
74
|
+
**迭代列表**
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
zt-devops-cli sprint list --project k64352
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**迭代提测列表**
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
zt-devops-cli sprint test-list --project b9f157 \
|
|
84
|
+
--search "BSC_V26.701.01" \
|
|
85
|
+
--num 1 \
|
|
86
|
+
--size 10
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
可选筛选:`--result`、`--create-user`、`--create-time`、`--principal`、`--obj-id`(均可重复传入)。
|
|
90
|
+
|
|
91
|
+
**创建迭代**
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
zt-devops-cli sprint create --project k64352 \
|
|
95
|
+
--title "迭代名称" \
|
|
96
|
+
--start-date 2026-04-04 \
|
|
97
|
+
--end-date 2026-05-30 \
|
|
98
|
+
--purpose "迭代目标"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
可选:`--test-start`、`--test-end`。
|
|
102
|
+
|
|
103
|
+
**启用 / 删除 / 完成迭代**
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
zt-devops-cli sprint start --project k64352 --sprint-id <id>
|
|
107
|
+
zt-devops-cli sprint delete --project k64352 --sprint-id <id>
|
|
108
|
+
zt-devops-cli sprint done --project k64352 --sprint-id <id>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 任务管理
|
|
112
|
+
|
|
113
|
+
**查询任务列表(TASK)**
|
|
114
|
+
|
|
115
|
+
必填:`-p`、`--start-date`、`--end-date`。可选:`--creator`、`--num`、`--size`、`--remember` / `--no-remember`(默认 `--no-remember`)。
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
zt-devops-cli task list --project f39507 \
|
|
119
|
+
--start-date 2026-04-01 \
|
|
120
|
+
--end-date 2026-04-30 \
|
|
121
|
+
--creator zt07905
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**创建任务(TASK)**
|
|
125
|
+
|
|
126
|
+
必填:`-p`、`-t`、`--owner`、`--estimate-start`、`--estimate-end`、`--zteam-project-id`(项目 ID 来自 `project list`,ZTeam 项目 ID 来自 `zteam-project list`)。
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
zt-devops-cli task create \
|
|
130
|
+
--project "<project-id>" \
|
|
131
|
+
--title "<任务标题>" \
|
|
132
|
+
--owner zt07905 \
|
|
133
|
+
--estimate-start 2026-04-01 \
|
|
134
|
+
--estimate-end 2026-04-30 \
|
|
135
|
+
--zteam-project-id "<zteam-project-id>"
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
可选:`--model-type-id`、`--priority`、`--editor-type`、`--desc`、`--parent-id`、`--demand-classify`、`--origin-hours`、`--remain-hours`;扩展字段使用 `--field fieldId=value`(可多次)。
|
|
139
|
+
|
|
140
|
+
### 缺陷管理
|
|
141
|
+
|
|
142
|
+
**查询缺陷列表(BUG)**
|
|
143
|
+
|
|
144
|
+
与页面表格筛选一致。必填:`-p`。常用可选:`--num`、`--size`、`--remember` / `--no-remember`(默认 `--no-remember`)、`--operator`(逗号分隔多账号)、`--zteam-project`、`--owner-field` / `--owner`、`--state`(状态 ID,可先 `bug states`)、`--creator`、`--create-date` 或 `--create-start` + `--create-end`。
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
zt-devops-cli bug list --project b9f157 \
|
|
148
|
+
--num 1 \
|
|
149
|
+
--size 20
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**查询缺陷状态可选项**
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
zt-devops-cli bug states --project b9f157
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
默认 `--all`;若与页面不一致可尝试 `--no-all`。
|
|
159
|
+
|
|
160
|
+
**创建缺陷(BUG)**
|
|
161
|
+
|
|
162
|
+
对应 `POST .../issue/{project}`。`--owner` 同时写入经办人与缺陷责任人;迭代、ZTeam、严重程度、分类、发现阶段等使用代码内固定 `fieldId`(与团队抓包一致)。若你们项目字段不同,需改源码中的 `instance_values` 映射。
|
|
163
|
+
|
|
164
|
+
| 选项 | 说明 |
|
|
165
|
+
|------|------|
|
|
166
|
+
| `-p` / `--project` | 项目 ID |
|
|
167
|
+
| `--zteam-project-id` | ZTeam 项目 ID |
|
|
168
|
+
| `--sprint-id` | 关联迭代 ID;可不关联时传空字符串 `""` |
|
|
169
|
+
| `-t` / `--title` | 标题 |
|
|
170
|
+
| `--severity` / `--type` / `--discovery-phase` | 与表单选项的 **value** 一致(非中文展示名) |
|
|
171
|
+
| `--owner` | 账号 |
|
|
172
|
+
| `--priority` | 默认 `CENTRAL` |
|
|
173
|
+
| `--desc` / `--desc-editor-type` | 描述 HTML 与编辑器类型,默认带四段模板 |
|
|
174
|
+
| `--parent-id`、`--model-type-id`、`--demand-classify` | 可选或保持默认 |
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
zt-devops-cli bug create -p b9f157 \
|
|
178
|
+
--zteam-project-id 15678224 \
|
|
179
|
+
--sprint-id 3129a9cd7315457eb2963bfe19919e72 \
|
|
180
|
+
-t "缺陷标题示例" \
|
|
181
|
+
--owner zt07905 \
|
|
182
|
+
--severity 9Clfj3I8fR \
|
|
183
|
+
--type bgEHPFOjFt \
|
|
184
|
+
--discovery-phase vENjmMhXMC
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**缺陷工作流(接受 / 已解决 / 已验证 / 关闭 / 重新打开 / 拒绝)**
|
|
188
|
+
|
|
189
|
+
均调用 `POST .../issue_direction/{project}/next`。各动作对应的 `nextNodeId` 写死在 `api.BUG_DIRECTION_NEXT_NODE_IDS`(与某项目浏览器抓包一致);若你们项目工作流节点不同,需改源码中该表。
|
|
190
|
+
|
|
191
|
+
- **位置参数 `ISSUE_ID`**:缺陷 ID(必填)。
|
|
192
|
+
- **`-p` / `--project`**:可省略,顺序为「子命令 `-p` → 根命令 `-p` → `config.yaml` 的 `default_project`」。
|
|
193
|
+
- **`--operator`**:可省略,逗号分隔多个账号;顺序为「CLI → 环境变量 `ZT_DEVOPS_DEFAULT_OPERATOR` 或 `ZT_DEVOPS_OPERATOR` → `config.yaml` 的 `default_operator`」。
|
|
194
|
+
- **`--comment`**:可选。
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
zt-devops-cli -p b9f157 bug accept <issue-id> --comment '<p>说明</p>'
|
|
198
|
+
zt-devops-cli bug resolve -p b9f157 <issue-id> --operator zt07905
|
|
199
|
+
zt-devops-cli bug verify <issue-id> --operator zt07905,user02
|
|
200
|
+
zt-devops-cli bug close -p b9f157 <issue-id>
|
|
201
|
+
zt-devops-cli bug reopen -p b9f157 <issue-id>
|
|
202
|
+
zt-devops-cli bug reject -p b9f157 <issue-id>
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
在 `~/.zt-devops-cli/config.yaml` 中可写:
|
|
206
|
+
|
|
207
|
+
```yaml
|
|
208
|
+
default_project: b9f157
|
|
209
|
+
default_operator: zt07905
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**删除缺陷**
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
zt-devops-cli bug delete -p b9f157 -i <issue-id>
|
|
216
|
+
zt-devops-cli bug delete -p b9f157 -i <issue-id> -y
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
`-y` / `--yes` 跳过交互确认。
|
|
220
|
+
|
|
221
|
+
### 需求管理
|
|
222
|
+
|
|
223
|
+
`issue` 命令组已预留,当前版本无子命令。可用 `zt-devops-cli issue --help` 查看。
|
|
224
|
+
|
|
225
|
+
## 配置
|
|
226
|
+
|
|
227
|
+
- Cookie 缓存:`~/.zt-devops-cli/cookies.json`
|
|
228
|
+
- 配置文件:`~/.zt-devops-cli/config.yaml`(常用键:`default_project` 等同根命令 `-p`;`default_operator` 供缺陷流转子命令在未传 `--operator` 时使用)
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "zt-devops-cli"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.2.0"
|
|
8
8
|
description = "DevOps 平台迭代管理 CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -16,7 +16,7 @@ dependencies = [
|
|
|
16
16
|
]
|
|
17
17
|
|
|
18
18
|
[project.scripts]
|
|
19
|
-
zt-devops-cli = "
|
|
19
|
+
zt-devops-cli = "zt_devops_cli.cli:main"
|
|
20
20
|
|
|
21
21
|
[tool.pytest.ini_options]
|
|
22
22
|
testpaths = ["tests"]
|
|
@@ -1,11 +1,32 @@
|
|
|
1
1
|
"""API 请求封装"""
|
|
2
2
|
import json as json_mod
|
|
3
|
+
from urllib.parse import quote
|
|
4
|
+
|
|
3
5
|
import requests
|
|
4
6
|
from typing import Optional
|
|
5
7
|
|
|
6
8
|
from .auth import get_auth_cookies, get_auth_headers
|
|
7
9
|
from .config import config
|
|
8
10
|
|
|
11
|
+
# BUG「缺陷类型」自定义字段 ID(与缺陷列表页 issue_field_value/.../option 抓包一致;若项目模板不同请改用 CLI --field-id)
|
|
12
|
+
BUG_DEFECT_TYPE_FIELD_ID = "f672b38532614f428828d9a68a514e24"
|
|
13
|
+
|
|
14
|
+
# BUG「发现阶段」自定义字段 ID(与缺陷表 issue_field_value/.../option 抓包及 create_bug 一致;若项目模板不同请改用 CLI --field-id)
|
|
15
|
+
BUG_DISCOVERY_PHASE_FIELD_ID = "bcee87c140d3475496a2a31c236631f4"
|
|
16
|
+
|
|
17
|
+
# BUG「解决方法」自定义字段 ID(与缺陷表 twBug issue_field_value/.../option 抓包及 create_bug 一致;若项目模板不同请改用 CLI --field-id)
|
|
18
|
+
BUG_SOLUTION_METHOD_FIELD_ID = "8756c5b483434c2bb54bd6bc6586b09b"
|
|
19
|
+
|
|
20
|
+
# BUG 工作流「下一节点」ID(与 DevOps 页面抓包一致;若项目工作流不同请改此表)
|
|
21
|
+
BUG_DIRECTION_NEXT_NODE_IDS = {
|
|
22
|
+
"accept": "ba66e60c5fd843a8b8fd00ed005eef66", # 接受
|
|
23
|
+
"resolved": "c66f5b9f84254b4298ff93c859033275", # 已解决
|
|
24
|
+
"verified": "790befe6321d4f0da588f91f456907ef", # 已验证
|
|
25
|
+
"close": "d9135ab19a6345a1b04d6358485fd23b", # 关闭
|
|
26
|
+
"reopen": "17767cf5fb9f4c75a5d2fa7a45343c93", # 重新打开
|
|
27
|
+
"reject": "08c79f18f6d44a22aae48a3ab14e4d19", # 拒绝
|
|
28
|
+
}
|
|
29
|
+
|
|
9
30
|
|
|
10
31
|
class DevOpsAPI:
|
|
11
32
|
"""DevOps API 客户端"""
|
|
@@ -47,6 +68,9 @@ class DevOpsAPI:
|
|
|
47
68
|
if response.status_code >= 400:
|
|
48
69
|
raise Exception(f"API 错误: {response.status_code} {response.text}")
|
|
49
70
|
|
|
71
|
+
text = (response.text or "").strip()
|
|
72
|
+
if not text:
|
|
73
|
+
return {}
|
|
50
74
|
return response.json()
|
|
51
75
|
|
|
52
76
|
# ========== 迭代操作 ==========
|
|
@@ -136,6 +160,68 @@ class DevOpsAPI:
|
|
|
136
160
|
f"/ms/vteam/api/user/issue_field_value/{self.project_id}/option/5abdcb4c783e11edbef4fa819a160800?all=false&classify=TASK",
|
|
137
161
|
)
|
|
138
162
|
|
|
163
|
+
def list_bug_state_options(self, all_options: bool = True) -> dict:
|
|
164
|
+
"""查询缺陷(BUG)状态字段可选项"""
|
|
165
|
+
all_param = "true" if all_options else "false"
|
|
166
|
+
return self._request(
|
|
167
|
+
"GET",
|
|
168
|
+
f"/ms/vteam/api/user/issue_field_value/{self.project_id}/option/state?all={all_param}&classify=BUG",
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
def list_issue_field_value_options(
|
|
172
|
+
self,
|
|
173
|
+
field_id: str,
|
|
174
|
+
classify: str,
|
|
175
|
+
all_options: bool = False,
|
|
176
|
+
) -> dict:
|
|
177
|
+
"""查询某工作项类型下指定自定义字段的下拉可选项(含优先级、严重程度等)。"""
|
|
178
|
+
all_param = "true" if all_options else "false"
|
|
179
|
+
cls = quote(str(classify).strip(), safe="")
|
|
180
|
+
fid = quote(str(field_id).strip(), safe="")
|
|
181
|
+
return self._request(
|
|
182
|
+
"GET",
|
|
183
|
+
f"/ms/vteam/api/user/issue_field_value/{self.project_id}/option/{fid}?all={all_param}&classify={cls}",
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
def list_bug_defect_type_options(
|
|
187
|
+
self,
|
|
188
|
+
all_options: bool = False,
|
|
189
|
+
field_id: Optional[str] = None,
|
|
190
|
+
) -> dict:
|
|
191
|
+
"""查询 BUG「缺陷类型」字段下拉可选项(GET issue_field_value/.../option/<fieldId>?classify=BUG)。"""
|
|
192
|
+
fid = (field_id or BUG_DEFECT_TYPE_FIELD_ID).strip()
|
|
193
|
+
return self.list_issue_field_value_options(
|
|
194
|
+
field_id=fid,
|
|
195
|
+
classify="BUG",
|
|
196
|
+
all_options=all_options,
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
def list_bug_discovery_phase_options(
|
|
200
|
+
self,
|
|
201
|
+
all_options: bool = False,
|
|
202
|
+
field_id: Optional[str] = None,
|
|
203
|
+
) -> dict:
|
|
204
|
+
"""查询 BUG「发现阶段」字段下拉可选项(GET issue_field_value/.../option/<fieldId>?classify=BUG)。"""
|
|
205
|
+
fid = (field_id or BUG_DISCOVERY_PHASE_FIELD_ID).strip()
|
|
206
|
+
return self.list_issue_field_value_options(
|
|
207
|
+
field_id=fid,
|
|
208
|
+
classify="BUG",
|
|
209
|
+
all_options=all_options,
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
def list_bug_solution_method_options(
|
|
213
|
+
self,
|
|
214
|
+
all_options: bool = False,
|
|
215
|
+
field_id: Optional[str] = None,
|
|
216
|
+
) -> dict:
|
|
217
|
+
"""查询 BUG「解决方法」字段下拉可选项(GET issue_field_value/.../option/<fieldId>?classify=BUG)。"""
|
|
218
|
+
fid = (field_id or BUG_SOLUTION_METHOD_FIELD_ID).strip()
|
|
219
|
+
return self.list_issue_field_value_options(
|
|
220
|
+
field_id=fid,
|
|
221
|
+
classify="BUG",
|
|
222
|
+
all_options=all_options,
|
|
223
|
+
)
|
|
224
|
+
|
|
139
225
|
# ========== 任务操作 ==========
|
|
140
226
|
|
|
141
227
|
def create_task(
|
|
@@ -222,12 +308,67 @@ class DevOpsAPI:
|
|
|
222
308
|
num: int = 1,
|
|
223
309
|
size: int = 20,
|
|
224
310
|
remember: bool = False,
|
|
311
|
+
operator_user: Optional[list] = None,
|
|
312
|
+
z_team_project_name: Optional[list] = None,
|
|
313
|
+
defect_owner_field: str = "F0dvVdNHpJ",
|
|
314
|
+
defect_owner: Optional[list] = None,
|
|
315
|
+
state: Optional[list] = None,
|
|
316
|
+
create_user: Optional[list] = None,
|
|
317
|
+
create_time: Optional[list] = None,
|
|
225
318
|
) -> dict:
|
|
226
|
-
"""查询 BUG
|
|
319
|
+
"""查询 BUG 列表(缺陷)。
|
|
320
|
+
|
|
321
|
+
请求体字段与 DevOps 表格筛选一致:operator_user(经办人)、z_team_project_name(ZTeam 项目)、
|
|
322
|
+
defect_owner_field + defect_owner(责任人自定义字段)、state、createUser、createTime(起止各一项日期字符串)。
|
|
323
|
+
"""
|
|
227
324
|
remember_value = str(remember).lower()
|
|
228
|
-
data
|
|
325
|
+
data: list = []
|
|
326
|
+
|
|
327
|
+
if operator_user:
|
|
328
|
+
data.append({"name": "operator_user", "value": list(operator_user)})
|
|
329
|
+
if z_team_project_name:
|
|
330
|
+
data.append({"name": "z_team_project_name", "value": list(z_team_project_name)})
|
|
331
|
+
if defect_owner:
|
|
332
|
+
field_key = defect_owner_field or "F0dvVdNHpJ"
|
|
333
|
+
data.append({"name": field_key, "value": list(defect_owner)})
|
|
334
|
+
if state:
|
|
335
|
+
data.append({"name": "state", "value": list(state)})
|
|
336
|
+
if create_user:
|
|
337
|
+
data.append({"name": "createUser", "value": list(create_user)})
|
|
338
|
+
if create_time:
|
|
339
|
+
data.append({"name": "createTime", "value": list(create_time)})
|
|
340
|
+
|
|
341
|
+
data.append({"name": "exclude", "value": []})
|
|
342
|
+
|
|
229
343
|
return self._request(
|
|
230
344
|
"POST",
|
|
231
345
|
f"/ms/vteam/api/user/issue/{self.project_id}/table/BUG?num={num}&size={size}&remember={remember_value}",
|
|
232
346
|
data=data,
|
|
233
347
|
)
|
|
348
|
+
|
|
349
|
+
def bug_direction_next(
|
|
350
|
+
self,
|
|
351
|
+
issue_id: str,
|
|
352
|
+
next_node_id: str,
|
|
353
|
+
operators: list,
|
|
354
|
+
comment: str = "",
|
|
355
|
+
at_users: Optional[list] = None,
|
|
356
|
+
direction_fields: Optional[list] = None,
|
|
357
|
+
) -> dict:
|
|
358
|
+
"""缺陷工作流流转到下一节点(POST issue_direction/.../next)。"""
|
|
359
|
+
data = {
|
|
360
|
+
"issueId": issue_id,
|
|
361
|
+
"nextNodeId": next_node_id,
|
|
362
|
+
"comment": {"atUser": list(at_users or []), "comment": comment},
|
|
363
|
+
"directionFields": list(direction_fields or []),
|
|
364
|
+
"operators": list(operators or []),
|
|
365
|
+
}
|
|
366
|
+
return self._request(
|
|
367
|
+
"POST",
|
|
368
|
+
f"/ms/vteam/api/user/issue_direction/{self.project_id}/next",
|
|
369
|
+
data=data,
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
def delete_issue(self, issue_id: str) -> dict:
|
|
373
|
+
"""删除工作项(缺陷等共用 issue 删除接口)。"""
|
|
374
|
+
return self._request("DELETE", f"/ms/vteam/api/user/issue/{self.project_id}/{issue_id}")
|