name: Build and Upload GCP CCM container image

on:
  push:
    branches:
      - 'main'
    paths:
      - '.github/workflows/build-ccm-gcp.yml'
      - '.github/actions/gcpccm_vers_to_build/**'
  schedule:
    - cron: "0 4 * * 3" # Every Wednesday at 4am UTC
  workflow_dispatch:

jobs:
  find-ccm-versions:
    runs-on: ubuntu-22.04
    outputs:
      versions: ${{ steps.find-versions.outputs.versions }}
      latest: ${{ steps.find-latest.outputs.latest }}
    steps:
      - name: Checkout Constellation
        uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0

      - name: Checkout kubernetes/cloud-provider-gcp
        uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
        with:
          repository: "kubernetes/cloud-provider-gcp"
          path: "cloud-provider-gcp"
          fetch-depth: 0

      - name: Setup Go environment
        uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0
        with:
          go-version: "1.21.5"
          cache: false

      - name: Install Crane
        run: |
          go install github.com/google/go-containerregistry/cmd/crane@latest

      - name: Find versions
        id: find-versions
        uses: ./.github/actions/gcpccm_vers_to_build
        with:
          path: "cloud-provider-gcp"

      - name: Find latest
        id: find-latest
        run: |
          rawList=$(jq -r '.[]' <<< '${{ steps.find-versions.outputs.versions }}')
          lastest=$(echo "${rawList}" | sort -V | tail -n 1)
          echo "latest=${lastest}" | tee -a "$GITHUB_OUTPUT"

  build-ccm-gcp:
    # matrix cannot handle empty lists
    if: needs.find-ccm-versions.outputs.versions != '[]'
    runs-on: ubuntu-22.04
    permissions:
      contents: read
      packages: write
    needs: find-ccm-versions
    strategy:
      fail-fast: false
      matrix:
        version: ${{ fromJson(needs.find-ccm-versions.outputs.versions) }}
    steps:
      - name: Checkout Constellation
        uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0

      - name: Checkout kubernetes/cloud-provider-gcp
        uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
        with:
          repository: "kubernetes/cloud-provider-gcp"
          path: "cloud-provider-gcp"
          ref: refs/tags/ccm/${{ matrix.version }}

      - name: Docker meta
        id: meta
        uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0
        with:
          images: |
            ghcr.io/edgelesssys/cloud-provider-gcp
          flavor: |
            latest=${{ matrix.version == needs.find-ccm-versions.outputs.latest }}
          tags: |
            type=semver,pattern=v{{version}},value=${{ matrix.version }}

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

      - name: Build CCM
        working-directory: cloud-provider-gcp
        run: |
          bazel build //cmd/cloud-controller-manager:cloud-controller-manager

      - name: Copy CCM
        working-directory: cloud-provider-gcp
        run: |
          cp ./bazel-bin/cmd/cloud-controller-manager/cloud-controller-manager_/cloud-controller-manager ./cloud-controller-manager

      - name: Prepare Dockerfile
        working-directory: cloud-provider-gcp
        run: |
          cat > Dockerfile <<EOF
          FROM scratch
          COPY ./cloud-controller-manager /cloud-controller-manager
          EOF

      - name: Build and push container image
        id: build
        uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0
        with:
          context: ./cloud-provider-gcp
          push: ${{ github.ref_name == 'main' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
