mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-10 16:04:04 +00:00
14e1e62deb
New additive targets, the existing server/exporter/smoke-client/enet-test
targets are byte-for-byte unchanged (make verify-phase6 re-run clean
after this, see previous commit):
- supervisor-build: builds server/cmd/game-server-supervisor with a
pinned golang:1.23-alpine (matching go.mod's go 1.23)
- game-server: the same dedicated-server export as `server`, plus the
supervisor binary, with the supervisor as ENTRYPOINT instead of the
direct launcher script -- this is what makes the process-ready/
assignment-ready control-plane registration from the last two
commits actually reachable in a real deployment.
Verified with a real docker build --target game-server, not just by
reading the file: both binaries land at the expected paths with
correct permissions, and the supervisor prints its usage text when
run directly.
deploy/k8s/base/fleet.yaml does not reference this image or invoke the
supervisor's flags yet -- documented inline and in
multiplayer-next.md; that's the next concrete step, not attempted here
since the exact flag values (control-plane URL, workload-token mount
path) are deployment-environment decisions this sandbox can't make.
74 lines
4.3 KiB
Docker
74 lines
4.3 KiB
Docker
# Local-only dedicated-server build and verification image. Pin the Godot
|
|
# release family used by project.godot; no image is pushed by this repository.
|
|
# barichello/godot-ci:4.7.1 (linux/amd64), resolved 2026-08-29.
|
|
FROM --platform=linux/amd64 barichello/godot-ci@sha256:622e5ca81b54cd8038ecf7de5d157b47efc800d7cf635af2eec18a6aee4bab7e AS project-imported
|
|
WORKDIR /workspace
|
|
RUN apt-get update \
|
|
&& apt-get install -y --no-install-recommends libfontconfig1 \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
COPY Game /workspace/Game
|
|
# `--import` starts the editor, waits for resource import to finish, then
|
|
# exits. Do not combine it with `--quit`, which ends the editor after one
|
|
# iteration and can interrupt generation of `.godot/imported` resources.
|
|
RUN godot --headless --path Game --import \
|
|
&& test -f Game/.godot/imported/nebula_station.glb-fa9a6dd87ae3789d04205b52215e2e76.scn \
|
|
&& test -f Game/.godot/imported/nebula_debris.glb-39af77a17c0998b5b73172577d906cb9.scn \
|
|
&& test -f Game/.godot/imported/nebula_planet.glb-2431590907ff85cf1057e7d6ad614ed7.scn
|
|
|
|
# Test the source client from an untouched, fully imported project. The
|
|
# dedicated-server export below rewrites the main scene and must not be used
|
|
# to run client integration tests.
|
|
FROM project-imported AS enet-test
|
|
COPY scripts/verify_enet_integration.sh /workspace/scripts/verify_enet_integration.sh
|
|
|
|
# Godot dedicated exports disallow command-line scene overrides. Bake the
|
|
# server scene into this export (the interactive project's source stays
|
|
# unchanged), then generate the global-script/autoload metadata it needs.
|
|
FROM project-imported AS exporter
|
|
RUN sed -i 's|^run/main_scene=.*$|run/main_scene="res://scenes/server_boot.tscn"|' Game/project.godot \
|
|
&& mkdir -p /opt/cosmic-clash \
|
|
&& godot --headless --path Game --export-release "Linux Dedicated Server" /opt/cosmic-clash/CosmicClashServer.x86_64
|
|
|
|
# ubuntu:24.04 multi-architecture index, resolved 2026-09-01. The previous
|
|
# pin (571c2ab1...) no longer resolves from Docker Hub as of this date --
|
|
# `docker pull` by that exact digest returns "not found", meaning
|
|
# make verify-phase6 (and this Dockerfile generally) was currently broken for
|
|
# anyone building from a clean cache. Re-pinned to a digest verified to pull.
|
|
FROM --platform=linux/amd64 ubuntu@sha256:33ceb71981b602c1a7443a53469e4dba065f7503eab3078a2d7a57a2ab987517 AS server
|
|
RUN apt-get update && apt-get install -y --no-install-recommends libfontconfig1 libgl1 libstdc++6 && rm -rf /var/lib/apt/lists/*
|
|
COPY --from=exporter /opt/cosmic-clash/ /opt/cosmic-clash/
|
|
COPY deploy/cosmic-clash-server /opt/cosmic-clash/cosmic-clash-server
|
|
RUN chmod 0755 /opt/cosmic-clash/cosmic-clash-server
|
|
WORKDIR /opt/cosmic-clash
|
|
EXPOSE 7777/udp
|
|
ENTRYPOINT ["/opt/cosmic-clash/cosmic-clash-server"]
|
|
|
|
# Test-only target: runs the source client harness against the exported server.
|
|
FROM exporter AS smoke-client
|
|
WORKDIR /workspace
|
|
ENTRYPOINT ["godot", "--headless", "--path", "Game", "res://tests/export_server_smoke.tscn", "--"]
|
|
|
|
# Builds the process supervisor (server/supervisor, multiplayer-next.md task
|
|
# 8.27/8.28) that wraps the Agones-allocated dedicated server as PID 1.
|
|
# golang:1.23-alpine (matches server/go.mod's `go 1.23`), resolved 2026-09-01.
|
|
FROM --platform=linux/amd64 golang@sha256:383395b794dffa5b53012a212365d40c8e37109a626ca30d6151c8348d380b5f AS supervisor-build
|
|
WORKDIR /workspace/server
|
|
COPY server/go.mod server/go.sum ./
|
|
RUN go mod download
|
|
COPY server/ ./
|
|
RUN CGO_ENABLED=0 go build -o /opt/cosmic-clash/game-server-supervisor ./cmd/game-server-supervisor
|
|
|
|
# Agones-allocated fleet image: the same dedicated-server export as `server`
|
|
# (unchanged above; make verify-phase6 exercises that target exactly as
|
|
# before), wrapped by the Go supervisor as PID 1 instead of the direct
|
|
# launcher script -- required for process-ready/assignment-ready Agones SDK
|
|
# calls and control-plane registration (multiplayer-next.md §8.27/§8.28).
|
|
# deploy/k8s/base/fleet.yaml does not reference this target yet: the
|
|
# per-deployment supervisor flags (--sdk-base-url, --control-plane-url,
|
|
# --workload-token-path, ...) still need to be decided and added to the
|
|
# Fleet pod template, along with the projected workload-token volume.
|
|
FROM server AS game-server
|
|
COPY --from=supervisor-build /opt/cosmic-clash/game-server-supervisor /opt/cosmic-clash/game-server-supervisor
|
|
RUN chmod 0755 /opt/cosmic-clash/game-server-supervisor
|
|
ENTRYPOINT ["/opt/cosmic-clash/game-server-supervisor"]
|