# syntax=docker/dockerfile:1 # # Crucible toolchain image: registry.westgate.pw/sow/crucible: # # Reproducible multi-stage build, no on-VPS build. Produces every cmd/* binary # and ships them on a static base. The `crucible` dispatcher is the entrypoint; # consumer CI can also call the standalone crucible- binaries by path. # # NOTE: the internal pipeline is migrated and the music conversion path is wired, # so the runtime stage is debian-slim with ffmpeg on PATH (BMU encode/decode). # See docs/migration-from-nwn-tool.md. FROM golang:1.26-alpine AS build WORKDIR /src RUN apk add --no-cache git # go.sum is committed now that the migrated packages pull golang.org/x/text and # gopkg.in/yaml.v3; the glob keeps the build working if it is ever absent. COPY go.mod go.sum* ./ RUN go mod download COPY . . ARG GIT_SHA=unknown ENV CGO_ENABLED=0 RUN set -eux; \ mkdir -p /out; \ for dir in ./cmd/*/; do \ name="$(basename "${dir}")"; \ go build -trimpath \ -ldflags "-s -w -X git.westgate.pw/ShadowsOverWestgate/sow-tools/internal/buildinfo.Version=${GIT_SHA}" \ -o "/out/${name}" "${dir}"; \ done FROM debian:12-slim # ffmpeg: the migrated music pipeline shells out to it for BMU conversion. # ca-certificates: builders fetch published manifests over HTTPS. RUN set -eux; \ apt-get update; \ apt-get install -y --no-install-recommends ffmpeg ca-certificates; \ rm -rf /var/lib/apt/lists/*; \ useradd --system --create-home --uid 65532 nonroot COPY --from=build /out/ /usr/local/bin/ USER nonroot ENTRYPOINT ["/usr/local/bin/crucible"] CMD ["help"]