1 Commits

Author SHA1 Message Date
julien 2d676cc279 feat(infra): add ci-runners.sh wrapper for the runner stack (#81)
CI / check (push) Successful in 1m53s
CI / commits (push) Has been skipped
CI / scan (push) Successful in 1m17s
CI / a11y (push) Successful in 1m3s
CI / perf (push) Successful in 2m27s
## Summary

Mirrors the convenience-script pattern we adopted for `infra/local/dev.sh`: typing `docker compose -f infra/ci-runners.compose.yml ...` for routine ops gets old fast, the pre-pull of the catthehacker job images is documented but easy to forget, and the "rotation of one runner at a time" tip in `infra/README.md` is a sequence the contributor was supposed to hand-roll every time.

`infra/ci-runners.sh` exposes the everyday verbs and automates the rolling-restart pattern.

## What lands

| Command                                       | Effect                                                                            |
| --------------------------------------------- | --------------------------------------------------------------------------------- |
| `./ci-runners.sh up`                          | Bring the three runner containers up                                              |
| `./ci-runners.sh up --prepull`                | Pre-pull the job images (`act-22.04` + `:full-22.04`) on the host first           |
| `./ci-runners.sh down`                        | Stop and remove the containers (**preserves** `data/runner-N/.runner` credentials) |
| `./ci-runners.sh restart <runner>`            | Restart one runner                                                                |
| `./ci-runners.sh rotate`                      | Rolling restart of every runner with a 15 s pause between each — keeps at least N-1 runners online through a config refresh |
| `./ci-runners.sh status`                      | `docker compose ps` for the runner services                                       |
| `./ci-runners.sh logs [runner]`               | Follow logs (one runner or all of them)                                           |
| `./ci-runners.sh pull-images`                 | Pre-pull / refresh the job images (idempotent)                                    |
| `./ci-runners.sh <other>`                     | Pass-through to `docker compose -f ci-runners.compose.yml ...`                    |

The destructive `down -v` (wipes `data/`, forces re-registration with a fresh Gitea token) is intentionally **not** exposed as a verb — invoke `docker compose -f ci-runners.compose.yml down -v` directly so the path is explicit at the typing level.

## Doc updates (`infra/README.md`)

- Inventory table at the top picks up the script.
- "First-time registration" walkthrough swaps the explicit `docker pull` / `docker compose up` steps for `./ci-runners.sh up --prepull`.
- New "Convenience script — `ci-runners.sh`" subsection with the cheat-sheet table.
- "Operational tips" rephrased to point at the script's `rotate` / `restart` / `logs` verbs as the canonical commands; the raw-docker-compose form is kept in parentheses as the underlying mechanism.
- "Adding a fourth runner" tip now reminds to update the `RUNNERS=()` array at the top of the script.

## Trade-off

The 15 s pause in `rotate` is a conservative approximation — `act_runner` doesn't expose a Compose healthcheck, so we can't poll for ready. Adjust the constant at the top of the script if reality argues for a different value.

## Test plan

- [ ] CI green on this PR.
- [ ] On the runner host: `./infra/ci-runners.sh status` shows the three runners running.
- [ ] `./infra/ci-runners.sh logs runner-1` tails runner-1's stdout.
- [ ] `./infra/ci-runners.sh rotate` cycles through runner-1 → runner-2 → runner-3 with the 15 s pauses; `status` between rotations shows N-1 runners online at any moment (with a brief gap for the one currently restarting).
- [ ] `./infra/ci-runners.sh restart runner-99` errors out with the "unknown runner" message.

---------

Co-authored-by: Julien Gautier <julien.gautier@apf.asso.fr>
Reviewed-on: #81
2026-05-10 06:37:07 +02:00