Skip to content

ci: gate runner-image digest automerge on a real smoke test, drop unresolvable soak - #50

Merged
cewert merged 1 commit into
mainfrom
fix/runner-digest-soak-reset
Jul 12, 2026
Merged

ci: gate runner-image digest automerge on a real smoke test, drop unresolvable soak#50
cewert merged 1 commit into
mainfrom
fix/runner-digest-soak-reset

Conversation

@cewert

@cewert cewert commented Jul 12, 2026

Copy link
Copy Markdown
Member

Problem

Renovate PRs for myoung34/github-runner digest bumps (e.g. #44) never automerge. Upstream rebuilds :latest more often than the org default's 2-day digest soak (minimumReleaseAge), so the soak never resolves — each Renovate run re-targets the newer digest, resetting the clock. A soak is fundamentally meaningless for a continuously-rebuilt rolling tag: there's no discrete release to age.

Worse, the soak was the only real safety net on these automerges — PR CI (docker compose config) only parses YAML and never pulls the image, so a broken or GitHub-deprecated runner binary would sail through on green.

Fix

Replace the unworkable soak with a gate that's actually meaningful for a digest rebuild:

  • ci.yml — new runner-image-smoke job pulls the pinned image and runs Runner.Listener --version, asserting a semver result. This directly catches the failure the soak was meant to (broken/deprecated binary landing unattended). Runs concurrently with the other jobs (~1GB pull). Uses Runner.Listener rather than config.sh --version because config.sh refuses to run as root.
  • renovate.json — drop the inherited soak for myoung34 digests (minimumReleaseAge: "0") and add a weekly schedule to rate-limit adoption to one digest/week. The runner self-updates its binary at container start, so weekly currency is ample; the schedule cuts PR churn hard.

Validation

Smoke gate run locally against the current pinned digest → Runner version: 2.335.1, semver assertion passes.

Follow-up

After merge, poke #44 (rebase checkbox / close-reopen) so Renovate re-evaluates it against the new rule and runs the smoke gate.

…esolvable soak

Upstream rebuilds myoung34/github-runner:latest more often than the org
default's 2-day digest soak, so minimumReleaseAge never resolves — Renovate
re-targets the newer digest each run and resets the clock, and the bump never
automerges. A soak is meaningless for a continuously-rebuilt rolling tag: there
is no discrete release to age.

Replace it with a gate that's actually meaningful for a digest rebuild:
- ci.yml gains runner-image-smoke, which pulls the pinned image and runs
  Runner.Listener --version, asserting a semver result. This catches a broken
  or GitHub-deprecated runner binary that `docker compose config` (YAML-only)
  never would. Uses Runner.Listener because config.sh refuses to run as root.
- renovate.json drops the inherited soak for myoung34 digests
  (minimumReleaseAge:0) and adds a weekly schedule to rate-limit adoption to
  one digest/week; the runner self-updates its binary at container start, so
  weekly currency is ample.
@cewert
cewert merged commit e3877b0 into main Jul 12, 2026
4 checks passed
@cewert
cewert deleted the fix/runner-digest-soak-reset branch July 12, 2026 15:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant