TestHub · Hardware-in-the-loop CI
Кожен pull request — перевірений на реальних платах.
Власна тестова ферма у вашій лабораторії. CI-пайплайни й розробники запускають тести прошивки на реальному залізі й емуляторах за вашим файрволом, і жоден пристрій лабораторії не має бути доступним ззовні.
- Без відкритих портів і VPN
- Ваші тести без змін
- Результати в pull request
$ 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
- 01 Запуск
thub run надсилає завдання: тип, мітки, команду, вхідні файли.
- 02 Розподіл
Воно потрапляє на вільний Client з потрібним типом, мітками й групою. Ніколи двічі.
- 03 Підготовка
Client завантажує прошивку й готує плату чи емулятор.
- 04 Виконання
Ваша команда виконується. Вивід і UART-логи транслюються в CI та дашборд.
- 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Хто яку плату резервував, на скільки й чим це закінчилося.
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-64 | ST-LINK/V2-1 | st-flash | virtual COM port |
| nRF52840 DK | J-Link OB | nrfutil | VCOM |
| ESP32-DevKitC | CP2102N UART | esptool | UART |
| Arduino Uno R3 | ATmega16U2 | avrdude | USB serial |
| Betaflight FC | STM32 USB / DFU | dfu-util | Betaflight CLI |
| ArduPilot FC | USB | uploader.py | MAVLink |
| Renode | SW Client, Docker | — | emulated UART |
| QEMU | SW Client | — | semihosting, exit code |
А також керування живленням через смарт-USB-хаб під час ваших задач, кілька плат на один Client і планові нічні перезавантаження.
CI/CD і код-рев’ю
Результати там, куди рев’юери вже дивляться
Крок пайплайна падає рівно тоді, коли падають тести. Скасування пайплайна скасовує завдання. Тести, що впали, зʼявляються в pull чи merge request.
JUnit із pytest, ctest, Robot Framework, Maven і Gradle.
Pull request #128 · коментар
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 і перше завдання.
Почніть з пілота
30 днів у вашій лабораторії із зарахуванням у ліцензію
Ми налаштовуємо TestHub для вас: до 4 плат, один пайплайн і супровід. Вартість платного пілота зараховується в річну ліцензію.
Огляд стенда
Покажіть нам свій стенд.
За 30 хвилин розкладемо ваші плати й пайплайн у налаштування TestHub і план пілота. Безкоштовно.