Skip to content

feat(compose): per-runner labels and opt-in control runners for coordination jobs - #26

Merged
azlekov merged 1 commit into
mainfrom
feat/control-runners-and-per-runner-labels
Oct 15, 2026
Merged

azlekov merged 1 commit into
mainfrom
feat/control-runners-and-per-runner-labels

Conversation

@azlekov

@azlekov azlekov commented Oct 15, 2026

Copy link
Copy Markdown

What

Two opt-in knobs. With neither set, docker compose config renders the same services, labels and volumes as today.

  • RUNNER_<N>_LABELS (runner, runner-2, runner-3) replaces LABELS for that one runner. A host whose runners are all light can let one of them also take large builds, without a second host file.
    • The runner environment moves to its own anchor (x-runner-env). A <<: merge replaces a whole mapping, so a service could not otherwise change LABELS without dropping every other variable.
  • COMPOSE_PROFILES=control adds control and control-2:
    • Ephemeral like the others.
    • Labelled only CONTROL_LABELS (default control), so no build or test can land on them.
    • No docker.sock, no tool cache: only a work volume and the read-only action cache.
    • Meant for the short jobs a merge waits on (a picker, a required summary job), so those never queue behind long builds.

Checked

docker compose config with a test .env:

  • Default: 3 runners plus the pruner, every runner on the host LABELS, unchanged.
  • RUNNER_3_LABELS=…,large: only runner-3 changes.
  • COMPOSE_PROFILES=control: two control runners. Each has the full App environment, EPHEMERAL=true, LABELS=control, the <prefix>-control name, only runner-work-control* and the action cache, and the same healthcheck.
  • COMPOSE_FILE=docker-compose.yml:hosts/no-caches.compose.yml: still valid.

The nested default ${RUNNER_3_LABELS:-${LABELS:-docker}} was verified with Compose v5.1.2. Hosts need a Compose version with nested interpolation (2.x and later).

🤖 Generated with Claude Code

…ination jobs

RUNNER_<N>_LABELS replaces LABELS for one runner, so one runner of a light host can also
join the large pool. The environment moves to its own anchor (x-runner-env) so a service
can change LABELS without dropping the other variables.

COMPOSE_PROFILES=control adds two ephemeral runners (control, control-2) built from one
x-control anchor. They carry only CONTROL_LABELS (default control) and mount no docker.sock
and no tool cache, only their work volume and the read-only action cache, for the short
jobs a merge waits on. With neither variable set, the rendered config is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@azlekov
azlekov force-pushed the feat/control-runners-and-per-runner-labels branch from 7923d78 to fb5bbac Compare October 15, 2026 21:26
@azlekov
azlekov merged commit dfabbe7 into main Oct 15, 2026
12 checks passed
@azlekov
azlekov deleted the feat/control-runners-and-per-runner-labels branch October 15, 2026 21:30
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