Skip to content

perf(ci): start native/CEF app builds off detect-changes, not build#395

Merged
goosewobbler merged 1 commit into
ci/status-gate-and-redundant-installsfrom
ci/decouple-native-app-builds
Jun 12, 2026
Merged

perf(ci): start native/CEF app builds off detect-changes, not build#395
goosewobbler merged 1 commit into
ci/status-gate-and-redundant-installsfrom
ci/decouple-native-app-builds

Conversation

@goosewobbler

Copy link
Copy Markdown
Contributor

Stacked on #394 (shares the same reusable files; base will auto-retarget to main once #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/utils file: tarball that the chore: debug commit 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 build job and downloaded its artifact — but never needed it. The slow Rust/CEF compile is independent of the JS build, so chaining them behind build just 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-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). Each leg now starts as soon as detect-changes finishes, in parallel with build instead of after it → the e2e/package leg start drops from build + app-build to max(build, app-build)app-build.

Why each app build is self-contained without the download

Build How it gets its JS Change
Tauri e2e turbo run build:js @wdio/tauri-plugin + turbo build (deps from source, remote-cache backed) remove download
Tauri package was turbo build --only (relied on download for deps) dropped --only so Turbo builds deps locally
Dioxus e2e/package builds the bridge guest JS explicitly, then cargo build remove download (the dist/ was never read)
Electrobun e2e/package electrobun build; fixture's only runtime dep is electrobun (the @wdio/* are test-time devDeps) remove download

Safety

  • The consuming e2e/package jobs still depend on build directly for the runnable service dist, so a JS build failure still reds CI — we only lose "fail-fast before Rust", and build runs in parallel anyway.
  • setup-workspace's pnpm install is untouched — install behaviour is identical to today.
  • Counts confirm exactly the 20 app-build jobs changed (60 needs.build.outputs lines + 20 needs: lines removed; 88 build-output refs + 32 build-gated blocks remain for the consumers).
  • actionlint 1.7.12 (the pinned CI version) clean — and since it validates needs.* references, it confirms no decoupled job has a dangling needs.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

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>
@greptile-apps

greptile-apps Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR decouples 20 native/CEF app-build jobs from the build job in ci.yml, letting them start as soon as detect-changes finishes (in parallel with build) instead of waiting for its completion. Three now-unused inputs (build_id, artifact_size, cache_key) and the artifact-download steps are removed from all six reusable app-build workflows.

  • All six reusable workflows (tauri/dioxus/electrobun × e2e/package) have their needs: build dependency and associated artifact download steps dropped; each build is now self-contained using either an explicit JS pre-build step or Turbo remote-cache-backed dependency resolution.
  • Tauri package app sees the only functional code change: turbo run build --filter=tauri-app-example --onlyturbo run build --filter=tauri-app-example, so Turbo now traverses and (re)builds workspace dependencies locally instead of relying on the previously-downloaded artifact.

Confidence Score: 5/5

Safe to merge — purely CI graph wiring and dead input removal, no production code touched.

The changes consistently remove an artifact download that was unused by Dioxus/Electrobun builds and now replaced by Turbo remote-cache-backed dep resolution for Tauri. The only functional code change (dropping --only from the Tauri package Turbo invocation) is necessary and correct: without the downloaded dist/ the deps must be built locally. Downstream e2e/package jobs still gate on build, so JS failures still block the test phase. No logic, secrets handling, or production paths are affected.

No files require special attention. The Tauri package app workflow is the most interesting file since it carries the --only removal, but the change is self-consistent and well-commented.

Important Files Changed

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
Loading

Reviews (1): Last reviewed commit: "perf(ci): start native/CEF app builds of..." | Re-trigger Greptile

@goosewobbler goosewobbler merged commit 91cf760 into ci/status-gate-and-redundant-installs Jun 12, 2026
585 of 594 checks passed
@goosewobbler goosewobbler deleted the ci/decouple-native-app-builds branch June 13, 2026 00:51
@goosewobbler goosewobbler restored the ci/decouple-native-app-builds branch June 13, 2026 01:06
goosewobbler added a commit that referenced this pull request Jun 13, 2026
…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>
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