--- name: 'build container images' on: push: branches: - master tags: - '*' concurrency: group: ci-${{ github.event.pull_request.number || github.sha }}-${{ github.repository }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: hipblas-jobs: if: github.repository == 'mudler/LocalAI' uses: ./.github/workflows/image_build.yml with: tag-latest: ${{ matrix.tag-latest }} tag-suffix: ${{ matrix.tag-suffix }} build-type: ${{ matrix.build-type }} cuda-major-version: ${{ matrix.cuda-major-version }} cuda-minor-version: ${{ matrix.cuda-minor-version }} platforms: ${{ matrix.platforms }} runs-on: ${{ matrix.runs-on }} base-image: ${{ matrix.base-image }} makeflags: ${{ matrix.makeflags }} ubuntu-version: ${{ matrix.ubuntu-version }} ubuntu-codename: ${{ matrix.ubuntu-codename }} secrets: dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }} dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }} quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }} quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }} strategy: matrix: include: - build-type: 'hipblas' platforms: 'linux/amd64' tag-latest: 'auto' tag-suffix: '-gpu-hipblas' base-image: "rocm/dev-ubuntu-24.04:7.2.1" runs-on: 'ubuntu-latest' makeflags: "--jobs=3 --output-sync=target" ubuntu-version: '2404' ubuntu-codename: 'noble' core-image-build: if: github.repository == 'mudler/LocalAI' uses: ./.github/workflows/image_build.yml with: tag-latest: ${{ matrix.tag-latest }} tag-suffix: ${{ matrix.tag-suffix }} build-type: ${{ matrix.build-type }} cuda-major-version: ${{ matrix.cuda-major-version }} cuda-minor-version: ${{ matrix.cuda-minor-version }} platforms: ${{ matrix.platforms }} platform-tag: ${{ matrix.platform-tag || '' }} runs-on: ${{ matrix.runs-on }} base-image: ${{ matrix.base-image }} makeflags: ${{ matrix.makeflags }} skip-drivers: ${{ matrix.skip-drivers }} ubuntu-version: ${{ matrix.ubuntu-version }} ubuntu-codename: ${{ matrix.ubuntu-codename }} secrets: dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }} dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }} quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }} quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }} strategy: #max-parallel: ${{ github.event_name != 'pull_request' && 2 || 4 }} matrix: include: - build-type: '' platforms: 'linux/amd64' platform-tag: 'amd64' tag-latest: 'auto' tag-suffix: '' base-image: "ubuntu:24.04" runs-on: 'ubuntu-latest' makeflags: "--jobs=4 --output-sync=target" skip-drivers: 'false' ubuntu-version: '2404' ubuntu-codename: 'noble' - build-type: '' platforms: 'linux/arm64' platform-tag: 'arm64' tag-latest: 'auto' tag-suffix: '' base-image: "ubuntu:24.04" runs-on: 'ubuntu-24.04-arm' makeflags: "--jobs=4 --output-sync=target" skip-drivers: 'false' ubuntu-version: '2404' ubuntu-codename: 'noble' - build-type: 'cublas' cuda-major-version: "12" cuda-minor-version: "8" platforms: 'linux/amd64' tag-latest: 'auto' tag-suffix: '-gpu-nvidia-cuda-12' runs-on: 'ubuntu-latest' base-image: "ubuntu:24.04" skip-drivers: 'false' makeflags: "--jobs=4 --output-sync=target" ubuntu-version: '2404' ubuntu-codename: 'noble' - build-type: 'cublas' cuda-major-version: "13" cuda-minor-version: "0" platforms: 'linux/amd64' tag-latest: 'auto' tag-suffix: '-gpu-nvidia-cuda-13' runs-on: 'ubuntu-latest' base-image: "ubuntu:22.04" skip-drivers: 'false' makeflags: "--jobs=4 --output-sync=target" ubuntu-version: '2404' ubuntu-codename: 'noble' - build-type: 'vulkan' platforms: 'linux/amd64' platform-tag: 'amd64' tag-latest: 'auto' tag-suffix: '-gpu-vulkan' runs-on: 'ubuntu-latest' base-image: "ubuntu:24.04" skip-drivers: 'false' makeflags: "--jobs=4 --output-sync=target" ubuntu-version: '2404' ubuntu-codename: 'noble' - build-type: 'vulkan' platforms: 'linux/arm64' platform-tag: 'arm64' tag-latest: 'auto' tag-suffix: '-gpu-vulkan' runs-on: 'ubuntu-24.04-arm' base-image: "ubuntu:24.04" skip-drivers: 'false' makeflags: "--jobs=4 --output-sync=target" ubuntu-version: '2404' ubuntu-codename: 'noble' - build-type: 'intel' platforms: 'linux/amd64' tag-latest: 'auto' base-image: "intel/oneapi-basekit:2025.3.2-0-devel-ubuntu24.04" tag-suffix: '-gpu-intel' runs-on: 'ubuntu-latest' makeflags: "--jobs=3 --output-sync=target" ubuntu-version: '2404' ubuntu-codename: 'noble' core-image-merge: # !cancelled(): without it, GHA's default `needs:` cascade skips the # merge whenever any matrix cell of the parent build fails or is # cancelled. Same fix as backend.yml's merge jobs — we still want to # publish the manifest list for tag-suffixes whose legs all succeeded. if: ${{ !cancelled() && github.repository == 'mudler/LocalAI' }} needs: core-image-build uses: ./.github/workflows/image_merge.yml with: tag-latest: 'auto' tag-suffix: '' secrets: dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }} dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }} quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }} quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }} gpu-vulkan-image-merge: if: ${{ !cancelled() && github.repository == 'mudler/LocalAI' }} needs: core-image-build uses: ./.github/workflows/image_merge.yml with: tag-latest: 'auto' tag-suffix: '-gpu-vulkan' secrets: dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }} dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }} quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }} quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }} # Single-arch server-image merges. Same conceptual fix as the backend # singletons in PR #9781: image_build.yml pushes by canonical digest # only, so without a downstream merge step there's no tag for consumers # (no :latest-gpu-nvidia-cuda-12, no :v-gpu-nvidia-cuda-12, etc.). # Each merge job needs only its parent build matrix and is filtered by # tag-suffix in image_merge.yml's artifact-download pattern. gpu-nvidia-cuda-12-image-merge: if: ${{ !cancelled() && github.repository == 'mudler/LocalAI' }} needs: core-image-build uses: ./.github/workflows/image_merge.yml with: tag-latest: 'auto' tag-suffix: '-gpu-nvidia-cuda-12' secrets: dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }} dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }} quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }} quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }} gpu-nvidia-cuda-13-image-merge: if: ${{ !cancelled() && github.repository == 'mudler/LocalAI' }} needs: core-image-build uses: ./.github/workflows/image_merge.yml with: tag-latest: 'auto' tag-suffix: '-gpu-nvidia-cuda-13' secrets: dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }} dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }} quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }} quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }} gpu-intel-image-merge: if: ${{ !cancelled() && github.repository == 'mudler/LocalAI' }} needs: core-image-build uses: ./.github/workflows/image_merge.yml with: tag-latest: 'auto' tag-suffix: '-gpu-intel' secrets: dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }} dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }} quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }} quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }} gpu-hipblas-image-merge: if: ${{ !cancelled() && github.repository == 'mudler/LocalAI' }} needs: hipblas-jobs uses: ./.github/workflows/image_merge.yml with: tag-latest: 'auto' tag-suffix: '-gpu-hipblas' secrets: dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }} dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }} quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }} quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }} nvidia-l4t-arm64-image-merge: if: ${{ !cancelled() && github.repository == 'mudler/LocalAI' }} needs: gh-runner uses: ./.github/workflows/image_merge.yml with: tag-latest: 'auto' tag-suffix: '-nvidia-l4t-arm64' secrets: dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }} dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }} quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }} quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }} nvidia-l4t-arm64-cuda-13-image-merge: if: ${{ !cancelled() && github.repository == 'mudler/LocalAI' }} needs: gh-runner uses: ./.github/workflows/image_merge.yml with: tag-latest: 'auto' tag-suffix: '-nvidia-l4t-arm64-cuda-13' secrets: dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }} dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }} quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }} quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }} gh-runner: if: github.repository == 'mudler/LocalAI' uses: ./.github/workflows/image_build.yml with: tag-latest: ${{ matrix.tag-latest }} tag-suffix: ${{ matrix.tag-suffix }} build-type: ${{ matrix.build-type }} cuda-major-version: ${{ matrix.cuda-major-version }} cuda-minor-version: ${{ matrix.cuda-minor-version }} platforms: ${{ matrix.platforms }} runs-on: ${{ matrix.runs-on }} base-image: ${{ matrix.base-image }} makeflags: ${{ matrix.makeflags }} skip-drivers: ${{ matrix.skip-drivers }} ubuntu-version: ${{ matrix.ubuntu-version }} ubuntu-codename: ${{ matrix.ubuntu-codename }} secrets: dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }} dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }} quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }} quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }} strategy: matrix: include: - build-type: 'cublas' cuda-major-version: "12" cuda-minor-version: "0" platforms: 'linux/arm64' tag-latest: 'auto' tag-suffix: '-nvidia-l4t-arm64' base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0" runs-on: 'ubuntu-24.04-arm' makeflags: "--jobs=4 --output-sync=target" skip-drivers: 'true' ubuntu-version: "2204" ubuntu-codename: 'jammy' - build-type: 'cublas' cuda-major-version: "13" cuda-minor-version: "0" platforms: 'linux/arm64' tag-latest: 'auto' tag-suffix: '-nvidia-l4t-arm64-cuda-13' base-image: "ubuntu:24.04" runs-on: 'ubuntu-24.04-arm' makeflags: "--jobs=4 --output-sync=target" skip-drivers: 'false' ubuntu-version: '2404' ubuntu-codename: 'noble'