savetest-cli 0.1.0__tar.gz → 0.1.2__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.
- savetest_cli-0.1.2/MANIFEST.in +2 -0
- savetest_cli-0.1.2/PKG-INFO +188 -0
- savetest_cli-0.1.2/README.md +178 -0
- {savetest_cli-0.1.0 → savetest_cli-0.1.2}/pyproject.toml +8 -2
- savetest_cli-0.1.2/savetest_cli/__init__.py +1 -0
- {savetest_cli-0.1.0 → savetest_cli-0.1.2}/savetest_cli/cli.py +38 -63
- savetest_cli-0.1.2/savetest_cli/pwa-512x512.png +0 -0
- savetest_cli-0.1.2/savetest_cli.egg-info/PKG-INFO +188 -0
- {savetest_cli-0.1.0 → savetest_cli-0.1.2}/savetest_cli.egg-info/SOURCES.txt +2 -0
- savetest_cli-0.1.0/PKG-INFO +0 -128
- savetest_cli-0.1.0/README.md +0 -118
- savetest_cli-0.1.0/savetest_cli/__init__.py +0 -1
- savetest_cli-0.1.0/savetest_cli.egg-info/PKG-INFO +0 -128
- {savetest_cli-0.1.0 → savetest_cli-0.1.2}/savetest_cli.egg-info/dependency_links.txt +0 -0
- {savetest_cli-0.1.0 → savetest_cli-0.1.2}/savetest_cli.egg-info/entry_points.txt +0 -0
- {savetest_cli-0.1.0 → savetest_cli-0.1.2}/savetest_cli.egg-info/requires.txt +0 -0
- {savetest_cli-0.1.0 → savetest_cli-0.1.2}/savetest_cli.egg-info/top_level.txt +0 -0
- {savetest_cli-0.1.0 → savetest_cli-0.1.2}/setup.cfg +0 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: savetest-cli
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: CLI for SaveTest: zip Allure results and upload them to SaveTest
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
Requires-Python: >=3.8
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: click>=8.0
|
|
9
|
+
Requires-Dist: requests>=2.28
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<img src="savetest_cli/pwa-512x512.png" alt="SaveTest" width="128">
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
# savetest-cli
|
|
16
|
+
|
|
17
|
+
CLI-утилита для упаковки Allure-результатов в ZIP и загрузки их в SaveTest.
|
|
18
|
+
|
|
19
|
+
## Установка
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pip install savetest-cli
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Быстрый старт
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# 1. Упаковать директорию с результатами в ZIP
|
|
31
|
+
savetest zip_report ./AllureReport
|
|
32
|
+
|
|
33
|
+
# 2. Загрузить в SaveTest и дождаться создания тест-рана
|
|
34
|
+
export SAVETEST_HOST=https://savetest.example.com
|
|
35
|
+
export SAVETEST_TOKEN=sat_xxxxxxxxxxxxxxxx
|
|
36
|
+
export SAVETEST_PROJECT_ID=42
|
|
37
|
+
export SAVETEST_BRANCH=main
|
|
38
|
+
|
|
39
|
+
savetest upload --test-run-name "Smoke $(date +%Y-%m-%d)"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Переменные окружения
|
|
45
|
+
|
|
46
|
+
Все параметры можно задать через переменные окружения — не нужно указывать флаги при каждом вызове.
|
|
47
|
+
|
|
48
|
+
| Переменная | Обязательна | Описание |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| `SAVETEST_HOST` | да | URL вашего SaveTest, например `https://savetest.example.com` |
|
|
51
|
+
| `SAVETEST_TOKEN` | да | API-токен (создаётся в настройках профиля SaveTest) |
|
|
52
|
+
| `SAVETEST_PROJECT_ID` | да | ID проекта в SaveTest |
|
|
53
|
+
| `SAVETEST_BRANCH` | нет | Ветка Git, привязываемая к тест-рану |
|
|
54
|
+
| `SAVETEST_TEST_RUN_ID` | нет | ID существующего тест-рана (если не задан — создаётся новый) |
|
|
55
|
+
| `SAVETEST_TEST_RUN_NAME` | нет | Имя нового тест-рана |
|
|
56
|
+
| `SAVETEST_INCLUDE_ATTACHMENTS` | нет | `true` — включать вложения в ZIP, `false` — исключать (быстрее) |
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Команды
|
|
61
|
+
|
|
62
|
+
### `savetest zip_report <path>`
|
|
63
|
+
|
|
64
|
+
Упаковывает директорию с Allure-результатами в ZIP-архив.
|
|
65
|
+
|
|
66
|
+
По умолчанию вложения (картинки, видео, `*-attachment.json`) **не включаются** — архив получается меньше и грузится быстрее. Флаг `--include-attachments` включает их.
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
savetest zip_report [OPTIONS] PATH
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
| Опция | По умолчанию | Описание |
|
|
73
|
+
|---|---|---|
|
|
74
|
+
| `PATH` | — | Путь к директории с Allure-результатами |
|
|
75
|
+
| `--output`, `-o` | `allure-results.zip` | Путь к выходному ZIP-файлу |
|
|
76
|
+
| `--include-attachments` | выключено | Включить вложения (картинки, видео, `*-attachment.json`) |
|
|
77
|
+
|
|
78
|
+
**Примеры:**
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
savetest zip_report ./AllureReport
|
|
82
|
+
|
|
83
|
+
savetest zip_report ./AllureReport --output report.zip
|
|
84
|
+
|
|
85
|
+
savetest zip_report ./AllureReport --include-attachments
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
### `savetest upload`
|
|
91
|
+
|
|
92
|
+
Загружает ZIP-файл в SaveTest по частям и ждёт завершения импорта. По завершении выводит ссылку на созданный тест-ран.
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
savetest upload [OPTIONS]
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
| Опция | Env-переменная | По умолчанию | Описание |
|
|
99
|
+
|---|---|---|---|
|
|
100
|
+
| `--host` | `SAVETEST_HOST` | — | URL SaveTest (**обязательно**) |
|
|
101
|
+
| `--token`, `-t` | `SAVETEST_TOKEN` | — | API-токен (**обязательно**) |
|
|
102
|
+
| `--project-id`, `-p` | `SAVETEST_PROJECT_ID` | — | ID проекта (**обязательно**) |
|
|
103
|
+
| `--zip-file`, `-z` | — | `allure-results.zip` | Путь к ZIP-файлу |
|
|
104
|
+
| `--branch`, `-b` | `SAVETEST_BRANCH` | — | Ветка Git |
|
|
105
|
+
| `--test-run-name` | `SAVETEST_TEST_RUN_NAME` | — | Имя нового тест-рана |
|
|
106
|
+
| `--test-run-id` | `SAVETEST_TEST_RUN_ID` | — | ID существующего тест-рана |
|
|
107
|
+
| `--include-attachments` | `SAVETEST_INCLUDE_ATTACHMENTS` | выключено | Сообщить серверу, что ZIP содержит вложения |
|
|
108
|
+
| `--chunk-size` | — | `50` | Размер чанка при загрузке (МБ) |
|
|
109
|
+
| `--wait` / `--no-wait` | — | `--wait` | Ждать завершения импорта |
|
|
110
|
+
| `--timeout` | — | `3600` | Таймаут ожидания (сек) |
|
|
111
|
+
| `--poll-interval` | — | `1.5` | Интервал опроса статуса (сек) |
|
|
112
|
+
|
|
113
|
+
`--host`, `--token` и `--project-id` обязательны. Передавайте их через флаги или переменные окружения.
|
|
114
|
+
|
|
115
|
+
**Примеры:**
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
# Через переменные окружения (рекомендуется)
|
|
119
|
+
export SAVETEST_HOST=https://savetest.example.com
|
|
120
|
+
export SAVETEST_TOKEN=sat_xxxxxxxxxxxxxxxx
|
|
121
|
+
export SAVETEST_PROJECT_ID=42
|
|
122
|
+
|
|
123
|
+
savetest upload --branch main --test-run-name "Regression $(date +%Y-%m-%d)"
|
|
124
|
+
|
|
125
|
+
# Загрузить в существующий тест-ран
|
|
126
|
+
savetest upload --branch main --test-run-id 17
|
|
127
|
+
|
|
128
|
+
# Загрузить другой ZIP с вложениями, не ждать импорта
|
|
129
|
+
savetest upload --zip-file full-report.zip --include-attachments --no-wait
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Настройка в Jenkins
|
|
135
|
+
|
|
136
|
+
Добавьте токен в **Jenkins → Manage Jenkins → Credentials** (тип: Secret text, ID: `savetest-token`).
|
|
137
|
+
|
|
138
|
+
В `Jenkinsfile` используйте `withCredentials` и `parameters`, чтобы не хранить конфигурацию в коде:
|
|
139
|
+
|
|
140
|
+
```groovy
|
|
141
|
+
pipeline {
|
|
142
|
+
agent any
|
|
143
|
+
|
|
144
|
+
parameters {
|
|
145
|
+
string(name: 'SAVETEST_HOST', defaultValue: '', description: 'URL SaveTest')
|
|
146
|
+
string(name: 'SAVETEST_PROJECT_ID', defaultValue: '', description: 'ID проекта в SaveTest')
|
|
147
|
+
string(name: 'SAVETEST_BRANCH', defaultValue: '', description: 'Ветка Git')
|
|
148
|
+
string(name: 'SAVETEST_TEST_RUN_ID',defaultValue: '', description: 'ID тест-рана (пусто = создать новый)')
|
|
149
|
+
booleanParam(name: 'INCLUDE_ATTACHMENTS', defaultValue: false, description: 'Включать вложения в ZIP')
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
stages {
|
|
153
|
+
// ... ваши стадии запуска тестов ...
|
|
154
|
+
|
|
155
|
+
stage('Upload to SaveTest') {
|
|
156
|
+
steps {
|
|
157
|
+
withCredentials([string(credentialsId: 'savetest-token', variable: 'SAVETEST_TOKEN')]) {
|
|
158
|
+
sh '''
|
|
159
|
+
pip install savetest-cli
|
|
160
|
+
|
|
161
|
+
savetest zip_report "${WORKSPACE}/AllureReport" \
|
|
162
|
+
$([ "${INCLUDE_ATTACHMENTS}" = "true" ] && echo "--include-attachments")
|
|
163
|
+
|
|
164
|
+
savetest upload \
|
|
165
|
+
--host "${SAVETEST_HOST}" \
|
|
166
|
+
--project-id "${SAVETEST_PROJECT_ID}" \
|
|
167
|
+
--branch "${SAVETEST_BRANCH}" \
|
|
168
|
+
--test-run-name "Jenkins ${JOB_NAME} #${BUILD_NUMBER}" \
|
|
169
|
+
$( [ -n "${SAVETEST_TEST_RUN_ID}" ] && echo "--test-run-id ${SAVETEST_TEST_RUN_ID}" ) \
|
|
170
|
+
$( [ "${INCLUDE_ATTACHMENTS}" = "true" ] && echo "--include-attachments" )
|
|
171
|
+
'''
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
> `SAVETEST_TOKEN` берётся из Jenkins Credentials и передаётся в окружение через `withCredentials` — в лог и в код сборки он не попадает.
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Получение API-токена
|
|
184
|
+
|
|
185
|
+
1. Войдите в SaveTest.
|
|
186
|
+
2. Откройте **Настройки профиля → API-токены**.
|
|
187
|
+
3. Создайте новый токен и скопируйте его значение.
|
|
188
|
+
4. Добавьте токен в Jenkins Credentials (или экспортируйте локально через `export SAVETEST_TOKEN=...`).
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="savetest_cli/pwa-512x512.png" alt="SaveTest" width="128">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# savetest-cli
|
|
6
|
+
|
|
7
|
+
CLI-утилита для упаковки Allure-результатов в ZIP и загрузки их в SaveTest.
|
|
8
|
+
|
|
9
|
+
## Установка
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pip install savetest-cli
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Быстрый старт
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# 1. Упаковать директорию с результатами в ZIP
|
|
21
|
+
savetest zip_report ./AllureReport
|
|
22
|
+
|
|
23
|
+
# 2. Загрузить в SaveTest и дождаться создания тест-рана
|
|
24
|
+
export SAVETEST_HOST=https://savetest.example.com
|
|
25
|
+
export SAVETEST_TOKEN=sat_xxxxxxxxxxxxxxxx
|
|
26
|
+
export SAVETEST_PROJECT_ID=42
|
|
27
|
+
export SAVETEST_BRANCH=main
|
|
28
|
+
|
|
29
|
+
savetest upload --test-run-name "Smoke $(date +%Y-%m-%d)"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Переменные окружения
|
|
35
|
+
|
|
36
|
+
Все параметры можно задать через переменные окружения — не нужно указывать флаги при каждом вызове.
|
|
37
|
+
|
|
38
|
+
| Переменная | Обязательна | Описание |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| `SAVETEST_HOST` | да | URL вашего SaveTest, например `https://savetest.example.com` |
|
|
41
|
+
| `SAVETEST_TOKEN` | да | API-токен (создаётся в настройках профиля SaveTest) |
|
|
42
|
+
| `SAVETEST_PROJECT_ID` | да | ID проекта в SaveTest |
|
|
43
|
+
| `SAVETEST_BRANCH` | нет | Ветка Git, привязываемая к тест-рану |
|
|
44
|
+
| `SAVETEST_TEST_RUN_ID` | нет | ID существующего тест-рана (если не задан — создаётся новый) |
|
|
45
|
+
| `SAVETEST_TEST_RUN_NAME` | нет | Имя нового тест-рана |
|
|
46
|
+
| `SAVETEST_INCLUDE_ATTACHMENTS` | нет | `true` — включать вложения в ZIP, `false` — исключать (быстрее) |
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Команды
|
|
51
|
+
|
|
52
|
+
### `savetest zip_report <path>`
|
|
53
|
+
|
|
54
|
+
Упаковывает директорию с Allure-результатами в ZIP-архив.
|
|
55
|
+
|
|
56
|
+
По умолчанию вложения (картинки, видео, `*-attachment.json`) **не включаются** — архив получается меньше и грузится быстрее. Флаг `--include-attachments` включает их.
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
savetest zip_report [OPTIONS] PATH
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
| Опция | По умолчанию | Описание |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| `PATH` | — | Путь к директории с Allure-результатами |
|
|
65
|
+
| `--output`, `-o` | `allure-results.zip` | Путь к выходному ZIP-файлу |
|
|
66
|
+
| `--include-attachments` | выключено | Включить вложения (картинки, видео, `*-attachment.json`) |
|
|
67
|
+
|
|
68
|
+
**Примеры:**
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
savetest zip_report ./AllureReport
|
|
72
|
+
|
|
73
|
+
savetest zip_report ./AllureReport --output report.zip
|
|
74
|
+
|
|
75
|
+
savetest zip_report ./AllureReport --include-attachments
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
### `savetest upload`
|
|
81
|
+
|
|
82
|
+
Загружает ZIP-файл в SaveTest по частям и ждёт завершения импорта. По завершении выводит ссылку на созданный тест-ран.
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
savetest upload [OPTIONS]
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
| Опция | Env-переменная | По умолчанию | Описание |
|
|
89
|
+
|---|---|---|---|
|
|
90
|
+
| `--host` | `SAVETEST_HOST` | — | URL SaveTest (**обязательно**) |
|
|
91
|
+
| `--token`, `-t` | `SAVETEST_TOKEN` | — | API-токен (**обязательно**) |
|
|
92
|
+
| `--project-id`, `-p` | `SAVETEST_PROJECT_ID` | — | ID проекта (**обязательно**) |
|
|
93
|
+
| `--zip-file`, `-z` | — | `allure-results.zip` | Путь к ZIP-файлу |
|
|
94
|
+
| `--branch`, `-b` | `SAVETEST_BRANCH` | — | Ветка Git |
|
|
95
|
+
| `--test-run-name` | `SAVETEST_TEST_RUN_NAME` | — | Имя нового тест-рана |
|
|
96
|
+
| `--test-run-id` | `SAVETEST_TEST_RUN_ID` | — | ID существующего тест-рана |
|
|
97
|
+
| `--include-attachments` | `SAVETEST_INCLUDE_ATTACHMENTS` | выключено | Сообщить серверу, что ZIP содержит вложения |
|
|
98
|
+
| `--chunk-size` | — | `50` | Размер чанка при загрузке (МБ) |
|
|
99
|
+
| `--wait` / `--no-wait` | — | `--wait` | Ждать завершения импорта |
|
|
100
|
+
| `--timeout` | — | `3600` | Таймаут ожидания (сек) |
|
|
101
|
+
| `--poll-interval` | — | `1.5` | Интервал опроса статуса (сек) |
|
|
102
|
+
|
|
103
|
+
`--host`, `--token` и `--project-id` обязательны. Передавайте их через флаги или переменные окружения.
|
|
104
|
+
|
|
105
|
+
**Примеры:**
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# Через переменные окружения (рекомендуется)
|
|
109
|
+
export SAVETEST_HOST=https://savetest.example.com
|
|
110
|
+
export SAVETEST_TOKEN=sat_xxxxxxxxxxxxxxxx
|
|
111
|
+
export SAVETEST_PROJECT_ID=42
|
|
112
|
+
|
|
113
|
+
savetest upload --branch main --test-run-name "Regression $(date +%Y-%m-%d)"
|
|
114
|
+
|
|
115
|
+
# Загрузить в существующий тест-ран
|
|
116
|
+
savetest upload --branch main --test-run-id 17
|
|
117
|
+
|
|
118
|
+
# Загрузить другой ZIP с вложениями, не ждать импорта
|
|
119
|
+
savetest upload --zip-file full-report.zip --include-attachments --no-wait
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Настройка в Jenkins
|
|
125
|
+
|
|
126
|
+
Добавьте токен в **Jenkins → Manage Jenkins → Credentials** (тип: Secret text, ID: `savetest-token`).
|
|
127
|
+
|
|
128
|
+
В `Jenkinsfile` используйте `withCredentials` и `parameters`, чтобы не хранить конфигурацию в коде:
|
|
129
|
+
|
|
130
|
+
```groovy
|
|
131
|
+
pipeline {
|
|
132
|
+
agent any
|
|
133
|
+
|
|
134
|
+
parameters {
|
|
135
|
+
string(name: 'SAVETEST_HOST', defaultValue: '', description: 'URL SaveTest')
|
|
136
|
+
string(name: 'SAVETEST_PROJECT_ID', defaultValue: '', description: 'ID проекта в SaveTest')
|
|
137
|
+
string(name: 'SAVETEST_BRANCH', defaultValue: '', description: 'Ветка Git')
|
|
138
|
+
string(name: 'SAVETEST_TEST_RUN_ID',defaultValue: '', description: 'ID тест-рана (пусто = создать новый)')
|
|
139
|
+
booleanParam(name: 'INCLUDE_ATTACHMENTS', defaultValue: false, description: 'Включать вложения в ZIP')
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
stages {
|
|
143
|
+
// ... ваши стадии запуска тестов ...
|
|
144
|
+
|
|
145
|
+
stage('Upload to SaveTest') {
|
|
146
|
+
steps {
|
|
147
|
+
withCredentials([string(credentialsId: 'savetest-token', variable: 'SAVETEST_TOKEN')]) {
|
|
148
|
+
sh '''
|
|
149
|
+
pip install savetest-cli
|
|
150
|
+
|
|
151
|
+
savetest zip_report "${WORKSPACE}/AllureReport" \
|
|
152
|
+
$([ "${INCLUDE_ATTACHMENTS}" = "true" ] && echo "--include-attachments")
|
|
153
|
+
|
|
154
|
+
savetest upload \
|
|
155
|
+
--host "${SAVETEST_HOST}" \
|
|
156
|
+
--project-id "${SAVETEST_PROJECT_ID}" \
|
|
157
|
+
--branch "${SAVETEST_BRANCH}" \
|
|
158
|
+
--test-run-name "Jenkins ${JOB_NAME} #${BUILD_NUMBER}" \
|
|
159
|
+
$( [ -n "${SAVETEST_TEST_RUN_ID}" ] && echo "--test-run-id ${SAVETEST_TEST_RUN_ID}" ) \
|
|
160
|
+
$( [ "${INCLUDE_ATTACHMENTS}" = "true" ] && echo "--include-attachments" )
|
|
161
|
+
'''
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
> `SAVETEST_TOKEN` берётся из Jenkins Credentials и передаётся в окружение через `withCredentials` — в лог и в код сборки он не попадает.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Получение API-токена
|
|
174
|
+
|
|
175
|
+
1. Войдите в SaveTest.
|
|
176
|
+
2. Откройте **Настройки профиля → API-токены**.
|
|
177
|
+
3. Создайте новый токен и скопируйте его значение.
|
|
178
|
+
4. Добавьте токен в Jenkins Credentials (или экспортируйте локально через `export SAVETEST_TOKEN=...`).
|
|
@@ -4,11 +4,11 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "savetest-cli"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.2"
|
|
8
8
|
description = "CLI for SaveTest: zip Allure results and upload them to SaveTest"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.8"
|
|
11
|
-
license =
|
|
11
|
+
license = "MIT"
|
|
12
12
|
dependencies = [
|
|
13
13
|
"click>=8.0",
|
|
14
14
|
"requests>=2.28",
|
|
@@ -17,6 +17,12 @@ dependencies = [
|
|
|
17
17
|
[project.scripts]
|
|
18
18
|
savetest = "savetest_cli.cli:cli"
|
|
19
19
|
|
|
20
|
+
[tool.setuptools]
|
|
21
|
+
include-package-data = true
|
|
22
|
+
|
|
20
23
|
[tool.setuptools.packages.find]
|
|
21
24
|
where = ["."]
|
|
22
25
|
include = ["savetest_cli*"]
|
|
26
|
+
|
|
27
|
+
[tool.setuptools.package-data]
|
|
28
|
+
savetest_cli = ["pwa-512x512.png"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.2"
|
|
@@ -14,7 +14,6 @@ ATTACHMENT_EXTENSIONS = {
|
|
|
14
14
|
}
|
|
15
15
|
ATTACHMENT_SUFFIXES = {"-attachment.json"}
|
|
16
16
|
|
|
17
|
-
DEFAULT_HOST = "https://save-test.ptnl.moscow"
|
|
18
17
|
DEFAULT_CHUNK_SIZE_MB = 50
|
|
19
18
|
DEFAULT_POLL_INTERVAL_SEC = 1.5
|
|
20
19
|
DEFAULT_WAIT_TIMEOUT_SEC = 3600
|
|
@@ -50,8 +49,7 @@ def _poll_import_task(
|
|
|
50
49
|
headers: Dict[str, str],
|
|
51
50
|
poll_interval: float,
|
|
52
51
|
timeout_sec: int,
|
|
53
|
-
) ->
|
|
54
|
-
"""Ожидает завершения фонового импорта (как UI SaveTest)."""
|
|
52
|
+
) -> Dict[str, Any]:
|
|
55
53
|
url = f"{host}/api/v1/projects/{project_id}/allure-results/tasks/{task_id}"
|
|
56
54
|
deadline = time.monotonic() + timeout_sec
|
|
57
55
|
poll_errors = 0
|
|
@@ -95,21 +93,21 @@ def _poll_import_task(
|
|
|
95
93
|
sys.exit(1)
|
|
96
94
|
|
|
97
95
|
|
|
98
|
-
def _print_import_result(host: str, project_id: str, status:
|
|
96
|
+
def _print_import_result(host: str, project_id: str, status: Dict[str, Any]) -> None:
|
|
99
97
|
state = status.get("status", "")
|
|
100
98
|
test_run_id = status.get("test_run_id")
|
|
101
99
|
test_run_name = status.get("test_run_name")
|
|
102
100
|
|
|
103
101
|
click.echo("\n--- Итог импорта ---")
|
|
104
|
-
click.echo(f"Статус:
|
|
102
|
+
click.echo(f"Статус: {state}")
|
|
105
103
|
if test_run_id is not None:
|
|
106
|
-
click.echo(f"Тест-ран ID:
|
|
107
|
-
click.echo(f"Тест-ран:
|
|
108
|
-
click.echo(f"Ссылка:
|
|
109
|
-
click.echo(f"Обработано:
|
|
110
|
-
click.echo(f"Создано:
|
|
111
|
-
click.echo(f"Сопоставлено:
|
|
112
|
-
click.echo(f"Пропущено:
|
|
104
|
+
click.echo(f"Тест-ран ID: {test_run_id}")
|
|
105
|
+
click.echo(f"Тест-ран: {test_run_name or '—'}")
|
|
106
|
+
click.echo(f"Ссылка: {host}/projects/{project_id}/test-runs/{test_run_id}")
|
|
107
|
+
click.echo(f"Обработано: {status.get('results_processed', 0)}")
|
|
108
|
+
click.echo(f"Создано: {status.get('results_created', 0)}")
|
|
109
|
+
click.echo(f"Сопоставлено: {status.get('test_cases_matched', 0)}")
|
|
110
|
+
click.echo(f"Пропущено: {status.get('skipped', 0)}")
|
|
113
111
|
|
|
114
112
|
errors = status.get("errors") or []
|
|
115
113
|
if errors:
|
|
@@ -130,6 +128,15 @@ def _print_import_result(host: str, project_id: str, status: dict[str, Any]) ->
|
|
|
130
128
|
sys.exit(1)
|
|
131
129
|
|
|
132
130
|
|
|
131
|
+
def _check_response(resp: "requests.Response", step: str) -> None:
|
|
132
|
+
if not resp.ok:
|
|
133
|
+
click.echo(
|
|
134
|
+
f"\nОшибка на шаге '{step}': HTTP {resp.status_code}\n{resp.text}",
|
|
135
|
+
err=True,
|
|
136
|
+
)
|
|
137
|
+
sys.exit(1)
|
|
138
|
+
|
|
139
|
+
|
|
133
140
|
# ---------------------------------------------------------------------------
|
|
134
141
|
# CLI root
|
|
135
142
|
# ---------------------------------------------------------------------------
|
|
@@ -159,14 +166,7 @@ def cli() -> None:
|
|
|
159
166
|
help="Включать вложения (картинки, видео, *-attachment.json).",
|
|
160
167
|
)
|
|
161
168
|
def zip_report(path: str, output: str, include_attachments: bool) -> None:
|
|
162
|
-
"""Упаковать директорию PATH с Allure-результатами в ZIP.
|
|
163
|
-
|
|
164
|
-
\b
|
|
165
|
-
Примеры:
|
|
166
|
-
savetest zip_report ./AllureReport
|
|
167
|
-
savetest zip_report ./AllureReport --output report.zip
|
|
168
|
-
savetest zip_report ./AllureReport --include-attachments
|
|
169
|
-
"""
|
|
169
|
+
"""Упаковать директорию PATH с Allure-результатами в ZIP."""
|
|
170
170
|
src = Path(path)
|
|
171
171
|
out = Path(output)
|
|
172
172
|
|
|
@@ -193,7 +193,7 @@ def zip_report(path: str, output: str, include_attachments: bool) -> None:
|
|
|
193
193
|
added += 1
|
|
194
194
|
|
|
195
195
|
size = _sizeof_fmt(out.stat().st_size)
|
|
196
|
-
click.echo(f"Готово:
|
|
196
|
+
click.echo(f"Готово: {added} файлов, пропущено {skipped} вложений. Размер: {size}")
|
|
197
197
|
click.echo(f"Файл: {out.resolve()}")
|
|
198
198
|
|
|
199
199
|
|
|
@@ -211,47 +211,46 @@ def zip_report(path: str, output: str, include_attachments: bool) -> None:
|
|
|
211
211
|
)
|
|
212
212
|
@click.option(
|
|
213
213
|
"--host",
|
|
214
|
-
|
|
215
|
-
show_default=True,
|
|
214
|
+
required=True,
|
|
216
215
|
envvar="SAVETEST_HOST",
|
|
217
|
-
help="
|
|
216
|
+
help="URL SaveTest, напр. https://savetest.example.com (env: SAVETEST_HOST).",
|
|
218
217
|
)
|
|
219
218
|
@click.option(
|
|
220
219
|
"--token", "-t",
|
|
221
220
|
required=True,
|
|
222
221
|
envvar="SAVETEST_TOKEN",
|
|
223
|
-
help="API-токен SaveTest (
|
|
222
|
+
help="API-токен SaveTest (env: SAVETEST_TOKEN).",
|
|
224
223
|
)
|
|
225
224
|
@click.option(
|
|
226
225
|
"--project-id", "-p",
|
|
227
226
|
required=True,
|
|
228
227
|
envvar="SAVETEST_PROJECT_ID",
|
|
229
|
-
help="ID проекта в SaveTest (
|
|
228
|
+
help="ID проекта в SaveTest (env: SAVETEST_PROJECT_ID).",
|
|
230
229
|
)
|
|
231
230
|
@click.option(
|
|
232
231
|
"--test-run-id",
|
|
233
|
-
default=
|
|
232
|
+
default=None,
|
|
234
233
|
envvar="SAVETEST_TEST_RUN_ID",
|
|
235
|
-
help="ID существующего
|
|
234
|
+
help="ID существующего тест-рана. Если не задан — создаётся новый (env: SAVETEST_TEST_RUN_ID).",
|
|
236
235
|
)
|
|
237
236
|
@click.option(
|
|
238
237
|
"--test-run-name",
|
|
239
|
-
default=
|
|
238
|
+
default=None,
|
|
240
239
|
envvar="SAVETEST_TEST_RUN_NAME",
|
|
241
|
-
help="Имя нового тест-рана (
|
|
240
|
+
help="Имя нового тест-рана (env: SAVETEST_TEST_RUN_NAME).",
|
|
242
241
|
)
|
|
243
242
|
@click.option(
|
|
244
243
|
"--branch", "-b",
|
|
245
|
-
default=
|
|
244
|
+
default=None,
|
|
246
245
|
envvar="SAVETEST_BRANCH",
|
|
247
|
-
help="Ветка Git
|
|
246
|
+
help="Ветка Git (env: SAVETEST_BRANCH).",
|
|
248
247
|
)
|
|
249
248
|
@click.option(
|
|
250
249
|
"--include-attachments/--no-include-attachments",
|
|
251
250
|
default=False,
|
|
252
251
|
show_default=True,
|
|
253
252
|
envvar="SAVETEST_INCLUDE_ATTACHMENTS",
|
|
254
|
-
help="Сообщить серверу, что ZIP содержит
|
|
253
|
+
help="Сообщить серверу, что ZIP содержит вложения (env: SAVETEST_INCLUDE_ATTACHMENTS).",
|
|
255
254
|
)
|
|
256
255
|
@click.option(
|
|
257
256
|
"--chunk-size",
|
|
@@ -264,7 +263,7 @@ def zip_report(path: str, output: str, include_attachments: bool) -> None:
|
|
|
264
263
|
"--wait/--no-wait",
|
|
265
264
|
default=True,
|
|
266
265
|
show_default=True,
|
|
267
|
-
help="Дождаться
|
|
266
|
+
help="Дождаться завершения импорта и создания тест-рана на сервере.",
|
|
268
267
|
)
|
|
269
268
|
@click.option(
|
|
270
269
|
"--poll-interval",
|
|
@@ -294,22 +293,7 @@ def upload(
|
|
|
294
293
|
poll_interval: float,
|
|
295
294
|
timeout: int,
|
|
296
295
|
) -> None:
|
|
297
|
-
"""Загрузить ZIP с Allure-результатами в SaveTest и дождаться импорта.
|
|
298
|
-
|
|
299
|
-
\b
|
|
300
|
-
После загрузки чанков CLI опрашивает статус задачи, пока не создастся
|
|
301
|
-
тест-ран и не завершится импорт (по умолчанию --wait).
|
|
302
|
-
|
|
303
|
-
\b
|
|
304
|
-
Токен можно передать через переменную окружения SAVETEST_TOKEN.
|
|
305
|
-
|
|
306
|
-
\b
|
|
307
|
-
Примеры:
|
|
308
|
-
savetest upload --token sat_xxx --project-id 40
|
|
309
|
-
savetest upload --token sat_xxx --project-id 40 --test-run-id 7
|
|
310
|
-
savetest upload --token sat_xxx --project-id 40 --test-run-name "Smoke DEV" --branch dev
|
|
311
|
-
SAVETEST_TOKEN=sat_xxx savetest upload --project-id 40
|
|
312
|
-
"""
|
|
296
|
+
"""Загрузить ZIP с Allure-результатами в SaveTest и дождаться импорта."""
|
|
313
297
|
host = host.rstrip("/")
|
|
314
298
|
chunk_bytes = chunk_size * 1024 * 1024
|
|
315
299
|
zip_path = Path(zip_file)
|
|
@@ -324,13 +308,14 @@ def upload(
|
|
|
324
308
|
headers = {"Authorization": f"Bearer {token}"}
|
|
325
309
|
|
|
326
310
|
# --- INIT ---
|
|
327
|
-
init_data:
|
|
311
|
+
init_data: Dict[str, str] = {
|
|
328
312
|
"filename": "allure-results.zip",
|
|
329
313
|
"total_chunks": str(total_chunks),
|
|
330
314
|
"chunk_size": str(chunk_bytes),
|
|
331
|
-
"git_branch": branch,
|
|
332
315
|
"include_attachments": "true" if include_attachments else "false",
|
|
333
316
|
}
|
|
317
|
+
if branch:
|
|
318
|
+
init_data["git_branch"] = branch
|
|
334
319
|
if test_run_id:
|
|
335
320
|
init_data["test_run_id"] = test_run_id
|
|
336
321
|
elif test_run_name:
|
|
@@ -382,20 +367,10 @@ def upload(
|
|
|
382
367
|
click.echo(f"Чанки загружены. Задача импорта: {task_id}")
|
|
383
368
|
|
|
384
369
|
if not wait:
|
|
385
|
-
click.echo(
|
|
386
|
-
click.echo("\nИмпорт выполняется в фоне. Используйте --wait или проверьте задачу в UI.")
|
|
370
|
+
click.echo("\nИмпорт выполняется в фоне (--no-wait). Проверьте статус в UI.")
|
|
387
371
|
return
|
|
388
372
|
|
|
389
373
|
final = _poll_import_task(
|
|
390
374
|
host, project_id, task_id, headers, poll_interval, timeout
|
|
391
375
|
)
|
|
392
376
|
_print_import_result(host, project_id, final)
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
def _check_response(resp: "requests.Response", step: str) -> None:
|
|
396
|
-
if not resp.ok:
|
|
397
|
-
click.echo(
|
|
398
|
-
f"\nОшибка на шаге '{step}': HTTP {resp.status_code}\n{resp.text}",
|
|
399
|
-
err=True,
|
|
400
|
-
)
|
|
401
|
-
sys.exit(1)
|
|
Binary file
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: savetest-cli
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: CLI for SaveTest: zip Allure results and upload them to SaveTest
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
Requires-Python: >=3.8
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: click>=8.0
|
|
9
|
+
Requires-Dist: requests>=2.28
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<img src="savetest_cli/pwa-512x512.png" alt="SaveTest" width="128">
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
# savetest-cli
|
|
16
|
+
|
|
17
|
+
CLI-утилита для упаковки Allure-результатов в ZIP и загрузки их в SaveTest.
|
|
18
|
+
|
|
19
|
+
## Установка
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pip install savetest-cli
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Быстрый старт
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# 1. Упаковать директорию с результатами в ZIP
|
|
31
|
+
savetest zip_report ./AllureReport
|
|
32
|
+
|
|
33
|
+
# 2. Загрузить в SaveTest и дождаться создания тест-рана
|
|
34
|
+
export SAVETEST_HOST=https://savetest.example.com
|
|
35
|
+
export SAVETEST_TOKEN=sat_xxxxxxxxxxxxxxxx
|
|
36
|
+
export SAVETEST_PROJECT_ID=42
|
|
37
|
+
export SAVETEST_BRANCH=main
|
|
38
|
+
|
|
39
|
+
savetest upload --test-run-name "Smoke $(date +%Y-%m-%d)"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Переменные окружения
|
|
45
|
+
|
|
46
|
+
Все параметры можно задать через переменные окружения — не нужно указывать флаги при каждом вызове.
|
|
47
|
+
|
|
48
|
+
| Переменная | Обязательна | Описание |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| `SAVETEST_HOST` | да | URL вашего SaveTest, например `https://savetest.example.com` |
|
|
51
|
+
| `SAVETEST_TOKEN` | да | API-токен (создаётся в настройках профиля SaveTest) |
|
|
52
|
+
| `SAVETEST_PROJECT_ID` | да | ID проекта в SaveTest |
|
|
53
|
+
| `SAVETEST_BRANCH` | нет | Ветка Git, привязываемая к тест-рану |
|
|
54
|
+
| `SAVETEST_TEST_RUN_ID` | нет | ID существующего тест-рана (если не задан — создаётся новый) |
|
|
55
|
+
| `SAVETEST_TEST_RUN_NAME` | нет | Имя нового тест-рана |
|
|
56
|
+
| `SAVETEST_INCLUDE_ATTACHMENTS` | нет | `true` — включать вложения в ZIP, `false` — исключать (быстрее) |
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Команды
|
|
61
|
+
|
|
62
|
+
### `savetest zip_report <path>`
|
|
63
|
+
|
|
64
|
+
Упаковывает директорию с Allure-результатами в ZIP-архив.
|
|
65
|
+
|
|
66
|
+
По умолчанию вложения (картинки, видео, `*-attachment.json`) **не включаются** — архив получается меньше и грузится быстрее. Флаг `--include-attachments` включает их.
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
savetest zip_report [OPTIONS] PATH
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
| Опция | По умолчанию | Описание |
|
|
73
|
+
|---|---|---|
|
|
74
|
+
| `PATH` | — | Путь к директории с Allure-результатами |
|
|
75
|
+
| `--output`, `-o` | `allure-results.zip` | Путь к выходному ZIP-файлу |
|
|
76
|
+
| `--include-attachments` | выключено | Включить вложения (картинки, видео, `*-attachment.json`) |
|
|
77
|
+
|
|
78
|
+
**Примеры:**
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
savetest zip_report ./AllureReport
|
|
82
|
+
|
|
83
|
+
savetest zip_report ./AllureReport --output report.zip
|
|
84
|
+
|
|
85
|
+
savetest zip_report ./AllureReport --include-attachments
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
### `savetest upload`
|
|
91
|
+
|
|
92
|
+
Загружает ZIP-файл в SaveTest по частям и ждёт завершения импорта. По завершении выводит ссылку на созданный тест-ран.
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
savetest upload [OPTIONS]
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
| Опция | Env-переменная | По умолчанию | Описание |
|
|
99
|
+
|---|---|---|---|
|
|
100
|
+
| `--host` | `SAVETEST_HOST` | — | URL SaveTest (**обязательно**) |
|
|
101
|
+
| `--token`, `-t` | `SAVETEST_TOKEN` | — | API-токен (**обязательно**) |
|
|
102
|
+
| `--project-id`, `-p` | `SAVETEST_PROJECT_ID` | — | ID проекта (**обязательно**) |
|
|
103
|
+
| `--zip-file`, `-z` | — | `allure-results.zip` | Путь к ZIP-файлу |
|
|
104
|
+
| `--branch`, `-b` | `SAVETEST_BRANCH` | — | Ветка Git |
|
|
105
|
+
| `--test-run-name` | `SAVETEST_TEST_RUN_NAME` | — | Имя нового тест-рана |
|
|
106
|
+
| `--test-run-id` | `SAVETEST_TEST_RUN_ID` | — | ID существующего тест-рана |
|
|
107
|
+
| `--include-attachments` | `SAVETEST_INCLUDE_ATTACHMENTS` | выключено | Сообщить серверу, что ZIP содержит вложения |
|
|
108
|
+
| `--chunk-size` | — | `50` | Размер чанка при загрузке (МБ) |
|
|
109
|
+
| `--wait` / `--no-wait` | — | `--wait` | Ждать завершения импорта |
|
|
110
|
+
| `--timeout` | — | `3600` | Таймаут ожидания (сек) |
|
|
111
|
+
| `--poll-interval` | — | `1.5` | Интервал опроса статуса (сек) |
|
|
112
|
+
|
|
113
|
+
`--host`, `--token` и `--project-id` обязательны. Передавайте их через флаги или переменные окружения.
|
|
114
|
+
|
|
115
|
+
**Примеры:**
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
# Через переменные окружения (рекомендуется)
|
|
119
|
+
export SAVETEST_HOST=https://savetest.example.com
|
|
120
|
+
export SAVETEST_TOKEN=sat_xxxxxxxxxxxxxxxx
|
|
121
|
+
export SAVETEST_PROJECT_ID=42
|
|
122
|
+
|
|
123
|
+
savetest upload --branch main --test-run-name "Regression $(date +%Y-%m-%d)"
|
|
124
|
+
|
|
125
|
+
# Загрузить в существующий тест-ран
|
|
126
|
+
savetest upload --branch main --test-run-id 17
|
|
127
|
+
|
|
128
|
+
# Загрузить другой ZIP с вложениями, не ждать импорта
|
|
129
|
+
savetest upload --zip-file full-report.zip --include-attachments --no-wait
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Настройка в Jenkins
|
|
135
|
+
|
|
136
|
+
Добавьте токен в **Jenkins → Manage Jenkins → Credentials** (тип: Secret text, ID: `savetest-token`).
|
|
137
|
+
|
|
138
|
+
В `Jenkinsfile` используйте `withCredentials` и `parameters`, чтобы не хранить конфигурацию в коде:
|
|
139
|
+
|
|
140
|
+
```groovy
|
|
141
|
+
pipeline {
|
|
142
|
+
agent any
|
|
143
|
+
|
|
144
|
+
parameters {
|
|
145
|
+
string(name: 'SAVETEST_HOST', defaultValue: '', description: 'URL SaveTest')
|
|
146
|
+
string(name: 'SAVETEST_PROJECT_ID', defaultValue: '', description: 'ID проекта в SaveTest')
|
|
147
|
+
string(name: 'SAVETEST_BRANCH', defaultValue: '', description: 'Ветка Git')
|
|
148
|
+
string(name: 'SAVETEST_TEST_RUN_ID',defaultValue: '', description: 'ID тест-рана (пусто = создать новый)')
|
|
149
|
+
booleanParam(name: 'INCLUDE_ATTACHMENTS', defaultValue: false, description: 'Включать вложения в ZIP')
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
stages {
|
|
153
|
+
// ... ваши стадии запуска тестов ...
|
|
154
|
+
|
|
155
|
+
stage('Upload to SaveTest') {
|
|
156
|
+
steps {
|
|
157
|
+
withCredentials([string(credentialsId: 'savetest-token', variable: 'SAVETEST_TOKEN')]) {
|
|
158
|
+
sh '''
|
|
159
|
+
pip install savetest-cli
|
|
160
|
+
|
|
161
|
+
savetest zip_report "${WORKSPACE}/AllureReport" \
|
|
162
|
+
$([ "${INCLUDE_ATTACHMENTS}" = "true" ] && echo "--include-attachments")
|
|
163
|
+
|
|
164
|
+
savetest upload \
|
|
165
|
+
--host "${SAVETEST_HOST}" \
|
|
166
|
+
--project-id "${SAVETEST_PROJECT_ID}" \
|
|
167
|
+
--branch "${SAVETEST_BRANCH}" \
|
|
168
|
+
--test-run-name "Jenkins ${JOB_NAME} #${BUILD_NUMBER}" \
|
|
169
|
+
$( [ -n "${SAVETEST_TEST_RUN_ID}" ] && echo "--test-run-id ${SAVETEST_TEST_RUN_ID}" ) \
|
|
170
|
+
$( [ "${INCLUDE_ATTACHMENTS}" = "true" ] && echo "--include-attachments" )
|
|
171
|
+
'''
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
> `SAVETEST_TOKEN` берётся из Jenkins Credentials и передаётся в окружение через `withCredentials` — в лог и в код сборки он не попадает.
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Получение API-токена
|
|
184
|
+
|
|
185
|
+
1. Войдите в SaveTest.
|
|
186
|
+
2. Откройте **Настройки профиля → API-токены**.
|
|
187
|
+
3. Создайте новый токен и скопируйте его значение.
|
|
188
|
+
4. Добавьте токен в Jenkins Credentials (или экспортируйте локально через `export SAVETEST_TOKEN=...`).
|
savetest_cli-0.1.0/PKG-INFO
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: savetest-cli
|
|
3
|
-
Version: 0.1.0
|
|
4
|
-
Summary: CLI for SaveTest: zip Allure results and upload them to SaveTest
|
|
5
|
-
License: MIT
|
|
6
|
-
Requires-Python: >=3.8
|
|
7
|
-
Description-Content-Type: text/markdown
|
|
8
|
-
Requires-Dist: click>=8.0
|
|
9
|
-
Requires-Dist: requests>=2.28
|
|
10
|
-
|
|
11
|
-
# savetest-cli
|
|
12
|
-
|
|
13
|
-
CLI-утилита для упаковки Allure-результатов в ZIP и загрузки их в [SaveTest](https://save-test.ru).
|
|
14
|
-
|
|
15
|
-
## Установка
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
pip install savetest-cli
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Команды
|
|
22
|
-
|
|
23
|
-
### `savetest zip_report <path>`
|
|
24
|
-
|
|
25
|
-
Упаковывает директорию с Allure-результатами в ZIP-архив.
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
savetest zip_report ./AllureReport
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
| Параметр | По умолчанию | Описание |
|
|
32
|
-
|---|---|---|
|
|
33
|
-
| `path` | — | Путь к директории с Allure-результатами |
|
|
34
|
-
| `--output`, `-o` | `allure-results.zip` | Путь к выходному ZIP-файлу |
|
|
35
|
-
| `--include-attachments` | `false` | Включить вложения (картинки, видео, `*-attachment.json`) |
|
|
36
|
-
| `--no-include-attachments` | — | Исключить вложения (быстрее, меньше объём) |
|
|
37
|
-
|
|
38
|
-
**Примеры:**
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
# Упаковать без вложений (быстрее)
|
|
42
|
-
savetest zip_report ./AllureReport
|
|
43
|
-
|
|
44
|
-
# Указать выходной файл
|
|
45
|
-
savetest zip_report ./AllureReport --output my-report.zip
|
|
46
|
-
|
|
47
|
-
# Включить вложения
|
|
48
|
-
savetest zip_report ./AllureReport --include-attachments
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
### `savetest upload`
|
|
54
|
-
|
|
55
|
-
Загружает ZIP-архив в SaveTest по частям (чанками).
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
savetest upload --token sat_xxx --project-id 40
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
| Параметр | Env-переменная | По умолчанию | Описание |
|
|
62
|
-
|---|---|---|---|
|
|
63
|
-
| `--zip-file`, `-z` | — | `allure-results.zip` | Путь к ZIP-файлу |
|
|
64
|
-
| `--host` | `SAVETEST_HOST` | `https://save-test.ptnl.moscow` | Хост SaveTest |
|
|
65
|
-
| `--token`, `-t` | `SAVETEST_TOKEN` | — | API-токен (**обязательно**) |
|
|
66
|
-
| `--project-id`, `-p` | `SAVETEST_PROJECT_ID` | — | ID проекта (**обязательно**) |
|
|
67
|
-
| `--test-run-id` | `SAVETEST_TEST_RUN_ID` | — | ID существующего тест-рана (иначе создаётся новый) |
|
|
68
|
-
| `--test-run-name` | `SAVETEST_TEST_RUN_NAME` | — | Имя нового тест-рана |
|
|
69
|
-
| `--branch`, `-b` | `SAVETEST_BRANCH` | — | Ветка Git |
|
|
70
|
-
| `--include-attachments` | `SAVETEST_INCLUDE_ATTACHMENTS` | `false` | Сообщить серверу, что ZIP содержит вложения |
|
|
71
|
-
| `--chunk-size` | — | `50` | Размер чанка при загрузке (МБ) |
|
|
72
|
-
| `--wait` / `--no-wait` | — | `--wait` | Дождаться завершения импорта и создания тест-рана |
|
|
73
|
-
| `--poll-interval` | — | `1.5` | Интервал опроса статуса (сек) |
|
|
74
|
-
| `--timeout` | — | `3600` | Таймаут ожидания обработки (сек) |
|
|
75
|
-
|
|
76
|
-
**Примеры:**
|
|
77
|
-
|
|
78
|
-
```bash
|
|
79
|
-
# Минимальный вызов (токен через переменную окружения)
|
|
80
|
-
export SAVETEST_TOKEN=sat_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
|
81
|
-
savetest upload --project-id 40
|
|
82
|
-
|
|
83
|
-
# Создать новый тест-ран с именем
|
|
84
|
-
savetest upload \
|
|
85
|
-
--token sat_xxx \
|
|
86
|
-
--project-id 40 \
|
|
87
|
-
--test-run-name "Smoke DEV #42" \
|
|
88
|
-
--branch dev
|
|
89
|
-
|
|
90
|
-
# Загрузить в существующий тест-ран
|
|
91
|
-
savetest upload \
|
|
92
|
-
--token sat_xxx \
|
|
93
|
-
--project-id 40 \
|
|
94
|
-
--test-run-id 7
|
|
95
|
-
|
|
96
|
-
# Загрузить с вложениями из другого файла
|
|
97
|
-
savetest upload \
|
|
98
|
-
--token sat_xxx \
|
|
99
|
-
--project-id 40 \
|
|
100
|
-
--zip-file my-report.zip \
|
|
101
|
-
--include-attachments
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
## Типичный сценарий
|
|
107
|
-
|
|
108
|
-
```bash
|
|
109
|
-
# 1. Упаковать результаты (без вложений)
|
|
110
|
-
savetest zip_report ./AllureReport
|
|
111
|
-
|
|
112
|
-
# 2. Загрузить в SaveTest (CLI дождётся импорта и выведет ссылку на тест-ран)
|
|
113
|
-
export SAVETEST_TOKEN=sat_xxx
|
|
114
|
-
savetest upload --project-id 40 --branch dev --test-run-name "CI build #123"
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
По умолчанию `upload` ждёт полной обработки. Чтобы вернуться сразу после приёма чанков: `--no-wait`.
|
|
118
|
-
|
|
119
|
-
## Соответствие параметрам Jenkins Pipeline
|
|
120
|
-
|
|
121
|
-
| Jenkins-параметр | CLI-опция |
|
|
122
|
-
|---|---|
|
|
123
|
-
| `savetest_host` | `--host` |
|
|
124
|
-
| `savetest_project_id` | `--project-id` |
|
|
125
|
-
| `savetest_test_run_id` | `--test-run-id` |
|
|
126
|
-
| `savetest_include_attachments` | `--include-attachments` / `--no-include-attachments` |
|
|
127
|
-
| `branch` | `--branch` |
|
|
128
|
-
| токен (захардкожен) | `--token` / `SAVETEST_TOKEN` |
|
savetest_cli-0.1.0/README.md
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
# savetest-cli
|
|
2
|
-
|
|
3
|
-
CLI-утилита для упаковки Allure-результатов в ZIP и загрузки их в [SaveTest](https://save-test.ru).
|
|
4
|
-
|
|
5
|
-
## Установка
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
pip install savetest-cli
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## Команды
|
|
12
|
-
|
|
13
|
-
### `savetest zip_report <path>`
|
|
14
|
-
|
|
15
|
-
Упаковывает директорию с Allure-результатами в ZIP-архив.
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
savetest zip_report ./AllureReport
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
| Параметр | По умолчанию | Описание |
|
|
22
|
-
|---|---|---|
|
|
23
|
-
| `path` | — | Путь к директории с Allure-результатами |
|
|
24
|
-
| `--output`, `-o` | `allure-results.zip` | Путь к выходному ZIP-файлу |
|
|
25
|
-
| `--include-attachments` | `false` | Включить вложения (картинки, видео, `*-attachment.json`) |
|
|
26
|
-
| `--no-include-attachments` | — | Исключить вложения (быстрее, меньше объём) |
|
|
27
|
-
|
|
28
|
-
**Примеры:**
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
# Упаковать без вложений (быстрее)
|
|
32
|
-
savetest zip_report ./AllureReport
|
|
33
|
-
|
|
34
|
-
# Указать выходной файл
|
|
35
|
-
savetest zip_report ./AllureReport --output my-report.zip
|
|
36
|
-
|
|
37
|
-
# Включить вложения
|
|
38
|
-
savetest zip_report ./AllureReport --include-attachments
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
### `savetest upload`
|
|
44
|
-
|
|
45
|
-
Загружает ZIP-архив в SaveTest по частям (чанками).
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
savetest upload --token sat_xxx --project-id 40
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
| Параметр | Env-переменная | По умолчанию | Описание |
|
|
52
|
-
|---|---|---|---|
|
|
53
|
-
| `--zip-file`, `-z` | — | `allure-results.zip` | Путь к ZIP-файлу |
|
|
54
|
-
| `--host` | `SAVETEST_HOST` | `https://save-test.ptnl.moscow` | Хост SaveTest |
|
|
55
|
-
| `--token`, `-t` | `SAVETEST_TOKEN` | — | API-токен (**обязательно**) |
|
|
56
|
-
| `--project-id`, `-p` | `SAVETEST_PROJECT_ID` | — | ID проекта (**обязательно**) |
|
|
57
|
-
| `--test-run-id` | `SAVETEST_TEST_RUN_ID` | — | ID существующего тест-рана (иначе создаётся новый) |
|
|
58
|
-
| `--test-run-name` | `SAVETEST_TEST_RUN_NAME` | — | Имя нового тест-рана |
|
|
59
|
-
| `--branch`, `-b` | `SAVETEST_BRANCH` | — | Ветка Git |
|
|
60
|
-
| `--include-attachments` | `SAVETEST_INCLUDE_ATTACHMENTS` | `false` | Сообщить серверу, что ZIP содержит вложения |
|
|
61
|
-
| `--chunk-size` | — | `50` | Размер чанка при загрузке (МБ) |
|
|
62
|
-
| `--wait` / `--no-wait` | — | `--wait` | Дождаться завершения импорта и создания тест-рана |
|
|
63
|
-
| `--poll-interval` | — | `1.5` | Интервал опроса статуса (сек) |
|
|
64
|
-
| `--timeout` | — | `3600` | Таймаут ожидания обработки (сек) |
|
|
65
|
-
|
|
66
|
-
**Примеры:**
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
# Минимальный вызов (токен через переменную окружения)
|
|
70
|
-
export SAVETEST_TOKEN=sat_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
|
71
|
-
savetest upload --project-id 40
|
|
72
|
-
|
|
73
|
-
# Создать новый тест-ран с именем
|
|
74
|
-
savetest upload \
|
|
75
|
-
--token sat_xxx \
|
|
76
|
-
--project-id 40 \
|
|
77
|
-
--test-run-name "Smoke DEV #42" \
|
|
78
|
-
--branch dev
|
|
79
|
-
|
|
80
|
-
# Загрузить в существующий тест-ран
|
|
81
|
-
savetest upload \
|
|
82
|
-
--token sat_xxx \
|
|
83
|
-
--project-id 40 \
|
|
84
|
-
--test-run-id 7
|
|
85
|
-
|
|
86
|
-
# Загрузить с вложениями из другого файла
|
|
87
|
-
savetest upload \
|
|
88
|
-
--token sat_xxx \
|
|
89
|
-
--project-id 40 \
|
|
90
|
-
--zip-file my-report.zip \
|
|
91
|
-
--include-attachments
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
---
|
|
95
|
-
|
|
96
|
-
## Типичный сценарий
|
|
97
|
-
|
|
98
|
-
```bash
|
|
99
|
-
# 1. Упаковать результаты (без вложений)
|
|
100
|
-
savetest zip_report ./AllureReport
|
|
101
|
-
|
|
102
|
-
# 2. Загрузить в SaveTest (CLI дождётся импорта и выведет ссылку на тест-ран)
|
|
103
|
-
export SAVETEST_TOKEN=sat_xxx
|
|
104
|
-
savetest upload --project-id 40 --branch dev --test-run-name "CI build #123"
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
По умолчанию `upload` ждёт полной обработки. Чтобы вернуться сразу после приёма чанков: `--no-wait`.
|
|
108
|
-
|
|
109
|
-
## Соответствие параметрам Jenkins Pipeline
|
|
110
|
-
|
|
111
|
-
| Jenkins-параметр | CLI-опция |
|
|
112
|
-
|---|---|
|
|
113
|
-
| `savetest_host` | `--host` |
|
|
114
|
-
| `savetest_project_id` | `--project-id` |
|
|
115
|
-
| `savetest_test_run_id` | `--test-run-id` |
|
|
116
|
-
| `savetest_include_attachments` | `--include-attachments` / `--no-include-attachments` |
|
|
117
|
-
| `branch` | `--branch` |
|
|
118
|
-
| токен (захардкожен) | `--token` / `SAVETEST_TOKEN` |
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.1.0"
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: savetest-cli
|
|
3
|
-
Version: 0.1.0
|
|
4
|
-
Summary: CLI for SaveTest: zip Allure results and upload them to SaveTest
|
|
5
|
-
License: MIT
|
|
6
|
-
Requires-Python: >=3.8
|
|
7
|
-
Description-Content-Type: text/markdown
|
|
8
|
-
Requires-Dist: click>=8.0
|
|
9
|
-
Requires-Dist: requests>=2.28
|
|
10
|
-
|
|
11
|
-
# savetest-cli
|
|
12
|
-
|
|
13
|
-
CLI-утилита для упаковки Allure-результатов в ZIP и загрузки их в [SaveTest](https://save-test.ru).
|
|
14
|
-
|
|
15
|
-
## Установка
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
pip install savetest-cli
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Команды
|
|
22
|
-
|
|
23
|
-
### `savetest zip_report <path>`
|
|
24
|
-
|
|
25
|
-
Упаковывает директорию с Allure-результатами в ZIP-архив.
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
savetest zip_report ./AllureReport
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
| Параметр | По умолчанию | Описание |
|
|
32
|
-
|---|---|---|
|
|
33
|
-
| `path` | — | Путь к директории с Allure-результатами |
|
|
34
|
-
| `--output`, `-o` | `allure-results.zip` | Путь к выходному ZIP-файлу |
|
|
35
|
-
| `--include-attachments` | `false` | Включить вложения (картинки, видео, `*-attachment.json`) |
|
|
36
|
-
| `--no-include-attachments` | — | Исключить вложения (быстрее, меньше объём) |
|
|
37
|
-
|
|
38
|
-
**Примеры:**
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
# Упаковать без вложений (быстрее)
|
|
42
|
-
savetest zip_report ./AllureReport
|
|
43
|
-
|
|
44
|
-
# Указать выходной файл
|
|
45
|
-
savetest zip_report ./AllureReport --output my-report.zip
|
|
46
|
-
|
|
47
|
-
# Включить вложения
|
|
48
|
-
savetest zip_report ./AllureReport --include-attachments
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
### `savetest upload`
|
|
54
|
-
|
|
55
|
-
Загружает ZIP-архив в SaveTest по частям (чанками).
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
savetest upload --token sat_xxx --project-id 40
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
| Параметр | Env-переменная | По умолчанию | Описание |
|
|
62
|
-
|---|---|---|---|
|
|
63
|
-
| `--zip-file`, `-z` | — | `allure-results.zip` | Путь к ZIP-файлу |
|
|
64
|
-
| `--host` | `SAVETEST_HOST` | `https://save-test.ptnl.moscow` | Хост SaveTest |
|
|
65
|
-
| `--token`, `-t` | `SAVETEST_TOKEN` | — | API-токен (**обязательно**) |
|
|
66
|
-
| `--project-id`, `-p` | `SAVETEST_PROJECT_ID` | — | ID проекта (**обязательно**) |
|
|
67
|
-
| `--test-run-id` | `SAVETEST_TEST_RUN_ID` | — | ID существующего тест-рана (иначе создаётся новый) |
|
|
68
|
-
| `--test-run-name` | `SAVETEST_TEST_RUN_NAME` | — | Имя нового тест-рана |
|
|
69
|
-
| `--branch`, `-b` | `SAVETEST_BRANCH` | — | Ветка Git |
|
|
70
|
-
| `--include-attachments` | `SAVETEST_INCLUDE_ATTACHMENTS` | `false` | Сообщить серверу, что ZIP содержит вложения |
|
|
71
|
-
| `--chunk-size` | — | `50` | Размер чанка при загрузке (МБ) |
|
|
72
|
-
| `--wait` / `--no-wait` | — | `--wait` | Дождаться завершения импорта и создания тест-рана |
|
|
73
|
-
| `--poll-interval` | — | `1.5` | Интервал опроса статуса (сек) |
|
|
74
|
-
| `--timeout` | — | `3600` | Таймаут ожидания обработки (сек) |
|
|
75
|
-
|
|
76
|
-
**Примеры:**
|
|
77
|
-
|
|
78
|
-
```bash
|
|
79
|
-
# Минимальный вызов (токен через переменную окружения)
|
|
80
|
-
export SAVETEST_TOKEN=sat_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
|
81
|
-
savetest upload --project-id 40
|
|
82
|
-
|
|
83
|
-
# Создать новый тест-ран с именем
|
|
84
|
-
savetest upload \
|
|
85
|
-
--token sat_xxx \
|
|
86
|
-
--project-id 40 \
|
|
87
|
-
--test-run-name "Smoke DEV #42" \
|
|
88
|
-
--branch dev
|
|
89
|
-
|
|
90
|
-
# Загрузить в существующий тест-ран
|
|
91
|
-
savetest upload \
|
|
92
|
-
--token sat_xxx \
|
|
93
|
-
--project-id 40 \
|
|
94
|
-
--test-run-id 7
|
|
95
|
-
|
|
96
|
-
# Загрузить с вложениями из другого файла
|
|
97
|
-
savetest upload \
|
|
98
|
-
--token sat_xxx \
|
|
99
|
-
--project-id 40 \
|
|
100
|
-
--zip-file my-report.zip \
|
|
101
|
-
--include-attachments
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
## Типичный сценарий
|
|
107
|
-
|
|
108
|
-
```bash
|
|
109
|
-
# 1. Упаковать результаты (без вложений)
|
|
110
|
-
savetest zip_report ./AllureReport
|
|
111
|
-
|
|
112
|
-
# 2. Загрузить в SaveTest (CLI дождётся импорта и выведет ссылку на тест-ран)
|
|
113
|
-
export SAVETEST_TOKEN=sat_xxx
|
|
114
|
-
savetest upload --project-id 40 --branch dev --test-run-name "CI build #123"
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
По умолчанию `upload` ждёт полной обработки. Чтобы вернуться сразу после приёма чанков: `--no-wait`.
|
|
118
|
-
|
|
119
|
-
## Соответствие параметрам Jenkins Pipeline
|
|
120
|
-
|
|
121
|
-
| Jenkins-параметр | CLI-опция |
|
|
122
|
-
|---|---|
|
|
123
|
-
| `savetest_host` | `--host` |
|
|
124
|
-
| `savetest_project_id` | `--project-id` |
|
|
125
|
-
| `savetest_test_run_id` | `--test-run-id` |
|
|
126
|
-
| `savetest_include_attachments` | `--include-attachments` / `--no-include-attachments` |
|
|
127
|
-
| `branch` | `--branch` |
|
|
128
|
-
| токен (захардкожен) | `--token` / `SAVETEST_TOKEN` |
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|