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:
19
.dockerignore
Normal file
19
.dockerignore
Normal 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
20
.gitea/workflows/ci.yml
Normal 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
|
||||||
30
.gitea/workflows/release.yml
Normal file
30
.gitea/workflows/release.yml
Normal 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
52
.goreleaser.yaml
Normal 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
|
||||||
24
Dockerfile
24
Dockerfile
@@ -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
31
Dockerfile.goreleaser
Normal 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"]
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user