savetest-cli 0.1.1__tar.gz → 0.1.3__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,213 @@
1
+ Metadata-Version: 2.4
2
+ Name: savetest-cli
3
+ Version: 0.1.3
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_TEST_RUN_DESCRIPTION` | нет | Описание нового тест-рана |
57
+ | `SAVETEST_TEST_RUN_VERSION` | нет | Версия системы |
58
+ | `SAVETEST_TEST_RUN_REVISION` | нет | Ревизия / номер сборки |
59
+ | `SAVETEST_TEST_RUN_OBJECT` | нет | Объект тестирования |
60
+ | `SAVETEST_EPIC_ID` | нет | ID эпика для привязки тест-рана |
61
+ | `SAVETEST_EPIC_NAME` | нет | Наименование эпика в проекте (если ID неизвестен) |
62
+ | `SAVETEST_CONFIGURATION_ID` | нет | ID конфигурации тест-рана |
63
+ | `SAVETEST_CONFIGURATION_NAME` | нет | Наименование конфигурации в проекте |
64
+ | `SAVETEST_INCLUDE_ATTACHMENTS` | нет | `true` — включать вложения в ZIP, `false` — исключать (быстрее) |
65
+
66
+ ---
67
+
68
+ ## Команды
69
+
70
+ ### `savetest zip_report <path>`
71
+
72
+ Упаковывает директорию с Allure-результатами в ZIP-архив.
73
+
74
+ По умолчанию вложения (картинки, видео, `*-attachment.json`) **не включаются** — архив получается меньше и грузится быстрее. Флаг `--include-attachments` включает их.
75
+
76
+ ```
77
+ savetest zip_report [OPTIONS] PATH
78
+ ```
79
+
80
+ | Опция | По умолчанию | Описание |
81
+ |---|---|---|
82
+ | `PATH` | — | Путь к директории с Allure-результатами |
83
+ | `--output`, `-o` | `allure-results.zip` | Путь к выходному ZIP-файлу |
84
+ | `--include-attachments` | выключено | Включить вложения (картинки, видео, `*-attachment.json`) |
85
+
86
+ **Примеры:**
87
+
88
+ ```bash
89
+ savetest zip_report ./AllureReport
90
+
91
+ savetest zip_report ./AllureReport --output report.zip
92
+
93
+ savetest zip_report ./AllureReport --include-attachments
94
+ ```
95
+
96
+ ---
97
+
98
+ ### `savetest upload`
99
+
100
+ Загружает ZIP-файл в SaveTest по частям и ждёт завершения импорта. По завершении выводит ссылку на созданный тест-ран.
101
+
102
+ ```
103
+ savetest upload [OPTIONS]
104
+ ```
105
+
106
+ | Опция | Env-переменная | По умолчанию | Описание |
107
+ |---|---|---|---|
108
+ | `--host` | `SAVETEST_HOST` | — | URL SaveTest (**обязательно**) |
109
+ | `--token`, `-t` | `SAVETEST_TOKEN` | — | API-токен (**обязательно**) |
110
+ | `--project-id`, `-p` | `SAVETEST_PROJECT_ID` | — | ID проекта (**обязательно**) |
111
+ | `--zip-file`, `-z` | — | `allure-results.zip` | Путь к ZIP-файлу |
112
+ | `--branch`, `-b` | `SAVETEST_BRANCH` | — | Ветка Git |
113
+ | `--test-run-name` | `SAVETEST_TEST_RUN_NAME` | — | Имя нового тест-рана |
114
+ | `--description` | `SAVETEST_TEST_RUN_DESCRIPTION` | — | Описание нового тест-рана |
115
+ | `--version` | `SAVETEST_TEST_RUN_VERSION` | — | Версия системы |
116
+ | `--revision` | `SAVETEST_TEST_RUN_REVISION` | — | Ревизия / номер сборки |
117
+ | `--test-object` | `SAVETEST_TEST_RUN_OBJECT` | — | Объект тестирования |
118
+ | `--epic-id` | `SAVETEST_EPIC_ID` | — | ID эпика |
119
+ | `--epic-name` | `SAVETEST_EPIC_NAME` | — | Наименование эпика в проекте |
120
+ | `--configuration-id` | `SAVETEST_CONFIGURATION_ID` | — | ID конфигурации |
121
+ | `--configuration-name` | `SAVETEST_CONFIGURATION_NAME` | — | Наименование конфигурации |
122
+ | `--test-run-id` | `SAVETEST_TEST_RUN_ID` | — | ID существующего тест-рана |
123
+ | `--include-attachments` | `SAVETEST_INCLUDE_ATTACHMENTS` | выключено | Сообщить серверу, что ZIP содержит вложения |
124
+ | `--chunk-size` | — | `50` | Размер чанка при загрузке (МБ) |
125
+ | `--wait` / `--no-wait` | — | `--wait` | Ждать завершения импорта |
126
+ | `--timeout` | — | `3600` | Таймаут ожидания (сек) |
127
+ | `--poll-interval` | — | `1.5` | Интервал опроса статуса (сек) |
128
+
129
+ `--host`, `--token` и `--project-id` обязательны. Передавайте их через флаги или переменные окружения.
130
+
131
+ **Примеры:**
132
+
133
+ ```bash
134
+ # Через переменные окружения (рекомендуется)
135
+ export SAVETEST_HOST=https://savetest.example.com
136
+ export SAVETEST_TOKEN=sat_xxxxxxxxxxxxxxxx
137
+ export SAVETEST_PROJECT_ID=42
138
+
139
+ savetest upload --branch main --test-run-name "Regression $(date +%Y-%m-%d)"
140
+
141
+ # Новый тест-ран с эпиком, конфигурацией и метаданными
142
+ savetest upload \
143
+ --branch main \
144
+ --test-run-name "Smoke $(date +%Y-%m-%d)" \
145
+ --epic-name "Release 2.4" \
146
+ --configuration-name "Chrome / Windows" \
147
+ --version "2.4.0" \
148
+ --description "Nightly smoke on staging"
149
+
150
+ # Загрузить в существующий тест-ран
151
+ savetest upload --branch main --test-run-id 17
152
+
153
+ # Загрузить другой ZIP с вложениями, не ждать импорта
154
+ savetest upload --zip-file full-report.zip --include-attachments --no-wait
155
+ ```
156
+
157
+ ---
158
+
159
+ ## Настройка в Jenkins
160
+
161
+ Добавьте токен в **Jenkins → Manage Jenkins → Credentials** (тип: Secret text, ID: `savetest-token`).
162
+
163
+ В `Jenkinsfile` используйте `withCredentials` и `parameters`, чтобы не хранить конфигурацию в коде:
164
+
165
+ ```groovy
166
+ pipeline {
167
+ agent any
168
+
169
+ parameters {
170
+ string(name: 'SAVETEST_HOST', defaultValue: '', description: 'URL SaveTest')
171
+ string(name: 'SAVETEST_PROJECT_ID', defaultValue: '', description: 'ID проекта в SaveTest')
172
+ string(name: 'SAVETEST_BRANCH', defaultValue: '', description: 'Ветка Git')
173
+ string(name: 'SAVETEST_TEST_RUN_ID',defaultValue: '', description: 'ID тест-рана (пусто = создать новый)')
174
+ booleanParam(name: 'INCLUDE_ATTACHMENTS', defaultValue: false, description: 'Включать вложения в ZIP')
175
+ }
176
+
177
+ stages {
178
+ // ... ваши стадии запуска тестов ...
179
+
180
+ stage('Upload to SaveTest') {
181
+ steps {
182
+ withCredentials([string(credentialsId: 'savetest-token', variable: 'SAVETEST_TOKEN')]) {
183
+ sh '''
184
+ pip install savetest-cli
185
+
186
+ savetest zip_report "${WORKSPACE}/AllureReport" \
187
+ $([ "${INCLUDE_ATTACHMENTS}" = "true" ] && echo "--include-attachments")
188
+
189
+ savetest upload \
190
+ --host "${SAVETEST_HOST}" \
191
+ --project-id "${SAVETEST_PROJECT_ID}" \
192
+ --branch "${SAVETEST_BRANCH}" \
193
+ --test-run-name "Jenkins ${JOB_NAME} #${BUILD_NUMBER}" \
194
+ $( [ -n "${SAVETEST_TEST_RUN_ID}" ] && echo "--test-run-id ${SAVETEST_TEST_RUN_ID}" ) \
195
+ $( [ "${INCLUDE_ATTACHMENTS}" = "true" ] && echo "--include-attachments" )
196
+ '''
197
+ }
198
+ }
199
+ }
200
+ }
201
+ }
202
+ ```
203
+
204
+ > `SAVETEST_TOKEN` берётся из Jenkins Credentials и передаётся в окружение через `withCredentials` — в лог и в код сборки он не попадает.
205
+
206
+ ---
207
+
208
+ ## Получение API-токена
209
+
210
+ 1. Войдите в SaveTest.
211
+ 2. Откройте **Настройки профиля → API-токены**.
212
+ 3. Создайте новый токен и скопируйте его значение.
213
+ 4. Добавьте токен в Jenkins Credentials (или экспортируйте локально через `export SAVETEST_TOKEN=...`).
@@ -0,0 +1,203 @@
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_TEST_RUN_DESCRIPTION` | нет | Описание нового тест-рана |
47
+ | `SAVETEST_TEST_RUN_VERSION` | нет | Версия системы |
48
+ | `SAVETEST_TEST_RUN_REVISION` | нет | Ревизия / номер сборки |
49
+ | `SAVETEST_TEST_RUN_OBJECT` | нет | Объект тестирования |
50
+ | `SAVETEST_EPIC_ID` | нет | ID эпика для привязки тест-рана |
51
+ | `SAVETEST_EPIC_NAME` | нет | Наименование эпика в проекте (если ID неизвестен) |
52
+ | `SAVETEST_CONFIGURATION_ID` | нет | ID конфигурации тест-рана |
53
+ | `SAVETEST_CONFIGURATION_NAME` | нет | Наименование конфигурации в проекте |
54
+ | `SAVETEST_INCLUDE_ATTACHMENTS` | нет | `true` — включать вложения в ZIP, `false` — исключать (быстрее) |
55
+
56
+ ---
57
+
58
+ ## Команды
59
+
60
+ ### `savetest zip_report <path>`
61
+
62
+ Упаковывает директорию с Allure-результатами в ZIP-архив.
63
+
64
+ По умолчанию вложения (картинки, видео, `*-attachment.json`) **не включаются** — архив получается меньше и грузится быстрее. Флаг `--include-attachments` включает их.
65
+
66
+ ```
67
+ savetest zip_report [OPTIONS] PATH
68
+ ```
69
+
70
+ | Опция | По умолчанию | Описание |
71
+ |---|---|---|
72
+ | `PATH` | — | Путь к директории с Allure-результатами |
73
+ | `--output`, `-o` | `allure-results.zip` | Путь к выходному ZIP-файлу |
74
+ | `--include-attachments` | выключено | Включить вложения (картинки, видео, `*-attachment.json`) |
75
+
76
+ **Примеры:**
77
+
78
+ ```bash
79
+ savetest zip_report ./AllureReport
80
+
81
+ savetest zip_report ./AllureReport --output report.zip
82
+
83
+ savetest zip_report ./AllureReport --include-attachments
84
+ ```
85
+
86
+ ---
87
+
88
+ ### `savetest upload`
89
+
90
+ Загружает ZIP-файл в SaveTest по частям и ждёт завершения импорта. По завершении выводит ссылку на созданный тест-ран.
91
+
92
+ ```
93
+ savetest upload [OPTIONS]
94
+ ```
95
+
96
+ | Опция | Env-переменная | По умолчанию | Описание |
97
+ |---|---|---|---|
98
+ | `--host` | `SAVETEST_HOST` | — | URL SaveTest (**обязательно**) |
99
+ | `--token`, `-t` | `SAVETEST_TOKEN` | — | API-токен (**обязательно**) |
100
+ | `--project-id`, `-p` | `SAVETEST_PROJECT_ID` | — | ID проекта (**обязательно**) |
101
+ | `--zip-file`, `-z` | — | `allure-results.zip` | Путь к ZIP-файлу |
102
+ | `--branch`, `-b` | `SAVETEST_BRANCH` | — | Ветка Git |
103
+ | `--test-run-name` | `SAVETEST_TEST_RUN_NAME` | — | Имя нового тест-рана |
104
+ | `--description` | `SAVETEST_TEST_RUN_DESCRIPTION` | — | Описание нового тест-рана |
105
+ | `--version` | `SAVETEST_TEST_RUN_VERSION` | — | Версия системы |
106
+ | `--revision` | `SAVETEST_TEST_RUN_REVISION` | — | Ревизия / номер сборки |
107
+ | `--test-object` | `SAVETEST_TEST_RUN_OBJECT` | — | Объект тестирования |
108
+ | `--epic-id` | `SAVETEST_EPIC_ID` | — | ID эпика |
109
+ | `--epic-name` | `SAVETEST_EPIC_NAME` | — | Наименование эпика в проекте |
110
+ | `--configuration-id` | `SAVETEST_CONFIGURATION_ID` | — | ID конфигурации |
111
+ | `--configuration-name` | `SAVETEST_CONFIGURATION_NAME` | — | Наименование конфигурации |
112
+ | `--test-run-id` | `SAVETEST_TEST_RUN_ID` | — | ID существующего тест-рана |
113
+ | `--include-attachments` | `SAVETEST_INCLUDE_ATTACHMENTS` | выключено | Сообщить серверу, что ZIP содержит вложения |
114
+ | `--chunk-size` | — | `50` | Размер чанка при загрузке (МБ) |
115
+ | `--wait` / `--no-wait` | — | `--wait` | Ждать завершения импорта |
116
+ | `--timeout` | — | `3600` | Таймаут ожидания (сек) |
117
+ | `--poll-interval` | — | `1.5` | Интервал опроса статуса (сек) |
118
+
119
+ `--host`, `--token` и `--project-id` обязательны. Передавайте их через флаги или переменные окружения.
120
+
121
+ **Примеры:**
122
+
123
+ ```bash
124
+ # Через переменные окружения (рекомендуется)
125
+ export SAVETEST_HOST=https://savetest.example.com
126
+ export SAVETEST_TOKEN=sat_xxxxxxxxxxxxxxxx
127
+ export SAVETEST_PROJECT_ID=42
128
+
129
+ savetest upload --branch main --test-run-name "Regression $(date +%Y-%m-%d)"
130
+
131
+ # Новый тест-ран с эпиком, конфигурацией и метаданными
132
+ savetest upload \
133
+ --branch main \
134
+ --test-run-name "Smoke $(date +%Y-%m-%d)" \
135
+ --epic-name "Release 2.4" \
136
+ --configuration-name "Chrome / Windows" \
137
+ --version "2.4.0" \
138
+ --description "Nightly smoke on staging"
139
+
140
+ # Загрузить в существующий тест-ран
141
+ savetest upload --branch main --test-run-id 17
142
+
143
+ # Загрузить другой ZIP с вложениями, не ждать импорта
144
+ savetest upload --zip-file full-report.zip --include-attachments --no-wait
145
+ ```
146
+
147
+ ---
148
+
149
+ ## Настройка в Jenkins
150
+
151
+ Добавьте токен в **Jenkins → Manage Jenkins → Credentials** (тип: Secret text, ID: `savetest-token`).
152
+
153
+ В `Jenkinsfile` используйте `withCredentials` и `parameters`, чтобы не хранить конфигурацию в коде:
154
+
155
+ ```groovy
156
+ pipeline {
157
+ agent any
158
+
159
+ parameters {
160
+ string(name: 'SAVETEST_HOST', defaultValue: '', description: 'URL SaveTest')
161
+ string(name: 'SAVETEST_PROJECT_ID', defaultValue: '', description: 'ID проекта в SaveTest')
162
+ string(name: 'SAVETEST_BRANCH', defaultValue: '', description: 'Ветка Git')
163
+ string(name: 'SAVETEST_TEST_RUN_ID',defaultValue: '', description: 'ID тест-рана (пусто = создать новый)')
164
+ booleanParam(name: 'INCLUDE_ATTACHMENTS', defaultValue: false, description: 'Включать вложения в ZIP')
165
+ }
166
+
167
+ stages {
168
+ // ... ваши стадии запуска тестов ...
169
+
170
+ stage('Upload to SaveTest') {
171
+ steps {
172
+ withCredentials([string(credentialsId: 'savetest-token', variable: 'SAVETEST_TOKEN')]) {
173
+ sh '''
174
+ pip install savetest-cli
175
+
176
+ savetest zip_report "${WORKSPACE}/AllureReport" \
177
+ $([ "${INCLUDE_ATTACHMENTS}" = "true" ] && echo "--include-attachments")
178
+
179
+ savetest upload \
180
+ --host "${SAVETEST_HOST}" \
181
+ --project-id "${SAVETEST_PROJECT_ID}" \
182
+ --branch "${SAVETEST_BRANCH}" \
183
+ --test-run-name "Jenkins ${JOB_NAME} #${BUILD_NUMBER}" \
184
+ $( [ -n "${SAVETEST_TEST_RUN_ID}" ] && echo "--test-run-id ${SAVETEST_TEST_RUN_ID}" ) \
185
+ $( [ "${INCLUDE_ATTACHMENTS}" = "true" ] && echo "--include-attachments" )
186
+ '''
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
192
+ ```
193
+
194
+ > `SAVETEST_TOKEN` берётся из Jenkins Credentials и передаётся в окружение через `withCredentials` — в лог и в код сборки он не попадает.
195
+
196
+ ---
197
+
198
+ ## Получение API-токена
199
+
200
+ 1. Войдите в SaveTest.
201
+ 2. Откройте **Настройки профиля → API-токены**.
202
+ 3. Создайте новый токен и скопируйте его значение.
203
+ 4. Добавьте токен в Jenkins Credentials (или экспортируйте локально через `export SAVETEST_TOKEN=...`).
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "savetest-cli"
7
- version = "0.1.1"
7
+ version = "0.1.3"
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"
@@ -0,0 +1 @@
1
+ __version__ = "0.1.3"