Skip to content

ci(release): give the frontend suite its own runner - #291

Merged
andrescera merged 2 commits into
mainfrom
ci/split-release-test-jobs
Aug 21, 2026
Merged

ci(release): give the frontend suite its own runner#291
andrescera merged 2 commits into
mainfrom
ci/split-release-test-jobs

Conversation

@andrescera

Copy link
Copy Markdown
Member

What

Splits publish-release.yml's combined bun run test step into per-workspace
steps, and lifts the frontend suite into its own job (release-frontend-tests)
that mirrors build-check.yml's test-fe.

rpc / i18n / backend stay in release-package-contracts — they absorb the
shared runner without trouble.

Why

Two consecutive release dispatches of the same SHA died at the same place:

EncoderDialog.axes.test.ts > caps-full: reaches the 4K/60 ceiling and enables H.265
Error: Test timed out in 5000ms.

— at 5544 ms (run 32449107745)
and 5480 ms (run 32450232432).
Reproducible, ~10% over budget, so not random.

It is not the test. It passes 5/5 in isolation, passes in build-check on the
same commit, and passes locally (3780/3780).

It is the job:

build-check test-fe publish-release gate (before)
Command bun run --filter frontend test bun run test — rpc + i18n + frontend + backend
Runner dedicated shared, after ruby/gem install, two .deb builds, full lint/typecheck
Frontend suite ~298 s 430 s

Several specs render a full dialog synchronously against vitest's 5 s default;
on a runner carrying all four suites plus the packaging contracts, the heaviest one
tips over. build-check has never hit this because it gives that suite a runner to
itself. This does the same.

How to verify

  • git diff --statone file, .github/workflows/publish-release.yml. No
    *.test.ts, no vite.config.ts, no testTimeout anywhere in the diff.
  • Coverage is unchanged: root test chained exactly
    @ceraui/rpc@ceraui/i18nfrontendbackend, and all four still run.
  • The new job is in the needs: of build-ceraui-system, build-debian-package
    and publish-federation, so it gates publication rather than running beside it.
  • Full local gate green on this branch: rpc 423, i18n 702, frontend 3780/281 files,
    backend 4698, lint 0 errors. EncoderDialog.axes.test.ts run 5× in isolation:
    10/10 every time.

Risks

Low, CI-only. Costs one extra runner and one extra bun install (cached) per
release; the frontend suite now runs in parallel with the contract gate rather
than after it, so wall-clock should improve slightly. No source, no test, and no
release semantics change. publish-release.yml is a skip_workflows entry in the
root ci-local.manifest.yaml ("secrets/OIDC"), so no manifest leaf or digest is owed.

Two consecutive release dispatches of the same SHA died at the same place:

  EncoderDialog.axes.test.ts > caps-full: reaches the 4K/60 ceiling…
  Error: Test timed out in 5000ms.        (5544 ms, then 5480 ms)

Not a flake, and not the test's fault. It passes 5/5 in isolation, passes in
build-check on the same commit, and passes locally 3780/3780. The release gate
was simply the only job that ran it on a runner which had already installed
ruby+gems, built two .debs for the packaging contracts, and run a full
lint/typecheck — the frontend suite took 430 s there against ~298 s in
build-check, and the heaviest synchronous render landed ~10% over vitest's 5 s
default.

build-check has never had this problem because it gives the frontend suite a
runner to itself (test-fe). This does the same: the combined `bun run test` is
replaced by per-workspace steps, with the frontend suite lifted into its own
job that mirrors test-fe. rpc/i18n/backend stay in the contract job — they
absorb the shared runner fine.

Coverage is identical: `bun run test` chained exactly these four workspaces, and
all four still run. The new job is wired into the `needs` of build-ceraui-system,
build-debian-package and publish-federation, so it gates publication rather than
merely running beside it.

No test file, no vitest config and no timeout is touched.
@coderabbitai

coderabbitai Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6c0d9546-f09f-49e6-8606-c39d1ec24cb9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

The separate job broke two literals that release-flow.test.sh pins by exact
string — `needs: [calculate-version, release-package-contracts]` on the three
publishing jobs, and a step named `Run unit tests` — so the contract gate
rejected it, correctly. Those contracts exist to stop a publishing job
bypassing the release gate, and they cannot express "contains", so extending
the needs arrays is not available without editing a test.

Ordering achieves the same thing without touching either. What made the
frontend suite fail was not sharing a runner as such, it was running after
this job's ruby/gem install, two .deb builds and a full lint/typecheck. It now
runs immediately after `bun install` — nothing but checkout, Bun and install
precede it, which is exactly build-check's test-fe, the job where this suite
has never timed out.

rpc/i18n/backend stay under the pinned `Run unit tests` step name, now invoked
per workspace. Coverage is unchanged: `bun run test` chained exactly these
four, and all four still run.
@andrescera
andrescera merged commit 71fe933 into main Aug 21, 2026
13 checks passed
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