This repository showcases how to hook remote development boards into FirmwareCI for automated firmware testing. We've set up two ODROID boards with full test suites that run boot tests, hardware checks, and performance validation. Both boards are not part of the FirmwareCI network but establish a connection to the server via our own VPN network. We harness Headscale for a scalable VPN solution.
Learn More: FirmwareCI Platform | Documentation
FirmwareCI handles CI/CD for firmware on servers and embedded systems. Instead of manually flashing and testing firmware on physical hardware, you can run automated tests on several remote boards over the network. This repository serves as the Infrastructure-as-Configuration store. All the necessary configurations can be found inside the .firmwareci directory. Both boards are connected to a Raspberry Pi running dutagent, which takes care of power-cycling, flashing, and serial output of the device. Each device is also connected to a PiKVM so one can hook up a variety of OS images. Both of these can be easily orchestrated inside tests using FirmwareCI.
- Network Address:
odroid.local - Control Host:
heracles.demo.vpn.firmware-ci.com - PiKVM:
freya.demo.vpn.firmware-ci.com
- Network Address:
odroid-2.local - Control Host:
erebus.demo.vpn.firmware-ci.com - PiKVM:
hestia.demo.vpn.firmware-ci.com
Both platforms are able to verify the same test cases independently of each other:
- Boot Tests: Verify successful firmware boot via serial console and network connectivity
- Hardware Enumeration: Validate ACPI tables and PCI device discovery
- Performance Testing: CPU load testing
- System Stability: Warm reboot testing to ensure reliable power management
Note:
This repository provides example configurations and workflows for demonstration purposes only. For detailed guidance on setting up and customizing FirmwareCI for your own hardware platforms, refer to the official documentation.
.firmwareci/
├── workflows/
│ └── Odroid-Board/ # ODROID-specific workflow and tests
│ ├── workflow.yaml # Main workflow definition
│ └── tests/ # Test suite definitions
├── duts/ # Device Under Test configurations
│ ├── odroid-h4/ # ODROID Board 1 configuration
│ └── odroid-h4-2/ # ODROID Board 2 configuration
└── storage/ # Shared storage configurations for images or other tooling
- PiKVM device (Download PiKVM Image)
- Raspberry Pi 4 (ARM32)
- Required files:
dutagent,dutagent.service,config.yaml - FirmwareCI VPN authentication key
-
Boot PiKVM with default configuration
-
Initial configuration:
ssh root@pikvm-ip
# Set to read-write mode
su root
rw
# Set your desired hostname
hostnamectl set-hostname <your-hostname>
# Change default passwords
passwd root
kvmd-htpasswd set admin
# Add demo KVM user
kvmd-htpasswd add demo
# Update PiKVM
pikvm-update- Connect to FirmwareCI VPN using Tailscale (Tailscale setup guide):
tailscale up --login-server=https://connect.firmware-ci.com --hostname=<your-hostname>.org --authkey=<your-auth-key>-
Copy required files to the Raspberry Pi:
dutagentbinary (ARM32)dutagent.servicesystemd unit fileconfig.yamlconfiguration file
-
Install dutagent:
# Install dutagent binary to system PATH
sudo install -m 755 dutagent /usr/local/bin/
# Copy configuration file
sudo mkdir -p /etc/dutagent
sudo cp config.yaml /etc/dutagent/config.yaml
# Install systemd service
sudo cp dutagent.service /etc/systemd/system/- Enable and start the service:
sudo systemctl daemon-reload
sudo systemctl enable dutagent.service
sudo systemctl start dutagent.service- Install dependencies and configure hardware:
# Install required tools
sudo apt-get update
sudo apt-get install -y flashrom
# Verify service status
sudo systemctl status dutagent.service- Connect to FirmwareCI VPN using Tailscale:
tailscale up --login-server=https://connect.firmware-ci.com --hostname=<your-hostname>.org --authkey=<your-auth-key>- Configure firewall rules to allow dutagent traffic (default port configuration in
/etc/dutagent/config.yaml)