@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 3f1a4bb639
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git

Synced Nov 4, 13:45 UTC

build: embed image provenance metadata in vLLM containers (#40653)

Signed-off-by: Alec Flowers <aflowers@nvidia.com> Co-authored-by: OpenAI Codex <codex@openai.com>

Alec committed Apr 29, 2026 at 03:07 UTC 3f1a4bb639a9b65e2634a6529c90da36944d6472
8 files changed +376 -10
.buildkite/image_build/image_build.sh
+1
@@ -192,6 +192,7 @@ export BUILDKITE_COMMIT
192 export PARENT_COMMIT
193 export IMAGE_TAG
194 export IMAGE_TAG_LATEST
195 +export COMMIT="${COMMIT:-${BUILDKITE_COMMIT}}"
196 export CACHE_FROM
197 export CACHE_FROM_BASE_BRANCH
198 export CACHE_FROM_MAIN
.buildkite/release-pipeline.yaml
+108 -8
@@ -121,7 +121,19 @@ steps:
121 queue: cpu_queue_release
122 commands:
123 - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
124 - - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=13.0.2 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_X86}\" --build-arg INSTALL_KV_CONNECTORS=true --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu22.04 --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m) --target vllm-openai --progress plain -f docker/Dockerfile ."
124 + - |
125 + DOCKER_BUILDKIT=1 docker build \
126 + $(bash .buildkite/scripts/docker-build-metadata-args.sh) \
127 + --build-arg max_jobs=16 \
128 + --build-arg USE_SCCACHE=1 \
129 + --build-arg GIT_REPO_CHECK=1 \
130 + --build-arg CUDA_VERSION=13.0.2 \
131 + --build-arg torch_cuda_arch_list="${CUDA_ARCH_X86}" \
132 + --build-arg INSTALL_KV_CONNECTORS=true \
133 + --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu22.04 \
134 + --target vllm-openai \
135 + --progress plain \
136 + -f docker/Dockerfile .
137 - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)"
138 # re-tag to default image tag and push, just in case arm64 build fails
139 - "docker tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m) public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT"
@@ -134,7 +146,19 @@ steps:
146 queue: arm64_cpu_queue_release
147 commands:
148 - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
137 - - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=13.0.2 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_AARCH64}\" --build-arg INSTALL_KV_CONNECTORS=true --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu22.04 --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m) --target vllm-openai --progress plain -f docker/Dockerfile ."
149 + - |
150 + DOCKER_BUILDKIT=1 docker build \
151 + $(bash .buildkite/scripts/docker-build-metadata-args.sh) \
152 + --build-arg max_jobs=16 \
153 + --build-arg USE_SCCACHE=1 \
154 + --build-arg GIT_REPO_CHECK=1 \
155 + --build-arg CUDA_VERSION=13.0.2 \
156 + --build-arg torch_cuda_arch_list="${CUDA_ARCH_AARCH64}" \
157 + --build-arg INSTALL_KV_CONNECTORS=true \
158 + --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu22.04 \
159 + --target vllm-openai \
160 + --progress plain \
161 + -f docker/Dockerfile .
162 - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)"
163
164 - label: "Build release image - x86_64 - CUDA 12.9"
@@ -144,7 +168,18 @@ steps:
168 queue: cpu_queue_release
169 commands:
170 - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
147 - - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=12.9.1 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_X86_CU129}\" --build-arg INSTALL_KV_CONNECTORS=true --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129 --target vllm-openai --progress plain -f docker/Dockerfile ."
171 + - |
172 + DOCKER_BUILDKIT=1 docker build \
173 + $(bash .buildkite/scripts/docker-build-metadata-args.sh cu129) \
174 + --build-arg max_jobs=16 \
175 + --build-arg USE_SCCACHE=1 \
176 + --build-arg GIT_REPO_CHECK=1 \
177 + --build-arg CUDA_VERSION=12.9.1 \
178 + --build-arg torch_cuda_arch_list="${CUDA_ARCH_X86_CU129}" \
179 + --build-arg INSTALL_KV_CONNECTORS=true \
180 + --target vllm-openai \
181 + --progress plain \
182 + -f docker/Dockerfile .
183 - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129"
184 # re-tag to default image tag and push, just in case arm64 build fails
185 - "docker tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129 public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-cu129"
@@ -157,7 +192,18 @@ steps:
192 queue: arm64_cpu_queue_release
193 commands:
194 - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
160 - - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=12.9.1 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_AARCH64_CU129}\" --build-arg INSTALL_KV_CONNECTORS=true --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129 --target vllm-openai --progress plain -f docker/Dockerfile ."
195 + - |
196 + DOCKER_BUILDKIT=1 docker build \
197 + $(bash .buildkite/scripts/docker-build-metadata-args.sh cu129) \
198 + --build-arg max_jobs=16 \
199 + --build-arg USE_SCCACHE=1 \
200 + --build-arg GIT_REPO_CHECK=1 \
201 + --build-arg CUDA_VERSION=12.9.1 \
202 + --build-arg torch_cuda_arch_list="${CUDA_ARCH_AARCH64_CU129}" \
203 + --build-arg INSTALL_KV_CONNECTORS=true \
204 + --target vllm-openai \
205 + --progress plain \
206 + -f docker/Dockerfile .
207 - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129"
208
209 - label: "Build release image - x86_64 - CUDA 13.0 - Ubuntu 24.04"
@@ -167,7 +213,21 @@ steps:
213 queue: cpu_queue_release
214 commands:
215 - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
170 - - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=13.0.2 --build-arg UBUNTU_VERSION=24.04 --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_X86}\" --build-arg INSTALL_KV_CONNECTORS=true --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu24.04 --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-ubuntu2404 --target vllm-openai --progress plain -f docker/Dockerfile ."
216 + - |
217 + DOCKER_BUILDKIT=1 docker build \
218 + $(bash .buildkite/scripts/docker-build-metadata-args.sh ubuntu2404) \
219 + --build-arg max_jobs=16 \
220 + --build-arg USE_SCCACHE=1 \
221 + --build-arg GIT_REPO_CHECK=1 \
222 + --build-arg CUDA_VERSION=13.0.2 \
223 + --build-arg UBUNTU_VERSION=24.04 \
224 + --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 \
225 + --build-arg torch_cuda_arch_list="${CUDA_ARCH_X86}" \
226 + --build-arg INSTALL_KV_CONNECTORS=true \
227 + --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu24.04 \
228 + --target vllm-openai \
229 + --progress plain \
230 + -f docker/Dockerfile .
231 - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-ubuntu2404"
232 - "docker tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-ubuntu2404 public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-ubuntu2404"
233 - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-ubuntu2404"
@@ -179,7 +239,21 @@ steps:
239 queue: arm64_cpu_queue_release
240 commands:
241 - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
182 - - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=13.0.2 --build-arg UBUNTU_VERSION=24.04 --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_AARCH64}\" --build-arg INSTALL_KV_CONNECTORS=true --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu24.04 --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-ubuntu2404 --target vllm-openai --progress plain -f docker/Dockerfile ."
242 + - |
243 + DOCKER_BUILDKIT=1 docker build \
244 + $(bash .buildkite/scripts/docker-build-metadata-args.sh ubuntu2404) \
245 + --build-arg max_jobs=16 \
246 + --build-arg USE_SCCACHE=1 \
247 + --build-arg GIT_REPO_CHECK=1 \
248 + --build-arg CUDA_VERSION=13.0.2 \
249 + --build-arg UBUNTU_VERSION=24.04 \
250 + --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 \
251 + --build-arg torch_cuda_arch_list="${CUDA_ARCH_AARCH64}" \
252 + --build-arg INSTALL_KV_CONNECTORS=true \
253 + --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu24.04 \
254 + --target vllm-openai \
255 + --progress plain \
256 + -f docker/Dockerfile .
257 - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-ubuntu2404"
258
259 - label: "Build release image - x86_64 - CUDA 12.9 - Ubuntu 24.04"
@@ -189,7 +263,20 @@ steps:
263 queue: cpu_queue_release
264 commands:
265 - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
192 - - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=12.9.1 --build-arg UBUNTU_VERSION=24.04 --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_X86_CU129}\" --build-arg INSTALL_KV_CONNECTORS=true --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129-ubuntu2404 --target vllm-openai --progress plain -f docker/Dockerfile ."
266 + - |
267 + DOCKER_BUILDKIT=1 docker build \
268 + $(bash .buildkite/scripts/docker-build-metadata-args.sh cu129-ubuntu2404) \
269 + --build-arg max_jobs=16 \
270 + --build-arg USE_SCCACHE=1 \
271 + --build-arg GIT_REPO_CHECK=1 \
272 + --build-arg CUDA_VERSION=12.9.1 \
273 + --build-arg UBUNTU_VERSION=24.04 \
274 + --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 \
275 + --build-arg torch_cuda_arch_list="${CUDA_ARCH_X86_CU129}" \
276 + --build-arg INSTALL_KV_CONNECTORS=true \
277 + --target vllm-openai \
278 + --progress plain \
279 + -f docker/Dockerfile .
280 - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129-ubuntu2404"
281 - "docker tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129-ubuntu2404 public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-cu129-ubuntu2404"
282 - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-cu129-ubuntu2404"
@@ -201,7 +288,20 @@ steps:
288 queue: arm64_cpu_queue_release
289 commands:
290 - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
204 - - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=12.9.1 --build-arg UBUNTU_VERSION=24.04 --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_AARCH64_CU129}\" --build-arg INSTALL_KV_CONNECTORS=true --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129-ubuntu2404 --target vllm-openai --progress plain -f docker/Dockerfile ."
291 + - |
292 + DOCKER_BUILDKIT=1 docker build \
293 + $(bash .buildkite/scripts/docker-build-metadata-args.sh cu129-ubuntu2404) \
294 + --build-arg max_jobs=16 \
295 + --build-arg USE_SCCACHE=1 \
296 + --build-arg GIT_REPO_CHECK=1 \
297 + --build-arg CUDA_VERSION=12.9.1 \
298 + --build-arg UBUNTU_VERSION=24.04 \
299 + --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 \
300 + --build-arg torch_cuda_arch_list="${CUDA_ARCH_AARCH64_CU129}" \
301 + --build-arg INSTALL_KV_CONNECTORS=true \
302 + --target vllm-openai \
303 + --progress plain \
304 + -f docker/Dockerfile .
305 - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129-ubuntu2404"
306
307 - block: "Build release image for x86_64 CPU"
.buildkite/scripts/docker-build-metadata-args.sh new
+54
@@ -0,0 +1,54 @@
1 +#!/bin/bash
2 +# Emit docker build flags for release image provenance metadata.
3 +# Keep this helper best-effort: missing Buildkite metadata should fall back to
4 +# local/default values instead of blocking the Docker build.
5 +
6 +# Variant examples: "", "cu129", "ubuntu2404", "cu129-ubuntu2404".
7 +variant="${1:-}"
8 +variant_suffix="${variant:+-${variant}}"
9 +
10 +image_name="${VLLM_DOCKER_IMAGE_NAME:-vllm/vllm-openai}"
11 +staging_repo="${VLLM_STAGING_IMAGE_REPO:-public.ecr.aws/q9t5s3a7/vllm-release-repo}"
12 +build_commit="${VLLM_BUILD_COMMIT:-${BUILDKITE_COMMIT:-unknown}}"
13 +build_pipeline="${VLLM_BUILD_PIPELINE:-${BUILDKITE_PIPELINE_ID:-${BUILDKITE_PIPELINE_SLUG:-local}}}"
14 +build_url="${VLLM_BUILD_URL:-${BUILDKITE_BUILD_URL:-}}"
15 +tag_commit="${BUILDKITE_COMMIT:-${build_commit}}"
16 +
17 +if [[ -n "${BUILDKITE:-}" || -n "${BUILDKITE_COMMIT:-}" ]]; then
18 + release_version="${RELEASE_VERSION:-}"
19 + if command -v buildkite-agent >/dev/null 2>&1; then
20 + release_version="${release_version:-$(buildkite-agent meta-data get release-version 2>/dev/null)}"
21 + fi
22 + release_version="${release_version#v}"
23 + release_version="${release_version:-${tag_commit}}"
24 +
25 + staging_image_ref="${staging_repo}:${tag_commit}-$(uname -m)${variant_suffix}"
26 +
27 + if [[ "${NIGHTLY:-}" == "1" ]]; then
28 + if [[ -z "${variant}" ]]; then
29 + image_tag="${image_name}:nightly-${tag_commit}"
30 + elif [[ "${variant}" == cu* ]]; then
31 + cuda_variant="${variant%%-*}"
32 + remaining_variant="${variant#${cuda_variant}}"
33 + image_tag="${image_name}:${cuda_variant}-nightly-${tag_commit}${remaining_variant}"
34 + else
35 + image_tag="${image_name}:nightly-${tag_commit}${variant_suffix}"
36 + fi
37 + else
38 + image_tag="${image_name}:v${release_version}${variant_suffix}"
39 + fi
40 +else
41 + image_tag="${VLLM_IMAGE_TAG:-local/vllm-openai:dev}"
42 + staging_image_ref="${image_tag}"
43 +fi
44 +
45 +emit_arg() {
46 + printf -- "--build-arg %s=%s " "$1" "$2"
47 +}
48 +
49 +emit_arg VLLM_BUILD_COMMIT "${build_commit}"
50 +emit_arg VLLM_BUILD_PIPELINE "${build_pipeline}"
51 +emit_arg VLLM_BUILD_URL "${build_url}"
52 +# This is the intended public tag. The final digest is only known after push.
53 +emit_arg VLLM_IMAGE_TAG "${image_tag}"
54 +printf -- "--tag %s " "${staging_image_ref}"
.buildkite/test_areas/docker.yaml new
+16
@@ -0,0 +1,16 @@
1 +group: Docker
2 +depends_on:
3 + - image-build-cpu
4 +steps:
5 +- label: Docker Build Metadata
6 + timeout_in_minutes: 10
7 + device: cpu-small
8 + source_file_dependencies:
9 + - .buildkite/release-pipeline.yaml
10 + - .buildkite/scripts/docker-build-metadata-args.sh
11 + - docker/Dockerfile
12 + - docker/Dockerfile.cpu
13 + - docker/docker-bake.hcl
14 + - tests/tools/test_docker_build_metadata_args.py
15 + commands:
16 + - pytest -v -s tools/test_docker_build_metadata_args.py
docker/Dockerfile
+16
@@ -763,6 +763,10 @@ FROM vllm-base AS vllm-openai-base
763 ARG TARGETPLATFORM
764 ARG INSTALL_KV_CONNECTORS=false
765 ARG CUDA_VERSION
766 +ARG VLLM_BUILD_COMMIT
767 +ARG VLLM_BUILD_PIPELINE
768 +ARG VLLM_BUILD_URL
769 +ARG VLLM_IMAGE_TAG
770
771 ARG PIP_INDEX_URL UV_INDEX_URL
772 ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL
@@ -799,6 +803,18 @@ RUN --mount=type=cache,target=/root/.cache/uv \
803 fi
804
805 ENV VLLM_USAGE_SOURCE production-docker-image
806 +ENV VLLM_BUILD_COMMIT=${VLLM_BUILD_COMMIT:-unknown} \
807 + VLLM_BUILD_PIPELINE=${VLLM_BUILD_PIPELINE:-local} \
808 + VLLM_BUILD_URL=${VLLM_BUILD_URL:-} \
809 + VLLM_IMAGE_TAG=${VLLM_IMAGE_TAG:-local/vllm-openai:dev}
810 +LABEL org.opencontainers.image.source="https://github.com/vllm-project/vllm" \
811 + org.opencontainers.image.revision="${VLLM_BUILD_COMMIT}" \
812 + org.opencontainers.image.version="${VLLM_IMAGE_TAG}" \
813 + org.opencontainers.image.url="${VLLM_BUILD_URL}" \
814 + ai.vllm.build.commit="${VLLM_BUILD_COMMIT}" \
815 + ai.vllm.build.pipeline="${VLLM_BUILD_PIPELINE}" \
816 + ai.vllm.build.url="${VLLM_BUILD_URL}" \
817 + ai.vllm.image.tag="${VLLM_IMAGE_TAG}"
818
819 # define sagemaker first, so it is not default from `docker build`
820 FROM vllm-openai-base AS vllm-sagemaker
docker/Dockerfile.cpu
+1
@@ -192,6 +192,7 @@ ADD ./tests/ ./tests/
192 ADD ./examples/ ./examples/
193 ADD ./benchmarks/ ./benchmarks/
194 ADD ./vllm/collect_env.py .
195 +ADD ./docker/ ./docker/
196 ADD ./.buildkite/ ./.buildkite/
197
198 # install development dependencies (for testing)
docker/docker-bake.hcl
+28 -2
@@ -27,6 +27,22 @@ variable "COMMIT" {
27 default = ""
28 }
29
30 +variable "VLLM_BUILD_COMMIT" {
31 + default = "unknown"
32 +}
33 +
34 +variable "VLLM_BUILD_PIPELINE" {
35 + default = "local"
36 +}
37 +
38 +variable "VLLM_BUILD_URL" {
39 + default = ""
40 +}
41 +
42 +variable "VLLM_IMAGE_TAG" {
43 + default = "local/vllm-openai:dev"
44 +}
45 +
46 # Groups
47
48 group "default" {
@@ -46,6 +62,10 @@ target "_common" {
62 max_jobs = MAX_JOBS
63 nvcc_threads = NVCC_THREADS
64 torch_cuda_arch_list = TORCH_CUDA_ARCH_LIST
65 + VLLM_BUILD_COMMIT = VLLM_BUILD_COMMIT != "unknown" ? VLLM_BUILD_COMMIT : (COMMIT != "" ? COMMIT : "unknown")
66 + VLLM_BUILD_PIPELINE = VLLM_BUILD_PIPELINE
67 + VLLM_BUILD_URL = VLLM_BUILD_URL
68 + VLLM_IMAGE_TAG = VLLM_IMAGE_TAG
69 }
70 }
71
@@ -56,10 +76,16 @@ target "_labels" {
76 "org.opencontainers.image.title" = "vLLM"
77 "org.opencontainers.image.description" = "vLLM: A high-throughput and memory-efficient inference and serving engine for LLMs"
78 "org.opencontainers.image.licenses" = "Apache-2.0"
59 - "org.opencontainers.image.revision" = COMMIT
79 + "org.opencontainers.image.revision" = VLLM_BUILD_COMMIT != "unknown" ? VLLM_BUILD_COMMIT : (COMMIT != "" ? COMMIT : "unknown")
80 + "org.opencontainers.image.version" = VLLM_IMAGE_TAG
81 + "org.opencontainers.image.url" = VLLM_BUILD_URL
82 + "ai.vllm.build.commit" = VLLM_BUILD_COMMIT != "unknown" ? VLLM_BUILD_COMMIT : (COMMIT != "" ? COMMIT : "unknown")
83 + "ai.vllm.build.pipeline" = VLLM_BUILD_PIPELINE
84 + "ai.vllm.build.url" = VLLM_BUILD_URL
85 + "ai.vllm.image.tag" = VLLM_IMAGE_TAG
86 }
87 annotations = [
62 - "index,manifest:org.opencontainers.image.revision=${COMMIT}",
88 + "index,manifest:org.opencontainers.image.revision=${VLLM_BUILD_COMMIT != "unknown" ? VLLM_BUILD_COMMIT : (COMMIT != "" ? COMMIT : "unknown")}",
89 ]
90 }
91
tests/tools/test_docker_build_metadata_args.py new
+152
@@ -0,0 +1,152 @@
1 +# SPDX-License-Identifier: Apache-2.0
2 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 +
4 +import os
5 +import shlex
6 +import subprocess
7 +from pathlib import Path
8 +
9 +REPO_ROOT = Path(__file__).resolve().parents[2]
10 +HELPER = REPO_ROOT / ".buildkite" / "scripts" / "docker-build-metadata-args.sh"
11 +
12 +
13 +def run_helper(
14 + *args: str,
15 + env: dict[str, str] | None = None,
16 + path: str | None = None,
17 +) -> list[str]:
18 + helper_env = {"PATH": path or os.environ["PATH"]}
19 + if env:
20 + helper_env.update(env)
21 + result = subprocess.run(
22 + ["bash", str(HELPER), *args],
23 + check=True,
24 + env=helper_env,
25 + stdout=subprocess.PIPE,
26 + text=True,
27 + )
28 + return shlex.split(result.stdout)
29 +
30 +
31 +def option_values(args: list[str], option: str) -> list[str]:
32 + return [args[i + 1] for i, arg in enumerate(args[:-1]) if arg == option]
33 +
34 +
35 +def build_args(args: list[str]) -> dict[str, str]:
36 + values = {}
37 + for value in option_values(args, "--build-arg"):
38 + key, arg_value = value.split("=", 1)
39 + values[key] = arg_value
40 + return values
41 +
42 +
43 +def test_release_metadata_args_prefer_pipeline_id() -> None:
44 + args = run_helper(
45 + "cu130-ubuntu2404",
46 + env={
47 + "BUILDKITE": "1",
48 + "BUILDKITE_COMMIT": "abc123",
49 + "BUILDKITE_PIPELINE_ID": "pipe-uuid",
50 + "BUILDKITE_PIPELINE_SLUG": "release",
51 + "BUILDKITE_BUILD_URL": "https://buildkite.example/vllm/builds/1",
52 + "RELEASE_VERSION": "v0.20.0",
53 + },
54 + )
55 +
56 + assert build_args(args) == {
57 + "VLLM_BUILD_COMMIT": "abc123",
58 + "VLLM_BUILD_PIPELINE": "pipe-uuid",
59 + "VLLM_BUILD_URL": "https://buildkite.example/vllm/builds/1",
60 + "VLLM_IMAGE_TAG": "vllm/vllm-openai:v0.20.0-cu130-ubuntu2404",
61 + }
62 + expected_tag = (
63 + "public.ecr.aws/q9t5s3a7/vllm-release-repo:"
64 + f"abc123-{os.uname().machine}-cu130-ubuntu2404"
65 + )
66 + assert option_values(args, "--tag") == [expected_tag]
67 +
68 +
69 +def test_nightly_metadata_args_fall_back_to_pipeline_slug() -> None:
70 + args = run_helper(
71 + "ubuntu2404",
72 + env={
73 + "BUILDKITE": "1",
74 + "BUILDKITE_COMMIT": "def456",
75 + "BUILDKITE_PIPELINE_SLUG": "release",
76 + "BUILDKITE_BUILD_URL": "https://buildkite.example/vllm/builds/2",
77 + "NIGHTLY": "1",
78 + },
79 + )
80 +
81 + assert build_args(args) == {
82 + "VLLM_BUILD_COMMIT": "def456",
83 + "VLLM_BUILD_PIPELINE": "release",
84 + "VLLM_BUILD_URL": "https://buildkite.example/vllm/builds/2",
85 + "VLLM_IMAGE_TAG": "vllm/vllm-openai:nightly-def456-ubuntu2404",
86 + }
87 + expected_tag = (
88 + "public.ecr.aws/q9t5s3a7/vllm-release-repo:"
89 + f"def456-{os.uname().machine}-ubuntu2404"
90 + )
91 + assert option_values(args, "--tag") == [expected_tag]
92 +
93 +
94 +def test_local_metadata_args_use_local_overrides() -> None:
95 + args = run_helper(
96 + env={
97 + "VLLM_IMAGE_TAG": "local/test:dev",
98 + "VLLM_BUILD_COMMIT": "localsha",
99 + "VLLM_BUILD_PIPELINE": "local-pipeline",
100 + "VLLM_BUILD_URL": "https://buildkite.example/local",
101 + },
102 + )
103 +
104 + assert build_args(args) == {
105 + "VLLM_BUILD_COMMIT": "localsha",
106 + "VLLM_BUILD_PIPELINE": "local-pipeline",
107 + "VLLM_BUILD_URL": "https://buildkite.example/local",
108 + "VLLM_IMAGE_TAG": "local/test:dev",
109 + }
110 + assert option_values(args, "--tag") == ["local/test:dev"]
111 +
112 +
113 +def test_release_version_lookup_failure_falls_back_to_commit(
114 + tmp_path: Path,
115 +) -> None:
116 + fake_bin = tmp_path / "bin"
117 + fake_bin.mkdir()
118 + buildkite_agent = fake_bin / "buildkite-agent"
119 + buildkite_agent.write_text("#!/bin/sh\nexit 1\n")
120 + buildkite_agent.chmod(0o755)
121 +
122 + args = run_helper(
123 + "cu129",
124 + env={
125 + "BUILDKITE": "1",
126 + "BUILDKITE_COMMIT": "fallback123",
127 + "BUILDKITE_PIPELINE_SLUG": "release",
128 + },
129 + path=f"{fake_bin}:{os.environ['PATH']}",
130 + )
131 +
132 + assert build_args(args)["VLLM_IMAGE_TAG"] == ("vllm/vllm-openai:vfallback123-cu129")
133 +
134 +
135 +def test_vllm_openai_image_embeds_metadata_contract() -> None:
136 + dockerfile = (REPO_ROOT / "docker" / "Dockerfile").read_text()
137 +
138 + for expected in (
139 + "ARG VLLM_BUILD_COMMIT",
140 + "ARG VLLM_BUILD_PIPELINE",
141 + "ARG VLLM_BUILD_URL",
142 + "ARG VLLM_IMAGE_TAG",
143 + "VLLM_BUILD_COMMIT=${VLLM_BUILD_COMMIT:-unknown}",
144 + "VLLM_BUILD_PIPELINE=${VLLM_BUILD_PIPELINE:-local}",
145 + "VLLM_BUILD_URL=${VLLM_BUILD_URL:-}",
146 + "VLLM_IMAGE_TAG=${VLLM_IMAGE_TAG:-local/vllm-openai:dev}",
147 + 'ai.vllm.build.commit="${VLLM_BUILD_COMMIT}"',
148 + 'ai.vllm.build.pipeline="${VLLM_BUILD_PIPELINE}"',
149 + 'ai.vllm.build.url="${VLLM_BUILD_URL}"',
150 + 'ai.vllm.image.tag="${VLLM_IMAGE_TAG}"',
151 + ):
152 + assert expected in dockerfile