name: release # Kör tester och bygger release-zippar för linux-amd64 och windows-amd64. # Varje push till master uppdaterar den rullande releasen "latest"; en tagg # vX.Y.Z ger dessutom en versionerad release. # # Körs ALLTID på brasse-linux01-runnern (label linux-amd64): Linux-bygget # behöver cgo + X11/GL-headers för amd64, vilket Pi5:n (arm64) inte kan ge # utan korskompilator – och Pi5:n ska inte belastas med spelbyggen. # Är datorn av köas jobbet tills runnern är tillbaka (ofarligt: pushar görs # ändå därifrån). Första steget vägrar köra på arm64 som skydd om labels ändras. on: push: branches: [master] tags: ["v*"] workflow_dispatch: inputs: tag: description: "Release-tag (lämna tom för 'latest')" required: false jobs: build-release: runs-on: linux-amd64 container: image: golang:1.27-bookworm steps: - name: Vägra bygga på arm64/Pi5 run: | if [ "$(uname -m)" != "x86_64" ]; then echo "::error::Fel runner ($(uname -m)). Spelbygget ska köras på brasse-linux01 (label linux-amd64)." exit 1 fi echo "Runner OK: $(uname -m) på $(hostname)" - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 # taggar behövs för versionsstämpeln (git describe) - name: Byggberoenden (X11/GL/ALSA-headers för Ebitengine på Linux) run: | apt-get update -qq DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends \ gcc libc6-dev pkg-config libgl1-mesa-dev libx11-dev libxrandr-dev libxcursor-dev \ libxinerama-dev libxi-dev libxxf86vm-dev libasound2-dev zip jq curl git >/dev/null git config --global --add safe.directory '*' go version - name: Cache Go-moduler uses: actions/cache@v4 with: path: /go/pkg/mod key: gomod-${{ hashFiles('go.sum') }} restore-keys: gomod- - name: Bestäm release-tag id: t run: | case "$GITHUB_REF" in refs/tags/*) T="$GITHUB_REF_NAME" ;; *) T="${{ inputs.tag }}"; [ -z "$T" ] && T="latest" ;; esac echo "tag=$T" >> "$GITHUB_OUTPUT" echo "bygger release: $T" - name: Vet + test run: | go vet ./... go test ./... - name: Bygg release (linux-amd64 + windows-amd64) run: | go run ./tools/build -mode release -os linux -arch amd64 go run ./tools/build -mode release -os windows -arch amd64 mkdir -p out (cd build/release && zip -qr ../../out/metro-puzzle-jp-linux-amd64.zip linux-amd64) (cd build/release && zip -qr ../../out/metro-puzzle-jp-windows-amd64.zip windows-amd64) (cd out && sha256sum *.zip > checksums.txt && ls -la && cat checksums.txt) - name: Skapa/uppdatera Gitea-release + ladda upp assets env: REPO: ${{ github.repository }} TAG: ${{ steps.t.outputs.tag }} TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | # gitea-d finns bara på Pi5:ns dockernät; härifrån används publika adressen API=http://gitea-d:3000/api/v1 curl -sf -m 5 "$API/version" >/dev/null 2>&1 || API=https://gitea.brasse-pc.eu/api/v1 echo "API: $API" auth() { curl -s -H "Authorization: token $TOKEN" "$@"; } VER=$(./build/release/linux-amd64/metro-puzzle-jp -version 2>/dev/null | awk '{print $2}' || echo "$TAG") BODY="Metro Puzzle JP $TAG ($VER, commit ${GITHUB_SHA:0:10}). Packa upp zippen för din plattform och kör binären i mappen – resources/ måste ligga bredvid. - Linux: kräver ett skrivbord med OpenGL (mesa) och X11/XWayland. Ljud via ALSA/PipeWire. - Windows 10+: inga extra beroenden." if [ "$TAG" = "latest" ]; then # rullande release: ta bort den gamla så att taggen följer master rid=$(auth "$API/repos/$REPO/releases/tags/$TAG" | jq -r '.id // empty') [ -n "$rid" ] && auth -X DELETE "$API/repos/$REPO/releases/$rid" -o /dev/null auth -X DELETE "$API/repos/$REPO/tags/$TAG" -o /dev/null || true JSON=$(jq -n --arg t "$TAG" --arg c "$GITHUB_SHA" --arg n "latest ($VER)" --arg b "$BODY" \ '{tag_name:$t, target_commitish:$c, name:$n, body:$b, prerelease:true}') else JSON=$(jq -n --arg t "$TAG" --arg b "$BODY" '{tag_name:$t, name:$t, body:$b}') fi RESP=$(auth -X POST "$API/repos/$REPO/releases" -H 'Content-Type: application/json' -d "$JSON") rid=$(echo "$RESP" | jq -r '.id // empty') [ -z "$rid" ] && rid=$(auth "$API/repos/$REPO/releases/tags/$TAG" | jq -r '.id // empty') [ -n "$rid" ] && [ "$rid" != "null" ] || { echo "kunde inte skapa release: $RESP"; exit 1; } echo "release id: $rid" for f in metro-puzzle-jp-linux-amd64.zip metro-puzzle-jp-windows-amd64.zip checksums.txt; do aid=$(auth "$API/repos/$REPO/releases/$rid/assets" | jq -r ".[] | select(.name==\"$f\") | .id") if [ -n "$aid" ] && [ "$aid" != "null" ]; then auth -X DELETE "$API/repos/$REPO/releases/$rid/assets/$aid" -o /dev/null fi echo "laddar upp $f ..." auth -X POST "$API/repos/$REPO/releases/$rid/assets?name=$f" -F "attachment=@out/$f" -o /dev/null -w " -> HTTP %{http_code}\n" done echo "klart: https://gitea.brasse-pc.eu/$REPO/releases/tag/$TAG"