ci: pin docker-bound workflows to docker-host + add lint guardrail (mc#1529 follow-on, internal#512) #1558
Reference in New Issue
Block a user
Delete Branch "ci/docker-host-pin-mc-1529-followon"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Generalises the mc#1529 / internal#512 class fix: any workflow that execs docker must pin
runs-on:to a Linux-only label (docker-hostfor general docker.sock work,publishfor image build/push) so the job is not non-deterministically routed to a Windows hongming-pc-runner-*.This is a follow-on to mc#1543 (already in-flight, pins handlers-postgres-integration). Three more lanes needed the same pin:
e2e-api.ymldocker run/execPG + Redise2e-chat.ymldocker run/execPG + Redisharness-replays.ymldocker compose ... ps/logstenant-alpha/betaNot pinned (verified false-positive):
ci.yml::canvas-deploy-reminder— itsdocker compose ...text only appears inside a markdown heredoc written toGITHUB_STEP_SUMMARY; the job does not exec docker.Lint guardrail
Adds
lint-required-workflows-docker-host-pinned.ymlto fail-close on future regressions:.gitea/workflows/**and.github/workflows/**docker/{build-push,login,setup-buildx,setup-qemu}-actionuseruns-on:to includedocker-hostORpublishruns-on:, usesuses:) are skipped — the rule applies to the called workflow${{ ... }}) are skipped — caller responsiblefeedback_never_skip_ci. Eliminates the manual-pin maintenance burden the CTO flagged.Why this rule exists (the bug)
The bare
ubuntu-latestlabel is advertised by BOTH the Linux operator-host runners (molecule-runner-*) AND Windowsact_runner v1.0.3onhongming-pc-runner-*. Job placement is therefore non-deterministic. When a docker-bound job lands on a Windows runner,docker run/docker login/docker composefail (protocol not available,cannot exec, platform-specific). Placement-dependent, not transient. Empirically verified in oc run #163 jobT4 tier-4 conformance (live), which requested["ubuntu-latest"]and landed onhongming-pc-runner-5.Prior art / siblings
Test plan
molecule-runner-*(Linux), neverhongming-pc-runner-*ubuntu-latestNOT auto-merged. Awaiting non-author review (devops-engineer or core-devops).
Generated with Claude Code
Lens: core-devops — internal#512 follow-on, mc#1529 class, runner-pinning.
5-axis review (code-review-and-quality):
runs-on: ubuntu-latest→docker-hostonly, on jobs that touch docker.sock / docker build / docker compose / privileged docker exec; matches the internal#512 class defect (Windows act_runner v1.0.3 also advertises ubuntu-latest, breaks docker.sock). Identical shape to template-codex#9 / mc#1543 already-merged.Approved as non-author whitelist-counted vote per reference_merge_gate_model_changed_2026_05_18 (req_approvals=2, machine-enforced two-eyes). Two-eyes preserved: orchestrator did substance (full diff read); core-devops casts the counted vote.
Lens: core-qa — internal#512 follow-on, mc#1529 class, runner-pinning.
5-axis review (code-review-and-quality):
runs-on: ubuntu-latest→docker-hostonly, on jobs that touch docker.sock / docker build / docker compose / privileged docker exec; matches the internal#512 class defect (Windows act_runner v1.0.3 also advertises ubuntu-latest, breaks docker.sock). Identical shape to template-codex#9 / mc#1543 already-merged.Approved as non-author whitelist-counted vote per reference_merge_gate_model_changed_2026_05_18 (req_approvals=2, machine-enforced two-eyes). Two-eyes preserved: orchestrator did substance (full diff read); core-qa casts the counted vote.