savetest-cli
CLI-утилита для упаковки Allure-результатов в ZIP и загрузки их в SaveTest.
Установка
pip install savetest-cli
Быстрый старт
# 1. Упаковать директорию с результатами в ZIP
savetest zip_report ./AllureReport
# 2. Загрузить в SaveTest и дождаться создания тест-рана
export SAVETEST_HOST=https://savetest.example.com
export SAVETEST_TOKEN=sat_xxxxxxxxxxxxxxxx
export SAVETEST_PROJECT_ID=42
export SAVETEST_BRANCH=main
savetest upload --test-run-name "Smoke $(date +%Y-%m-%d)"
Переменные окружения
Все параметры можно задать через переменные окружения — не нужно указывать флаги при каждом вызове.
| Переменная | Обязательна | Описание |
|---|---|---|
SAVETEST_HOST |
да | URL вашего SaveTest, например https://savetest.example.com |
SAVETEST_TOKEN |
да | API-токен (создаётся в настройках профиля SaveTest) |
SAVETEST_PROJECT_ID |
да | ID проекта в SaveTest |
SAVETEST_BRANCH |
нет | Ветка Git, привязываемая к тест-рану |
SAVETEST_TEST_RUN_ID |
нет | ID существующего тест-рана (если не задан — создаётся новый) |
SAVETEST_TEST_RUN_NAME |
нет | Имя нового тест-рана |
SAVETEST_TEST_RUN_DESCRIPTION |
нет | Описание нового тест-рана |
SAVETEST_TEST_RUN_VERSION |
нет | Версия системы |
SAVETEST_TEST_RUN_REVISION |
нет | Ревизия / номер сборки |
SAVETEST_TEST_RUN_OBJECT |
нет | Объект тестирования |
SAVETEST_EPIC_ID |
нет | ID эпика для привязки тест-рана |
SAVETEST_EPIC_NAME |
нет | Наименование эпика в проекте (если ID неизвестен) |
SAVETEST_CONFIGURATION_ID |
нет | ID конфигурации тест-рана |
SAVETEST_CONFIGURATION_NAME |
нет | Наименование конфигурации в проекте |
SAVETEST_INCLUDE_ATTACHMENTS |
нет | true — включать вложения в ZIP, false — исключать (быстрее) |
Команды
savetest zip_report <path>
Упаковывает директорию с Allure-результатами в ZIP-архив.
По умолчанию вложения (картинки, видео, *-attachment.json) не включаются — архив получается меньше и грузится быстрее. Флаг --include-attachments включает их.
savetest zip_report [OPTIONS] PATH
| Опция | По умолчанию | Описание |
|---|---|---|
PATH |
— | Путь к директории с Allure-результатами |
--output, -o |
allure-results.zip |
Путь к выходному ZIP-файлу |
--include-attachments |
выключено | Включить вложения (картинки, видео, *-attachment.json) |
Примеры:
savetest zip_report ./AllureReport
savetest zip_report ./AllureReport --output report.zip
savetest zip_report ./AllureReport --include-attachments
savetest upload
Загружает ZIP-файл в SaveTest по частям и ждёт завершения импорта. По завершении выводит ссылку на созданный тест-ран.
savetest upload [OPTIONS]
| Опция | Env-переменная | По умолчанию | Описание |
|---|---|---|---|
--host |
SAVETEST_HOST |
— | URL SaveTest (обязательно) |
--token, -t |
SAVETEST_TOKEN |
— | API-токен (обязательно) |
--project-id, -p |
SAVETEST_PROJECT_ID |
— | ID проекта (обязательно) |
--zip-file, -z |
— | allure-results.zip |
Путь к ZIP-файлу |
--branch, -b |
SAVETEST_BRANCH |
— | Ветка Git |
--test-run-name |
SAVETEST_TEST_RUN_NAME |
— | Имя нового тест-рана |
--description |
SAVETEST_TEST_RUN_DESCRIPTION |
— | Описание нового тест-рана |
--version |
SAVETEST_TEST_RUN_VERSION |
— | Версия системы |
--revision |
SAVETEST_TEST_RUN_REVISION |
— | Ревизия / номер сборки |
--test-object |
SAVETEST_TEST_RUN_OBJECT |
— | Объект тестирования |
--epic-id |
SAVETEST_EPIC_ID |
— | ID эпика |
--epic-name |
SAVETEST_EPIC_NAME |
— | Наименование эпика в проекте |
--configuration-id |
SAVETEST_CONFIGURATION_ID |
— | ID конфигурации |
--configuration-name |
SAVETEST_CONFIGURATION_NAME |
— | Наименование конфигурации |
--test-run-id |
SAVETEST_TEST_RUN_ID |
— | ID существующего тест-рана |
--include-attachments |
SAVETEST_INCLUDE_ATTACHMENTS |
выключено | Сообщить серверу, что ZIP содержит вложения |
--chunk-size |
— | 50 |
Размер чанка при загрузке (МБ) |
--wait / --no-wait |
— | --wait |
Ждать завершения импорта |
--timeout |
— | 3600 |
Таймаут ожидания (сек) |
--poll-interval |
— | 1.5 |
Интервал опроса статуса (сек) |
--host, --token и --project-id обязательны. Передавайте их через флаги или переменные окружения.
Примеры:
# Через переменные окружения (рекомендуется)
export SAVETEST_HOST=https://savetest.example.com
export SAVETEST_TOKEN=sat_xxxxxxxxxxxxxxxx
export SAVETEST_PROJECT_ID=42
savetest upload --branch main --test-run-name "Regression $(date +%Y-%m-%d)"
# Новый тест-ран с эпиком, конфигурацией и метаданными
savetest upload \
--branch main \
--test-run-name "Smoke $(date +%Y-%m-%d)" \
--epic-name "Release 2.4" \
--configuration-name "Chrome / Windows" \
--version "2.4.0" \
--description "Nightly smoke on staging"
# Загрузить в существующий тест-ран
savetest upload --branch main --test-run-id 17
# Загрузить другой ZIP с вложениями, не ждать импорта
savetest upload --zip-file full-report.zip --include-attachments --no-wait
Настройка в Jenkins
Добавьте токен в Jenkins → Manage Jenkins → Credentials (тип: Secret text, ID: savetest-token).
В Jenkinsfile используйте withCredentials и parameters, чтобы не хранить конфигурацию в коде:
pipeline {
agent any
parameters {
string(name: 'SAVETEST_HOST', defaultValue: '', description: 'URL SaveTest')
string(name: 'SAVETEST_PROJECT_ID', defaultValue: '', description: 'ID проекта в SaveTest')
string(name: 'SAVETEST_BRANCH', defaultValue: '', description: 'Ветка Git')
string(name: 'SAVETEST_TEST_RUN_ID',defaultValue: '', description: 'ID тест-рана (пусто = создать новый)')
booleanParam(name: 'INCLUDE_ATTACHMENTS', defaultValue: false, description: 'Включать вложения в ZIP')
}
stages {
// ... ваши стадии запуска тестов ...
stage('Upload to SaveTest') {
steps {
withCredentials([string(credentialsId: 'savetest-token', variable: 'SAVETEST_TOKEN')]) {
sh '''
pip install savetest-cli
savetest zip_report "${WORKSPACE}/AllureReport" \
$([ "${INCLUDE_ATTACHMENTS}" = "true" ] && echo "--include-attachments")
savetest upload \
--host "${SAVETEST_HOST}" \
--project-id "${SAVETEST_PROJECT_ID}" \
--branch "${SAVETEST_BRANCH}" \
--test-run-name "Jenkins ${JOB_NAME} #${BUILD_NUMBER}" \
$( [ -n "${SAVETEST_TEST_RUN_ID}" ] && echo "--test-run-id ${SAVETEST_TEST_RUN_ID}" ) \
$( [ "${INCLUDE_ATTACHMENTS}" = "true" ] && echo "--include-attachments" )
'''
}
}
}
}
}
SAVETEST_TOKENберётся из Jenkins Credentials и передаётся в окружение черезwithCredentials— в лог и в код сборки он не попадает.
Получение API-токена
- Войдите в SaveTest.
- Откройте Настройки профиля → API-токены.
- Создайте новый токен и скопируйте его значение.
- Добавьте токен в Jenkins Credentials (или экспортируйте локально через
export SAVETEST_TOKEN=...).
Metadata
Release files for savetest-cli 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| savetest_cli-0.1.3.tar.gz | 20.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| savetest_cli-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 37.6 kB
Release files / savetest_cli-0.1.3.tar.gz
| Download URL | savetest_cli-0.1.3.tar.gz |
|---|---|
| Size | 20.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6609cd0ffb21049a2b4ddb405aebe348fb8ddead200ad695eebfc63093144b8a
|
|
BLAKE2b-256 checksum How to use checksums |
6d13f207b736005b3dca8df19f63bc7dd75313d56fa5e88383fb7ebd87f554b5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.2
|
Release files / savetest_cli-0.1.3-py3-none-any.whl
| Download URL | savetest_cli-0.1.3-py3-none-any.whl |
|---|---|
| Size | 17.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dce01d5a0f3db88d8e19074875e4757348e28976c95b3e221c2aef052098a873
|
|
BLAKE2b-256 checksum How to use checksums |
d4c2bcf81b93da4302d4282802cb628b9a59525030542b49d7f1e95141fa9c11
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.2
|
Security for savetest-cli 0.1.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.