Continuous Integration for Embedded Hardware
Project description
BenchCI
Continuous Integration for real embedded hardware.
Build firmware in CI, flash a real device, run hardware tests, and get logs/results back automatically.
🎥 Demo
Watch BenchCI run real hardware tests directly from CI:
STM32 + Raspberry Pi + GitHub Actions
No simulation. Real device.
🧪 What this demo shows
- CI pipeline builds firmware
- BenchCI schedules a real hardware bench
- Device is flashed automatically
- Tests run on actual hardware
- Results and logs are returned to CI
👉 No simulation. No mocks. Real hardware in the loop.
Why BenchCI?
Most embedded testing still looks like this:
- build firmware
- flash the board manually
- open a serial terminal
- send a command
- read logs by hand
- repeat after every change
That works for one engineer at one desk.
It breaks when you need repeatable validation, shared benches, CI pipelines, release gates, or remote teams.
BenchCI turns real hardware into a CI-executable test target.
Quickstart
pip install benchci
benchci login
benchci run -b bench.yaml -s suite.yaml -a build/fw.elf
BenchCI will:
- flash firmware
- execute your test suite on real hardware
- validate device behavior
- generate structured results and logs
Create or access your workspace from:
https://app.benchci.dev
Read the docs:
https://docs.benchci.dev
The core idea
BenchCI separates the physical bench from the test logic:
bench.yaml -> hardware setup
suite.yaml -> test steps
benchci run -> real hardware execution
What BenchCI can automate
BenchCI can:
- flash firmware with OpenOCD, STM32CubeProgrammer, J-Link, or esptool
- talk to devices over UART, Modbus RTU/TCP, and CAN
- control GPIO locally or through a remote Agent
- run local tests on a hardware-connected machine
- run remote tests through a customer-managed Agent
- run cloud-scheduled tests through BenchCI Cloud
- return artifacts, logs, and structured results to CI
Example suite.yaml
version: "1"
suite:
name: firmware_smoke
tests:
- name: boot_ok
steps:
- expect_uart:
node: dut
transport: console
contains: "[BOOT] OK"
within_ms: 3000
- name: ping
steps:
- send_uart:
node: dut
transport: console
data: "PING\n"
- expect_uart:
node: dut
transport: console
contains: "PONG"
within_ms: 1000
Run it:
benchci run -b bench.yaml -s suite.yaml -a build/fw.elf
CI example
benchci run --cloud --bench-id my-bench --suite suite.yaml --artifact build/fw.elf
Typical flow:
GitHub Actions / GitLab CI
↓
BenchCI CLI
↓
BenchCI Cloud
↓
Cloud-connected Agent
↓
Real hardware
↓
Results + artifacts
Documentation path
Start here:
Then use the reference docs for bench.yaml, suite.yaml, CLI commands, Agent, Cloud Mode, GPIO, architecture, and security.
Early access
BenchCI is currently in early access.
For onboarding, pilots, or managed hardware demos:
tech@benchci.dev
No simulation. Real device.
BenchCI is for teams that want automated validation on the hardware they actually ship.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file benchci-0.4.1.tar.gz.
File metadata
- Download URL: benchci-0.4.1.tar.gz
- Upload date:
- Size: 78.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ded0eb1b15515952dc8e01056b23e7ab07db7f5df2a1eed13cc1707fd9806cf
|
|
| MD5 |
2c386ba336ec4c16950d1b4853f07351
|
|
| BLAKE2b-256 |
efb8dd4afb55f00089cdaa4a77fbb4f98f27b8dffe741d02d2ddc1a0c46d3c9a
|
File details
Details for the file benchci-0.4.1-py3-none-any.whl.
File metadata
- Download URL: benchci-0.4.1-py3-none-any.whl
- Upload date:
- Size: 92.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
484c38665ff225a8da680b8949410c29196521e3ec6720a7195cd43f47cadfea
|
|
| MD5 |
cb662d7b5f340b3fef241b5c8cb6b418
|
|
| BLAKE2b-256 |
87e54d7137bad2a8ec294841ab7a3997807f6bbf5733d0bfe3d0424cd0455efe
|