TestHub · Hardware-in-the-loop CI

Кожен pull request — перевірений на реальних платах.

Власна тестова ферма у вашій лабораторії. CI-пайплайни й розробники запускають тести прошивки на реальному залізі й емуляторах за вашим файрволом, і жоден пристрій лабораторії не має бути доступним ззовні.

  • Без відкритих портів і VPN
  • Ваші тести без змін
  • Результати в pull request
GitHub Actions · test-on-hardware
$ thub run --type hw \
    --label board:nucleo-f401re \
    --command './ci/test.sh' --wait
Job A-00123 → lab-hw-01   QUEUED → RUNNING
flash ok · uart captured · pytest
PASSED  tests=42  failed=0
→ comment posted on PR #128
Ілюстративний запуск.

Проблема

Плати стоять у закритій лабораторії. CI до них не дістається.

Ручне тестування перед релізом

Прошити, дивитися лог, повторити. Кожен реліз чекає на людину біля стенда.

Баги, які видно лише на залізі

Проблеми з таймінгами, периферією й живленням проходять симуляцію і їдуть у поле.

Стенди, які не поділиш

Інженери конфліктують за одну плату, а віддалені розробники взагалі не мають до неї доступу.

Як це працює

Одна команда. Однаково в CI і на ноутбуці.

Той самий thub run працює в кроці пайплайна й на машині розробника, тож будь-який збій CI відтворюється точно.

AGENT · thub

CI-пайплайни й розробники

CLI і єдиний спосіб створити завдання. GitHub Actions, GitLab, Bitbucket, Jenkins або ноутбук.

COORDINATOR

Черга, планувальник, дашборд

Єдине джерело істини й єдиний компонент із публічним HTTPS-портом. Логи транслюються наживо.

Ваша лабораторія · без вхідного трафіку

CLIENT · HW

Прошиває й тестує реальну плату

CLIENT · SW

Запускає емулятор у Docker

  1. 01 Запуск

    thub run надсилає завдання: тип, мітки, команду, вхідні файли.

  2. 02 Розподіл

    Воно потрапляє на вільний Client з потрібним типом, мітками й групою. Ніколи двічі.

  3. 03 Підготовка

    Client завантажує прошивку й готує плату чи емулятор.

  4. 04 Виконання

    Ваша команда виконується. Вивід і UART-логи транслюються в CI та дашборд.

  5. 05 Вердикт

    Код виходу 0 — пайплайн проходить, будь-який інший — падає. Повертаються підсумки JUnit.

Сценарії

Одна лабораторія для всіх способів тестування

Hardware-in-the-loop CI

Кожен push збирає прошивку, а Client у лабораторії прошиває реальну плату через ST-Link, читає її UART і запускає тести.

Ферми емуляторів

QEMU, Renode чи ваш симулятор на Linux-машинах, за бажанням у Docker. Масштабуєтеся, додаючи VM.

Віддалений доступ для розробників

Відтворіть збій CI з дому на тому самому стенді, де він стався.

Спільні стенди без конфліктів

Резервуйте плату на час від 30 хвилин до 8 годин або на власний. На ній виконуються лише ваші задачі, а щойно час спливає, вона звільняється.

Окремі пули

Групи й мітки спрямовують завдання на потрібне залізо, наприклад нічний пул окремо від пулу для PR.

Будь-які консольні тести

pytest, ctest, Robot Framework, раннер у Docker або скрипт прошивки й smoke-тесту.

Віддалений стенд

Лабораторний стенд — прямо у VS Code

Зарезервуйте плату просто з редактора, а потім прошивайте, налагоджуйте, читайте її послідовні порти й дивіться камеру так, ніби вона стоїть на вашому столі. Лабораторія й далі не приймає жодних вхідних зʼєднань, а все завершується разом із резервуванням.

  • RESERVE30 хвилин, 2, 4 чи 8 годин або власний час. Одночасно одне резервування HIL і одне SIL.
  • FLASHОдин клік або задача збірки, потім перевірка секцій.
  • DEBUGF5 і стандартні клавіші налагодження, Cortex-Debug через SWD і OpenOCD.
  • UARTТермінал VS Code з мітками часу, файл журналу або звичайний TCP-сокет.
  • RTTЖурнали SEGGER RTT у терміналі.
  • CAMERAУ VS Code, mpv, ffplay, VLC або браузері. Доступна лише у вашому резервуванні.
  • AUDITХто яку плату резервував, на скільки й чим це закінчилося.
VS Code · TestHub · Ports
lab-hw-01 · HIL
зарезервовано для вас до 16:00
  UART    dut1-uart      localhost:40001
  GDB     ST-Link #1     localhost:3333
  RTT     channel 0      localhost:19021
  CAMERA  bench camera   localhost:8890
  WEB     client:8080    localhost:48080
⚠ залишилось 10 хвилин · Продовжити +1 год · Звільнити
Для ілюстрації.

Можливості

Усе потрібне — у розширенні для VS Code

TestHub працює там, де вже є розробники вбудованих систем, — у редакторі. Усі функції нижче працюють у VS Code і звертаються до вашого власного Coordinator.

Лабораторія й резервування

  • Резервуйте плату просто з редактора: на 30 хвилин, 2, 4, 8 годин або на власний час.
  • Тримайте одночасно одне апаратне (HIL) і одне симуляційне (SIL) резервування.
  • Попередження за 10 хвилин до кінця резервування: продовження (+1 година) або звільнення одним кліком.
  • На вашій платі виконуються лише ваші задачі; щойно час спливає, плата звільняється.

