name: build-ublue
on:
  pull_request:
  merge_group:  
  schedule:
    - cron: '0 5 * * *'  # 5 am everyday
  workflow_dispatch:  
env:
    IMAGE_NAME: extras
    IMAGE_REGISTRY: ghcr.io/${{ github.repository_owner }}

jobs:
  push-ghcr:
    name: Build and push image
    runs-on: ubuntu-22.04
    permissions:
      contents: read
      packages: write
      id-token: write
    steps: 
      # Checkout push-to-registry action GitHub repository
      - name: Checkout Push to Registry action
        uses: actions/checkout@v3

      - name: Generate tags
        id: generate-tags
        shell: bash
        run: |
          echo "sha_short=${GITHUB_SHA::7}" >> $GITHUB_OUTPUT
          alias_tags=()
          # Only perform the follow code when the action is spawned from a Pull Request
          if [[ "${{ github.event_name }}" == "pull_request" ]]; then
            alias_tags+=("pr-${{ github.event.number }}")
          else
            # The following is run when the timer is triggered or a merge/push to main
            echo "date=$(date +%Y%m%d)" >> $GITHUB_OUTPUT
            alias_tags+=("latest")
          fi
          echo "alias_tags=${alias_tags[*]}" >> $GITHUB_OUTPUT

      # Build image using Buildah action
      - name: Build Image
        id: build_image
        uses: redhat-actions/buildah-build@v2
        with:
          containerfiles: |
            ./Containerfile
          image: ${{ env.IMAGE_NAME }}
          tags: |
            ${{ steps.generate-tags.outputs.alias_tags }}
            ${{ steps.generate-tags.outputs.date }}
            ${{ steps.generate-tags.outputs.sha_short }}
          oci: true

      # Workaround bug where capital letters in your GitHub username make it impossible to push to GHCR.
      # https://github.com/macbre/push-to-ghcr/issues/12
      - name: Lowercase Registry
        id: registry_case
        uses: ASzc/change-string-case-action@v5
        with:
          string: ${{ env.IMAGE_REGISTRY }}

      # Push the image to GHCR (Image Registry)
      - name: Push To GHCR
        uses: redhat-actions/push-to-registry@v2
        id: push
        if: github.event_name != 'pull_request'
        env:
          REGISTRY_USER: ${{ github.actor }}
          REGISTRY_PASSWORD: ${{ github.token }}
        with:
          image: ${{ steps.build_image.outputs.image }}
          tags: ${{ steps.build_image.outputs.tags }}
          registry: ${{ steps.registry_case.outputs.lowercase }}
          username: ${{ env.REGISTRY_USER }}
          password: ${{ env.REGISTRY_PASSWORD }}
          extra-args: |
            --disable-content-trust

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v2
        if: github.event_name != 'pull_request'
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      # Sign container
      - uses: sigstore/cosign-installer@v3.0.5
        if: github.event_name != 'pull_request'

      - name: Sign container image
        if: github.event_name != 'pull_request'
        run: |
          cosign sign -y --key env://COSIGN_PRIVATE_KEY ${{ steps.registry_case.outputs.lowercase }}/${{ env.IMAGE_NAME }}@${TAGS}
        env:
          TAGS: ${{ steps.push.outputs.digest }}
          COSIGN_EXPERIMENTAL: false
          COSIGN_PRIVATE_KEY: ${{ secrets.SIGNING_SECRET }}

      - name: Echo outputs
        if: github.event_name != 'pull_request'
        run: |
          echo "${{ toJSON(steps.push.outputs) }}"
