[CI] Annotate built Docker image tags on the Buildkite build page (#48101)

Signed-off-by: khluu <khluu000@gmail.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

Kevin H. Luu committed Jul 9, 2026 at 07:02 UTC 299d2b565517044847f7300c11b9eb4c41931c36
8 files changed +124 -77
.buildkite/image_build/image_build.sh
+8
@@ -79,12 +79,18 @@ setup_buildx_builder() {
79 docker buildx ls | grep -E '^\*|^NAME' || docker buildx ls
80 }
81
82 +annotate_image_tags() {
83 + .buildkite/scripts/annotate-image-build.sh \
84 + "${IMAGE_TAG:-}" "${IMAGE_TAG_LATEST:-}"
85 +}
86 +
87 check_and_skip_if_image_exists() {
88 if [[ -n "${IMAGE_TAG:-}" ]]; then
89 echo "--- :mag: Checking if image exists"
90 if docker manifest inspect "${IMAGE_TAG}" >/dev/null 2>&1; then
91 echo "Image already exists: ${IMAGE_TAG}"
92 echo "Skipping build"
93 + annotate_image_tags
94 exit 0
95 fi
96 echo "Image not found, proceeding with build"
@@ -254,3 +260,5 @@ echo "--- :docker: Building ${TARGET}"
260 docker --debug buildx bake -f "${VLLM_BAKE_FILE_PATH}" -f "${CI_HCL_PATH}" --progress plain "${TARGET}"
261
262 echo "--- :white_check_mark: Build complete"
263 +
264 +annotate_image_tags
.buildkite/image_build/image_build_arm64.sh
+19 -19
@@ -9,30 +9,30 @@ fi
9 REGISTRY=$1
10 REPO=$2
11 BUILDKITE_COMMIT=$3
12 +IMAGE="$REGISTRY/$REPO:$BUILDKITE_COMMIT-arm64"
13
14 # authenticate with AWS ECR
15 aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin "$REGISTRY" || true
16
17 # skip build if image already exists
17 -if [[ -z $(docker manifest inspect "$REGISTRY"/"$REPO":"$BUILDKITE_COMMIT"-arm64) ]]; then
18 - echo "Image not found, proceeding with build..."
19 -else
18 +if docker manifest inspect "$IMAGE" >/dev/null 2>&1; then
19 echo "Image found"
21 - exit 0
20 +else
21 + echo "Image not found, proceeding with build..."
22 + # build for arm64 GPU targets: Grace/GH200 (sm_90) and DGX Spark/GB10
23 + # (sm_121, family-covered by 12.0 under CUDA 13)
24 + docker build --file docker/Dockerfile \
25 + --platform linux/arm64 \
26 + --build-arg max_jobs=16 \
27 + --build-arg nvcc_threads=4 \
28 + --build-arg torch_cuda_arch_list="9.0 12.0" \
29 + --build-arg USE_SCCACHE=1 \
30 + --build-arg buildkite_commit="$BUILDKITE_COMMIT" \
31 + --tag "$IMAGE" \
32 + --target test \
33 + --progress plain .
34 + # push
35 + docker push "$IMAGE"
36 fi
37
24 -# build for arm64 GPU targets: Grace/GH200 (sm_90) and DGX Spark/GB10
25 -# (sm_121, family-covered by 12.0 under CUDA 13)
26 -docker build --file docker/Dockerfile \
27 - --platform linux/arm64 \
28 - --build-arg max_jobs=16 \
29 - --build-arg nvcc_threads=4 \
30 - --build-arg torch_cuda_arch_list="9.0 12.0" \
31 - --build-arg USE_SCCACHE=1 \
32 - --build-arg buildkite_commit="$BUILDKITE_COMMIT" \
33 - --tag "$REGISTRY"/"$REPO":"$BUILDKITE_COMMIT"-arm64 \
34 - --target test \
35 - --progress plain .
36 -
37 -# push
38 -docker push "$REGISTRY"/"$REPO":"$BUILDKITE_COMMIT"-arm64
38 +.buildkite/scripts/annotate-image-build.sh "$IMAGE"
.buildkite/image_build/image_build_cpu.sh
+15 -15
@@ -9,26 +9,26 @@ fi
9 REGISTRY=$1
10 REPO=$2
11 BUILDKITE_COMMIT=$3
12 +IMAGE="$REGISTRY/$REPO:$BUILDKITE_COMMIT-cpu"
13
14 # authenticate with AWS ECR
15 aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin "$REGISTRY" || true
16
17 # skip build if image already exists
17 -if [[ -z $(docker manifest inspect "$REGISTRY"/"$REPO":"$BUILDKITE_COMMIT"-cpu) ]]; then
18 - echo "Image not found, proceeding with build..."
19 -else
18 +if docker manifest inspect "$IMAGE" >/dev/null 2>&1; then
19 echo "Image found"
21 - exit 0
20 +else
21 + echo "Image not found, proceeding with build..."
22 + # build
23 + docker build --file docker/Dockerfile.cpu \
24 + --build-arg max_jobs=16 \
25 + --build-arg buildkite_commit="$BUILDKITE_COMMIT" \
26 + --build-arg VLLM_CPU_X86=true \
27 + --tag "$IMAGE" \
28 + --target vllm-test \
29 + --progress plain .
30 + # push
31 + docker push "$IMAGE"
32 fi
33
24 -# build
25 -docker build --file docker/Dockerfile.cpu \
26 - --build-arg max_jobs=16 \
27 - --build-arg buildkite_commit="$BUILDKITE_COMMIT" \
28 - --build-arg VLLM_CPU_X86=true \
29 - --tag "$REGISTRY"/"$REPO":"$BUILDKITE_COMMIT"-cpu \
30 - --target vllm-test \
31 - --progress plain .
32 -
33 -# push
34 -docker push "$REGISTRY"/"$REPO":"$BUILDKITE_COMMIT"-cpu
34 +.buildkite/scripts/annotate-image-build.sh "$IMAGE"
.buildkite/image_build/image_build_cpu_arm64.sh
+14 -14
@@ -9,25 +9,25 @@ fi
9 REGISTRY=$1
10 REPO=$2
11 BUILDKITE_COMMIT=$3
12 +IMAGE="$REGISTRY/$REPO:$BUILDKITE_COMMIT-arm64-cpu"
13
14 # authenticate with AWS ECR
15 aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin "$REGISTRY" || true
16
17 # skip build if image already exists
17 -if [[ -z $(docker manifest inspect "$REGISTRY"/"$REPO":"$BUILDKITE_COMMIT"-arm64-cpu) ]]; then
18 - echo "Image not found, proceeding with build..."
19 -else
18 +if docker manifest inspect "$IMAGE" >/dev/null 2>&1; then
19 echo "Image found"
21 - exit 0
20 +else
21 + echo "Image not found, proceeding with build..."
22 + # build
23 + docker build --file docker/Dockerfile.cpu \
24 + --build-arg max_jobs=16 \
25 + --build-arg buildkite_commit="$BUILDKITE_COMMIT" \
26 + --tag "$IMAGE" \
27 + --target vllm-test \
28 + --progress plain .
29 + # push
30 + docker push "$IMAGE"
31 fi
32
24 -# build
25 -docker build --file docker/Dockerfile.cpu \
26 - --build-arg max_jobs=16 \
27 - --build-arg buildkite_commit="$BUILDKITE_COMMIT" \
28 - --tag "$REGISTRY"/"$REPO":"$BUILDKITE_COMMIT"-arm64-cpu \
29 - --target vllm-test \
30 - --progress plain .
31 -
32 -# push
33 -docker push "$REGISTRY"/"$REPO":"$BUILDKITE_COMMIT"-arm64-cpu
33 +.buildkite/scripts/annotate-image-build.sh "$IMAGE"
.buildkite/image_build/image_build_hpu.sh
+15 -15
@@ -9,26 +9,26 @@ fi
9 REGISTRY=$1
10 REPO=$2
11 BUILDKITE_COMMIT=$3
12 +IMAGE="$REGISTRY/$REPO:$BUILDKITE_COMMIT-hpu"
13
14 # authenticate with AWS ECR
15 aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin "$REGISTRY" || true
16
17 # skip build if image already exists
17 -if [[ -z $(docker manifest inspect "$REGISTRY"/"$REPO":"$BUILDKITE_COMMIT"-hpu) ]]; then
18 - echo "Image not found, proceeding with build..."
19 -else
18 +if docker manifest inspect "$IMAGE" >/dev/null 2>&1; then
19 echo "Image found"
21 - exit 0
20 +else
21 + echo "Image not found, proceeding with build..."
22 + # build
23 + docker build \
24 + --file tests/pytorch_ci_hud_benchmark/Dockerfile.hpu \
25 + --build-arg max_jobs=16 \
26 + --build-arg buildkite_commit="$BUILDKITE_COMMIT" \
27 + --tag "$IMAGE" \
28 + --progress plain \
29 + https://github.com/vllm-project/vllm-gaudi.git
30 + # push
31 + docker push "$IMAGE"
32 fi
33
24 -# build
25 -docker build \
26 - --file tests/pytorch_ci_hud_benchmark/Dockerfile.hpu \
27 - --build-arg max_jobs=16 \
28 - --build-arg buildkite_commit="$BUILDKITE_COMMIT" \
29 - --tag "$REGISTRY"/"$REPO":"$BUILDKITE_COMMIT"-hpu \
30 - --progress plain \
31 - https://github.com/vllm-project/vllm-gaudi.git
32 -
33 -# push
34 -docker push "$REGISTRY"/"$REPO":"$BUILDKITE_COMMIT"-hpu
34 +.buildkite/scripts/annotate-image-build.sh "$IMAGE"
.buildkite/image_build/image_build_torch_nightly.sh
+3
@@ -40,6 +40,7 @@ docker buildx ls
40 echo "--- :mag: Checking if image already exists"
41 if docker manifest inspect "$IMAGE_TAG" >/dev/null 2>&1; then
42 echo "Image found: $IMAGE_TAG — skipping build"
43 + .buildkite/scripts/annotate-image-build.sh "$IMAGE_TAG"
44 exit 0
45 fi
46 echo "Image not found, proceeding with build..."
@@ -66,3 +67,5 @@ docker buildx build --file docker/Dockerfile \
67 --progress plain .
68
69 echo "--- :white_check_mark: Torch nightly image build complete: $IMAGE_TAG"
70 +
71 +.buildkite/scripts/annotate-image-build.sh "$IMAGE_TAG"
.buildkite/image_build/image_build_xpu.sh
+14 -14
@@ -9,26 +9,26 @@ fi
9 REGISTRY=$1
10 REPO=$2
11 BUILDKITE_COMMIT=$3
12 +IMAGE="$REGISTRY/$REPO:$BUILDKITE_COMMIT-xpu"
13
14 # authenticate with AWS ECR
15 aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin "$REGISTRY" || true
16 aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 936637512419.dkr.ecr.us-east-1.amazonaws.com || true
17
18 # skip build if image already exists
18 -if ! docker manifest inspect "$REGISTRY"/"$REPO":"$BUILDKITE_COMMIT"-xpu &> /dev/null; then
19 - echo "Image not found, proceeding with build..."
20 -else
19 +if docker manifest inspect "$IMAGE" &> /dev/null; then
20 echo "Image found"
22 - exit 0
21 +else
22 + echo "Image not found, proceeding with build..."
23 + # build
24 + docker build \
25 + --file docker/Dockerfile.xpu \
26 + --build-arg max_jobs=16 \
27 + --build-arg buildkite_commit="$BUILDKITE_COMMIT" \
28 + --tag "$IMAGE" \
29 + --progress plain .
30 + # push
31 + docker push "$IMAGE"
32 fi
33
25 -# build
26 -docker build \
27 - --file docker/Dockerfile.xpu \
28 - --build-arg max_jobs=16 \
29 - --build-arg buildkite_commit="$BUILDKITE_COMMIT" \
30 - --tag "$REGISTRY"/"$REPO":"$BUILDKITE_COMMIT"-xpu \
31 - --progress plain .
32 -
33 -# push
34 -docker push "$REGISTRY"/"$REPO":"$BUILDKITE_COMMIT"-xpu
34 +.buildkite/scripts/annotate-image-build.sh "$IMAGE"
.buildkite/scripts/annotate-image-build.sh new
+36
@@ -0,0 +1,36 @@
1 +#!/bin/bash
2 +# SPDX-License-Identifier: Apache-2.0
3 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
4 +#
5 +# Append the Docker image tag(s) an image-build step pushed to a Buildkite
6 +# annotation, so the built image tags show up on the build page instead of
7 +# being buried in the job logs.
8 +#
9 +# Usage: annotate-image-build.sh <image_tag> [<image_tag> ...]
10 +set -euo pipefail
11 +
12 +# buildkite-agent only exists on Buildkite agents; no-op elsewhere so the
13 +# image build scripts stay runnable locally.
14 +if ! command -v buildkite-agent >/dev/null 2>&1; then
15 + echo "buildkite-agent not found; skipping image tag annotation"
16 + exit 0
17 +fi
18 +
19 +label="${BUILDKITE_LABEL:-Image build}"
20 +content=""
21 +for image in "$@"; do
22 + [[ -n "$image" ]] || continue
23 + content+="- **${label}**: \`${image}\`"$'\n'
24 +done
25 +
26 +if [[ -z "$content" ]]; then
27 + echo "No image tags provided; nothing to annotate"
28 + exit 0
29 +fi
30 +
31 +# Best-effort: a flaky annotation must never fail an otherwise successful
32 +# (and expensive) image build.
33 +if ! printf '%s' "$content" | \
34 + buildkite-agent annotate --append --style 'info' --context 'docker-images'; then
35 + echo "warning: failed to annotate build with image tags"
36 +fi