perf(ci): start native/CEF app builds off detect-changes, not build#395
Conversation
The Tauri/Dioxus/Electrobun e2e + package-test app builds (20 jobs) gated on
the Linux `build` job and downloaded its artifact, but never needed it — the
slow Rust/CEF compile is independent of the JS build. Chaining them behind
`build` just delayed every one of those legs (the downstream e2e/package jobs
wait on the app build, so this is on their critical path). Mirrors the RN/Flutter
iOS app builds, which already run off detect-changes only.
For each app-build reusable: drop `needs: build`, remove the build-artifact
download (+ the dead "Show Build Information" step and the now-unused
build_id/artifact_size/cache_key inputs). The app builds are self-contained:
- Tauri e2e: turbo builds the plugin JS + app deps from source (remote-cache backed).
- Tauri package: dropped `--only` so turbo builds the app's deps locally
instead of relying on the downloaded dist/.
- Dioxus e2e/package: build the bridge guest JS explicitly, then cargo build —
the downloaded dist/ was never read.
- Electrobun e2e/package: `electrobun build`; the fixture's only runtime dep is
electrobun (the @wdio/* deps are test-time only), so no workspace dist needed.
The consuming e2e/package jobs still depend on `build` directly for the runnable
service dist, so a JS build failure still reds CI. setup-workspace's install is
untouched. Each leg now starts as soon as detect-changes finishes, in parallel
with build.
Validated with actionlint 1.7.12 (the pinned CI version); no job references
needs.build without build in its needs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
| Filename | Overview |
|---|---|
| .github/workflows/ci.yml | Drops build from needs on 20 app-build jobs and removes the three build-output with: args. Downstream e2e/package jobs still depend on build, preserving JS-build fail-fast for the test phase. |
| .github/workflows/_ci-build-tauri-package-app.reusable.yml | Removes artifact download + three inputs; changes Turbo invocation from --filter=tauri-app-example --only to --filter=tauri-app-example so workspace deps are built locally (remote-cache backed) rather than read from the downloaded artifact. |
| .github/workflows/_ci-build-tauri-e2e-app.reusable.yml | Removes artifact download + three inputs. The e2e app already built Tauri plugin JS explicitly before cargo tauri build, so it was already self-contained. |
| .github/workflows/_ci-build-dioxus-e2e-app.reusable.yml | Removes artifact download + three inputs. Bridge guest JS is built explicitly with pnpm --filter @wdio/dioxus-bridge build; cargo build only needs that output. |
| .github/workflows/_ci-build-dioxus-package-app.reusable.yml | Removes artifact download + three inputs; same self-contained bridge-JS + cargo build pattern as the e2e variant. |
| .github/workflows/_ci-build-electrobun-e2e-app.reusable.yml | Removes artifact download + three inputs; electrobun build has no @wdio/* runtime dependency so the download was already unused. |
| .github/workflows/_ci-build-electrobun-package-app.reusable.yml | Removes artifact download + three inputs; mirrors the e2e variant – same CEF/WebView2 build with no @wdio/* runtime dep. |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart TD
DC[detect-changes]
B[build\nLinux JS]
DC --> B
DC --> TAE[build-tauri-e2e-app\n×3 OS]
DC --> TAP[build-tauri-package-app\n×5 OS]
DC --> DIE[build-dioxus-e2e-app\n×3 OS]
DC --> DIP[build-dioxus-package-app\n×5 OS]
DC --> ELE[build-electrobun-e2e-app\n×2 OS]
DC --> ELP[build-electrobun-package-app\n×2 OS]
B --> UT[unit-matrix]
B --> E2E[e2e jobs]
B --> PKG[package-test jobs]
TAE --> E2E
TAP --> PKG
DIE --> E2E
DIP --> PKG
ELE --> E2E
ELP --> PKG
style DC fill:#f0e68c
style B fill:#add8e6
style TAE fill:#90ee90
style TAP fill:#90ee90
style DIE fill:#90ee90
style DIP fill:#90ee90
style ELE fill:#90ee90
style ELP fill:#90ee90
Reviews (1): Last reviewed commit: "perf(ci): start native/CEF app builds of..." | Re-trigger Greptile
91cf760
into
ci/status-gate-and-redundant-installs
…re-land #395) (#396) The Tauri/Dioxus/Electrobun e2e + package-test app builds (20 jobs) gated on the Linux `build` job and downloaded its artifact, but never needed it — the slow Rust/CEF compile is independent of the JS build. Chaining them behind `build` just delayed every one of those legs (the downstream e2e/package jobs wait on the app build, so this is on their critical path). Mirrors the RN/Flutter iOS app builds, which already run off detect-changes only. For each app-build reusable: drop `needs: build`, remove the build-artifact download (+ the dead "Show Build Information" step and the now-unused build_id/artifact_size/cache_key inputs). The app builds are self-contained: - Tauri e2e: turbo builds the plugin JS + app deps from source (remote-cache backed). - Tauri package: dropped `--only` so turbo builds the app's deps locally instead of relying on the downloaded dist/. - Dioxus e2e/package: build the bridge guest JS explicitly, then cargo build — the downloaded dist/ was never read. - Electrobun e2e/package: `electrobun build`; the fixture's only runtime dep is electrobun (the @wdio/* deps are test-time only), so no workspace dist needed. The consuming e2e/package jobs still depend on `build` directly for the runnable service dist, so a JS build failure still reds CI. setup-workspace's install is untouched. Each leg now starts as soon as detect-changes finishes, in parallel with build. Validated with actionlint 1.7.12 (the pinned CI version); no job references needs.build without build in its needs. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Stacked on #394 (shares the same reusable files; base will auto-retarget to
mainonce #394 merges). Review #394 first.This is Perf-1 from the CI review — the structural follow-up. (Perf-4, re-enabling the pnpm store cache, is deferred to its own spike: it's entangled with the generated
@wdio/utilsfile:tarball that thechore: debugcommit disabled the cache to protect, and can only be validated on a real CI run.)What
The Tauri / Dioxus / Electrobun e2e + package-test app builds (20 jobs) gated on the Linux
buildjob and downloaded its artifact — but never needed it. The slow Rust/CEF compile is independent of the JS build, so chaining them behindbuildjust delayed every one of those legs. Since the downstream e2e/package jobs wait on the app build, this delay is on their critical path.This mirrors the RN/Flutter iOS app builds, which already run off
detect-changesonly.For each app-build reusable: drop
needs: build, remove the build-artifact download (+ the deadShow Build Informationstep and the now-unusedbuild_id/artifact_size/cache_keyinputs). Each leg now starts as soon asdetect-changesfinishes, in parallel withbuildinstead of after it → the e2e/package leg start drops frombuild + app-buildtomax(build, app-build)≈app-build.Why each app build is self-contained without the download
turbo run build:js @wdio/tauri-plugin+turbo build(deps from source, remote-cache backed)turbo build --only(relied on download for deps)--onlyso Turbo builds deps locallycargo buildelectrobun build; fixture's only runtime dep iselectrobun(the@wdio/*are test-time devDeps)Safety
builddirectly for the runnable service dist, so a JS build failure still reds CI — we only lose "fail-fast before Rust", andbuildruns in parallel anyway.setup-workspace'spnpm installis untouched — install behaviour is identical to today.needs.build.outputslines + 20needs:lines removed; 88 build-output refs + 32 build-gated blocks remain for the consumers).actionlint1.7.12 (the pinned CI version) clean — and since it validatesneeds.*references, it confirms no decoupled job has a danglingneeds.build.The real proof is the CI run on this branch — these app builds can't be fully validated locally. If any leg's "build JS locally" assumption is wrong, the targeted fix is to add back that one dep build, not the whole artifact download.
🤖 Generated with Claude Code