name: Docker build on tag
env:
  DOCKER_CLI_EXPERIMENTAL: enabled
  TAG_FMT: "^refs/tags/(((.?[0-9]+){3,4}))$"
  DOCKER_BUILDKIT: 0
  COMPOSE_DOCKER_CLI_BUILD: 0

on:
  push:
    tags:
      - v[0-9]+.[0-9]+.[0-9]+
      - v[0-9]+.[0-9]+.[0-9]+-*

permissions:
  contents: read

jobs:
  build:
    strategy:
      matrix:
        service:
          - frontend
          - backend
    runs-on: ubuntu-latest
    timeout-minutes: 120
    name: Build and push to DockerHub
    steps:
      # Workaround based on JonasAlfredsson/docker-on-tmpfs@v1.0.1
      - name: Replace the current swap file
        shell: bash
        run: |
          sudo swapoff /mnt/swapfile
          sudo rm -v /mnt/swapfile
          sudo fallocate -l 13G /mnt/swapfile
          sudo chmod 600 /mnt/swapfile
          sudo mkswap /mnt/swapfile
          sudo swapon /mnt/swapfile

      - name: Show current memory and swap status
        shell: bash
        run: |
          sudo free -h
          echo
          sudo swapon --show

      - name: Mount a tmpfs over /var/lib/docker
        shell: bash
        run: |
          if [ ! -d "/var/lib/docker" ]; then
            echo "Directory '/var/lib/docker' not found"
            exit 1
          fi
          sudo mount -t tmpfs -o size=10G tmpfs /var/lib/docker
          sudo systemctl restart docker
          sudo df -h | grep docker

      - name: Set env variables
        run: echo "TAG=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV

      - name: Show set environment variables
        run: |
          printf "      TAG: %s\n"  "$TAG"

      - name: Add SHORT_SHA env property with commit short sha
        run: echo "SHORT_SHA=`echo ${GITHUB_SHA} | cut -c1-8`" >> $GITHUB_ENV

      - name: Login to Docker for building
        run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin

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

      - name: Init repo for Dockerization
        run: docker/init.sh "$TAG"

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
        id: qemu

      - name: Setup Docker buildx action
        uses: docker/setup-buildx-action@v3
        id: buildx

      - name: Available platforms
        run: echo ${{ steps.buildx.outputs.platforms }}

      - name: Cache Docker layers
        uses: actions/cache@v3
        id: cache
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-buildx-

      - name: Run Docker buildx for ${{ matrix.service }} against tag
        run: |
          docker buildx build \
          --cache-from "type=local,src=/tmp/.buildx-cache" \
          --cache-to "type=local,dest=/tmp/.buildx-cache" \
          --platform linux/amd64,linux/arm64 \
          --tag ${{ secrets.DOCKER_HUB_USER }}/${{ matrix.service }}:$TAG \
          --tag ${{ secrets.DOCKER_HUB_USER }}/${{ matrix.service }}:latest \
          --build-context rustgbt=./rust \
          --build-context backend=./backend \
          --output "type=registry" ./${{ matrix.service }}/ \
          --build-arg commitHash=$SHORT_SHA
