From db55b7a26f2213ab0d3505fec308c914c08db43f Mon Sep 17 00:00:00 2001 From: "Flemming N. Larsen" Date: Sun, 13 Sep 2026 23:22:48 +0200 Subject: [PATCH 1/4] propose(CH-002): launchers default to the published GHCR image Opens CH-002, proposing that docker/rumble.sh and rumble.ps1 default to ghcr.io/robocode-dev/rumble-client:latest so contributors can pull and run without tagging or building the image. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KwJVGH7ftyX2ThQ2wMCLQK --- .clue/id-ledger.yaml | 4 ++++ .../proposal.md | 21 +++++++++++++++++++ .../tasks.md | 15 +++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 changes/CH-002-launchers-default-ghcr-image/proposal.md create mode 100644 changes/CH-002-launchers-default-ghcr-image/tasks.md diff --git a/.clue/id-ledger.yaml b/.clue/id-ledger.yaml index efb1bc4..fee05ca 100644 --- a/.clue/id-ledger.yaml +++ b/.clue/id-ledger.yaml @@ -16,3 +16,7 @@ events: - {id: CAP-003, kind: numeric, state: reserved, prefix: CAP, component: "3"} - {id: CAP-002, kind: numeric, state: live, prefix: CAP, component: "2"} - {id: CAP-003, kind: numeric, state: live, prefix: CAP, component: "3"} + - {id: CH-002, kind: numeric, state: reserved, prefix: CH, component: "2"} + - {id: CH-002, kind: numeric, state: live, prefix: CH, component: "2"} + - {id: TASK-001, kind: numeric, state: reserved, prefix: TASK, component: "1"} + - {id: TASK-001, kind: numeric, state: live, prefix: TASK, component: "1"} diff --git a/changes/CH-002-launchers-default-ghcr-image/proposal.md b/changes/CH-002-launchers-default-ghcr-image/proposal.md new file mode 100644 index 0000000..1f90a00 --- /dev/null +++ b/changes/CH-002-launchers-default-ghcr-image/proposal.md @@ -0,0 +1,21 @@ +--- +id: CH-002 +type: change +status: open +links: [CAP-001, G-001] +title: Launchers default to the published GHCR image +--- + +# CH-002 — Launchers default to the published GHCR image + +This change is plan-less: it serves G-001 directly and no plan exists in this repository. + +## What + +`docker/rumble.sh` and `docker/rumble.ps1` default their image argument to `ghcr.io/robocode-dev/rumble-client:latest` instead of the local-only name `rumble-client:dev`. Passing an explicit image argument keeps working, so a locally built image is still usable by naming it. + +The README Quickstart and container section drop the `docker tag` workaround: pulling the published image is the default path, and building the image or the Java code yourself moves under "Building `rumble-client` itself". CAP-001 is revised, because it currently states the launchers are unchanged, and gains a criterion for the new default. + +## Why + +G-001 wants contributors to run battles without building the image. CH-001 published the image, but the launchers still looked for `rumble-client:dev`, so the published image only worked after an extra `docker tag` step or a third argument on every command. Defaulting to the published image makes the common path pull-and-run. diff --git a/changes/CH-002-launchers-default-ghcr-image/tasks.md b/changes/CH-002-launchers-default-ghcr-image/tasks.md new file mode 100644 index 0000000..10180f2 --- /dev/null +++ b/changes/CH-002-launchers-default-ghcr-image/tasks.md @@ -0,0 +1,15 @@ +--- +id: TASK-001 +type: tasks +status: open +links: [CH-002] +title: Tasks for CH-002 +--- + +# Tasks — CH-002 + +- [ ] Add criterion AC-004 to CAP-001 for the launchers' default image, and revise the CAP-001 README's statement that the launchers are unchanged. +- [ ] Change the default image in `docker/rumble.sh` and `docker/rumble.ps1` to `ghcr.io/robocode-dev/rumble-client:latest` (AC-004). +- [ ] Update `README.md` so pulling the published image is the default and building it yourself is optional (AC-004). +- [ ] Update `docs/architecture/README.md` and the CAP-001 design for the new default. +- [ ] Add a `CHANGELOG.md` `[Unreleased]` entry. From 737382e020cc5cdb205f0f14bb21ed48f868304f Mon Sep 17 00:00:00 2001 From: "Flemming N. Larsen" Date: Sun, 13 Sep 2026 23:24:39 +0200 Subject: [PATCH 2/4] implement(CH-002): launchers default to the published GHCR image docker/rumble.sh and rumble.ps1 now default to ghcr.io/robocode-dev/rumble-client:latest. Adds AC-004 to CAP-001, revises its scope statement and design, and makes pulling the published image the README's default path with local building under "Building rumble-client itself". Adds an Unreleased changelog entry. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KwJVGH7ftyX2ThQ2wMCLQK --- CHANGELOG.md | 4 ++ README.md | 43 ++++++++++++------- .../tasks.md | 10 ++--- docker/rumble.ps1 | 2 +- docker/rumble.sh | 2 +- docs/architecture/README.md | 2 +- .../README.md | 2 +- .../criteria.md | 8 ++++ .../design.md | 2 + 9 files changed, 50 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21d4b43..4704be0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), ## [Unreleased] +### Changed + +- The `docker/rumble.sh` and `docker/rumble.ps1` launchers now default to the published `ghcr.io/robocode-dev/rumble-client:latest` image instead of the local-only `rumble-client:dev`, so you can pull and run without building or tagging an image. To use a locally built image, pass its name as the launcher's image argument. + ## [0.1.0] - 2026-09-13 ### Changed diff --git a/README.md b/README.md index 96ad729..ffe66fc 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,10 @@ For the complete newcomer-friendly walkthrough, including registration and token ## Quickstart (Docker, recommended) -Docker is the recommended way to build and run the client: it supplies the complete Java, .NET, Python, and Node.js environment every ranked bot needs, and is the isolation boundary for running reviewed-but-untrusted bot code. Docker Engine or Docker Desktop is required for this path. +Docker is the recommended way to run the client: it supplies the complete Java, .NET, Python, and Node.js environment every ranked bot needs, and is the isolation boundary for running reviewed-but-untrusted bot code. Docker Engine or Docker Desktop is required for this path. You do not need to build anything: the ready-made image is published at [`ghcr.io/robocode-dev/rumble-client`](https://github.com/robocode-dev/rumble-client/pkgs/container/rumble-client). -1. Clone this repository. -2. Get the image: pull a released version and tag it locally — `docker pull ghcr.io/robocode-dev/rumble-client:latest && docker tag ghcr.io/robocode-dev/rumble-client:latest rumble-client:dev` — or build it yourself with `docker build --tag rumble-client:dev .` +1. Clone this repository. You only need it for the launcher scripts and the example configuration. +2. Pull the published image: `docker pull ghcr.io/robocode-dev/rumble-client:latest`. The launchers use this image by default and pull it on first use, so this step only saves waiting later. 3. Copy `rumble-client.example.json` to `rumble-client.json` and edit it — see [Configuration](#configuration) below. Never commit the resulting file. 4. Check your settings: `docker/rumble.sh validate rumble-client.json` 5. Check the bundled runtimes: `docker/rumble.sh runtimes` @@ -21,13 +21,32 @@ Docker is the recommended way to build and run the client: it supplies the compl On PowerShell, use `docker/rumble.ps1 [config-path] [image]` instead — for example `docker/rumble.ps1 run rumble-client.json`, and set `$env:RUMBLE_CLIENT_TOKEN` before `submit`. +Run `docker pull` again to pick up a newer `latest`. To pin a release, pass a version tag as the image argument, for example `docker/rumble.sh run rumble-client.json ghcr.io/robocode-dev/rumble-client:0.1.0`; see [`CHANGELOG.md`](CHANGELOG.md) for what changed in each one. If you want to build the image yourself, see [Building `rumble-client` itself](#building-rumble-client-itself). + Every command runs the container read-only, with capabilities dropped and resource limits applied. Only `runtimes` blocks network access outright; `validate`, `sync`, `run`, and `submit` use normal outbound network because synchronization and submission need it, and `run` re-synchronizes the ranked snapshot before executing a battle. The client tracks posted batches locally and only drops them once their receipt comment appears on the closed issue; retrying an already-accepted submission is acknowledged idempotently rather than double-submitted. ## Building `rumble-client` itself -Most contributors only need the Quickstart above. If you're changing this repository's own Java code, you need to build and test it, which still needs Gradle — but not installed on your machine. Run it inside a Gradle image matching this repository's pinned wrapper version (`gradle/wrapper/gradle-wrapper.properties`, currently 9.7.1), with your checkout bind-mounted: +Most people only need the Quickstart above and the published image. Build it yourself only if you are changing this repository or prefer not to use the published image. + +### Building the container image + +Build the image locally: + +```shell +docker build --tag rumble-client:dev . +podman build --tag rumble-client:dev . +``` + +The launchers default to the published image, so pass the local name as their image argument to run your build, for example `docker/rumble.sh runtimes rumble-client.json rumble-client:dev` or `docker/rumble.ps1 runtimes rumble-client.json rumble-client:dev`. + +To run the four-language container smoke check locally, build the sample-bot archives and run `CONTAINER_ENGINE=podman TANK_ROYALE_SOURCE=../tank-royale bash scripts/verify-container.sh`; Docker is the default engine. + +### Building and testing the Java code + +If you're changing this repository's own Java code, you need to build and test it, which still needs Gradle — but not installed on your machine. Run it inside a Gradle image matching this repository's pinned wrapper version (`gradle/wrapper/gradle-wrapper.properties`, currently 9.7.1), with your checkout bind-mounted: ```shell docker run --rm -it -v "${PWD}:/workspace" -w /workspace gradle:9.7.1-jdk17 gradle build @@ -51,7 +70,7 @@ The build produces native ZIP and TAR archives under `build/distributions/`. Run The container and native preflight currently target Java 25, .NET 10, Python 3.14, and Node.js 24 (Node.js installer 24.21.0). This block is refreshed by the scheduled runtime update workflow. -The client validates configuration and can synchronize the current ranked input snapshot. Run `./gradlew run --args="--validate-config"` to check local settings, then run `./gradlew run --args="--sync"` to resolve the canonical data repository, validate its engine pin, catalog, client registration, and matchmaking advice, and prepare an immutable bot cache at the catalog's exact source commit. Every cached source tree is checked against its catalog SHA-256 before it can be used. Ranked battle selection uses a recorded random seed, prioritizes under-sampled pairings involving `myBots`, and falls back to distinct active catalog bots when no advice is available. Each game type declares how many bots one catalog entry expands to, so TwinDuel selects two team entries for its four pinned participants while `1v1` and melee select individual bots, and a selection never contains two entries that share a member bot. Run `./gradlew run --args="--run"` to execute one pinned ranked battle through Battle Runner and retain its replay evidence locally. Run `./gradlew run --args="--submit"` to post pending records through the `rumble-data` issue inbox. It reads `RUMBLE_CLIENT_TOKEN` only at runtime; use a GitHub fine-grained token limited to read and write Issues access for that repository. The client records posted batches locally and removes records only after their result-data receipt comments appear. See the Docker and Podman development image section below for the isolated multi-runtime container. +The client validates configuration and can synchronize the current ranked input snapshot. Run `./gradlew run --args="--validate-config"` to check local settings, then run `./gradlew run --args="--sync"` to resolve the canonical data repository, validate its engine pin, catalog, client registration, and matchmaking advice, and prepare an immutable bot cache at the catalog's exact source commit. Every cached source tree is checked against its catalog SHA-256 before it can be used. Ranked battle selection uses a recorded random seed, prioritizes under-sampled pairings involving `myBots`, and falls back to distinct active catalog bots when no advice is available. Each game type declares how many bots one catalog entry expands to, so TwinDuel selects two team entries for its four pinned participants while `1v1` and melee select individual bots, and a selection never contains two entries that share a member bot. Run `./gradlew run --args="--run"` to execute one pinned ranked battle through Battle Runner and retain its replay evidence locally. Run `./gradlew run --args="--submit"` to post pending records through the `rumble-data` issue inbox. It reads `RUMBLE_CLIENT_TOKEN` only at runtime; use a GitHub fine-grained token limited to read and write Issues access for that repository. The client records posted batches locally and removes records only after their result-data receipt comments appear. See [Docker and Podman container image](#docker-and-podman-container-image) below for the isolated multi-runtime container. ## Configuration @@ -61,13 +80,14 @@ Use one game type per configuration with the current command-line client. `--run ## Docker and Podman container image -Released versions are published to `ghcr.io/robocode-dev/rumble-client`; pull one instead of building it yourself: +Released versions are published to [`ghcr.io/robocode-dev/rumble-client`](https://github.com/robocode-dev/rumble-client/pkgs/container/rumble-client), and this is the default way to get the image: ```shell docker pull ghcr.io/robocode-dev/rumble-client:latest +podman pull ghcr.io/robocode-dev/rumble-client:latest ``` -Substitute a specific version, e.g. `ghcr.io/robocode-dev/rumble-client:0.2.0`, to pin to a release; see [`CHANGELOG.md`](CHANGELOG.md) for what changed in each one. The image can also be built and run locally with Docker Engine, Docker Desktop, or Podman. The examples below use Docker; replace `docker` with `podman` when invoking the image directly. On Windows, Podman Desktop needs a running Linux virtual machine and can use WSL2 or Hyper-V as the provider; choose the provider when creating the machine. Podman Desktop/WSL2 on Windows and rootless Podman on Linux have both been manually verified for this image; neither is part of CI. +Substitute a specific version, e.g. `ghcr.io/robocode-dev/rumble-client:0.1.0`, to pin to a release; see [`CHANGELOG.md`](CHANGELOG.md) for what changed in each one. The launchers default to `ghcr.io/robocode-dev/rumble-client:latest`; pass another image name as their image argument to use a pinned version or a locally built image. The image runs with Docker Engine, Docker Desktop, or Podman. To build the image yourself instead, see [Building the container image](#building-the-container-image). The examples below use Docker; replace `docker` with `podman` when invoking the image directly. On Windows, Podman Desktop needs a running Linux virtual machine and can use WSL2 or Hyper-V as the provider; choose the provider when creating the machine. Podman Desktop/WSL2 on Windows and rootless Podman on Linux have both been manually verified for this image; neither is part of CI. Two flag differences from Docker are handled for you by the launcher scripts and do not need manual workarounds: @@ -76,15 +96,6 @@ Two flag differences from Docker are handled for you by the launcher scripts and One flag difference is not handled by the scripts and needs a one-time host setting instead: the launchers pass `--cpus`, `--memory`, and `--pids-limit` unconditionally, and rootless Podman honors them only when the `cpu`, `memory`, and `pids` cgroup controllers are delegated to your user session (`cat /sys/fs/cgroup/user.slice/user-$(id -u).slice/user@$(id -u).service/cgroup.controllers` lists them if so). Recent systemd (245+) delegates all three by default on most current Linux distributions, including the Ubuntu install these launchers were verified against, so this is normally a non-issue; if a run fails with a cgroup- or resource-limit-related error instead of an application error, delegation is the first thing to check. -Build the image with one of these commands: - -```shell -docker build --tag rumble-client:dev . -podman build --tag rumble-client:dev . -``` - -To run the four-language container smoke check locally, build the sample-bot archives and run `CONTAINER_ENGINE=podman TANK_ROYALE_SOURCE=../tank-royale bash scripts/verify-container.sh`; Docker is the default engine. - Use the launcher scripts for configuration validation, runtime checks, snapshot synchronization, ranked battles, and result submission. The shell launcher selects Docker by default and accepts `CONTAINER_ENGINE=podman`; the PowerShell launcher accepts `-Engine podman` or the same `CONTAINER_ENGINE` environment variable: ```shell diff --git a/changes/CH-002-launchers-default-ghcr-image/tasks.md b/changes/CH-002-launchers-default-ghcr-image/tasks.md index 10180f2..3e6fb68 100644 --- a/changes/CH-002-launchers-default-ghcr-image/tasks.md +++ b/changes/CH-002-launchers-default-ghcr-image/tasks.md @@ -8,8 +8,8 @@ title: Tasks for CH-002 # Tasks — CH-002 -- [ ] Add criterion AC-004 to CAP-001 for the launchers' default image, and revise the CAP-001 README's statement that the launchers are unchanged. -- [ ] Change the default image in `docker/rumble.sh` and `docker/rumble.ps1` to `ghcr.io/robocode-dev/rumble-client:latest` (AC-004). -- [ ] Update `README.md` so pulling the published image is the default and building it yourself is optional (AC-004). -- [ ] Update `docs/architecture/README.md` and the CAP-001 design for the new default. -- [ ] Add a `CHANGELOG.md` `[Unreleased]` entry. +- [x] Add criterion AC-004 to CAP-001 for the launchers' default image, and revise the CAP-001 README's statement that the launchers are unchanged. +- [x] Change the default image in `docker/rumble.sh` and `docker/rumble.ps1` to `ghcr.io/robocode-dev/rumble-client:latest` (AC-004). +- [x] Update `README.md` so pulling the published image is the default and building it yourself is optional (AC-004). +- [x] Update `docs/architecture/README.md` and the CAP-001 design for the new default. +- [x] Add a `CHANGELOG.md` `[Unreleased]` entry. diff --git a/docker/rumble.ps1 b/docker/rumble.ps1 index 5bba4a6..796e5cd 100644 --- a/docker/rumble.ps1 +++ b/docker/rumble.ps1 @@ -7,7 +7,7 @@ param( [string] $Configuration = 'rumble-client.json', [Parameter(Position = 2)] - [string] $Image = 'rumble-client:dev', + [string] $Image = 'ghcr.io/robocode-dev/rumble-client:latest', [Parameter(Position = 3)] [ValidateSet('docker', 'podman')] diff --git a/docker/rumble.sh b/docker/rumble.sh index c7d3983..8283f8b 100755 --- a/docker/rumble.sh +++ b/docker/rumble.sh @@ -8,7 +8,7 @@ usage() { command_name="${1:-}" config_path="${2:-rumble-client.json}" -image="${3:-rumble-client:dev}" +image="${3:-ghcr.io/robocode-dev/rumble-client:latest}" container_engine="${CONTAINER_ENGINE:-docker}" case "${container_engine}" in diff --git a/docs/architecture/README.md b/docs/architecture/README.md index 9d5ae24..978662b 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -1,6 +1,6 @@ # Architecture -The Rumble Client is a Java 17 command-line application packaged and run through Gradle or the repository's Docker image. It coordinates local battle execution between the Tank Royale Battle Runner and the shared Rumble data repositories. +The Rumble Client is a Java 17 command-line application packaged as a container image that is published to GHCR and run by default from there; building it locally, or running it through Gradle, remains possible for development. It coordinates local battle execution between the Tank Royale Battle Runner and the shared Rumble data repositories. ## Boundaries and actors diff --git a/docs/capabilities/CAP-001-published-container-image/README.md b/docs/capabilities/CAP-001-published-container-image/README.md index 02306f7..b0b84ba 100644 --- a/docs/capabilities/CAP-001-published-container-image/README.md +++ b/docs/capabilities/CAP-001-published-container-image/README.md @@ -13,6 +13,6 @@ title: Published container image The system publishes a versioned, pullable container image so a contributor can run ranked battles without building the four-language image themselves. Publishing happens once per human-authored release: a maintainer updates `CHANGELOG.md` and the Gradle version, pushes a `vX.Y.Z` tag, and CI builds the existing `Dockerfile` and pushes it to GHCR under that version and `latest`. -This capability does not change how the image is built (the `Dockerfile` and `scripts/verify-container.sh` verification are unchanged) or how it runs (`docker/rumble.sh` / `rumble.ps1` are unchanged); it only adds a distribution path so `docker build` is no longer the only way to obtain the image. Local building remains supported for development, per the README's "Building `rumble-client` itself" section. +This capability does not change how the image is built (the `Dockerfile` and `scripts/verify-container.sh` verification are unchanged) or how it runs (the launchers' container flags are unchanged). It adds a distribution path, and `docker/rumble.sh` / `rumble.ps1` default to the published `ghcr.io/robocode-dev/rumble-client:latest` image, so a contributor can pull and run without building or tagging anything. Local building remains supported for development, per the README's "Building `rumble-client` itself" section: pass the locally built image name as the launcher's image argument. See `criteria.md` for acceptance criteria and `design.md` for how the publish workflow fits together. diff --git a/docs/capabilities/CAP-001-published-container-image/criteria.md b/docs/capabilities/CAP-001-published-container-image/criteria.md index 51471ee..ceac874 100644 --- a/docs/capabilities/CAP-001-published-container-image/criteria.md +++ b/docs/capabilities/CAP-001-published-container-image/criteria.md @@ -30,4 +30,12 @@ Scenario: Every published version has a changelog entry Given a version tag "vX.Y.Z" has been pushed When a contributor reads CHANGELOG.md Then it contains a "## [X.Y.Z]" section describing what changed since the previous version + +@AC-004 +Scenario: The launchers run the published image unless told otherwise + Test-type: Human + Given a contributor has not built or tagged any image locally + When they run "docker/rumble.sh runtimes" or "docker/rumble.ps1 runtimes" without an image argument + Then the launcher runs ghcr.io/robocode-dev/rumble-client:latest, pulling it if it is not present + And passing an explicit image argument, such as a locally built "rumble-client:dev", runs that image instead ``` diff --git a/docs/capabilities/CAP-001-published-container-image/design.md b/docs/capabilities/CAP-001-published-container-image/design.md index 3c712bc..79ff8b1 100644 --- a/docs/capabilities/CAP-001-published-container-image/design.md +++ b/docs/capabilities/CAP-001-published-container-image/design.md @@ -25,4 +25,6 @@ flowchart LR A package newly created on GHCR via `GITHUB_TOKEN` is not guaranteed to be public, which would silently defeat this capability's purpose (nobody could `docker pull` it without credentials) — and GitHub's API has no operation to set a package's visibility, so the workflow cannot fix this itself. Instead, after pushing, it proves the image is actually usable by logging out, removing the local image, and pulling it back down anonymously; a failure there fails the workflow run loudly rather than leaving a package a contributor cannot use. On the first release this is expected to fail once — `RELEASING.md` documents setting the package to public by hand in its GHCR settings, a one-time step, after which the same check should keep passing on every later release. +On the consuming side, `docker/rumble.sh` and `docker/rumble.ps1` default their image argument to `ghcr.io/robocode-dev/rumble-client:latest`. The container engine pulls it on first use; it does not refresh an already-present `latest`, so contributors re-run `docker pull` to pick up a newer release, or pass a version tag to pin one. A locally built image is used by passing its name as the image argument; CI's smoke check (`scripts/verify-container.sh`) does not go through the launchers and is unaffected by the default. + Versioning is manual (see the repository's `RELEASING.md`): a maintainer edits `CHANGELOG.md`'s `## [Unreleased]` section into a dated version heading, sets the plain (non-`-SNAPSHOT`) version in `gradle.properties`, commits, and pushes a matching `vX.Y.Z` tag. The tag is what the workflow reacts to; `gradle.properties` is not read by CI to decide what to publish. From 3d2448bc07f05eedc8d2101a9df1879179307276 Mon Sep 17 00:00:00 2001 From: "Flemming N. Larsen" Date: Sun, 13 Sep 2026 23:24:40 +0200 Subject: [PATCH 3/4] digest(CH-002): fold launcher default into the corpus Deletes the CH-002 change workspace now that every task is done; CAP-001's README, criteria (AC-004), and design carry the durable record. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KwJVGH7ftyX2ThQ2wMCLQK --- .../proposal.md | 21 ------------------- .../tasks.md | 15 ------------- 2 files changed, 36 deletions(-) delete mode 100644 changes/CH-002-launchers-default-ghcr-image/proposal.md delete mode 100644 changes/CH-002-launchers-default-ghcr-image/tasks.md diff --git a/changes/CH-002-launchers-default-ghcr-image/proposal.md b/changes/CH-002-launchers-default-ghcr-image/proposal.md deleted file mode 100644 index 1f90a00..0000000 --- a/changes/CH-002-launchers-default-ghcr-image/proposal.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: CH-002 -type: change -status: open -links: [CAP-001, G-001] -title: Launchers default to the published GHCR image ---- - -# CH-002 — Launchers default to the published GHCR image - -This change is plan-less: it serves G-001 directly and no plan exists in this repository. - -## What - -`docker/rumble.sh` and `docker/rumble.ps1` default their image argument to `ghcr.io/robocode-dev/rumble-client:latest` instead of the local-only name `rumble-client:dev`. Passing an explicit image argument keeps working, so a locally built image is still usable by naming it. - -The README Quickstart and container section drop the `docker tag` workaround: pulling the published image is the default path, and building the image or the Java code yourself moves under "Building `rumble-client` itself". CAP-001 is revised, because it currently states the launchers are unchanged, and gains a criterion for the new default. - -## Why - -G-001 wants contributors to run battles without building the image. CH-001 published the image, but the launchers still looked for `rumble-client:dev`, so the published image only worked after an extra `docker tag` step or a third argument on every command. Defaulting to the published image makes the common path pull-and-run. diff --git a/changes/CH-002-launchers-default-ghcr-image/tasks.md b/changes/CH-002-launchers-default-ghcr-image/tasks.md deleted file mode 100644 index 3e6fb68..0000000 --- a/changes/CH-002-launchers-default-ghcr-image/tasks.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: TASK-001 -type: tasks -status: open -links: [CH-002] -title: Tasks for CH-002 ---- - -# Tasks — CH-002 - -- [x] Add criterion AC-004 to CAP-001 for the launchers' default image, and revise the CAP-001 README's statement that the launchers are unchanged. -- [x] Change the default image in `docker/rumble.sh` and `docker/rumble.ps1` to `ghcr.io/robocode-dev/rumble-client:latest` (AC-004). -- [x] Update `README.md` so pulling the published image is the default and building it yourself is optional (AC-004). -- [x] Update `docs/architecture/README.md` and the CAP-001 design for the new default. -- [x] Add a `CHANGELOG.md` `[Unreleased]` entry. From 00549c060801c8493925052c57898635860137c1 Mon Sep 17 00:00:00 2001 From: "Flemming N. Larsen" Date: Sun, 13 Sep 2026 23:36:53 +0200 Subject: [PATCH 4/4] fix(CH-002): show Docker and Podman commands as alternatives The pull and build blocks listed docker and podman commands together, reading as if both should run. Keep the Docker command in the block and give the Podman equivalent in a sentence. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KwJVGH7ftyX2ThQ2wMCLQK --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ffe66fc..bc5e85b 100644 --- a/README.md +++ b/README.md @@ -37,9 +37,10 @@ Build the image locally: ```shell docker build --tag rumble-client:dev . -podman build --tag rumble-client:dev . ``` +With Podman, run `podman build --tag rumble-client:dev .` instead. + The launchers default to the published image, so pass the local name as their image argument to run your build, for example `docker/rumble.sh runtimes rumble-client.json rumble-client:dev` or `docker/rumble.ps1 runtimes rumble-client.json rumble-client:dev`. To run the four-language container smoke check locally, build the sample-bot archives and run `CONTAINER_ENGINE=podman TANK_ROYALE_SOURCE=../tank-royale bash scripts/verify-container.sh`; Docker is the default engine. @@ -84,9 +85,10 @@ Released versions are published to [`ghcr.io/robocode-dev/rumble-client`](https: ```shell docker pull ghcr.io/robocode-dev/rumble-client:latest -podman pull ghcr.io/robocode-dev/rumble-client:latest ``` +With Podman, run `podman pull ghcr.io/robocode-dev/rumble-client:latest` instead. + Substitute a specific version, e.g. `ghcr.io/robocode-dev/rumble-client:0.1.0`, to pin to a release; see [`CHANGELOG.md`](CHANGELOG.md) for what changed in each one. The launchers default to `ghcr.io/robocode-dev/rumble-client:latest`; pass another image name as their image argument to use a pinned version or a locally built image. The image runs with Docker Engine, Docker Desktop, or Podman. To build the image yourself instead, see [Building the container image](#building-the-container-image). The examples below use Docker; replace `docker` with `podman` when invoking the image directly. On Windows, Podman Desktop needs a running Linux virtual machine and can use WSL2 or Hyper-V as the provider; choose the provider when creating the machine. Podman Desktop/WSL2 on Windows and rootless Podman on Linux have both been manually verified for this image; neither is part of CI. Two flag differences from Docker are handled for you by the launcher scripts and do not need manual workarounds: