Run CI on the fleet's local runners (Raspberry Pi arm64 pilot) when PM_LOCAL_RUNNER selects them

Merged
UN
43m ago
+9-1

Pilot for running a small repository's full CI on the fleet's Raspberry Pi 4 runners (arm64), which frees GitHub's shared 20-job pool. This repository's jobs take 2–6 min on GitHub-hosted runners.

  • Routing: runs-on is an expression on the repository variable PM_LOCAL_RUNNER:

    • arm64 (set): Raspberry Pi runners, label pm-local-arm64;
    • on: the x64 LAN runners, label pm-local;
    • anything else: ubuntu-latest.

    The controller sets the variable from live capacity, and to off when no host answers.

  • Runners: each is a fresh container that takes one job (--ephemeral), capped in CPU, memory and pids, with no Docker socket and no host mounts.

  • Fork pull requests always use ubuntu-latest, and workflows from outside contributors' fork PRs need approval.

  • Concurrency: a new push cancels that PR's earlier CI run.

Required check names are unchanged. Related: unbraind/pm-memory#73 (x64 pilot).

Summary by Sourcery

Route trusted CI workloads to the selected ephemeral fleet runners while preserving safe fork handling and efficient pull-request concurrency.

New Features:

  • Route eligible CI jobs to Raspberry Pi arm64 or x64 fleet runners based on the PM_LOCAL_RUNNER repository variable.

Enhancements:

  • Keep fork pull requests on GitHub-hosted runners and preserve the existing fallback when local runners are unavailable.
  • Cancel superseded pull-request CI runs while isolating main-branch pushes and manual runs.

Summary by cubic

Lets CI run on the fleet's local runners instead of GitHub's shared pool by choosing the runner from the PM_LOCAL_RUNNER repository variable. With arm64, Linux jobs go to ephemeral Raspberry Pi runners (label pm-local-arm64); with on, to the x64 LAN runners (pm-local); with anything else they stay on ubuntu-latest. Fork pull requests always use GitHub-hosted runners, and a new push to a pull request now cancels that PR's earlier CI run rather than letting both queue. Required check names are unchanged.