name: Release Images
on:
  workflow_dispatch:
    inputs:
      tag:
        description: 'Release tag name'
        required: true
  
  release:
    types: [released, prereleased]


env:
  # The values are extracted from the github.event context,
  # which is only availble when the workflow gets triggered by a release event.
  RELEASE_VERSION: ${{ github.event.release.name }}
  BRANCH: ${{ github.event.release.target_commitish }}


jobs:
  release-images:
    if: github.repository_owner == 'Apicurio'
    runs-on: ubuntu-22.04
    timeout-minutes: 120
    env:
      RELEASE_TYPE: release
    steps:

      - name: Check Prerequisites
        if: github.event_name != 'workflow_dispatch' && !startsWith(github.event.release.tag_name, '2.6.')
        run: |
          exit 1

      - name: View Disk Usage
        run: df -h

      # https://github.com/marketplace/actions/free-disk-space-ubuntu
      - name: Free Disk Space (Ubuntu)
        uses: jlumbroso/free-disk-space@76866dbe54312617f00798d1762df7f43def6e5c
        with:
          android: true
          dotnet: true
          haskell: true
          swap-storage: true
          large-packages: false
          # this might remove tools that are actually needed, but frees about 6 GB
          tool-cache: false

      - name: View Disk Usage
        run: df -h

        # Open-Source Machine emulator that allows you to emulate multiple CPU architectures on your machine
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1
        
        # Docker CLI plugin for extended build capabilities with BuildKit
      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@v1
        
      - name: Inspect builder
        run: |
          echo "Name:      ${{ steps.buildx.outputs.name }}"
          echo "Endpoint:  ${{ steps.buildx.outputs.endpoint }}"
          echo "Status:    ${{ steps.buildx.outputs.status }}"
          echo "Flags:     ${{ steps.buildx.outputs.flags }}"
          echo "Platforms: ${{ steps.buildx.outputs.platforms }}"

      - name: Fetch Release Details
        if: github.event_name == 'workflow_dispatch'
        run: |
          touch release.json && curl https://api.github.com/repos/${GITHUB_REPOSITORY}/releases/tags/${{ github.event.inputs.tag }} > release.json
          echo "RELEASE_VERSION=$(cat release.json | jq -r '.name')" >> $GITHUB_ENV
          echo "BRANCH=$(cat release.json | jq -r '.target_commitish')" >> $GITHUB_ENV

      - name: Determine Release Type
        if: "contains(env.RELEASE_VERSION, 'RC')"
        run: |
          echo "This is a pre-release. Setting 'RELEASE_TYPE' to 'pre-release'"
          echo "RELEASE_TYPE=pre-release" >> $GITHUB_ENV

      - name: Download Source Code
        run: git clone --branch $RELEASE_VERSION --single-branch ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git registry
        
      # We have faced issues in the past where a github release was created from a wrong commit
      # This step will ensure that the release was created from the right commit  
      - name: Verify Project Version
        run: |
          cd registry
          PROJECT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
          if [[ $PROJECT_VERSION != $RELEASE_VERSION ]]
          then
              echo "ERROR: Project Version '${PROJECT_VERSION}' does not match with Released Version '${RELEASE_VERSION}'"
              exit 1	  
          fi

      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Build Project
        run: cd registry && make SKIP_TESTS=true BUILD_FLAGS='-Dmaven.wagon.httpconnectionManager.maxTotal=30 -Dmaven.wagon.http.retryHandler.count=5' build-all
      
      - name: Login to DockerHub Registry
        run: echo ${{ secrets.DOCKERHUB_PASSWORD }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin
       
      - name: Build and Push Multi-arch Images to Docker.io
        run: cd registry && ./.github/scripts/build-and-push-multiarch-images.sh ${BRANCH} docker.io multiarch-registry-images ${RELEASE_TYPE} ${RELEASE_VERSION}

      - name: Login to Quay.io Registry
        run: docker login -u "${{ secrets.QUAY_USERNAME }}" -p "${{ secrets.QUAY_PASSWORD }}" quay.io

      - name: Build and Push Multi-arch Images to Quay.io
        run: cd registry && ./.github/scripts/build-and-push-multiarch-images.sh ${BRANCH} quay.io multiarch-registry-images ${RELEASE_TYPE} ${RELEASE_VERSION}

      - name: Google Chat Notification
        if: ${{ failure() }}
        uses: Co-qn/google-chat-notification@b9227d9daa4638c9782a5bd16c4abb86268127a1
        with:
          name: ${{ github.job }}
          url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }}
          status: ${{ job.status }}
