Мы связываем голосовые команды в Telegram с запуском автотестов в GitHub Actions и сбором результатов в TMS ТестОпс. Логика такая: говорим чат-боту что-то вроде: «Запусти регресс на staging в Chrome!», бот распознаёт речь, через MCP‑сервер (и/или API) инициирует workflow_dispatch в нужном репозитории, а результаты и статус выполнения «приземляются» в запусках ТестОпс. Эта связка и схема параметров подтверждены руководствами по интеграции GitHub ↔ ТестОпс и MCP ↔ GitHub.
Практическая реализация: локальный Whisper + обработчик голосовых сообщений, валидатор параметров запуска, GitHub Actions с обязательными inputs для запусков из ТестОпс и мониторинг/отмена прогонов через готовые MCP‑инструменты list_workflow_runs и cancel_workflow_run.
В документации подробно описано, как настроить токен ТестОпс.
В нашем блоге есть серия статей о настройке связки с MCP.
*Whisper — это модель глубокого обучения, оптимизированная для работы на локальных устройствах, включая CPU и GPU. Она требует достаточных вычислительных ресурсов, но ее открытый исходный код позволяет разработчикам настраивать и оптимизировать модель под конкретные задачи. Тестировщики отмечают высокую точность распознавания (WER — Word Error Rate — на уровне лучших облачных решений) и возможность дообучения для специфических сценариев.
name: tests
on:
push:
workflow_dispatch:
inputs:
ALLURE_JOB_RUN_ID:
description: "Service param for TMS ТестОпс"
required: false
ALLURE_USERNAME:
description: "Service param for TMS ТестОпс"
required: false
GITHUB_TESTS_BROWSER:
description: "Browser"
required: true
default: chrome
TEST_SUITE:
description: "Suite"
required: true
default: smoke
GITHUB_TESTS_ENDPOINT:
description: "Target stand"
required: true
default: https://staging.example.com
env:
ALLURE_RESULTS: allure-results
ALLURE_JOB_RUN_ID: ${{ github.event.inputs.ALLURE_JOB_RUN_ID }}
ALLURE_USERNAME: ${{ github.event.inputs.ALLURE_USERNAME }}
GITHUB_TESTS_BROWSER: ${{ github.event.inputs.GITHUB_TESTS_BROWSER }}
TEST_SUITE: ${{ github.event.inputs.TEST_SUITE }}
GITHUB_TESTS_ENDPOINT: ${{ github.event.inputs.GITHUB_TESTS_ENDPOINT }}
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: allure-framework/setup-allurectl@v1
with:
allure-endpoint: ${{ secrets.ALLURE_ENDPOINT }}
allure-token: ${{ secrets.ALLURE_TOKEN }}
allure-project-id: ${{ secrets.ALLURE_PROJECT_ID }}
- name: Run tests with streaming to TMS
run: |
echo "Browser: $GITHUB_TESTS_BROWSER; Suite: $TEST_SUITE; URL: $GITHUB_TESTS_ENDPOINT"
allurectl watch -- ./gradlew test
В ТестОпс одна джоба = один workflow GitHub; один запуск джобы = один запуск workflow. Статусы синхронизируются в обе стороны.
npx -y @modelcontextprotocol/server-github stdio
# если всё работает корректно, получаем ответ "Server listening on stdio"В готовом сервере GitHub инструменты для мониторинга/отмены присутствуют из коробки; запуск (dispatch) часто делают обычным REST‑вызовом GitHub API. Если в вашей сборке сервера есть инструмент для dispatch, используйте его; иначе вызывайте REST так, как показано в обработчике ниже — логика цепочки при этом не меняется.
def convert_telegram_voice_to_wav(oga_path: str) -> str:
import os
import ffmpeg
wav_path = oga_path.replace('.oga', '.wav')
(ffmpeg
.input(oga_path)
.output(
wav_path,
acodec='pcm_s16le',
ar=16000,
ac=1,
loglevel='error'
)
.overwrite_output()
.run(capture_stdout=True, capture_stderr=True)
)
if not os.path.exists(wav_path) or os.path.getsize(wav_path) == 0:
raise Exception("Conversion failed - output file empty or missing")
return wav_path
В нашем блоге опубликованы подробные гайды по настройке вебхуков для Telegram и Slack.
В ТестОпс тест‑кейсы формируются автоматически из кода после прогонов CI, что серьёзно экономит время на документацию.
jobs:
validate-inputs:
runs-on: ubuntu-latest
outputs:
browser: ${{ steps.v.outputs.browser }}
suite: ${{ steps.v.outputs.suite }}
endpoint: ${{ steps.v.outputs.endpoint }}
steps:
- id: v
run: |
case "${{ env.GITHUB_TESTS_BROWSER }}" in
chrome|firefox|edge|safari)
echo "browser=${{ env.GITHUB_TESTS_BROWSER }}" >> $GITHUB_OUTPUT ;;
*)
echo "Bad browser";
exit 1 ;;
esac
case "${{ env.TEST_SUITE }}" in
smoke|regression|api|ui|full)
echo "suite=${{ env.TEST_SUITE }}" >> $GITHUB_OUTPUT ;;
*)
echo "Bad suite";
exit 1 ;;
esac
echo "endpoint=${{ env.GITHUB_TESTS_ENDPOINT }}" >> $GITHUB_OUTPUT
{
"text": "Запуск {{launchName}} в проекте {{projectName}}: failed={{failedCount}}, broken={{brokenCount}}, passed={{passedCount}}. Ссылка: {{launchUrl}}"
}
Мы интегрировали голосовые команды с CI и ТестОпс. Бот распознаёт намерения, MCP/REST активируют и контролируют workflow_dispatch, а allurectl передаёт результаты в ТестОпс. Команда получает уведомления. Все процессы и настройки основаны на актуальных руководствах и проверенных практиках из экосистемы ТестОпс.