Hardware Validation #11
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |