Skip to content

ci: split the suite into parallel jobs - #101

Merged
thangnm93 merged 1 commit into
developfrom
ci/parallel-jobs
Aug 23, 2026
Merged

thangnm93 merged 1 commit into
developfrom
ci/parallel-jobs

Conversation

@thangnm93

Copy link
Copy Markdown
Collaborator

Summary

The suite ran as one sequential job (~9m45s) even though its two heaviest steps are independent: yourssh_rdp cargo tests (165s) and the app suite (176s). Split into parallel jobs so wall clock is the longest job rather than the sum.

Changes

  • app job — apt deps, pub get, analyze, flutter test. No Rust: nothing under app/test loads the native bridge. Verified by hiding packages/*/assets/native and running the RDP/VNC model + workspace tests, which still pass.
  • bridge matrix job (yourssh_rdp, yourssh_vnc) — cargo tests, build.sh, and the package's Dart tests stay in one job per crate on purpose: both cargo invocations use --release, so the library build reuses the test build's compilation. Splitting them would compile the IronRDP / vnc-rs tree twice. fail-fast: false so one broken crate doesn't mask the other; rust-cache keyed per crate workspace.
  • test aggregate gate — master's branch protection requires a status check named exactly test, so that name has to survive the split. This job needs: [app, bridge] and fails unless both succeeded. It uses if: always(), because otherwise an upstream failure would skip it and leave the required check pending forever instead of red.

Measured baseline (run 32627632086, the last sequential green)

Step Time
Rust tests yourssh_rdp 165s
Test (app) 176s
Build RDP native lib 62s
flutter-action setup 58s
Rust tests yourssh_vnc 25s
Analyze 21s
apt deps 19s
everything else 4–13s each

Expected after the split: ~5 min wall clock (the RDP crate job is the critical path), at the cost of two extra Flutter/toolchain setups in compute.

Type of change

  • ci — CI configuration only

How was this tested?

This PR is its own test: it targets develop, so the four checks appearing here — app, bridge (yourssh_rdp), bridge (yourssh_vnc), test — are the change working. Compare the run duration against 32627632086.

python3 -c "import yaml; yaml.safe_load(...)" confirms the file parses and resolves to the three jobs with the gate wired to both.

One sequential job took ~9m45s, and the two heaviest steps do not depend on
each other at all: the yourssh_rdp cargo tests (165s) and the app suite (176s).
Nothing under app/test loads the native bridge — verified by hiding
assets/native and running the RDP/VNC model and workspace tests, which still
pass — so the app work never needed to queue behind Rust.

Split into an `app` job and a `bridge` matrix job per crate. Each crate keeps
its cargo tests, build.sh and Dart tests together: both cargo invocations use
--release, so the library build reuses the test build's compilation, and
splitting them would compile the IronRDP / vnc-rs tree twice. fail-fast is off
so a broken RDP crate does not hide a broken VNC crate, and rust-cache is keyed
per crate workspace.

Wall clock becomes the longest job (~5 min, the RDP crate) instead of the sum.
It costs two extra Flutter/toolchain setups in compute — cheaper waiting, more
machine time.

master's branch protection requires a status check literally named "test", so
the split keeps a job with that name: an aggregate gate that needs both others
and fails unless both succeeded. It runs with `always()` — otherwise a failure
upstream would skip it and leave the required check pending forever rather than
red.
@thangnm93
thangnm93 merged commit ab911bb into develop Aug 23, 2026
4 checks passed
@thangnm93
thangnm93 deleted the ci/parallel-jobs branch August 23, 2026 09:36
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