name: Docker

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

on:
  schedule:
    - cron: '30 20 * * Sun'
  push:
    branches: ["*"]
    # Publish semver tags as releases.
    tags: ["v*.*.*"]
  pull_request:
    branches: ["{{is_default_branch}}"]
  release:
    types: [published]

env:
  # Use docker.io for Docker Hub if empty
  REGISTRY: ghcr.io
  # github.repository as <account>/<repo>
  IMAGE_NAME: ${{ github.repository }}

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        include:
          - dockerfile: ./Dockerfile
            image: ghcr.io/${{ github.repository }}
            flavour: ""
          - dockerfile: ./Dockerfile.alpine
            image: ghcr.io/${{ github.repository }}
            flavour: "-alpine"
    permissions:
      contents: read
      packages: write
      # This is used to complete the identity challenge
      # with sigstore/fulcio when running outside of PRs.
      id-token: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      # Fetch the ipinfo database file using curl if API key is defined
      - name: Fetch DB from ipinfo.io
        # IPINFO_APIKEY is set in https://github.com/librespeed/speedtest/settings/secrets/actions
        run: |
          if [ -z "${{ secrets.IPINFO_APIKEY }}" ]; then
            echo "Warning: IPINFO_APIKEY is not defined."
          else
            curl -L https://ipinfo.io/data/free/country_asn.mmdb?token=${{ secrets.IPINFO_APIKEY }} -o backend/country_asn.mmdb
          fi

      # Set up BuildKit Docker container builder to be able to build
      # multi-platform images and export cache
      # https://github.com/docker/setup-buildx-action
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      # Login against a Docker registry except on PR
      # https://github.com/docker/login-action
      - name: Log into registry ${{ env.REGISTRY }}
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      # Extract metadata (tags, labels) for Docker
      # https://github.com/docker/metadata-action
      - name: Extract Docker metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ matrix.image }}
          tags: |
            type=ref,event=branch,suffix=${{ matrix.flavour }}
            type=ref,event=pr,suffix=${{ matrix.flavour }}
            # set latest tag for default branch
            type=raw,value=latest${{ matrix.flavour }},enable={{is_default_branch}}
            type=semver,pattern={{version}}${{ matrix.flavour }}
            type=semver,pattern={{major}}${{ matrix.flavour }}
            type=semver,pattern={{major}}.{{minor}}${{ matrix.flavour }}
            type=semver,pattern={{major}}.{{minor}}.{{patch}}${{ matrix.flavour }}

      # Build and push Docker image with Buildx (don't push on PR)
      # https://github.com/docker/build-push-action
      - name: Build and push Docker image
        id: build-and-push
        uses: docker/build-push-action@v6
        with:
          context: .
          file: ${{ matrix.dockerfile }}
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
