---

name: Build and Deploy CI

on:
  push:
    branches: [ 'dev-**', 'pr-**', staging, master ]
    tags: [ '**' ]
  pull_request:
    branches: [ staging, master ]
  schedule:
    # At 02:30 on Saturday
    - cron:  '30 2 * * 6'

jobs:

  build_docker:

    name: Build Docker Image
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        flavour: ["debian", "arch"]

    steps:
    # Fetch shallow git repository
    - name: Checkout
      uses: actions/checkout@v2

    # Use QEMU to build
    - name: Set up QEMU
      if: success()
      id: qemu
      uses: docker/setup-qemu-action@v1

    # Use docker buildx to build the docker image
    - name: Build the Docker image
      uses: docker/setup-buildx-action@v1
      if: success()
      id: buildx
      with:
        version: latest

    # Generate 'prepare' build arguments to be retrieved later on
    - name: Prepare
      if: success()
      id: prepare
      run: |
        FLAVOUR=${{ matrix.flavour }}
        echo  "FLAVOUR='${FLAVOUR}'"
        echo  "GITHUB_REF='${GITHUB_REF}'"
        echo  "GITHUB_REPOSITORY='${GITHUB_REPOSITORY}'"
        DOCKER_IMAGE=docker.io/josh5/steam-headless
        VERSION_TAG=${GITHUB_REF#refs/*/}
        DOCKER_TAGS=""
        if [[ ${VERSION_TAG%/merge} == 'master' ]]; then
          if [[ ${FLAVOUR} == 'debian' ]]; then
            DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:latest,"
          fi
          DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:${FLAVOUR},"
        elif [[ ${VERSION_TAG%/merge} == 'staging' ]]; then
          DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:${FLAVOUR}-staging,"
        elif [[ ${VERSION_TAG%/merge} =~ "dev-"* ]]; then
          DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:${FLAVOUR}-${VERSION_TAG%/merge},"
        fi
        if [[ ${GITHUB_REF} == refs/tags/* ]]; then
          VERSION=${GITHUB_REF#refs/tags/}
          if [[ ${VERSION} =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}[-\w]*$ ]]; then
            DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:${FLAVOUR}-${VERSION},"
            if [[ ${FLAVOUR} == 'debian' ]]; then
              DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:latest,"
            fi
          fi
        fi
        echo "DOCKER_TAGS='${DOCKER_TAGS}'"

        echo "Build: [$(date +"%F %T")] [${GITHUB_REF_NAME}] [${GITHUB_SHA}] [${FLAVOUR}]" > ./overlay/version.txt

        DOCKER_PUSH="true"
        if [[ ${DOCKER_IMAGE} != 'docker.io/josh5/steam-headless' ]]; then
          DOCKER_PUSH="false"
        fi
        if [[ ${VERSION_TAG%/merge} =~ "pr-"* ]]; then
          DOCKER_PUSH="false"
        fi
        if [[ ${VERSION_TAG%/merge} =~ ^[0-9]+$ ]]; then
          DOCKER_PUSH="false"
        fi
        if [[ "X${DOCKER_TAGS}" == "X" ]]; then
          DOCKER_PUSH="false"
        fi
        echo "DOCKER_PUSH='${DOCKER_PUSH}'"
        cat ./overlay/version.txt

        echo "docker_image=${DOCKER_IMAGE}" >> $GITHUB_OUTPUT
        echo "docker_tags=$(echo ${DOCKER_TAGS} | sed 's/,$//')" >> $GITHUB_OUTPUT
        echo "docker_platforms=linux/amd64" >> $GITHUB_OUTPUT
        echo "docker_push=${DOCKER_PUSH}" >> $GITHUB_OUTPUT

    # Cache the build
    - name: Cache Docker layers
      uses: actions/cache@v2
      id: cache
      with:
        path: /tmp/.buildx-cache
        key: ${{ runner.os }}-buildx-${{ matrix.flavour }}-${{ github.sha }}
        restore-keys: |
          ${{ runner.os }}-buildx-${{ matrix.flavour }}-
    
    # Login to Docker Hub
    - name: Login to Docker Hub
      if: success() && (startsWith(github.ref, 'refs/heads/') || startsWith(github.ref, 'refs/tags/'))
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}
    
    # Run docker build and push
    - name: Docker Build and Push
      if: success()
      uses: docker/build-push-action@v2
      with:
        context: .
        file: Dockerfile.${{ matrix.flavour }}
        pull: true
        platforms: ${{ steps.prepare.outputs.docker_platforms }}
        push: ${{ steps.prepare.outputs.docker_push }}
        tags: |
          ${{ steps.prepare.outputs.docker_tags }}
        cache-from: type=local,src=/tmp/.buildx-cache
        cache-to: type=local,mode=max,dest=/tmp/.buildx-cache-new

    # Keep only latest cache
    #   https://github.com/docker/build-push-action/issues/252
    #   https://github.com/moby/buildkit/issues/1896
    - name: Move cache
      if: always()
      run: |
        if [[ -e /tmp/.buildx-cache-new ]]; then
          echo "Cleaning up old cache..."
          rm -rf /tmp/.buildx-cache
          mv -v /tmp/.buildx-cache-new /tmp/.buildx-cache
        fi