diff --git a/.github/scripts/folio-run.sh b/.github/scripts/folio-run.sh index 0c4cea8..41ebb83 100755 --- a/.github/scripts/folio-run.sh +++ b/.github/scripts/folio-run.sh @@ -31,7 +31,9 @@ case "$platform" in # freshly installed app IS clear state). The in-run reinstall path is worth # avoiding here: `simctl uninstall` + `install` immediately followed by the # XCTest runner's own launch hits "app.folio is unknown to FrontBoard" - # perhaps half the time, and the run then hangs rather than failing. + # perhaps half the time. The launch RPC is bounded now, so that surfaces + # as an error rather than an indefinite hang, but a failed leg is still a + # failed leg and a fresh install is already clear state. folio_args+=(--platform ios --clear-data=false --ios-device "${IOS_DEVICE:-iPhone 16 Pro}") diff --git a/docs/development/ci.md b/docs/development/ci.md index c0dc867..169c84f 100644 --- a/docs/development/ci.md +++ b/docs/development/ci.md @@ -61,8 +61,15 @@ The ios leg passes `--clear-data=false`, because the job installs a fresh build immediately before the run and a freshly installed app is already clear state. The in-run reinstall is worth avoiding: `simctl uninstall` + `install` followed straight away by the XCTest runner's own launch fails with `app.folio is unknown -to FrontBoard` maybe half the time, and the run then hangs rather than failing. -The job timeouts are the backstop if it happens anyway. +to FrontBoard` maybe half the time. That used to hang the run outright; the +launch RPC is bounded now, so it fails in about 90 seconds with a real error +instead, but a failing leg is still a failing leg. The job timeouts are the +backstop if it happens anyway. + +Only one sanderling run may drive a given simulator at a time. The driver takes +an advisory lock on the target's UDID and a second run is refused with the lock +path in the message, because two runs interleaving app lifecycle leave the first +run's automation session bound to a bundle the simulator no longer knows. ## replay-ui