Две разные связки
С SourceCraft QA Деск работает в двух местах, и их полезно не путать:
- CI — пайплайн отдаёт отчёт автотестов, деск делает из него прогон. Работает так же, как с любым другим CI.
- Задачи и код — из карточки дефекта заводится задача в репозитории, а обратно приезжают её статус и пул-реквесты, которые её закрыли. Это уже интеграция, настраиваемая в кабинете.
Мы сами живём на этой связке: QA Деск собирается в SourceCraft CI на своём воркере.
Выгрузка отчёта из кубика
cubes:
- name: e2e
image: node:22-alpine
script:
- npx playwright test --reporter=junit
- wget -qO qadesk-cli https://qadesk.ru/cli/qadesk-cli-linux-amd64 && chmod +x qadesk-cli
- ./qadesk-cli upload --run "e2e" --env stage ./reports
Узнаваемых переменных пайплайна у SourceCraft утилита не знает, и ключ идемпотентности она не выдумывает — ключ из текущей даты молча выключил бы защиту от дублей. Задайте его сами:
QADESK_CI_RUN_ID=$SOME_RUN_ID ./qadesk-cli upload ./reports
# либо явно
./qadesk-cli upload --ci-run-id "$SOME_RUN_ID" --attempt 1 ./reports
Без ключа отчёт примется, но защиты от повторного прогона у него не будет — перезапуск создаст второй прогон.
Задача разработчику из карточки дефекта
Организация подключается в кабинете личным токеном (Настройки → Интеграции → SourceCraft), репозитории привязываются к проектам. Проверка живая: подключение сохраняется, только если SourceCraft принял токен и показал организацию — «настроено» у нас значит «работает». За две недели до истечения токена приходит предупреждение.
Дальше из карточки дефекта создаётся задача (Issue) — с шагами воспроизведения и ссылкой обратно. Существующую задачу можно привязать.
Что приходит обратно
Поллер раз в несколько минут читает связанные задачи и пишет в дефект только реальные смены:
- статус задачи изменился;
- у задачи появился пул-реквест;
- пул-реквест влит — вместе с хешем коммита слияния.
Хеш замыкает цепочку «дефект → задача → пул-реквест → сборка»: тестировщик видит, в какой именно версии искать исправление, и не перепроверяет вслепую.
Связь «задача ↔ пул-реквест» строит сама платформа по упоминанию номера задачи; мы её только читаем.
Зачем это тестировщику
Обычная развилка после исправления: дефект переведён в «готово к проверке», а перепроверять надо на конкретной сборке, и какая это сборка — знает только разработчик. Хеш коммита слияния в карточке отвечает на вопрос без переписки: если на стенде стоит другая версия, перепроверять рано.
Второе — видимость. Пул-реквест, появившийся у задачи, попадает в историю дефекта сам, поэтому «взяли в работу» перестаёт быть устным сообщением в чате.
Чего специально не делаем
Стадия дефекта не переводится автоматически при закрытии задачи — и не будет. Закрытая задача это утверждение разработчика «сделал», а не проверка тестировщика. Иначе дефекты закрывал бы тот, кто их чинит.
Машинные события в истории дефекта подписаны источником («SourceCraft»), а не владельцем подключения: писать «Максим влил пул-реквест», который влил другой человек, — самый дорогой вид вранья в истории дефекта.
Вебхуков пока нет — обратная связь работает опросом; вебхуки в дорожной карте. В карточке дефекта есть кнопка «Обновить из SourceCraft», если ждать не хочется.
С чего начать
- Подключите организацию личным токеном и привяжите репозиторий к проекту.
- Заведите первую задачу из карточки дефекта и посмотрите, как через несколько минут в историю придёт пул-реквест.
- Добавьте кубик выгрузки отчёта с явным
QADESK_CI_RUN_ID. - Если пайплайн шардит тесты — свой
--attemptна шард, иначе одинаковый ключ с другим содержимым получит честный отказ.
Попробуйте на своём проекте
Заведите проект, загрузите первый отчёт или заведите первый дефект — бесплатный тариф без карты. Нужно демо на ваших сценариях — напишите на hello@qadesk.ru.
Создать проектРядом по теме
JUnit XML
Своего формата у QA Деск нет: подойдёт JUnit XML, который ваш раннер уже пишет. Один запрос из пайплайна — и отчёт становится прогоном с историей, покрытием и дефектами.
JUnit XML — формат, который умеет писать всёGitLab CI
Отчёт из GitLab CI уезжает в QA Деск шагом в пять строк: токен проекта в masked-переменной, ключ идемпотентности утилита берёт из CI_PIPELINE_ID сама.
GitLab CI — один шаг в пайплайне, прогон в дескеSentry
Ошибка уровня error или fatal становится дефектом выбранного проекта — с типом исключения, местом и ссылкой на issue. Одна ошибка — один дефект, повторные срабатывания дублей не плодят.
Sentry — ошибка у пользователя приходит дефектом