name: Release Workflow

on:
  workflow_dispatch: {}
  release:
    types: [published]
  # This can be used to automatically publish nightlies at UTC nighttime
  schedule:
    - cron: "0 2 * * *" # run at 2 AM UTC

permissions:
  contents: read

jobs:
  web:
    name: Push website Docker image to registry
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4
        with:
          submodules: true
          fetch-depth: 3 # fix for when this gets triggered by tag
          fetch-tags: true
          ref: ${{ github.ref }}
          token: ${{ secrets.GITHUB_TOKEN }}

      - name: Determine final version
        id: get_final_ver
        run: |
          BASE_VER=v$(jq -r '.version' package.json)
          TODAY=$(date +'%Y.%m.%d')

          echo "Today will be: $TODAY"
          echo "today=$TODAY" >> $GITHUB_OUTPUT

          if [[ "${{ github.event_name }}" == "release" ]]; then
            FINAL_VER="$BASE_VER"
          else
            FINAL_VER="${BASE_VER}-nightly.$TODAY"
          fi

          echo "Drop's release tag will be: $FINAL_VER"
          echo "final_ver=$FINAL_VER" >> $GITHUB_OUTPUT

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

      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@v3
        with:
          buildkitd-flags: --debug

      - name: Log in to the Container registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: |
            ghcr.io/drop-OSS/drop
          tags: |
            type=schedule,pattern=nightly
            type=schedule,pattern=nightly.${{ steps.get_final_ver.outputs.today }}
            type=semver,pattern=v{{version}}
            type=semver,pattern=v{{major}}.{{minor}}
            type=semver,pattern=v{{major}}
            type=ref,event=branch,prefix=branch-
            type=ref,event=pr
            type=sha
            # set latest tag for stable releases
            type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }}

      - name: Cache
        uses: actions/cache@v4
        id: cache
        with:
          path: cache-mount
          key: cache-mount-${{ hashFiles('Dockerfile') }}

      - name: Restore Docker cache mounts
        uses: reproducible-containers/buildkit-cache-dance@v3
        with:
          builder: ${{ steps.setup-buildx.outputs.name }}
          cache-dir: cache-mount
          dockerfile: Dockerfile
          skip-extraction: ${{ steps.cache.outputs.cache-hit }}

      - name: Build and push image
        id: build-and-push
        uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          provenance: mode=max
          sbom: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          platforms: linux/amd64,linux/arm64
          cache-from: type=gha
          cache-to: type=gha,mode=max
          build-args: |
            BUILD_DROP_VERSION=${{ steps.get_final_ver.outputs.final_ver }}
