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: '20 0 * * *'
  push:
    branches:
      - main
      - feature/**
      - dev
    # Publish semver tags as releases.
    tags: [ 'v*.*.*' ]
    paths-ignore:
      - 'docs/**'
      - 'mkdocs.yml'
  pull_request:
    branches: [ "dev" ]
    paths-ignore:
      - 'docs/**'
      - 'mkdocs.yml'
  merge_group:

env:
  # github.repository as <account>/<repo>
  IMAGE_NAME: ${{ github.repository }}


jobs:
  pre-commit:
    name: Linting Checks
    runs-on: ubuntu-22.04
    steps:
      -
        name: Checkout repository
        uses: actions/checkout@v4
      -
        name: Install python
        uses: actions/setup-python@v5
        with:
          python-version: 3.x
      -
        name: Check files
        uses: pre-commit/action@v3.0.1
      -
        name: Install pnpm
        uses: pnpm/action-setup@v4
        with:
          version: 10
          run_install: false
      -
        name: Install Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'pnpm'
      -
        name: Install dependencies
        run: pnpm install
      -
        name: Lint frontend
        run: pnpm run lint

  build:
    name: Docker Build & Push
    if:  github.repository == 'gethomepage/homepage'
    runs-on: self-hosted
    needs:
      - pre-commit
    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@v4

      # Login to Docker Registry
      # 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: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Login to Docker Hub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      # Setup QEMU
      # https://github.com/marketplace/actions/docker-setup-buildx#with-qemu
      - name: Setup QEMU
        uses: docker/setup-qemu-action@v3.6.0

      # Workaround: https://github.com/docker/build-push-action/issues/461
      - name: Setup Docker buildx
        uses: docker/setup-buildx-action@v3

      # 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: |
            ${{ env.IMAGE_NAME }}
            ghcr.io/${{ env.IMAGE_NAME }}
          flavor: |
            latest=auto

      # 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: .
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          build-args: |
            BUILDTIME=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
            VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}
            REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
          # https://github.com/docker/setup-qemu-action#about
          # platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
          platforms: linux/amd64,linux/arm64
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max

      # Temp fix
      # https://github.com/docker/build-push-action/issues/252
      # https://github.com/moby/buildkit/issues/1896
      - name: Move cache
        run: |
          rm -rf /tmp/.buildx-cache
          mv /tmp/.buildx-cache-new /tmp/.buildx-cache
