Skip to content

ci(gui): fold the smoke steps into build + test and unify the drive legs - #209

Merged
agentjp merged 1 commit into
masterfrom
ci/gui-job-merges
Aug 2, 2026
Merged

ci(gui): fold the smoke steps into build + test and unify the drive legs#209
agentjp merged 1 commit into
masterfrom
ci/gui-job-merges

Conversation

@agentjp

@agentjp agentjp commented Aug 2, 2026

Copy link
Copy Markdown
Owner

Removes duplicated fixed cost inside gui.yml without dropping an assertion.

Shape

before after
6 x gui build + test, 5 x gui smoke 6 x gui build + test (launch smokes inside)
5 x gui drive assisted + 5 x gui drive inject 5 x gui drive
1 x gui drive mosaic unchanged, needs: [drive]

The smoke job re-paid a checkout, a rust-cache restore (41.6 s average across
the GUI legs) and a rebuild to produce the debug binary the same OS build+test
leg had already built. The two drive jobs built the identical drive-seam debug
binary twice per arch.

Step mapping

old job old step new location
smoke Install the virtual display + software Vulkan (Linux) build + test, same name
smoke Build (debug - the env hooks are debug-only) build + test, served by the existing Build step
smoke Launch smoke (xvfb + lavapipe) build + test, same name
smoke Portable-marker smoke (config lands beside the executable) build + test, same name
smoke Launch smoke (DX12 WARP) build + test, same name
smoke Launch smoke (paravirtual Metal) build + test, same name, guard tightened to matrix.os == 'macos-15'
drive-assisted Install the virtual display + software Vulkan + capture (Linux) drive, merged into the inject step's superset name
drive-assisted Install displayplacer (macOS resolution control) drive, merged into Install cliclick + displayplacer
drive-assisted Build (debug - the drive seam is debug-only) drive, merged build step
drive-assisted Drive the walk (xvfb + lavapipe / DX12 WARP / paravirtual Metal) drive, same names
drive-assisted Upload the gallery (evidence either way) drive, Upload the assisted gallery (evidence either way)
drive-inject Install the virtual display + software Vulkan + xdotool + capture (Linux) drive, same name
drive-inject Install cliclick + displayplacer (macOS clicks + resolution) drive, same name
drive-inject Build (debug - the env hooks are debug-only) drive, merged build step
drive-inject Inject the walk (xdotool under xvfb / SendInput / cliclick) drive, same names
drive-inject Upload the gallery (evidence either way) drive, Upload the inject gallery (evidence either way)

Adapted steps

  • Three Build (debug ...) steps collapse to one per job. Both smoke and drive
    ran a plain cargo build --locked of this crate under this workflow's env,
    identical to build+test's existing Build step, so one build serves both
    consumers in each merged job. The drive job's step is renamed
    Build (debug - the drive seam and the env hooks are debug-only).
  • The two Linux apt steps installed the same package set under different
    names; the drive job keeps the inject step's superset name. The two macOS
    brew steps keep the inject step's cliclick + displayplacer name.
  • The two gallery uploads are renamed assisted / inject so a single job
    does not carry two identically named steps. Artifact names, paths inside the
    artifacts and retention are unchanged, so gui drive mosaic composes the
    same 2 x 5 grid from the same gui-drive-* pattern.
  • Launch smoke (paravirtual Metal) keys on matrix.os == 'macos-15' instead
    of runner.os == 'macOS': the build+test matrix also carries
    macos-15-intel, whose hosted VMs expose no Metal and which the smoke matrix
    deliberately omitted.

Separation of verdicts

Each walk writes its own gallery directory (gallery-assisted /
gallery-inject), and the three inject steps run under !cancelled(), so a
failed assisted walk still produces the injected walk's verdict and evidence -
what two separate jobs gave before. Both uploads keep if: always().

Timeouts

Per-arch step p90 over 20 runs per leg (2026-08-02): the slowest arch,
windows-2025, spends ~200 s on the assisted walk, ~175 s on the injected walk
and ~130 s on a cold build. gui drive is capped at 45 minutes. gui build + test had no cap; it inherits 45 minutes as well, since the launch smokes it
absorbed open real windows and the deleted smoke job carried a cap for that
reason.

Cache scopes

smoke, drive-assisted and drive-inject shared one gui-drive rust-cache
lineage; only the merged drive job uses it now, and the smoke build rides
build+test's own scope. The lineage name is kept explicit rather than
defaulting to the job id, so the existing archive stays addressable across the
job rename.

Checks

action-validator, ryl -s ., zizmor, typos, taplo fmt --check and
classify-diff.ps1 -SelfTest pass locally. No required status check matches an
inner gui.yml job name (ci-ok, conventional commits + banned words,
dependency-review, analyze (rust)), and no sweep marker key, script or
other workflow referenced the removed job names.

The launch smokes now close each `gui build + test` leg, reusing that job's
debug binary instead of paying a second checkout, cache restore and rebuild
per OS. The assisted and injected walks share one `gui drive` job per arch for
the same reason, each keeping its own gallery directory, artifact name and
verdict; the injected walk runs under `!cancelled()` so an assisted failure
cannot suppress it.

Cache scopes drop from three sharing `gui-drive` to one. The merged drive job
caps at 45 minutes, above the ~510 s its slowest arch spends on a cold build
plus both walks; `gui build + test` gains the same cap, which the deleted
smoke job carried against a window that never exits.
@agentjp
agentjp merged commit e50b82b into master Aug 2, 2026
61 of 63 checks passed
@agentjp
agentjp deleted the ci/gui-job-merges branch August 2, 2026 06:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant