# When changing the OTP version, make sure to update all references:
# - the default in workflow_dispatch
# - otp_version in both jobs
#
#
name: OCI (make)
on:
  push:
    paths-ignore:
      - '.github/workflows/secondary-umbrella.yaml'
      - '.github/workflows/update-elixir-patches.yaml'
      - '.github/workflows/update-otp-patches.yaml'
      - '.github/workflows/release-alphas.yaml'
      - '*.md'
  workflow_dispatch:
    inputs:
      otp_version:
        # a tag of the erlang image, see https://hub.docker.com/_/erlang for available tags
        # also used in the setup-beam step (same tag should work for both)
        description: OTP version (eg. `26`, `26.2.5.6`)
        default: 27
      build_arm:
        description: Build for ARM64 as well?
        type: boolean
        default: false
env:
  REGISTRY_IMAGE: pivotalrabbitmq/rabbitmq
concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true
jobs:
  build-package-generic-unix:
    strategy:
      matrix:
        otp_version:
        - ${{ github.event.inputs.otp_version || '27' }}
    runs-on: ubuntu-latest
    outputs:
      authorized: ${{ steps.authorized.outputs.authorized }}
    steps:
      - name: CHECK IF IMAGE WILL PUSH
        id: authorized
        run: |
          if [ -n "${{ secrets.DOCKERHUB_PASSWORD }}" ]; then
            echo "authorized=true" | tee -a $GITHUB_OUTPUT
          else
            echo "authorized=false" | tee -a $GITHUB_OUTPUT
          fi
      - name: Checkout
        if: steps.authorized.outputs.authorized == 'true'
        uses: actions/checkout@v4
      - name: Configure Erlang
        if: steps.authorized.outputs.authorized == 'true'
        uses: erlef/setup-beam@v1
        with:
          otp-version: ${{ matrix.otp_version }}
          elixir-version: latest
      - name: make package-generic-unix
        if: steps.authorized.outputs.authorized == 'true'
        run: |
          make package-generic-unix PROJECT_VERSION=4.1.0-alpha.1
      - name: Upload package-generic-unix
        if: steps.authorized.outputs.authorized == 'true'
        uses: actions/upload-artifact@v4
        with:
          name: package-generic-unix-otp${{ matrix.otp_version }}
          path: PACKAGES/rabbitmq-server-*.tar.xz

  build-and-push:
    strategy:
      fail-fast: false
      matrix:
        otp_version:
        - ${{ github.event.inputs.otp_version || '27' }}
    needs: build-package-generic-unix
    runs-on: ubuntu-latest
    if: ${{ needs.build-package-generic-unix.outputs.authorized }} == 'true'
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Download package-generic-unix
        uses: actions/download-artifact@v4
        with:
          name: package-generic-unix-otp${{ matrix.otp_version }}
          path: PACKAGES
      - name: Rename package-generic-unix
        run: |
          cp \
            PACKAGES/rabbitmq-server-generic-unix-*.tar.xz \
            packaging/docker-image/package-generic-unix.tar.xz
      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY_IMAGE }}
          flavor: |
            suffix=-otp${{ matrix.otp_version }}
          tags: |
            type=ref,event=branch
            type=ref,event=pr
            type=sha,format=long
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_PASSWORD }}
      - name: Build and push by digest
        id: build
        uses: docker/build-push-action@v6
        with:
          push: true
          context: packaging/docker-image
          platforms: ${{ github.event.inputs.build_arm && 'linux/amd64, linux/arm64' || 'linux/amd64' }}
          tags: ${{ steps.meta.outputs.tags }}
          cache-to: type=gha,mode=max,scope=${{ matrix.otp_version }}
          cache-from: type=gha,scope=${{ matrix.otp_version }}
          build-args:
            OTP_VERSION=${{ matrix.otp_version }}
