Skip to content

ci(image): publish missing :latest-* and :v<X>-* singleton image tags#9812

Merged
mudler merged 2 commits into
masterfrom
ci-image-singletons-cancelled-fix
May 13, 2026
Merged

ci(image): publish missing :latest-* and :v<X>-* singleton image tags#9812
mudler merged 2 commits into
masterfrom
ci-image-singletons-cancelled-fix

Conversation

@localai-bot

Copy link
Copy Markdown
Collaborator

Fixes #9789

Summary

image.yml had merge jobs only for '' (core) and -gpu-vulkan (the two multi-arch entries). The six single-arch server-image variants — -gpu-hipblas, -gpu-nvidia-cuda-12, -gpu-nvidia-cuda-13, -gpu-intel, -nvidia-l4t-arm64, -nvidia-l4t-arm64-cuda-13 — built with push-by-digest=true but never had a downstream merge step, so their digests were pushed to both registries untagged. Result: :latest-gpu-hipblas, :v4.2.x-gpu-hipblas, etc. were never published by the post-PR-#9730 workflow.

Verified state before this PR (both registries):

Tag class Quay local-ai Dockerhub localai/localai
:latest, :v4.2.3 published published
:latest-gpu-vulkan, :v4.2.3-gpu-vulkan published published
:latest-gpu-hipblas, :latest-gpu-nvidia-cuda-1{2,3}, :latest-gpu-intel, :latest-nvidia-l4t-* stale (pre-#9730) stale (pre-#9730)
:v4.2.{1,2,3}-gpu-hipblas, :v4.2.{1,2,3}-gpu-nvidia-cuda-1{2,3}, :v4.2.{1,2,3}-gpu-intel MISSING MISSING

Changes

Two commits, all in CI workflow files. Mirrors the parity of the backend fix from PR #9781 plus the follow-up 8521af14.

e5300f1a — wire singleton merges + -- artifact separator

  • image.yml: add 6 new merge jobs, one per single-arch entry. Each needs: only its parent build matrix (hipblas-jobs, core-image-build, or gh-runner) and is filtered by tag-suffix in image_merge.yml's artifact-download pattern.
  • 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 is a prefix of -nvidia-l4t-arm64-cuda-13). Same convention as backend_build.yml.
  • image_merge.yml: update the download pattern to match.

96266b29 — add !cancelled() guard to all 8 image merge jobs
Without it, GHA's default needs: cascade skips the merge whenever 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.

Coverage of both registries

image_merge.yml's Docker meta step emits tags for both quay.io/go-skynet/local-ai and localai/localai. The quay side sources from ci-cache@<digest> (already fixed in 6bfe7f8c for the GC race) and the dockerhub side sources from localai/localai@<digest> (dockerhub's GC isn't aggressive enough to matter — verified for backends with 273/273 matching tags). So next master push or tag will produce the missing :latest-* and :v<X>-* for all 6 singletons on both registries.

Final parity vs backend workflow

# Fix Backend Image (this PR)
1 Singletons get merge entries
2 Keepalive anchor in build ✓ (in 6bfe7f8)
3 Post-merge cleanup ✓ (in 6bfe7f8)
4 Merge sources from ci-cache (quay) ✓ (in 6bfe7f8)
5 -- separator + 'single' placeholder
6 !cancelled() on merge if:

Test plan

  • On merge, the next master push to image.yml 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 on both quay.io/go-skynet/local-ai and localai/localai.
  • Next tag release should additionally produce the matching :v<X>-* tags.
  • Confirm via docker buildx imagetools inspect that each new manifest list resolves on both registries and pulls successfully.

🤖 Generated with Claude Code

mudler added 2 commits May 13, 2026 22:12
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>
Parity pass with backend.yml's merge jobs (8521af1). 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 in e5300f1)
  - gpu-nvidia-cuda-13-image-merge       (added in e5300f1)
  - gpu-intel-image-merge                (added in e5300f1)
  - gpu-hipblas-image-merge              (added in e5300f1)
  - nvidia-l4t-arm64-image-merge         (added in e5300f1)
  - nvidia-l4t-arm64-cuda-13-image-merge (added in e5300f1)

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>
@mudler mudler merged commit 42a8db3 into master May 13, 2026
19 of 20 checks passed
@mudler mudler deleted the ci-image-singletons-cancelled-fix branch May 13, 2026 22:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Latest 4.2.1, 4.2.2, 4.2.3 ROCm/cuda/intel latest tag container not available

2 participants