Dashboard Architecture¶
The dashboard is a fully static page — no backend, no database. All data is fetched client-side at load time from two sources.
Data sources¶
flowchart LR
subgraph browser [Browser]
HTML["dashboard.html\n(static HTML + JS)"]
end
subgraph gh_api [GitHub Actions API]
runs["GET /actions/workflows/\nbuild-firmware.yml/runs"]
jobs["GET /actions/runs/{id}/jobs"]
end
subgraph pages [GitHub Pages]
xml["results/{type}/{device}-{release}/report.xml"]
devjson["results/devices.json"]
end
HTML -->|"fetch (no auth)"| runs
HTML -->|"fetch (no auth)"| jobs
HTML -->|"fetch"| xml
HTML -->|"fetch"| devjson
Hold "Alt" / "Option" to enable pan & zoom
Source 1 — GitHub Actions REST API¶
Used for: job status, run history, duration, links.
- Endpoint:
https://api.github.com/repos/fcefyn-testbed/lime-packages/actions/... - No authentication required (public repo)
- Rate limit: 60 requests/hour per IP (unauthenticated)
- Job names are parsed to extract device, place, and release:
test-firmware (belkin_rt3200_1 / 24.10.6)→ place=belkin_rt3200_1, release=24.10.6 - Supported job name patterns: see Device registry — Job types
Source 2 — Published report.xml files¶
Used for: per-test-case breakdown (pass / fail / skip counts and individual test names).
- Served from this repo's GitHub Pages alongside
dashboard.html - JUnit XML format, generated by pytest (
--junitxml) - Populated by the
collect-lime-results.ymlworkflow, which pulls artifacts fromfcefyn-testbed/lime-packagesCI every 6h — see Publishing results - Path convention:
results/{type}/{identifier}/report.xml - Direct links to reports use
PAGES_BASE(configured at the top ofdashboard.html):const PAGES_BASE = 'https://fcefyn-testbed.github.io/fcefyn_testbed_utils/ci-results/results/';
Source 3 — devices.json¶
Used for: registering device/release combinations that should always appear in the dashboard, even with no recent CI runs.
- Fetched from
results/devices.jsonon the same Pages deployment - Merged with the entries discovered from the GitHub API
Request flow¶
- Page loads → skeleton cards shown immediately (no blank state while loading)
- JS fetches last 10 workflow runs from GitHub API
- For each run, fetches the job list (parallel requests)
- Parses job names → builds a map of
{id → entry}with run history - Fetches
devices.jsonto merge in any registered entries not found via API - Renders device cards immediately with API data; release dropdown populated
- In parallel, fetches each
report.xmlfrom Pages - Cards with a
report.xmlre-render to show test case details; stats bar updates
Error handling¶
| Condition | Behaviour |
|---|---|
| GitHub API unreachable or rate-limited | Error banner with retry button shown in place of the grid |
report.xml missing or not yet published |
Card shows "Test details not yet published" |
devices.json missing |
Dashboard still works using API-discovered entries only |
Configuration¶
All tuneable constants are at the top of the <script> block in dashboard.html:
| Constant | Default | Description |
|---|---|---|
REPO |
fcefyn-testbed/lime-packages |
GitHub repo to query |
WF |
build-firmware.yml |
Workflow filename |
RUNS |
10 |
Number of recent runs to fetch |
RESULTS_BASE |
results/ |
Local path to report.xml files (relative to dashboard.html) |
PAGES_BASE |
https://fcefyn-testbed.github.io/… |
Absolute URL used for direct report links; set to '' to hide the links |