Прошивка й налагодження з VS Code

  • Прошивайте віддалену плату своєю прошивкою (ELF) одним кліком або як задачу збірки.
  • Прошивка після збірки: успішна збірка автоматично завантажується на плату, а незмінений образ можна пропустити.
  • Перевірка після прошивки (порівняння секцій), далі — скидання й запуск, зупинка або старт налагодження.
  • Налагоджуйте віддалену плату клавішею F5 і стандартними клавішами налагодження через Cortex-Debug.
  • Обирайте ST-Link (SWD-зонд) для прошивки чи налагодження прямо з його запису в дереві.
  • Працює через SWD і OpenOCD на Client плати; ціль OpenOCD задається для кожної плати або робочого простору.
  • Повторне підключення налагоджувача, якщо звʼязок обірвався.

Послідовні порти й журнали

  • Відкривайте UART плати як термінал VS Code з мітками часу.
  • Записуйте у файл усе, що отримує послідовний термінал.
  • Підключайтеся до будь-якого UART з інших інструментів як до звичайного TCP-сокета (наприклад, через pyserial).
  • Журнали RTT: читайте вивід SEGGER RTT з плати в терміналі, зі збереженими налаштуваннями пошуку для кожної плати.

Камера

  • Дивіться камеру плати у VS Code, у зовнішньому програвачі (mpv, ffplay, VLC) або в браузері.
  • Кожен потік камери доступний лише у вашому резервуванні й зупиняється, коли воно закінчується.

Порти й сервіси

  • Одна панель Ports показує всі локальні порти підключених плат: UART, GDB, RTT, камеру й переадресовані сервіси.
  • Переадресуйте сервіс, що працює на Client плати (наприклад, вебінтерфейс), і відкрийте його у VS Code.
  • Переадресовані сервіси зберігаються для кожної плати й відновлюються після повторного підключення.

Налаштування й безпека

  • Вхід до вашого Coordinator за ключем доступу, що зберігається в захищеному сховищі секретів VS Code.
  • Agent CLI сам встановлюється й оновлюється у VS Code — окремо нічого ставити не треба.
  • Працює через Remote-SSH, WSL і dev containers: інструменти запускаються на тій самій машині, що й розширення.

STM32G491

Демо-прошивка в комплекті

Демо-проєкт для STM32G491: періодичне повідомлення tick в UART, керування світлодіодом через UART (ON, OFF, BLINK), журнали RTT і незалежний сторожовий таймер, що скидає плату, якщо вона перестає відповідати.

Обмеження — чесно

  • Керування живленням через USB (перезапуск, увімкнення, вимкнення) працює лише під час вашої задачі на платі. Керування живленням на весь час резервування поки недоступне.
  • Переадресовані сервіси мають слухати 127.0.0.1 на хості Client.

Залізо

Плати, польотні контролери й симулятори

Кожна ціль підключається за одним шаблоном: вказати USB-порт, прошити рідним інструментом, перевірити результат. Готові скрипти й конфігурації Client є в репозиторії прикладів.

ЦільПідключенняПрошивкаПеревірка через
STM32 Nucleo-64ST-LINK/V2-1st-flashvirtual COM port
nRF52840 DKJ-Link OBnrfutilVCOM
ESP32-DevKitCCP2102N UARTesptoolUART
Arduino Uno R3ATmega16U2avrdudeUSB serial
Betaflight FCSTM32 USB / DFUdfu-utilBetaflight CLI
ArduPilot FCUSBuploader.pyMAVLink
RenodeSW Client, Docker—emulated UART
QEMUSW Client—semihosting, exit code

А також керування живленням через смарт-USB-хаб під час ваших задач, кілька плат на один Client і планові нічні перезавантаження.

CI/CD і код-рев’ю

Результати там, куди рев’юери вже дивляться

Крок пайплайна падає рівно тоді, коли падають тести. Скасування пайплайна скасовує завдання. Тести, що впали, зʼявляються в pull чи merge request.

GitHub ActionsGitLabBitbucketJenkins

JUnit із pytest, ctest, Robot Framework, Maven і Gradle.

Pull request #128 · коментар

✓ PassedA-00123 · lab-hw-01 · 3 m 12 s

42 tests · 0 failed · 0 skipped

- uses: andrianyablonskyy/thub-action@v1
  with:
    type: hw
    key: ${{ secrets.THUB_CI_TOKEN }}

Ілюстративний коментар. GitHub action також пише Job Summary і статус коміту.

Безпека

Створено, щоб пройти вашу перевірку безпеки

  • Лише вихідні зʼєднання. Машини лабораторії самі підключаються через HTTPS. Файрвол не пропускає вхідних зʼєднань.
  • On-premises. Прошивки, логи й стан завдань залишаються у вашій мережі.
  • Мінімальні привілеї. Завдання виконуються від сервісного користувача, ніколи від root. CI-токени не потрапляють у лабораторію.
  • SSO. Вхід через GitHub і Google лише для ваших організацій чи доменів.
  • Журнал аудиту. Кожна зміна й резервація — з автором.

Розгортання

Легко підтримувати, швидко запустити

Один Coordinator — це один процес Node.js із SQLite, який обслуговує десятки Clients і сотні завдань на день. Скрипт швидкого старту за кілька хвилин піднімає Coordinator, демо-Client і перше завдання.

Docker amd64 · arm64ComposeKubernetesAnsiblesystemd

Почніть з пілота

30 днів у вашій лабораторії із зарахуванням у ліцензію

Ми налаштовуємо TestHub для вас: до 4 плат, один пайплайн і супровід. Вартість платного пілота зараховується в річну ліцензію.

Безкоштовний огляд стенда →30 хвилин з інженером

Огляд стенда

Покажіть нам свій стенд.

За 30 хвилин розкладемо ваші плати й пайплайн у налаштування TestHub і план пілота. Безкоштовно.

info@adsystem.pro · +380 67 439 1881

Ваші дані потрібні лише для відповіді вам.