Continuous Integration for Embedded Hardware
Project description
BenchCI
Continuous Integration for Embedded Hardware
Flash firmware, run automated tests on real devices, and validate embedded systems in CI โ using simple YAML configs.
๐ Quickstart (30 seconds)
pip install benchci
benchci login
benchci run -b bench.yaml -s suite.yaml -a build/fw.elf
๐ Thatโs it โ BenchCI will:
- flash firmware
- execute tests on real hardware
- validate behavior
- generate structured artifacts
โก Why BenchCI?
Testing embedded firmware usually looks like this:
- flash firmware manually
- open serial terminal
- send commands
- watch logs
- write ad-hoc scripts
- repeat for every release
๐ This is manual, fragile, and not CI-friendly
BenchCI makes hardware testing:
- โ declarative
- โ repeatable
- โ CI-ready
- โ scalable across teams
๐ง Mental Model
BenchCI separates hardware and test logic:
bench.yamlโ your hardware setupsuite.yamlโ your tests
bench.yaml + suite.yaml
โ
benchci run
โ
real hardware execution
โ
results + logs
๐๏ธ How It Works
CI Pipeline / Developer
โ
โผ
benchci run
โ
โผ
BenchCI Agent
โ
โผ
Real Hardware Bench
โ
โผ
DUT / PLC / ECU
BenchCI separates:
- execution (CLI / CI)
- hardware access (Agent)
This enables:
- remote labs
- shared benches
- scalable hardware testing
๐ง What BenchCI Does
BenchCI connects your CI pipeline directly to real hardware and allows you to:
- flash firmware automatically (OpenOCD, CubeProgrammer, J-Link, esptool)
- interact with devices over UART, Modbus RTU/TCP, and CAN
- control and monitor GPIO (local or remote)
- validate behavior with structured test steps
- run tests on remote hardware via Agent
- generate reproducible artifacts
๐ Configuration Model
BenchCI uses two files:
bench.yaml
Defines your hardware:
- nodes (DUT, controllers, PLCs, etc.)
- transports (UART, Modbus, CAN)
- flashing configuration
- GPIO control
suite.yaml
Defines your tests:
- test cases
- step-by-step actions
- expected behavior
๐ Example
suite.yaml
version: "1"
suite:
name: "firmware-tests"
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:
benchci run -b bench.yaml -s suite.yaml -a build/fw.elf
๐ Supported Interfaces
Communication
- UART
- Modbus RTU
- Modbus TCP
- CAN
Hardware Control
- Linux GPIO
- Remote GPIO (via Agent)
- Mock GPIO
Flashing Backends
- OpenOCD
- STM32CubeProgrammer
- SEGGER J-Link
- esptool (ESP32)
๐งช Example Scenarios
examples/
โโโ device_boot_validation/
โโโ local_gpio_reset_and_ready/
โโโ remote_gpio_power_cycle/
โโโ modbus_rtu_plc_validation/
โโโ modbus_tcp_gateway_validation/
โโโ can_ecu_handshake/
โโโ multi_node_system_smoke/
๐ฆ Output Artifacts
BenchCI generates structured outputs:
benchci-results/
โโโ <timestamp>/
โโโ results.json
โโโ nodes/
โโโ dut/
โโโ flash.log
โโโ gpio.log
โโโ transport-console.log
Perfect for:
- CI pipelines
- debugging
- traceability
๐งฐ CLI Workflow
benchci doctorโ check environmentbenchci validateโ validate configsbenchci loginโ authenticatebenchci runโ execute tests
๐ CI Integration
BenchCI is designed for automation:
- GitLab CI (example included)
- GitHub Actions / Jenkins
- remote execution via Agent
๐ Documentation
Includes:
- quickstart
- installation
- configuration guides
- agent setup
- CI integration
๐ Repository Contents
This repository contains:
- documentation
- configuration examples
- CI examples
- helper tools
BenchCI core source code is maintained in a private repository.
๐ผ License
BenchCI is a commercial product.
A valid license key is required to run commands.
For access:
๐ง tech@benchci.dev
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.2.0.tar.gz.
File metadata
- Download URL: benchci-0.2.0.tar.gz
- Upload date:
- Size: 66.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2fffc8618c93156f53adaccb0807675a97ef0823c42e1e58454ead6c0b4f6f68
|
|
| MD5 |
b9c18f041ea71b932cc9624563400567
|
|
| BLAKE2b-256 |
98f94421c7c953faf32f739aee088310b32b765cfccc1f3031a6d2f4841ae896
|
File details
Details for the file benchci-0.2.0-py3-none-any.whl.
File metadata
- Download URL: benchci-0.2.0-py3-none-any.whl
- Upload date:
- Size: 79.4 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 |
b47bbf4d104a4b05ba19a1df7d4cc9f92793cf8b3d718268ffff6f4b85110db1
|
|
| MD5 |
8d37205e6aaa678ed759d214ec305ca9
|
|
| BLAKE2b-256 |
1ddb16affee2b17d19869fea46d931cf804dc5184622884d4085cfab2056cea0
|