# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
---
name: "Release PROD images"
on:  # yamllint disable-line rule:truthy
  workflow_dispatch:
    inputs:
      airflowVersion:
        description: 'Airflow version'
        required: true
      skipLatest:
        description: 'Skip Latest: Set to true if not latest.'
        default: ''
        required: false
permissions:
  contents: read
concurrency:
  group: ${{ github.event.inputs.airflowVersion }}
  cancel-in-progress: true
jobs:
  build-info:
    timeout-minutes: 10
    name: "Build Info"
    runs-on: ${{ github.repository == 'apache/airflow' && 'self-hosted' || 'ubuntu-20.04' }}
    outputs:
      pythonVersions: ${{ steps.selective-checks.outputs.python-versions }}
      allPythonVersions: ${{ steps.selective-checks.outputs.all-python-versions }}
      defaultPythonVersion: ${{ steps.selective-checks.outputs.default-python-version }}
      skipLatest: ${{ github.event.inputs.skipLatest == '' && ' ' || '--skip-latest' }}
      limitPlatform: ${{ github.repository == 'apache/airflow' && ' ' || '--limit-platform linux/amd64' }}
    env:
      GITHUB_CONTEXT: ${{ toJson(github) }}
    steps:
      - name: Cleanup repo
        run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm -rf /workspace/*"
      - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
        uses: actions/checkout@v3
        with:
          persist-credentials: false
          submodules: recursive
      - name: "Install Breeze"
        uses: ./.github/actions/breeze
      - name: Selective checks
        id: selective-checks
        env:
          VERBOSE: "false"
        run: breeze ci selective-check 2>> ${GITHUB_OUTPUT}
  release-images:
    timeout-minutes: 120
    name: "Release images: ${{ github.event.inputs.airflowVersion }}, ${{ matrix.python-version }}"
    runs-on: ${{ github.repository == 'apache/airflow' && 'self-hosted' || 'ubuntu-20.04' }}
    needs: [build-info]
    strategy:
      fail-fast: false
      matrix:
        python-version: ${{ fromJson(needs.build-info.outputs.pythonVersions) }}
    env:
      RUNS_ON: ${{ github.repository == 'apache/airflow' && 'self-hosted' || 'ubuntu-20.04' }}
    if: contains(fromJSON('[
      "ashb",
      "ephraimbuddy",
      "jedcunningham",
      "kaxil",
      "pierrejeambrun",
      "potiuk",
      ]'), github.event.sender.login)
    steps:
      - name: Cleanup repo
        run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm -rf /workspace/*"
      - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
        uses: actions/checkout@v3
        with:
          persist-credentials: false
      - name: "Install Breeze"
        uses: ./.github/actions/breeze
      - name: Build CI image for PROD build ${{ needs.build-info.outputs.defaultPythonVersion }}
        run: breeze ci-image build
        env:
          PYTHON_MAJOR_MINOR_VERSION: ${{ needs.build-info.outputs.defaultPythonVersion }}
      - name: "Cleanup dist and context file"
        run: rm -fv ./dist/* ./docker-context-files/*
      - name: "Start ARM instance"
        run: ./scripts/ci/images/ci_start_arm_instance_and_connect_to_docker.sh
        if: github.repository == 'apache/airflow'
      - name: "Login to docker"
        run: >
          echo ${{ secrets.DOCKERHUB_TOKEN }} |
          docker login --password-stdin --username ${{ secrets.DOCKERHUB_USER }}
      - name: >
          Release regular images: ${{ github.event.inputs.airflowVersion }}, ${{ matrix.python-version }}
        run: >
          breeze release-management release-prod-images
          --dockerhub-repo ${{ github.repository }}
          --airflow-version  ${{ github.event.inputs.airflowVersion }}
          ${{ needs.build-info.outputs.skipLatest }}
          ${{ needs.build-info.outputs.limitPlatform }}
          --limit-python ${{ matrix.python-version }}
      - name: >
          Release slim images: ${{ github.event.inputs.airflowVersion }}, ${{ matrix.python-version }}
        run: >
          breeze release-management release-prod-images
          --dockerhub-repo ${{ github.repository }}
          --airflow-version  ${{ github.event.inputs.airflowVersion }}
          ${{ needs.build-info.outputs.skipLatest }}
          ${{ needs.build-info.outputs.limitPlatform }}
          --limit-python ${{ matrix.python-version }} --slim-images
      - name: "Stop ARM instance"
        run: ./scripts/ci/images/ci_stop_arm_instance.sh
        if: always() && github.repository == 'apache/airflow'
      - name: >
          Verify regular AMD64 image: ${{ github.event.inputs.airflowVersion }}, ${{ matrix.python-version }}
        run: >
          breeze prod-image verify
          --pull
          --image-name
          ${{github.repository}}:${{github.event.inputs.airflowVersion}}-python${{matrix.python-version}}
      - name: >
          Verify slim AMD64 image: ${{ github.event.inputs.airflowVersion }}, ${{ matrix.python-version }}
        run: >
          breeze prod-image verify
          --pull
          --slim-image
          --image-name
          ${{github.repository}}:slim-${{github.event.inputs.airflowVersion}}-python${{matrix.python-version}}
      - name: "Docker logout"
        run: docker logout
        if: always()
      - name: "Fix ownership"
        run: breeze ci fix-ownership
        if: always()