[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"