How long does a GitHub Actions self-hosted runner version keep running jobs, and what happens to a runner that falls behind? This repo asks GitHub's own runner version deprecations API about every actions/runner release, and records real runners of four versions registering against github.com.
# Every release's support end date, from GitHub's API (needs gh, and a repo you admin)
REPO=your-org/your-repo python3 scripts/sweep.py
python3 scripts/window.py
# Check the versions your fleet runs
echo 2.335.1 | REPO=your-org/your-repo scripts/check-versions.sh| Script | What it does |
|---|---|
scripts/sweep.py |
Lists every actions/runner release and calls GET /repos/{repo}/actions/runners/deprecations/{version} for each. Writes data/versions.json. |
scripts/window.py |
Computes, for each version, the days between the next release and the end of runtime support. Writes data/window.json. |
scripts/check-versions.sh |
Reads runner versions on stdin and prints the API's runtime deprecation date and days left for each. Exits non-zero on bad input, an empty list, or an API error. Needs bash, python3 and gh. |
scripts/floor-test.sh |
Downloads one runner version, registers it with --disableupdate to a private test repo, sends it one job with a workflow_dispatch probe, and records what GitHub does. Removes the runner afterwards. |
The deprecations endpoint needs a credential that administers the repository. A classic token with the repo scope works at repository level; the organization-level endpoint also needs admin:org or the fine-grained self-hosted runners permission.
The probe workflow used by floor-test.sh is in probe/probe.yml. Put it in a private repository you own. Never attach a self-hosted runner to a public repository.
- The API knows 19 versions, 2.321.0 to 2.337.0. Older versions return 404.
- No successful response contained a
registration_deprecates_atfield. - For the 18 versions with a runtime deprecation date and a later release, the date is 62 to 70 whole days after that release (median 64.5). GitHub's documentation says runners must install each release within 30 days.
- Runner 2.328.0: registration refused, "The minimum runner version required to register with GitHub Actions is now 2.329.0."
- Runner 2.335.1 (runtime support ended September 24): registered, then logged "Runner version v2.335.1 is deprecated and cannot receive messages." and
run.shexited with code 0. The job was still queued after 197 seconds. - The same 2.335.1 runner with
ACTIONS_RUNNER_RETURN_VERSION_DEPRECATED_EXIT_CODE=1set: same error, andrun.shexited with code 7 (runs/2.335.1-deprecated-exit-code.txt). - Runners 2.336.0 and 2.337.0: registered and ran the job.
- The test organization is on GitHub's Free plan (
runs/org-plan.txt).
Raw output is in runs/, and the API data, with every raw response, is in data/. runs/first-pass/ holds an earlier run of the same four versions made with the first version of floor-test.sh; the results matched.
Write-up: DevOps Daily.
MIT