Skip to content

Containers CI: buildkit graceful_stop aborts a random matrix row during GHA cache export #2639

Description

@Xore

Recurring, image-agnostic flake in .github/workflows/containers.yml on the self-hosted honeypot-ci runners. The image builds fine — every stage reports DONE — then the job dies during #13 exporting to GitHub Actions Cache:

ERROR: failed to build: failed to receive status: rpc error: code = Unavailable
desc = closing transport due to: connection error: desc = "error reading from server: EOF",
received prior goaway: code: NO_ERROR, debug data: "graceful_stop"

It is not the PR content

Three runs on 2026-08-29 failed this way, each on a different matrix row, on branches whose diffs did not touch the failing image at all:

run row that failed branch diff touched
33248870831 citrix-honeypot sandbox/ghosts/** only
33247431081 dashboard-next
33246670261 vps-portbridge

Re-running the failed job is currently the only remedy, which costs a full serialized matrix pass each time.

What the box shows

  • The buildkit container receives a graceful SIGTERM, not a kill: no oom-kill: / Killed process in dmesg anywhere near the failure timestamp, and the gRPC GOAWAY carries code: NO_ERROR.
  • No prune/cleanup timer fires at the failure time — the only relevant units are honeypot-sandbox-cleanup.timer (last ran 00:22) and systemd-tmpfiles-clean.timer.
  • Five CI runner services are registered on the box (github-ci-runner, -2-5), so several docker/setup-buildx-action builders exist concurrently. The docker journal shows moby/buildkit:buildx-stable-1 being pulled and a new buildx_buildkit_builder-* joining the bridge every ~30-60s during a matrix pass.
  • Leaked builders outlive their jobs — e.g. a buildx_buildkit_builder-* container still Up 2 hours after its run had finished, i.e. some jobs are not running their setup-buildx post-cleanup.

That combination (concurrent builders + missed post-cleanup + graceful stop landing on an unrelated in-flight builder) is the leading hypothesis, but the specific actor sending the SIGTERM is not yet pinned down.

Suggested next steps

  1. Pin the actor: enable docker daemon debug or watch docker events --filter event=kill --filter event=die across a full matrix pass and catch which PID/unit stops the builder.
  2. Reap leaked builders between jobs so a stale buildx_buildkit_builder-* cannot be swept up by a later cleanup.
  3. Independently of the root cause, make the build step tolerate it — a retry around docker/build-push-action in containers.yml, so a teardown during cache export costs a retry instead of a whole re-run. This is cross-cutting across all 18 matrix rows, so it wants its own PR rather than riding along on an unrelated one.

Filed while fixing an unrelated failure on PR #2637, which was collateral damage from this flake.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingopsDeployment, runners, observability, host access

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions