name: Linux (Ubuntu 24.04, Python 3.12)
on:
  workflow_dispatch:
  pull_request:
  merge_group:
  push:
    branches:
      - master
      - 'releases/**'

concurrency:
  # github.ref is not unique in post-commit
  group: ${{ github.event_name == 'push' && github.run_id || github.ref }}-ubuntu-24
  cancel-in-progress: true

permissions: read-all

env:
  PIP_CACHE_PATH: /mount/caches/pip/linux

jobs:
  Smart_CI:
    runs-on: ubuntu-latest
    outputs:
      affected_components: "${{ steps.smart_ci.outputs.affected_components }}"
      changed_components: "${{ steps.smart_ci.outputs.changed_components }}"
      skip_workflow: "${{ steps.smart_ci.outputs.skip_workflow }}"
    steps:
      - name: checkout action
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        timeout-minutes: 15
        with:
          sparse-checkout: .github/actions/smart-ci

      - name: Get affected components
        id: smart_ci
        uses: ./.github/actions/smart-ci
        with:
          repository: ${{ github.repository }}
          pr: ${{ github.event.number }}
          commit_sha: ${{ github.sha }}
          ref_name: ${{ github.ref_name }}
          component_pattern: "category: (.*)"
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          skip_when_only_listed_labels_set: 'docs'
          skip_when_only_listed_files_changed: '*.md,*.rst,*.png,*.jpg,*.svg'

      - name: Show affected components
        run: |
          echo "${{ toJSON(steps.smart_ci.outputs.affected_components) }}"
        shell: bash

  Docker:
    needs: Smart_CI
    if: "!needs.smart_ci.outputs.skip_workflow"
    runs-on: aks-linux-4-cores-16gb-docker-build
    container:
      image: openvinogithubactions.azurecr.io/docker_build:0.2
      volumes:
        - /mount:/mount
    outputs:
      images: "${{ steps.handle_docker.outputs.images }}"
    steps:
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        timeout-minutes: 15

      - uses: ./.github/actions/handle_docker
        id: handle_docker
        with:
          images: |
            ov_build/ubuntu_24_04_x64
            ov_test/ubuntu_24_04_x64
          registry: 'openvinogithubactions.azurecr.io'
          dockerfiles_root_dir: '.github/dockerfiles'
          changed_components: ${{ needs.smart_ci.outputs.changed_components }}

  Build:
    needs: [Docker, Smart_CI]
    uses: ./.github/workflows/job_build_linux.yml
    with:
      runner: 'aks-linux-16-cores-32gb'
      container: '{"image": "${{ fromJSON(needs.docker.outputs.images).ov_build.ubuntu_24_04_x64 }}", "volumes": ["/mount:/mount"], "options": "-e SCCACHE_AZURE_BLOB_CONTAINER -e SCCACHE_AZURE_CONNECTION_STRING"}'
      affected-components: ${{ needs.smart_ci.outputs.affected_components }}
      event-name: ${{ github.event_name }}
      os: 'ubuntu_24_04'
      build-rpm-packages: false
      build-js: true
      build-debian-packages: true
      build-contrib: true
      cmake-options: |- 
            -G "Ninja Multi-Config" \
            -DENABLE_CPPLINT=OFF \
            -DENABLE_NCC_STYLE=OFF \
            -DENABLE_TESTS=ON \
            -DENABLE_STRICT_DEPENDENCIES=OFF \
            -DENABLE_SYSTEM_OPENCL=ON \
            -DCMAKE_VERBOSE_MAKEFILE=ON \
            -DCPACK_GENERATOR=TGZ \
            -DCMAKE_COMPILE_WARNING_AS_ERROR=ON

  CXX_Unit_Tests:
    name: C++ unit tests
    needs: [ Docker, Build, Smart_CI ]
    uses: ./.github/workflows/job_cxx_unit_tests.yml
    with:
      runner: 'aks-linux-4-cores-16gb'
      image: ${{ fromJSON(needs.docker.outputs.images).ov_test.ubuntu_24_04_x64 }}
      affected-components: ${{ needs.smart_ci.outputs.affected_components }}
      os: 'ubuntu_24_04'

  Debian_Packages:
    name: Debian Packages
    needs: [ Docker, Build ]
    uses: ./.github/workflows/job_debian_packages.yml
    with:
      runner: 'aks-linux-4-cores-16gb'
      image: 'openvinogithubactions.azurecr.io/dockerhub/ubuntu:24.04'

  Samples:
    needs: [ Docker, Build, Smart_CI ]
    if: fromJSON(needs.smart_ci.outputs.affected_components).samples
    uses: ./.github/workflows/job_samples_tests.yml
    with:
      runner: 'aks-linux-4-cores-16gb'
      container: '{"image": "${{ fromJSON(needs.docker.outputs.images).ov_test.ubuntu_24_04_x64 }}", "volumes": ["/mount:/mount"]}'
      affected-components: ${{ needs.smart_ci.outputs.affected_components }}

  Python_Unit_Tests:
    name: Python unit tests
    needs: [ Docker, Build, Smart_CI ]
    uses: ./.github/workflows/job_python_unit_tests.yml
    with:
      runner: 'aks-linux-4-cores-16gb'
      container: '{"image": "${{ fromJSON(needs.docker.outputs.images).ov_test.ubuntu_24_04_x64 }}", "volumes": ["/mount:/mount"]}'
      affected-components: ${{ needs.smart_ci.outputs.affected_components }}
      python-version: '3.12'

  Python_API_Tests:
    name: Python API tests
    needs: [ Docker, Build, Smart_CI ]
    uses: ./.github/workflows/job_python_api_tests.yml
    with:
      runner: 'aks-linux-4-cores-16gb'
      container: '{"image": "${{ fromJSON(needs.docker.outputs.images).ov_test.ubuntu_24_04_x64 }}", "volumes": ["/mount:/mount"]}'
      affected-components: ${{ needs.smart_ci.outputs.affected_components }}
      python-version: '3.12'

  Pytorch_Layer_Tests:
    name: Pytorch Layer Tests
    needs: [ Docker, Build, Smart_CI ]
    uses: ./.github/workflows/job_pytorch_layer_tests.yml
    with:
      runner: 'aks-linux-4-cores-16gb'
      container: '{"image": "${{ fromJSON(needs.docker.outputs.images).ov_test.ubuntu_24_04_x64 }}", "volumes": ["/mount:/mount"]}'
      affected-components: ${{ needs.smart_ci.outputs.affected_components }}
      python-version: '3.12'

  JAX_Layer_Tests:
    name: JAX Layer Tests
    needs: [ Docker, Build, Smart_CI ]
    uses: ./.github/workflows/job_jax_layer_tests.yml
    with:
      runner: 'aks-linux-4-cores-16gb'
      container: '{"image": "${{ fromJSON(needs.docker.outputs.images).ov_test.ubuntu_24_04_x64 }}", "volumes": ["/mount:/mount"]}'
      affected-components: ${{ needs.smart_ci.outputs.affected_components }}
      python-version: '3.12'

  TensorFlow_Layer_Tests:
    name: TensorFlow Layer Tests
    needs: [ Docker, Build, Smart_CI, Openvino_tokenizers ]
    uses: ./.github/workflows/job_tensorflow_layer_tests.yml
    with:
      runner: 'aks-linux-4-cores-16gb'
      container: '{"image": "${{ fromJSON(needs.docker.outputs.images).ov_test.ubuntu_24_04_x64 }}", "volumes": ["/mount:/mount"]}'
      affected-components: ${{ needs.smart_ci.outputs.affected_components }}
      python-version: '3.12'

  Openvino_tokenizers:
    name: OpenVINO tokenizers extension
    needs: [ Build, Smart_CI, Docker ]
    uses: ./.github/workflows/job_tokenizers.yml
    with:
      runner: 'aks-linux-4-cores-16gb'
      shell: bash
      container: '{"image": "${{ fromJSON(needs.docker.outputs.images).ov_build.ubuntu_24_04_x64 }}", "volumes": ["/mount:/mount"]}'
      affected-components: ${{ needs.smart_ci.outputs.affected_components }}
      python-version: '3.12'
    if: fromJSON(needs.smart_ci.outputs.affected_components).TOKENIZERS

  Overall_Status:
    name: ci/gha_overall_status_ubuntu_24
    needs: [Smart_CI, Build, Debian_Packages, Samples, Python_Unit_Tests, Pytorch_Layer_Tests, TensorFlow_Layer_Tests, Openvino_tokenizers]
    if: ${{ always() }}
    runs-on: ubuntu-latest
    steps:
      - name: Check status of all jobs
        if: >-
          ${{
            contains(needs.*.result, 'failure') ||
            contains(needs.*.result, 'cancelled')
          }}
        run: exit 1