fix(ci): enable Flutter DDS frontend compiler on CI smoke (#501)#581
Merged
fix(ci): enable Flutter DDS frontend compiler on CI smoke (#501)#581
Conversation
13 tasks
The Flutter smoke job's four jest tests have been failing on every CI
run, hidden by `continue-on-error: true`. Root cause from the failure
log:
[input-backend] Flutter VM on <UDID> rejects evaluate (code 113).
Likely a release build or `simctl launch` without `flutter run` —
falling back past Tier 0.
`flutter run --no-hot --machine` was the workflow's compromise to keep
the launcher non-blocking without stdin, but `--no-hot` disables the
DDS frontend compiler service that `FlutterVMInputBackend.probeEvaluateCompile`
requires. Without it the backend rejects the device and getInputBackend()
falls through to `HeadlessInputUnavailableError`.
Changes:
- Drop `--no-hot` so the DDS frontend compiler initializes; redirect
stdin to /dev/null instead so `flutter run` doesn't block on tty.
- Use `--vmservice-out-file` to capture the resolved VM service URI
directly, replacing the brittle log-scraping regex chain. The file
appears only after the engine has bound the port, eliminating the
race where we read the URL before DDS is actually accepting clients.
- Promote the DDS warmup probe from a warning-on-failure to a hard
error and check for HTTP 200 specifically.
- Promote the VM service URL discovery to a hard error.
- Remove `continue-on-error: true` so genuine Flutter failures surface
in the workflow result instead of hiding behind a green checkmark.
This addresses the "Flutter 자동화 — 샘플 앱 멀티스텝 시나리오 통과"
checkbox on #501 by making the test actually run end-to-end.
Towards: #501
29196b1 to
1bf4626
Compare
shaun0927
commented
Apr 16, 2026
Owner
Author
shaun0927
left a comment
There was a problem hiding this comment.
Code review: P0=0, P1=0, P2=1 (timing). Root-cause fix for Flutter DDS compiler. --vmservice-out-file replaces fragile log scraping. Removes continue-on-error. LGTM.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The Flutter smoke job has been failing all 4 jest tests on every CI run since #526 landed, hidden by `continue-on-error: true`. This PR fixes the root cause and surfaces real failures.
Root cause
From the most recent CI failure log (run `24506966387`):
```
[input-backend] Flutter VM on rejects evaluate (code 113).
Likely a release build or `simctl launch` without `flutter run` —
falling back past Tier 0.
```
`flutter run --no-hot --machine` was the workflow's compromise to keep the launcher non-blocking without stdin, but `--no-hot` disables the DDS frontend compiler service that `FlutterVMInputBackend.probeEvaluateCompile` calls. Without it the backend rejects the device, `getInputBackend()` falls through to `HeadlessInputUnavailableError`, and every Tier-0 input test errors out.
The previous comment on the workflow noted "hot-reload mode hangs the DDS connection on CI" — but the actual symptom of plain `flutter run` was that the launcher blocked on stdin, not that DDS itself hung. Fixing that with `</dev/null` lets us keep the frontend compiler enabled.
Changes
Why this should now actually pass
`probeEvaluateCompile` invokes `compileExpression` over JSON-RPC, which the DDS frontend compiler service answers. With hot-reload mode enabled the service is up by the time the warmup probe sees HTTP 200, and the 8-second settle covers the initial compile pass. The other three input tests (`tap` / `typeText` / `swipe`) only need `getInputBackend()` to return Tier-0 — once `probeEvaluateCompile` succeeds, that path is unblocked.
Test plan
Towards: #501
🤖 Generated with Claude Code