name: build

on:
  push:
    branches:
      - 'master'
    tags:
      - 'v*'
  pull_request:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Set up Go
        uses: actions/setup-go@v5.0.1
        with:
          go-version: "1.22"

      - name: Set up nodejs
        uses: actions/setup-node@v4
        with:
          node-version: '17'
      
      - name: Create frontend bundle
        run: cd public && npm ci && npm run bundle

      - name: Cache Go modules
        uses: actions/cache@v4
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-

      - name: Tests
        run: |
          go test ./...

      # only on tags or the master branch
      - name: Docker Login
        if: success() && (startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/master')
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      # only on tags
      - name: Run GoReleaser
        uses: goreleaser/goreleaser-action@v6
        if: success() && startsWith(github.ref, 'refs/tags/')
        with:
          version: latest
          args: release --clean
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      # only on the master branch
      - name: Build and push latest docker image
        if: success() && github.ref == 'refs/heads/master'
        run: |
          CGO_ENABLED=0 go build .
          docker build . -t minetestmapserver/mapserver:latest
          docker push minetestmapserver/mapserver:latest