Skip to content

Hardware Validation #11

Hardware Validation

Hardware Validation #11

name: Hardware Validation
on:
workflow_dispatch:
inputs:
suite:
description: "Validation suite preset"
required: true
default: smoke
type: choice
options:
- smoke
- models-rt
- models-aot
- complete
boards:
description: "Comma-separated board IDs"
required: true
default: apollo510_evb,apollo330mP_evb
type: string
models:
description: "Optional comma-separated model IDs; empty uses suite defaults"
required: false
default: ""
type: string
engines:
description: "Optional comma-separated engines: helia-rt,helia-aot; empty uses suite defaults"
required: false
default: ""
type: string
toolchains:
description: "Optional comma-separated toolchains: arm-none-eabi-gcc,armclang,atfe; empty uses suite defaults"
required: false
default: ""
type: string
atfe_root:
description: "Optional ATFE_ROOT path; falls back to repository/environment variable ATFE_ROOT"
required: false
default: ""
type: string
transports:
description: "Optional comma-separated transports: rtt,uart,swo,usb_cdc; empty uses suite defaults"
required: false
default: ""
type: string
memories:
description: "Optional comma-separated memory placements: auto,tcm,sram,mram,psram; empty uses suite defaults"
required: false
default: ""
type: string
power:
description: "Power validation mode"
required: true
default: "off"
type: choice
options:
- "off"
- "on"
- "both"
jlink_serials:
description: "Optional comma-separated board=serial entries"
required: false
default: "apollo510_evb=1160003180,apollo330mP_evb=1160003409"
type: string
repeat:
description: "Repeat each selected case N times"
required: true
default: "1"
type: string
timeout:
description: "Per-case timeout in seconds"
required: true
default: "900"
type: string
defaults:
run:
shell: bash
env:
UV_CACHE_DIR: ${{ github.workspace }}/.uv-cache
UV_PYTHON_INSTALL_DIR: ${{ github.workspace }}/.uv-python
SEGGER_RTT_PATH: ${{ github.workspace }}/segger-rtt
concurrency:
group: hardware-validation-${{ inputs.boards }}
cancel-in-progress: false
jobs:
validate:
runs-on: [self-hosted, hpx-hardware]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
lfs: true
- name: Install uv
uses: astral-sh/setup-uv@v5
with:
enable-cache: true
- name: Install Python
run: uv python install 3.11
- name: Install test dependencies
run: uv sync --python 3.11 --group test
- name: Fetch LFS fixtures
run: git lfs pull
- name: Fetch SEGGER RTT sources
run: |
if [[ ! -f "${SEGGER_RTT_PATH}/RTT/SEGGER_RTT.c" || ! -f "${SEGGER_RTT_PATH}/RTT/SEGGER_RTT.h" || ! -f "${SEGGER_RTT_PATH}/Config/SEGGER_RTT_Conf.h" ]]; then
rm -rf "${SEGGER_RTT_PATH}"
git clone --depth 1 https://github.com/SEGGERMicro/RTT.git "${SEGGER_RTT_PATH}"
fi
- name: Configure ATFE_ROOT override
env:
HPX_ATFE_ROOT_OVERRIDE: ${{ inputs.atfe_root || vars.ATFE_ROOT }}
run: |
if [[ -n "${HPX_ATFE_ROOT_OVERRIDE}" ]]; then
echo "ATFE_ROOT=${HPX_ATFE_ROOT_OVERRIDE}" >> "${GITHUB_ENV}"
fi
- name: Check host dependencies
run: uv run hpx doctor
- name: Preview validation cases
env:
HPX_VALIDATION_SUITE: ${{ inputs.suite }}
HPX_VALIDATION_BOARDS: ${{ inputs.boards }}
HPX_VALIDATION_MODELS: ${{ inputs.models }}
HPX_VALIDATION_ENGINES: ${{ inputs.engines }}
HPX_VALIDATION_TOOLCHAINS: ${{ inputs.toolchains }}
HPX_VALIDATION_TRANSPORTS: ${{ inputs.transports }}
HPX_VALIDATION_MEMORIES: ${{ inputs.memories }}
HPX_VALIDATION_POWER: ${{ inputs.power }}
HPX_VALIDATION_JLINK_SERIALS: ${{ inputs.jlink_serials }}
HPX_VALIDATION_REPEAT: ${{ inputs.repeat }}
HPX_VALIDATION_TIMEOUT: ${{ inputs.timeout }}
run: |
args=(
--list
--suite "${HPX_VALIDATION_SUITE}"
--boards "${HPX_VALIDATION_BOARDS}"
--power "${HPX_VALIDATION_POWER}"
--repeat "${HPX_VALIDATION_REPEAT}"
--timeout "${HPX_VALIDATION_TIMEOUT}"
)
if [[ -n "${HPX_VALIDATION_MODELS}" ]]; then
args+=(--models "${HPX_VALIDATION_MODELS}")
fi
if [[ -n "${HPX_VALIDATION_ENGINES}" ]]; then
args+=(--engines "${HPX_VALIDATION_ENGINES}")
fi
if [[ -n "${HPX_VALIDATION_TOOLCHAINS}" ]]; then
args+=(--toolchains "${HPX_VALIDATION_TOOLCHAINS}")
fi
if [[ -n "${HPX_VALIDATION_TRANSPORTS}" ]]; then
args+=(--transports "${HPX_VALIDATION_TRANSPORTS}")
fi
if [[ -n "${HPX_VALIDATION_MEMORIES}" ]]; then
args+=(--memories "${HPX_VALIDATION_MEMORIES}")
fi
if [[ -n "${HPX_VALIDATION_JLINK_SERIALS}" ]]; then
args+=(--jlink-serials "${HPX_VALIDATION_JLINK_SERIALS}")
fi
uv run hpx validate "${args[@]}"
- name: Run hardware validation
env:
HPX_VALIDATION_SUITE: ${{ inputs.suite }}
HPX_VALIDATION_BOARDS: ${{ inputs.boards }}
HPX_VALIDATION_MODELS: ${{ inputs.models }}
HPX_VALIDATION_ENGINES: ${{ inputs.engines }}
HPX_VALIDATION_TOOLCHAINS: ${{ inputs.toolchains }}
HPX_VALIDATION_TRANSPORTS: ${{ inputs.transports }}
HPX_VALIDATION_MEMORIES: ${{ inputs.memories }}
HPX_VALIDATION_POWER: ${{ inputs.power }}
HPX_VALIDATION_JLINK_SERIALS: ${{ inputs.jlink_serials }}
HPX_VALIDATION_REPEAT: ${{ inputs.repeat }}
HPX_VALIDATION_TIMEOUT: ${{ inputs.timeout }}
run: |
mkdir -p results/validation
args=(
--suite "${HPX_VALIDATION_SUITE}"
--boards "${HPX_VALIDATION_BOARDS}"
--power "${HPX_VALIDATION_POWER}"
--repeat "${HPX_VALIDATION_REPEAT}"
--timeout "${HPX_VALIDATION_TIMEOUT}"
--output-dir results/validation
--junit-xml results/validation/junit.xml
)
if [[ -n "${HPX_VALIDATION_MODELS}" ]]; then
args+=(--models "${HPX_VALIDATION_MODELS}")
fi
if [[ -n "${HPX_VALIDATION_ENGINES}" ]]; then
args+=(--engines "${HPX_VALIDATION_ENGINES}")
fi
if [[ -n "${HPX_VALIDATION_TOOLCHAINS}" ]]; then
args+=(--toolchains "${HPX_VALIDATION_TOOLCHAINS}")
fi
if [[ -n "${HPX_VALIDATION_TRANSPORTS}" ]]; then
args+=(--transports "${HPX_VALIDATION_TRANSPORTS}")
fi
if [[ -n "${HPX_VALIDATION_MEMORIES}" ]]; then
args+=(--memories "${HPX_VALIDATION_MEMORIES}")
fi
if [[ -n "${HPX_VALIDATION_JLINK_SERIALS}" ]]; then
args+=(--jlink-serials "${HPX_VALIDATION_JLINK_SERIALS}")
fi
uv run hpx validate "${args[@]}"
- name: Upload validation artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: hardware-validation-${{ github.run_id }}
path: |
results/validation/
!results/validation/**/work/**
if-no-files-found: warn