name: Server release

on:
  push:
    tags:
      - "v*"
  workflow_dispatch:

jobs:
  build-server:
    name: Build a docker image for spacedrive server
    runs-on: blacksmith-4vcpu-ubuntu-2404
    defaults:
      run:
        shell: bash
    steps:
      - name: Maximize build space
        if: ${{ runner.os == 'Linux' }}
        uses: easimon/maximize-build-space@master
        with:
          remove-codeql: 'true'
          remove-dotnet: 'true'
          remove-haskell: 'true'
          remove-android: 'true'
          overprovision-lvm: 'true'
          remove-docker-images: 'true'

      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Homebrew
        id: set-up-homebrew
        uses: Homebrew/actions/setup-homebrew@master

      - name: Update Podman & crun
        run: |
          sudo apt-get remove crun podman
          brew install crun podman

      - name: Update buildah
        shell: bash
        run: |
          set -euxo pipefail
          wget -O- 'https://github.com/HeavenVolkoff/buildah-static/releases/latest/download/buildah-amd64.tar.gz' \
          | sudo tar -xzf- -C /usr/local/bin

      - name: Install netavark
        shell: bash
        run: |
          set -euxo pipefail
          sudo mkdir -p /usr/local/lib/podman
          sudo wget -O- 'https://github.com/containers/netavark/releases/latest/download/netavark.gz' \
          | gunzip | sudo dd status=none of=/usr/local/lib/podman/netavark
          sudo chmod +x /usr/local/lib/podman/netavark

      - name: Install passt
        shell: bash
        working-directory: /tmp
        run: |
          set -euxo pipefail

          deb="$(
            curl -SsL https://passt.top/builds/latest/x86_64 \
            | grep -oP 'passt[^\.<>'\''"]+\.deb' | sort -u | head -n1
          )"

          curl -SsJLO "https://passt.top/builds/latest/x86_64/${deb}"
          sudo dpkg -i "${deb}"

      - name: Basic sanity check
        run: |
          crun --version
          podman version
          buildah --version

      - name: Determine image name & tag
        id: image_info
        shell: bash
        run: |
          set -euxo pipefail
          if [[ "$GITHUB_REF" == refs/tags/* ]]; then
            IMAGE_TAG="${GITHUB_REF##*/}"
            # Only tag as "latest" for stable releases (no alpha/beta/rc suffix)
            if [[ "$IMAGE_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
              EXTRA_TAG="latest"
            else
              EXTRA_TAG=""
            fi
          else
            IMAGE_TAG="$(git rev-parse --short "$GITHUB_SHA")"
            EXTRA_TAG="staging"
          fi
          IMAGE_TAG="${IMAGE_TAG,,}"
          IMAGE_NAME="${GITHUB_REPOSITORY,,}/server"

          echo "Building ${IMAGE_NAME}:${IMAGE_TAG}"

          echo "tag=${IMAGE_TAG}" >> "$GITHUB_OUTPUT"
          echo "extra_tag=${EXTRA_TAG}" >> "$GITHUB_OUTPUT"
          echo "name=${IMAGE_NAME}" >> "$GITHUB_OUTPUT"
          echo "repo=${GITHUB_REPOSITORY}" >> "$GITHUB_OUTPUT"
          echo "repo_ref=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> "$GITHUB_OUTPUT"

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
        with:
          platforms: 'arm64'

      - name: Build image
        id: build-image
        uses: redhat-actions/buildah-build@v2
        with:
          tags: ${{ steps.image_info.outputs.extra_tag && format('{0} {1}', steps.image_info.outputs.tag, steps.image_info.outputs.extra_tag) || steps.image_info.outputs.tag }}
          archs: amd64, arm64
          image: ${{ steps.image_info.outputs.name }}
          layers: 'false'
          context: .
          build-args: |
            REPO=${{ steps.image_info.outputs.repo }}
            REPO_REF=${{ steps.image_info.outputs.repo_ref }}
          containerfiles: |
            ./apps/server/Dockerfile

      - name: Push image to ghcr.io
        uses: redhat-actions/push-to-registry@v2
        with:
          tags: ${{ steps.build-image.outputs.tags }}
          image: ${{ steps.build-image.outputs.image }}
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
