From 50bd3ac71f8abdfc3130e3b729e8160a3ac21c7d Mon Sep 17 00:00:00 2001 From: Micah Alpern Date: Fri, 6 Nov 2026 22:37:22 -0800 Subject: [PATCH] Skip mini-only workflows while CI runs on hosted runners cache-warm, runner-health and both coverage jobs always target the mini's self-hosted runners. With KEYPATH_CI_RUNNER=hosted and the mini away, every run queues with no runner (four were queued on 2026-11-06). Each job now skips while that variable is set, and ci.yml's header says so. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/cache-warm.yml | 3 +++ .github/workflows/ci.yml | 4 ++-- .github/workflows/coverage.yml | 6 +++++- .github/workflows/runner-health.yml | 3 +++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cache-warm.yml b/.github/workflows/cache-warm.yml index f71002fe2..bbb176158 100644 --- a/.github/workflows/cache-warm.yml +++ b/.github/workflows/cache-warm.yml @@ -13,6 +13,9 @@ on: jobs: warm-cache: + # Skipped while the mini is away (KEYPATH_CI_RUNNER=hosted); a self-hosted + # job with no runner online just queues. See the header of ci.yml. + if: vars.KEYPATH_CI_RUNNER != 'hosted' runs-on: [self-hosted, macOS, keypath, swiftpm-safe] timeout-minutes: 5 steps: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b3bb8fc1b..68f915023 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,8 +15,8 @@ concurrency: # mini. Job names, and so the required checks, are the same either way. # gh variable set KEYPATH_CI_RUNNER --repo malpern/KeyPath --body hosted # gh variable delete KEYPATH_CI_RUNNER --repo malpern/KeyPath -# Only ci.yml has the fallback; coverage, cache-warm and runner-health are -# scheduled jobs that stay on the mini and don't gate PRs. +# Only ci.yml has the fallback. coverage, cache-warm and runner-health are +# mini-only jobs that do not gate PRs; they skip while this variable is set. # GitHub counts a skipped check as passing, so the required checks must never be # skipped. `build-and-test` and `code-quality` at the bottom of this file always run diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index efe44f000..44a0596e6 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -11,6 +11,9 @@ concurrency: jobs: narrow-coverage: + # Skipped while the mini is away (KEYPATH_CI_RUNNER=hosted); a self-hosted + # job with no runner online just queues. See the header of ci.yml. + if: vars.KEYPATH_CI_RUNNER != 'hosted' runs-on: [self-hosted, macOS, keypath, swiftpm-safe] timeout-minutes: 10 env: @@ -108,7 +111,8 @@ jobs: # serializes them; `if: always()` still surfaces full numbers when the narrow # floor regresses or a filtered test fails. needs: [narrow-coverage] - if: always() + # Also skipped while the mini is away (KEYPATH_CI_RUNNER=hosted); see ci.yml. + if: always() && vars.KEYPATH_CI_RUNNER != 'hosted' timeout-minutes: 40 steps: - name: Clean stale git credentials diff --git a/.github/workflows/runner-health.yml b/.github/workflows/runner-health.yml index 52b9527e8..6b59e8023 100644 --- a/.github/workflows/runner-health.yml +++ b/.github/workflows/runner-health.yml @@ -7,6 +7,9 @@ on: jobs: ping: + # Skipped while the mini is away (KEYPATH_CI_RUNNER=hosted); a self-hosted + # job with no runner online just queues. See the header of ci.yml. + if: vars.KEYPATH_CI_RUNNER != 'hosted' runs-on: [self-hosted, macOS, keypath] timeout-minutes: 2 steps: