mirror of
https://github.com/mudler/LocalAI.git
synced 2026-05-16 20:52:08 -04:00
* ci(image): wire singleton merges + `--` artifact separator Closes the same singletons gap on the LocalAI server image workflow that PR #9781 closed for backends. The user observed it as missing :latest-gpu-nvidia-cuda-12 etc. on quay.io/go-skynet/local-ai — the build matrix has six single-arch entries with no corresponding merge step, so their per-arch digests push (push-by-digest=true) and never get tagged: - -gpu-hipblas (hipblas-jobs) - -gpu-nvidia-cuda-12 (core-image-build) - -gpu-nvidia-cuda-13 (core-image-build) - -gpu-intel (core-image-build) - -nvidia-l4t-arm64 (gh-runner) - -nvidia-l4t-arm64-cuda-13 (gh-runner) Only :latest, :v<X>, :latest-gpu-vulkan and :v<X>-gpu-vulkan were actually being published before this commit (the two multiarch suffixes that had merge jobs). Changes: 1. image.yml: add six new merge jobs, one per single-arch entry. Each `needs:` only its parent build job (matching the existing pattern for core-image-merge / gpu-vulkan-image-merge). 2. image_build.yml: switch artifact name to `digests-localai<suffix>--<platform-tag-or-"single">`. The `--` separator anchors the merge-side glob so a singleton tag-suffix doesn't over-match a longer suffix that shares its prefix (-nvidia-l4t-arm64 vs -nvidia-l4t-arm64-cuda-13). Same convention as backend_build.yml's fix. 3. image_merge.yml: update the download pattern to match. Next master push or tag release should produce :latest-gpu-hipblas, :latest-gpu-nvidia-cuda-12, :latest-gpu-nvidia-cuda-13, :latest-gpu-intel, :latest-nvidia-l4t-arm64, :latest-nvidia-l4t-arm64-cuda-13 (and their :v<X>-* equivalents) for the first time on the post-#9781 workflow. Assisted-by: Claude:claude-opus-4-7 Signed-off-by: Ettore Di Giacinto <mudler@localai.io> * ci(image): add !cancelled() guard to all 8 image merge jobs Parity pass with backend.yml's merge jobs (8521af14). Without !cancelled(), GHA's default `needs:` cascade skips the merge when ANY matrix cell of the parent build job fails or is cancelled — so a single flaky leg would suppress publication of every other tag-suffix's manifest list. Same fix the backend got after v4.2.1 showed 2 failed singlearch builds cascade-skip 199 singlearch merge entries. Applied to all 8 image merges: - core-image-merge - gpu-vulkan-image-merge - gpu-nvidia-cuda-12-image-merge (added ine5300f1a) - gpu-nvidia-cuda-13-image-merge (added ine5300f1a) - gpu-intel-image-merge (added ine5300f1a) - gpu-hipblas-image-merge (added ine5300f1a) - nvidia-l4t-arm64-image-merge (added ine5300f1a) - nvidia-l4t-arm64-cuda-13-image-merge (added ine5300f1a) Build jobs (hipblas-jobs, core-image-build, gh-runner) are intentionally NOT changed — they have no upstream `needs:` to cascade- skip from. Assisted-by: Claude:claude-opus-4-7 Signed-off-by: Ettore Di Giacinto <mudler@localai.io> --------- Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Co-authored-by: Ettore Di Giacinto <mudler@localai.io>
315 lines
12 KiB
YAML
315 lines
12 KiB
YAML
---
|
|
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<X>-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'
|
|
|