[CI/Build] Upload CPU nightly image to Docker Hub (#55163)

Signed-off-by: Liao, Wei <wei.liao@intel.com>

wliao2 committed Sep 9, 2026 at 02:13 UTC 474839f8469ed4d47bffa18c6a063547a148bf2c
3 files changed +94 -12
.buildkite/release-pipeline.yaml
+34 -10
@@ -439,43 +439,48 @@ steps:
439 env:
440 DOCKER_BUILDKIT: "1"
441
442 + # CPU release images follow the CUDA pattern: a single build label per arch
443 + # pushes the arch-specific commit tag to ECR, consumed by both the nightly
444 + # DockerHub publish and the release publish step. The block auto-skips in
445 + # nightly (if NIGHTLY != "1") so the build runs unattended, mirroring
446 + # block-build-release-images.
447 - block: "Build release image for x86_64 CPU"
448 key: block-cpu-release-image-build
449 depends_on: ~
450 + if: build.env("NIGHTLY") != "1"
451
452 - label: "Build release image - x86_64 - CPU"
453 key: build-cpu-release-image-x86
454 depends_on:
455 - block-cpu-release-image-build
450 - - input-release-version
456 + allow_dependency_failure: true
457 agents:
458 queue: cpu_queue_release
459 commands:
460 - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
455 - - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg GIT_REPO_CHECK=1 --build-arg VLLM_CPU_X86=true --tag public.ecr.aws/q9t5s3a7/vllm-cpu-release-repo:$(buildkite-agent meta-data get release-version) --tag public.ecr.aws/q9t5s3a7/vllm-cpu-release-repo:latest --progress plain --target vllm-openai -f docker/Dockerfile.cpu ."
456 - - "docker push public.ecr.aws/q9t5s3a7/vllm-cpu-release-repo:latest"
457 - - "docker push public.ecr.aws/q9t5s3a7/vllm-cpu-release-repo:$(buildkite-agent meta-data get release-version)"
458 - - 'bash .buildkite/scripts/annotate-build-artifact.sh "$$BUILDKITE_LABEL" "public.ecr.aws/q9t5s3a7/vllm-cpu-release-repo:$(buildkite-agent meta-data get release-version)" release-images'
461 + - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg GIT_REPO_CHECK=1 --build-arg VLLM_CPU_X86=true --tag public.ecr.aws/q9t5s3a7/vllm-cpu-release-repo:$BUILDKITE_COMMIT-x86_64 --progress plain --target vllm-openai -f docker/Dockerfile.cpu ."
462 + - "docker push public.ecr.aws/q9t5s3a7/vllm-cpu-release-repo:$BUILDKITE_COMMIT-x86_64"
463 + - 'bash .buildkite/scripts/annotate-build-artifact.sh "$$BUILDKITE_LABEL" "public.ecr.aws/q9t5s3a7/vllm-cpu-release-repo:$BUILDKITE_COMMIT-x86_64" release-images'
464 env:
465 DOCKER_BUILDKIT: "1"
466
467 - block: "Build release image for arm64 CPU"
468 key: block-arm64-cpu-release-image-build
469 depends_on: ~
470 + if: build.env("NIGHTLY") != "1"
471
472 - label: "Build release image - arm64 - CPU"
473 key: build-cpu-release-image-arm64
474 depends_on:
475 - block-arm64-cpu-release-image-build
470 - - input-release-version
476 + allow_dependency_failure: true
477 agents:
478 queue: arm64_cpu_queue_release
479 commands:
480 - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
475 - - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg GIT_REPO_CHECK=1 --tag public.ecr.aws/q9t5s3a7/vllm-arm64-cpu-release-repo:$(buildkite-agent meta-data get release-version) --tag public.ecr.aws/q9t5s3a7/vllm-arm64-cpu-release-repo:latest --progress plain --target vllm-openai -f docker/Dockerfile.cpu ."
476 - - "docker push public.ecr.aws/q9t5s3a7/vllm-arm64-cpu-release-repo:latest"
477 - - "docker push public.ecr.aws/q9t5s3a7/vllm-arm64-cpu-release-repo:$(buildkite-agent meta-data get release-version)"
478 - - 'bash .buildkite/scripts/annotate-build-artifact.sh "$$BUILDKITE_LABEL" "public.ecr.aws/q9t5s3a7/vllm-arm64-cpu-release-repo:$(buildkite-agent meta-data get release-version)" release-images'
481 + - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg GIT_REPO_CHECK=1 --tag public.ecr.aws/q9t5s3a7/vllm-arm64-cpu-release-repo:$BUILDKITE_COMMIT-arm64 --progress plain --target vllm-openai -f docker/Dockerfile.cpu ."
482 + - "docker push public.ecr.aws/q9t5s3a7/vllm-arm64-cpu-release-repo:$BUILDKITE_COMMIT-arm64"
483 + - 'bash .buildkite/scripts/annotate-build-artifact.sh "$$BUILDKITE_LABEL" "public.ecr.aws/q9t5s3a7/vllm-arm64-cpu-release-repo:$BUILDKITE_COMMIT-arm64" release-images'
484 env:
485 DOCKER_BUILDKIT: "1"
486
@@ -580,6 +585,25 @@ steps:
585 DOCKER_BUILDKIT: "1"
586 DOCKERHUB_USERNAME: "vllmbot"
587
588 + - label: "Publish nightly CPU multi-arch image to DockerHub"
589 + depends_on:
590 + - build-cpu-release-image-x86
591 + - build-cpu-release-image-arm64
592 + if: build.env("NIGHTLY") == "1"
593 + agents:
594 + queue: small_cpu_queue_release
595 + commands:
596 + - "bash .buildkite/scripts/push-nightly-builds-cpu.sh"
597 + # Clean up old nightly builds (keep only last 14)
598 + - "bash .buildkite/scripts/cleanup-nightly-builds.sh nightly- vllm/vllm-openai-cpu"
599 + plugins:
600 + - docker-login#v3.0.0:
601 + username: vllmbot
602 + password-env: DOCKERHUB_TOKEN
603 + env:
604 + DOCKER_BUILDKIT: "1"
605 + DOCKERHUB_USERNAME: "vllmbot"
606 +
607 # =============================================================================
608 # ROCm Release Pipeline (x86_64 only)
609 # =============================================================================
.buildkite/scripts/publish-release-images.sh
+2 -2
@@ -181,8 +181,8 @@ fi
181 # `:latest` multi-arch manifest still resolves to the previous release.
182
183 if target_enabled cpu; then
184 - CPU_X86_TAG=public.ecr.aws/q9t5s3a7/vllm-cpu-release-repo:v${RELEASE_VERSION}
185 - CPU_ARM_TAG=public.ecr.aws/q9t5s3a7/vllm-arm64-cpu-release-repo:v${RELEASE_VERSION}
184 + CPU_X86_TAG=public.ecr.aws/q9t5s3a7/vllm-cpu-release-repo:${COMMIT}-x86_64
185 + CPU_ARM_TAG=public.ecr.aws/q9t5s3a7/vllm-arm64-cpu-release-repo:${COMMIT}-arm64
186
187 CPU_X86_AVAILABLE=false
188 CPU_ARM_AVAILABLE=false
.buildkite/scripts/push-nightly-builds-cpu.sh new
+58
@@ -0,0 +1,58 @@
1 +#!/bin/bash
2 +# SPDX-License-Identifier: Apache-2.0
3 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
4 +#
5 +# Push CPU nightly images from ECR to Docker Hub as
6 +# vllm/vllm-openai-cpu:nightly and vllm/vllm-openai-cpu:nightly-<commit>,
7 +# combining the x86_64 and aarch64 architectures into a multi-arch manifest.
8 +# Run when NIGHTLY=1 after the CPU release images have been pushed to ECR.
9 +#
10 +# Local testing (no push to Docker Hub):
11 +# BUILDKITE_COMMIT=<commit-with-cpu-images-in-ecr> DRY_RUN=1 bash .buildkite/scripts/push-nightly-builds-cpu.sh
12 +# Requires: AWS CLI configured (for ECR public login), Docker. For full run: Docker Hub login.
13 +
14 +set -ex
15 +
16 +# Use BUILDKITE_COMMIT from env (required; set to a commit that has CPU images in ECR for local test)
17 +BUILDKITE_COMMIT="${BUILDKITE_COMMIT:?Set BUILDKITE_COMMIT to the commit SHA that has the CPU images in ECR (e.g. from a previous release pipeline run)}"
18 +DRY_RUN="${DRY_RUN:-0}"
19 +
20 +TAG_NAME="nightly"
21 +TAG_NAME_COMMIT="nightly-${BUILDKITE_COMMIT}"
22 +
23 +# arch-dependent source images in ECR (pushed by the CPU release image build steps)
24 +X86_ORIG_TAG="public.ecr.aws/q9t5s3a7/vllm-cpu-release-repo:${BUILDKITE_COMMIT}-x86_64"
25 +ARM64_ORIG_TAG="public.ecr.aws/q9t5s3a7/vllm-arm64-cpu-release-repo:${BUILDKITE_COMMIT}-arm64"
26 +
27 +echo "Pushing CPU release images from ECR to Docker Hub as $TAG_NAME and $TAG_NAME_COMMIT"
28 +echo " x86_64: $X86_ORIG_TAG"
29 +echo " arm64: $ARM64_ORIG_TAG"
30 +[[ "$DRY_RUN" == "1" ]] && echo "[DRY_RUN] Skipping push to Docker Hub"
31 +
32 +# Login to ECR and pull the arch-dependent images
33 +aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7
34 +docker pull "$X86_ORIG_TAG"
35 +docker pull "$ARM64_ORIG_TAG"
36 +
37 +# Tag arch-dependent images for Docker Hub
38 +docker tag "$X86_ORIG_TAG" vllm/vllm-openai-cpu:"$TAG_NAME"-x86_64
39 +docker tag "$ARM64_ORIG_TAG" vllm/vllm-openai-cpu:"$TAG_NAME"-arm64
40 +
41 +if [[ "$DRY_RUN" == "1" ]]; then
42 + echo "[DRY_RUN] Would push vllm/vllm-openai-cpu:$TAG_NAME-x86_64 and vllm/vllm-openai-cpu:$TAG_NAME-arm64"
43 + echo "[DRY_RUN] Would create and push manifests vllm/vllm-openai-cpu:$TAG_NAME and vllm/vllm-openai-cpu:$TAG_NAME_COMMIT"
44 + echo "[DRY_RUN] Local tags created. Exiting without push."
45 + exit 0
46 +fi
47 +
48 +# Push arch-dependent images to Docker Hub
49 +docker push vllm/vllm-openai-cpu:"$TAG_NAME"-x86_64
50 +docker push vllm/vllm-openai-cpu:"$TAG_NAME"-arm64
51 +
52 +# Create and push the arch-independent manifests
53 +docker manifest create vllm/vllm-openai-cpu:"$TAG_NAME" vllm/vllm-openai-cpu:"$TAG_NAME"-x86_64 vllm/vllm-openai-cpu:"$TAG_NAME"-arm64 --amend
54 +docker manifest create vllm/vllm-openai-cpu:"$TAG_NAME_COMMIT" vllm/vllm-openai-cpu:"$TAG_NAME"-x86_64 vllm/vllm-openai-cpu:"$TAG_NAME"-arm64 --amend
55 +docker manifest push vllm/vllm-openai-cpu:"$TAG_NAME"
56 +docker manifest push vllm/vllm-openai-cpu:"$TAG_NAME_COMMIT"
57 +
58 +echo "Pushed vllm/vllm-openai-cpu:$TAG_NAME and vllm/vllm-openai-cpu:$TAG_NAME_COMMIT"