From d94593743f80cde100e81678567efec25d63fe3c Mon Sep 17 00:00:00 2001 From: MrFastwind Date: Mon, 6 Jul 2026 17:35:23 +0200 Subject: [PATCH] ci: add build and distribution pipeline with goreleaser and Gitea Actions - .goreleaser.yaml: cross-compile linux/windows, Docker image, Gitea releases - .gitea/workflows/ci.yml: verify build on every push/PR - .gitea/workflows/release.yml: goreleaser + Docker on tag push - Dockerfile: switch to debian:bookworm-slim, install steamcmd from Valve - Dockerfile.goreleaser: minimal image used by goreleaser dockers - docker-compose.yml: parameterize SERVERS_DIR via env var --- .dockerignore | 19 +++++++++++++ .gitea/workflows/ci.yml | 20 ++++++++++++++ .gitea/workflows/release.yml | 30 +++++++++++++++++++++ .goreleaser.yaml | 52 ++++++++++++++++++++++++++++++++++++ Dockerfile | 24 ++++++++++------- Dockerfile.goreleaser | 31 +++++++++++++++++++++ docker-compose.yml | 3 +-- 7 files changed, 167 insertions(+), 12 deletions(-) create mode 100644 .dockerignore create mode 100644 .gitea/workflows/ci.yml create mode 100644 .gitea/workflows/release.yml create mode 100644 .goreleaser.yaml create mode 100644 Dockerfile.goreleaser diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..ed0f43d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,19 @@ +node_modules/ +frontend/node_modules/ +frontend/dist/ +data/ +serverfiles/ +.git/ +.gitignore +*.log +*.rpt +.DS_Store +.env +modlist-example.html +Start-Server-kp.bat +PLAN.md +CODEBASE.md +ARMA3.md +.gitea/ +.goreleaser.yaml +.dockerignore diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml new file mode 100644 index 0000000..4dcc261 --- /dev/null +++ b/.gitea/workflows/ci.yml @@ -0,0 +1,20 @@ +name: CI +on: + push: + branches: + - "**" + pull_request: {} + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: "1.25" + - uses: actions/setup-node@v4 + with: + node-version: "22" + - run: cd backend && go build ./... + - run: cd frontend && npm ci && npm run build diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..76135cc --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,30 @@ +name: Release +on: + push: + tags: + - "v*" + +jobs: + goreleaser: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/setup-go@v5 + with: + go-version: "1.25" + - uses: actions/setup-node@v4 + with: + node-version: "22" + - uses: docker/setup-qemu-action@v3 + - uses: docker/setup-buildx-action@v3 + - run: cd frontend && npm ci + - uses: goreleaser/goreleaser-action@v6 + with: + version: "~> 2" + args: release --clean + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + REGISTRY: ${{ gitea.server_host }} + REPOSITORY_OWNER: ${{ gitea.repository_owner }} diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000..2c93a26 --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,52 @@ +version: 2 + +project_name: arma3-web-server + +before: + hooks: + - cd frontend && npm ci && npm run build + +builds: + - id: server + dir: backend + main: ./cmd/server/ + binary: arma3-web-server + goos: + - linux + - windows + goarch: + - amd64 + env: + - CGO_ENABLED=0 + +archives: + - id: default + name_template: >- + {{ .ProjectName }}_{{ .Tag }}_{{ .Os }}_{{ .Arch }} + files: + - frontend/dist/**/* + +dockers: + - ids: + - server + goos: linux + goarch: amd64 + image_templates: + - "{{ .Env.REGISTRY }}/{{ .Env.REPOSITORY_OWNER }}/arma3-web-server:{{ .Tag }}" + - "{{ .Env.REGISTRY }}/{{ .Env.REPOSITORY_OWNER }}/arma3-web-server:latest" + dockerfile: Dockerfile.goreleaser + extra_files: + - frontend/dist + +checksum: + name_template: "checksums.txt" + +snapshot: + name_template: "{{ incpatch .Version }}-next" + +release: + gitea: + owner: "{{ .Env.REPOSITORY_OWNER }}" + name: arma3-web-server + draft: false + prerelease: auto diff --git a/Dockerfile b/Dockerfile index 30a525e..2b4561c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.25-alpine AS backend +FROM golang:1.25-bookworm AS backend WORKDIR /src COPY backend/go.mod backend/go.sum ./ RUN go mod download @@ -12,9 +12,19 @@ RUN npm ci COPY frontend/ . RUN npm run build -FROM alpine:3.21 -RUN apk add --no-cache ca-certificates tzdata -RUN apk add --no-cache steamcmd libstdc++ libgcc || true +FROM debian:bookworm-slim +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + ca-certificates \ + tzdata \ + lib32gcc-s1 \ + wget \ + xz-utils && \ + mkdir -p /steamcmd && \ + wget -qO- https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz | \ + tar xvz -C /steamcmd && \ + ln -s /steamcmd/steamcmd.sh /usr/local/bin/steamcmd && \ + rm -rf /var/lib/apt/lists/* COPY --from=backend /server /usr/local/bin/arma3-web-server COPY --from=frontend /src/dist /usr/share/arma3-web-server/frontend @@ -22,12 +32,6 @@ COPY --from=frontend /src/dist /usr/share/arma3-web-server/frontend EXPOSE 8080 VOLUME ["/data", "/servers"] -# Expected mount structure under /servers: -# /servers/ ← SERVERFILE_DIR (arma3server_x64 binary, userconfig/) -# /servers/steamapps/workshop/content/107410/ ← workshop mods (downloaded via SteamCMD) -# /servers/mods/ ← MODS_DIR (@modname mod folders) -# /servers/cfg/ ← CFG_DIR (.cfg files) -# /servers/profiles/ ← PROFILES_DIR (logs, .rpt, server profile) ENV DATA_DIR=/data ENV SERVERFILE_DIR=/servers ENV MODS_DIR=/servers/mods diff --git a/Dockerfile.goreleaser b/Dockerfile.goreleaser new file mode 100644 index 0000000..7e13dd1 --- /dev/null +++ b/Dockerfile.goreleaser @@ -0,0 +1,31 @@ +FROM debian:bookworm-slim + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + ca-certificates \ + tzdata \ + lib32gcc-s1 \ + wget \ + xz-utils && \ + mkdir -p /steamcmd && \ + wget -qO- https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz | \ + tar xvz -C /steamcmd && \ + ln -s /steamcmd/steamcmd.sh /usr/local/bin/steamcmd && \ + rm -rf /var/lib/apt/lists/* + +COPY arma3-web-server /usr/local/bin/arma3-web-server +COPY frontend/dist /usr/share/arma3-web-server/frontend + +EXPOSE 8080 +VOLUME ["/data", "/servers"] + +ENV DATA_DIR=/data +ENV SERVERFILE_DIR=/servers +ENV MODS_DIR=/servers/mods +ENV CFG_DIR=/servers/cfg +ENV PROFILES_DIR=/servers/profiles +ENV LISTEN=:8080 +ENV FRONTEND_DIR=/usr/share/arma3-web-server/frontend +ENV GIN_MODE=release + +ENTRYPOINT ["arma3-web-server"] diff --git a/docker-compose.yml b/docker-compose.yml index 9c74a7a..17376df 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,8 +6,7 @@ services: - "8080:8080" volumes: - ./data:/data - # /servers should contain the Arma 3 server install (binary + steamapps/workshop for mods) - - /path/to/your/servers:/servers + - ${SERVERS_DIR:-./serverfiles}:/servers environment: - DATA_DIR=/data - SERVERFILE_DIR=/servers