ci: pin the smoke image with a running container during the test
Lint / hadolint (push) Successful in 12s
Lint / skill-floor (push) Successful in 13s
Lint / doc-drift (push) Successful in 17s
Lint / actionlint (push) Successful in 26s

The label only protects against reclaims that honour it. The runner
hosts also run jobs we do not control: runner-2 has a second act_runner
registered with gitea.egl.lan on the same Docker daemon, and
opencode-devbox's workflows run raw `docker system prune -af` in 7
places. No prune removes an image a running container uses, so the
smoke step now starts a holder (`ci-reclaim-docker.sh hold`: --rm,
--network none, sleep 3600) right after the preflight, and the
always() cleanup step runs `release` (holder + image). Unprotected now:
only the seconds between the build step's load and the holder starting.

Verified on an isolated docker:29-dind: an unlabelled held image survives
raw system prune and image prune -af (control without holder: deleted);
hold fails on a missing image; holder is AutoRemove + network none;
release removes holder and image; reclaim behaviour unchanged.
This commit is contained in:
2026-10-23 12:46:39 +02:00
parent e0611c787f
commit 779efbf4fe
5 changed files with 86 additions and 27 deletions
+2 -2
View File
@@ -91,8 +91,8 @@ jobs:
run: bash scripts/check-workflow-shell.sh .gitea/workflows
- name: No raw docker prune in workflows (shared runner daemon)
# Jobs on the same runner share its Docker daemon (runner-a1 runs
# several docker-publish.yml jobs at once), and
# Everything on one runner host shares its Docker daemon (runner-a1
# runs several jobs at once; runner-2 also serves gitea.egl.lan), and
# a bare `docker system prune -a` in one job deletes the smoke image
# another job is testing (v1.12.2 run 740 shipped without its -studio
# tags that way). Reclaim goes through scripts/ci-reclaim-docker.sh,