WIP: ci: add an owner-approved hardware fixture pilot #100
No reviewers
Labels
No labels
accessibility
autorelease: pending
autorelease: tagged
bug
dependencies
documentation
duplicate
enhancement
github_actions
good first issue
help wanted
invalid
needs measurements
question
testing wanted
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Longshot!100
Loading…
Reference in a new issue
No description provided.
Delete branch "mooki/Longshot:ci/opt-in-hardware"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Why
Volunteers need a small, opt-in way to run authored Vulkan checks on real GPUs without giving an ordinary pull request access to their machines. This adds a disabled-by-default, owner-controlled pilot, not an upstream hardware service; it stays WIP until its real isolation and Forgejo execution are demonstrated.
I offer my Arch Linux PC with an RTX 4090 and an Intel UHD 770 as a second adapter, carrying the explicit
longshot-hardware-linuxlabel. Registration would happen only after a maintainer agrees and I confirm the proposed setup.What changed
.forgejo/workflows/hardware-fixtures.yml: manual dispatch only, only an owner'smain, explicitly disabled inMagicBeanDev/Longshot. The full approved SHA must match the dispatch and still be the remote head before execution. A repository variable enables the job; an explicit hardware label routes it. No PR trigger, arbitrary PR checkout, release secret or required merge check.scripts/hardware_fixtures.py: probe the selected GPU, then compile/run the existing five write-back cases and one copy-span case inside bounded, offline rootless Podman containers. The default--no-gpupath writesnot_runwithout probing hardware or starting a container. Missing devices, skips, wrong-device results, repeated/missing cases, missing validation activation and command/cleanup failures are not passes..git, untracked files, a home, a dump, saves, a display socket or a writable host directory. The payload receives no inherited token/proxy environment. Only fixed configuration rows leave it; raw command output and directory artifacts do not.tests/test_hardware_fixtures.py: GPU-free parsing, reporting, resource-command, cleanup, source-export and workflow-contract regressions. Authored command results exercise the orchestration without pretending to prove a real GPU or container.docs/forgejo-runners.md: put runner placement and security first; document the optional workflow, settings, prerequisites, limits, safe reporting command and human fallback. Replace its stale blanket claim that Actions is off and no runner exists with instructions to inspect current availability.Scope: this first slice tests an owner-reviewed default-branch snapshot, not an arbitrary PR head. Labels are routing, not isolation: another eligible workflow can select the same runner. Use only an owner's fork or dedicated control repository with trusted workflows and writers, never a personal PC in the shared upstream/organization runner pool. Game-based work, automatic request consumption and per-PR label approval remain decisions and separate work under #43.
The action and Vulkan-header pins match main.
tools.lockandscripts/tools.pysupply the Windows builder, not this Linux driver image, so they are unchanged. The owner must provision a reviewed image pinned by digest; the job never pulls an image, installs packages or accepts an SDK license. The aspect fixture is deliberately excluded until its explicit selector lands; the software-driver proposal in #67 remains separate.Flags and settings
No game setting, menu option, ini key or runtime default changes. These controls are documented in the runner guide and the command's help. Recommendations apply to this opt-in command, not to enabling hardware execution for everyone.
--run--no-gpu--commit--output--image--run--gpu-device--run--device-name--run--headers--run; workflow uses main's v1.4.345 pinHARDWARE_TESTS_ENABLEDtrueenablesHARDWARE_TEST_IMAGE--imageHARDWARE_TEST_DEVICE--gpu-deviceapproved_shadevice_nameVK_INSTANCE_LAYERSVK_LAYER_KHRONOS_validationin payloadVK_LOADER_DEBUGlayerin payloadVK_LAYER_SETTINGS_PATHMeasurements
main:
77f605a25f(2026-11-13)this PR: move/ci/opt-in-hardware @
2d9962311eBase suite: 509 passed, 0 failed, 19 skipped.
Head suite: 510 passed, 0 failed, 19 skipped.
Hardware: Arch Linux; Python 3.14.8 for the focused checks. No GPU was probed.
Scene: none; authored parser inputs and a no-GPU reporting invocation.
Method: focused standard-library tests, YAML parsing, a limited workflow-syntax check, the final-head no-GPU command and the whole game-free source suite. No frame rate, timing comparison or real hardware pass is claimed. The shared base suite was read rather than repeated.
How to reproduce:
python3 -I -B tests/test_hardware_fixtures.py;python3 -I -B scripts/hardware_fixtures.py --no-gpu --commit "$(git rev-parse HEAD)" --output hardware-results.mdwith a new output path;python -I -B tests/run_all.py --jobs 6 --strict.77f605a252d996231not_run, GPU not probedYAML parsing passed. Unmodified actionlint 1.7.12 returned three errors because it rejects the full-origin action URLs required by Forgejo. With only those known origins removed in a validation-only copy, and the custom runner label declared, its remaining syntax/expression/shell checks passed. The original workflow was not rewritten to suit GitHub's checker. This limited check is not a successful Forgejo job.
Testing
Tested: on Linux, all 27 focused tests above, including authored GPU/driver records, wrong/missing/repeated results, validation activation, bounded output and timeout, cleanup refusal, non-overwrite behavior, exact source export and no-GPU orchestration. The committed no-GPU command wrote the existing eight-column configuration-row format, naming the full head with
not_runandnot probed; that artifact was inspected. YAML parsing passed; the actionlint limitation and validation-only copy are recorded above. These are correctness checks, not hardware or speed measurements.The whole source suite also passed on the exact final head: 510 passed, 0 failed, 19 declared skips. The shared base is 509 passed, 0 failed, 19 skips; its former updater dependency failure no longer applies because PR 13 removed that updater test.
Not tested: no runner was installed, registered or started; no real Forgejo dispatch/checkout/upload or changed-head refusal was exercised. Podman is unavailable on this PC, so no image, resource-limit enforcement, confinement/escape resistance, GPU pass-through or real cleanup/cancellation was tested. No hardware GPU, Windows execution, AMD/Deck run, game build/run, swapchain or performance measurement. Mock command results prove controller logic only. The first real isolation and publication trial is still required before activation.
Needs other testers:
Screenshots
Nothing on screen. No window or game screenshot was produced.
Risk and rollback
A hardware label or a manual workflow is not a security boundary. Another eligible workflow can bypass this command, and a rootless container still shares the host kernel and GPU driver. Keep the controller in a trusted owner-controlled repository and separate environment without personal/game files or release credentials; never register this PC upstream merely because this workflow is gated. A pinned image, CDI mapping and runner configuration still need review. Driver hangs/escapes and forged results remain possible.
Missing tools, unsupported driver features or changed validation output deliberately fail. An offline, skipped, refused or timed-out job is not a pass and must fall back to human testing. Disable
HARDWARE_TESTS_ENABLEDand stop the runner to withdraw the machine; reverting these four files removes the pilot without touching game settings or saves.Reviewer notes
Start with
container_command(),export_source(),capture()and the fixed-format parser/report functions. The workflow/controller accepts only the owner's reviewedmain; it is not a secure arbitrary-PR executor. Decide runner ownership/placement, the label and image policy, who approves exact revisions and who reviews publication before activating anything. No payload signing/publishing secret is required; Forgejo's job token remains in trusted controller/action processes, not the containers.Keep #43 open. Automatic queue consumption, revision-bound PR labels, a separate PR publisher, other OS/device qualification and any dump-using workload are outside this first slice. #69's owner-controlled rolling monitor is not a Forgejo runner and is unchanged.
Issues
See #43. Related: #67 for software Vulkan fixtures and #69 for the separate local rolling record.
Checklist
For everyone
type(scope): description).main. — Tested on the assigned base77f605a25; not rebased over the later main changes.python -I -B tests/run_all.pyrun and passing (any failure that also fails onmainis named above). — Exact final head: 510 passed, 0 failed, 19 skipped.third_party/untouched (a new folder with aPROVENANCE.mdinstead).If applicable
Assisted-by:/Co-Authored-By:trailers.tests/that reads changed source updated in this PR, not weakened. — New workflow-contract checks; existing fixture checks unchanged.New on this forge; not opened on GitHub.
Assisted-by: GPT-6 Astra
Co-Authored-By: GPT-6 Astra [email protected]
View command line instructions
Manual merge helper
Use this merge commit message when completing the merge manually.
Checkout
From your project repository, check out a new branch and test the changes.