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.
@@ -0,0 +1,2 @@
1
+ include README.md
2
+ recursive-include savetest_cli *.png
@@ -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.0"
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 = { text = "MIT" }
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
- ) -> dict[str, Any]:
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: dict[str, Any]) -> None:
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"Статус: {state}")
102
+ click.echo(f"Статус: {state}")
105
103
  if test_run_id is not None:
106
- click.echo(f"Тест-ран ID: {test_run_id}")
107
- click.echo(f"Тест-ран: {test_run_name or '—'}")
108
- click.echo(f"Ссылка: {host}/projects/{project_id}/test-runs/{test_run_id}")
109
- click.echo(f"Обработано: {status.get('results_processed', 0)}")
110
- click.echo(f"Создано: {status.get('results_created', 0)}")
111
- click.echo(f"Сопоставлено: {status.get('test_cases_matched', 0)}")
112
- click.echo(f"Пропущено: {status.get('skipped', 0)}")
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"Готово: добавлено {added} файлов, пропущено {skipped} вложений. Размер: {size}")
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
- default=DEFAULT_HOST,
215
- show_default=True,
214
+ required=True,
216
215
  envvar="SAVETEST_HOST",
217
- help="Хост SaveTest (или переменная окружения SAVETEST_HOST).",
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 (или переменная окружения SAVETEST_TOKEN).",
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 (или переменная окружения SAVETEST_PROJECT_ID).",
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="Имя нового тест-рана (используется, если --test-run-id не задан).",
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: dict = {
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(json.dumps(result, ensure_ascii=False, indent=2))
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)
@@ -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=...`).
@@ -1,7 +1,9 @@
1
+ MANIFEST.in
1
2
  README.md
2
3
  pyproject.toml
3
4
  savetest_cli/__init__.py
4
5
  savetest_cli/cli.py
6
+ savetest_cli/pwa-512x512.png
5
7
  savetest_cli.egg-info/PKG-INFO
6
8
  savetest_cli.egg-info/SOURCES.txt
7
9
  savetest_cli.egg-info/dependency_links.txt
@@ -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` |
@@ -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