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
This commit is contained in:
MrFastwind
2026-07-06 17:35:23 +02:00
parent cc7cb0bc56
commit d94593743f
7 changed files with 167 additions and 12 deletions

19
.dockerignore Normal file
View File

@@ -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

20
.gitea/workflows/ci.yml Normal file
View File

@@ -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

View File

@@ -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 }}

52
.goreleaser.yaml Normal file
View File

@@ -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

View File

@@ -1,4 +1,4 @@
FROM golang:1.25-alpine AS backend FROM golang:1.25-bookworm AS backend
WORKDIR /src WORKDIR /src
COPY backend/go.mod backend/go.sum ./ COPY backend/go.mod backend/go.sum ./
RUN go mod download RUN go mod download
@@ -12,9 +12,19 @@ RUN npm ci
COPY frontend/ . COPY frontend/ .
RUN npm run build RUN npm run build
FROM alpine:3.21 FROM debian:bookworm-slim
RUN apk add --no-cache ca-certificates tzdata RUN apt-get update && \
RUN apk add --no-cache steamcmd libstdc++ libgcc || true 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=backend /server /usr/local/bin/arma3-web-server
COPY --from=frontend /src/dist /usr/share/arma3-web-server/frontend 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 EXPOSE 8080
VOLUME ["/data", "/servers"] 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 DATA_DIR=/data
ENV SERVERFILE_DIR=/servers ENV SERVERFILE_DIR=/servers
ENV MODS_DIR=/servers/mods ENV MODS_DIR=/servers/mods

31
Dockerfile.goreleaser Normal file
View File

@@ -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"]

View File

@@ -6,8 +6,7 @@ services:
- "8080:8080" - "8080:8080"
volumes: volumes:
- ./data:/data - ./data:/data
# /servers should contain the Arma 3 server install (binary + steamapps/workshop for mods) - ${SERVERS_DIR:-./serverfiles}:/servers
- /path/to/your/servers:/servers
environment: environment:
- DATA_DIR=/data - DATA_DIR=/data
- SERVERFILE_DIR=/servers - SERVERFILE_DIR=/servers