diff --git a/.buildkite/image_build/image_build.sh b/.buildkite/image_build/image_build.sh index 00ae34bba6..10c03c3e17 100755 --- a/.buildkite/image_build/image_build.sh +++ b/.buildkite/image_build/image_build.sh @@ -192,6 +192,7 @@ export BUILDKITE_COMMIT export PARENT_COMMIT export IMAGE_TAG export IMAGE_TAG_LATEST +export COMMIT="${COMMIT:-${BUILDKITE_COMMIT}}" export CACHE_FROM export CACHE_FROM_BASE_BRANCH export CACHE_FROM_MAIN diff --git a/.buildkite/release-pipeline.yaml b/.buildkite/release-pipeline.yaml index ffe5f4f2bd..74227da45c 100644 --- a/.buildkite/release-pipeline.yaml +++ b/.buildkite/release-pipeline.yaml @@ -121,7 +121,19 @@ steps: queue: cpu_queue_release commands: - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7" - - "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 ." + - | + DOCKER_BUILDKIT=1 docker build \ + $(bash .buildkite/scripts/docker-build-metadata-args.sh) \ + --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 \ + --target vllm-openai \ + --progress plain \ + -f docker/Dockerfile . - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)" # re-tag to default image tag and push, just in case arm64 build fails - "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: queue: arm64_cpu_queue_release commands: - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7" - - "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 ." + - | + DOCKER_BUILDKIT=1 docker build \ + $(bash .buildkite/scripts/docker-build-metadata-args.sh) \ + --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 \ + --target vllm-openai \ + --progress plain \ + -f docker/Dockerfile . - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)" - label: "Build release image - x86_64 - CUDA 12.9" @@ -144,7 +168,18 @@ steps: queue: cpu_queue_release commands: - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7" - - "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 ." + - | + DOCKER_BUILDKIT=1 docker build \ + $(bash .buildkite/scripts/docker-build-metadata-args.sh cu129) \ + --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 \ + --target vllm-openai \ + --progress plain \ + -f docker/Dockerfile . - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129" # re-tag to default image tag and push, just in case arm64 build fails - "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: queue: arm64_cpu_queue_release commands: - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7" - - "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 ." + - | + DOCKER_BUILDKIT=1 docker build \ + $(bash .buildkite/scripts/docker-build-metadata-args.sh cu129) \ + --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 \ + --target vllm-openai \ + --progress plain \ + -f docker/Dockerfile . - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129" - label: "Build release image - x86_64 - CUDA 13.0 - Ubuntu 24.04" @@ -167,7 +213,21 @@ steps: queue: cpu_queue_release commands: - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7" - - "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 ." + - | + DOCKER_BUILDKIT=1 docker build \ + $(bash .buildkite/scripts/docker-build-metadata-args.sh ubuntu2404) \ + --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 \ + --target vllm-openai \ + --progress plain \ + -f docker/Dockerfile . - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-ubuntu2404" - "docker tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-ubuntu2404 public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-ubuntu2404" - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-ubuntu2404" @@ -179,7 +239,21 @@ steps: queue: arm64_cpu_queue_release commands: - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7" - - "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 ." + - | + DOCKER_BUILDKIT=1 docker build \ + $(bash .buildkite/scripts/docker-build-metadata-args.sh ubuntu2404) \ + --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 \ + --target vllm-openai \ + --progress plain \ + -f docker/Dockerfile . - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-ubuntu2404" - label: "Build release image - x86_64 - CUDA 12.9 - Ubuntu 24.04" @@ -189,7 +263,20 @@ steps: queue: cpu_queue_release commands: - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7" - - "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 ." + - | + DOCKER_BUILDKIT=1 docker build \ + $(bash .buildkite/scripts/docker-build-metadata-args.sh cu129-ubuntu2404) \ + --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 \ + --target vllm-openai \ + --progress plain \ + -f docker/Dockerfile . - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129-ubuntu2404" - "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" - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-cu129-ubuntu2404" @@ -201,7 +288,20 @@ steps: queue: arm64_cpu_queue_release commands: - "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7" - - "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 ." + - | + DOCKER_BUILDKIT=1 docker build \ + $(bash .buildkite/scripts/docker-build-metadata-args.sh cu129-ubuntu2404) \ + --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 \ + --target vllm-openai \ + --progress plain \ + -f docker/Dockerfile . - "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129-ubuntu2404" - block: "Build release image for x86_64 CPU" diff --git a/.buildkite/scripts/docker-build-metadata-args.sh b/.buildkite/scripts/docker-build-metadata-args.sh new file mode 100644 index 0000000000..9aa6fa9314 --- /dev/null +++ b/.buildkite/scripts/docker-build-metadata-args.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# Emit docker build flags for release image provenance metadata. +# Keep this helper best-effort: missing Buildkite metadata should fall back to +# local/default values instead of blocking the Docker build. + +# Variant examples: "", "cu129", "ubuntu2404", "cu129-ubuntu2404". +variant="${1:-}" +variant_suffix="${variant:+-${variant}}" + +image_name="${VLLM_DOCKER_IMAGE_NAME:-vllm/vllm-openai}" +staging_repo="${VLLM_STAGING_IMAGE_REPO:-public.ecr.aws/q9t5s3a7/vllm-release-repo}" +build_commit="${VLLM_BUILD_COMMIT:-${BUILDKITE_COMMIT:-unknown}}" +build_pipeline="${VLLM_BUILD_PIPELINE:-${BUILDKITE_PIPELINE_ID:-${BUILDKITE_PIPELINE_SLUG:-local}}}" +build_url="${VLLM_BUILD_URL:-${BUILDKITE_BUILD_URL:-}}" +tag_commit="${BUILDKITE_COMMIT:-${build_commit}}" + +if [[ -n "${BUILDKITE:-}" || -n "${BUILDKITE_COMMIT:-}" ]]; then + release_version="${RELEASE_VERSION:-}" + if command -v buildkite-agent >/dev/null 2>&1; then + release_version="${release_version:-$(buildkite-agent meta-data get release-version 2>/dev/null)}" + fi + release_version="${release_version#v}" + release_version="${release_version:-${tag_commit}}" + + staging_image_ref="${staging_repo}:${tag_commit}-$(uname -m)${variant_suffix}" + + if [[ "${NIGHTLY:-}" == "1" ]]; then + if [[ -z "${variant}" ]]; then + image_tag="${image_name}:nightly-${tag_commit}" + elif [[ "${variant}" == cu* ]]; then + cuda_variant="${variant%%-*}" + remaining_variant="${variant#${cuda_variant}}" + image_tag="${image_name}:${cuda_variant}-nightly-${tag_commit}${remaining_variant}" + else + image_tag="${image_name}:nightly-${tag_commit}${variant_suffix}" + fi + else + image_tag="${image_name}:v${release_version}${variant_suffix}" + fi +else + image_tag="${VLLM_IMAGE_TAG:-local/vllm-openai:dev}" + staging_image_ref="${image_tag}" +fi + +emit_arg() { + printf -- "--build-arg %s=%s " "$1" "$2" +} + +emit_arg VLLM_BUILD_COMMIT "${build_commit}" +emit_arg VLLM_BUILD_PIPELINE "${build_pipeline}" +emit_arg VLLM_BUILD_URL "${build_url}" +# This is the intended public tag. The final digest is only known after push. +emit_arg VLLM_IMAGE_TAG "${image_tag}" +printf -- "--tag %s " "${staging_image_ref}" diff --git a/.buildkite/test_areas/docker.yaml b/.buildkite/test_areas/docker.yaml new file mode 100644 index 0000000000..9bf96221ab --- /dev/null +++ b/.buildkite/test_areas/docker.yaml @@ -0,0 +1,16 @@ +group: Docker +depends_on: + - image-build-cpu +steps: +- label: Docker Build Metadata + timeout_in_minutes: 10 + device: cpu-small + source_file_dependencies: + - .buildkite/release-pipeline.yaml + - .buildkite/scripts/docker-build-metadata-args.sh + - docker/Dockerfile + - docker/Dockerfile.cpu + - docker/docker-bake.hcl + - tests/tools/test_docker_build_metadata_args.py + commands: + - pytest -v -s tools/test_docker_build_metadata_args.py diff --git a/docker/Dockerfile b/docker/Dockerfile index 3d652a5dea..a6b2914077 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -763,6 +763,10 @@ FROM vllm-base AS vllm-openai-base ARG TARGETPLATFORM ARG INSTALL_KV_CONNECTORS=false ARG CUDA_VERSION +ARG VLLM_BUILD_COMMIT +ARG VLLM_BUILD_PIPELINE +ARG VLLM_BUILD_URL +ARG VLLM_IMAGE_TAG ARG PIP_INDEX_URL UV_INDEX_URL ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL @@ -799,6 +803,18 @@ RUN --mount=type=cache,target=/root/.cache/uv \ fi ENV VLLM_USAGE_SOURCE production-docker-image +ENV VLLM_BUILD_COMMIT=${VLLM_BUILD_COMMIT:-unknown} \ + VLLM_BUILD_PIPELINE=${VLLM_BUILD_PIPELINE:-local} \ + VLLM_BUILD_URL=${VLLM_BUILD_URL:-} \ + VLLM_IMAGE_TAG=${VLLM_IMAGE_TAG:-local/vllm-openai:dev} +LABEL org.opencontainers.image.source="https://github.com/vllm-project/vllm" \ + org.opencontainers.image.revision="${VLLM_BUILD_COMMIT}" \ + org.opencontainers.image.version="${VLLM_IMAGE_TAG}" \ + org.opencontainers.image.url="${VLLM_BUILD_URL}" \ + ai.vllm.build.commit="${VLLM_BUILD_COMMIT}" \ + ai.vllm.build.pipeline="${VLLM_BUILD_PIPELINE}" \ + ai.vllm.build.url="${VLLM_BUILD_URL}" \ + ai.vllm.image.tag="${VLLM_IMAGE_TAG}" # define sagemaker first, so it is not default from `docker build` FROM vllm-openai-base AS vllm-sagemaker diff --git a/docker/Dockerfile.cpu b/docker/Dockerfile.cpu index 72ee002d90..d15ced8e01 100644 --- a/docker/Dockerfile.cpu +++ b/docker/Dockerfile.cpu @@ -192,6 +192,7 @@ ADD ./tests/ ./tests/ ADD ./examples/ ./examples/ ADD ./benchmarks/ ./benchmarks/ ADD ./vllm/collect_env.py . +ADD ./docker/ ./docker/ ADD ./.buildkite/ ./.buildkite/ # install development dependencies (for testing) diff --git a/docker/docker-bake.hcl b/docker/docker-bake.hcl index 785d598d60..94ca839756 100644 --- a/docker/docker-bake.hcl +++ b/docker/docker-bake.hcl @@ -27,6 +27,22 @@ variable "COMMIT" { default = "" } +variable "VLLM_BUILD_COMMIT" { + default = "unknown" +} + +variable "VLLM_BUILD_PIPELINE" { + default = "local" +} + +variable "VLLM_BUILD_URL" { + default = "" +} + +variable "VLLM_IMAGE_TAG" { + default = "local/vllm-openai:dev" +} + # Groups group "default" { @@ -46,6 +62,10 @@ target "_common" { max_jobs = MAX_JOBS nvcc_threads = NVCC_THREADS torch_cuda_arch_list = TORCH_CUDA_ARCH_LIST + VLLM_BUILD_COMMIT = VLLM_BUILD_COMMIT != "unknown" ? VLLM_BUILD_COMMIT : (COMMIT != "" ? COMMIT : "unknown") + VLLM_BUILD_PIPELINE = VLLM_BUILD_PIPELINE + VLLM_BUILD_URL = VLLM_BUILD_URL + VLLM_IMAGE_TAG = VLLM_IMAGE_TAG } } @@ -56,10 +76,16 @@ target "_labels" { "org.opencontainers.image.title" = "vLLM" "org.opencontainers.image.description" = "vLLM: A high-throughput and memory-efficient inference and serving engine for LLMs" "org.opencontainers.image.licenses" = "Apache-2.0" - "org.opencontainers.image.revision" = COMMIT + "org.opencontainers.image.revision" = VLLM_BUILD_COMMIT != "unknown" ? VLLM_BUILD_COMMIT : (COMMIT != "" ? COMMIT : "unknown") + "org.opencontainers.image.version" = VLLM_IMAGE_TAG + "org.opencontainers.image.url" = VLLM_BUILD_URL + "ai.vllm.build.commit" = VLLM_BUILD_COMMIT != "unknown" ? VLLM_BUILD_COMMIT : (COMMIT != "" ? COMMIT : "unknown") + "ai.vllm.build.pipeline" = VLLM_BUILD_PIPELINE + "ai.vllm.build.url" = VLLM_BUILD_URL + "ai.vllm.image.tag" = VLLM_IMAGE_TAG } annotations = [ - "index,manifest:org.opencontainers.image.revision=${COMMIT}", + "index,manifest:org.opencontainers.image.revision=${VLLM_BUILD_COMMIT != "unknown" ? VLLM_BUILD_COMMIT : (COMMIT != "" ? COMMIT : "unknown")}", ] } diff --git a/tests/tools/test_docker_build_metadata_args.py b/tests/tools/test_docker_build_metadata_args.py new file mode 100644 index 0000000000..fa2eac558f --- /dev/null +++ b/tests/tools/test_docker_build_metadata_args.py @@ -0,0 +1,152 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project + +import os +import shlex +import subprocess +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[2] +HELPER = REPO_ROOT / ".buildkite" / "scripts" / "docker-build-metadata-args.sh" + + +def run_helper( + *args: str, + env: dict[str, str] | None = None, + path: str | None = None, +) -> list[str]: + helper_env = {"PATH": path or os.environ["PATH"]} + if env: + helper_env.update(env) + result = subprocess.run( + ["bash", str(HELPER), *args], + check=True, + env=helper_env, + stdout=subprocess.PIPE, + text=True, + ) + return shlex.split(result.stdout) + + +def option_values(args: list[str], option: str) -> list[str]: + return [args[i + 1] for i, arg in enumerate(args[:-1]) if arg == option] + + +def build_args(args: list[str]) -> dict[str, str]: + values = {} + for value in option_values(args, "--build-arg"): + key, arg_value = value.split("=", 1) + values[key] = arg_value + return values + + +def test_release_metadata_args_prefer_pipeline_id() -> None: + args = run_helper( + "cu130-ubuntu2404", + env={ + "BUILDKITE": "1", + "BUILDKITE_COMMIT": "abc123", + "BUILDKITE_PIPELINE_ID": "pipe-uuid", + "BUILDKITE_PIPELINE_SLUG": "release", + "BUILDKITE_BUILD_URL": "https://buildkite.example/vllm/builds/1", + "RELEASE_VERSION": "v0.20.0", + }, + ) + + assert build_args(args) == { + "VLLM_BUILD_COMMIT": "abc123", + "VLLM_BUILD_PIPELINE": "pipe-uuid", + "VLLM_BUILD_URL": "https://buildkite.example/vllm/builds/1", + "VLLM_IMAGE_TAG": "vllm/vllm-openai:v0.20.0-cu130-ubuntu2404", + } + expected_tag = ( + "public.ecr.aws/q9t5s3a7/vllm-release-repo:" + f"abc123-{os.uname().machine}-cu130-ubuntu2404" + ) + assert option_values(args, "--tag") == [expected_tag] + + +def test_nightly_metadata_args_fall_back_to_pipeline_slug() -> None: + args = run_helper( + "ubuntu2404", + env={ + "BUILDKITE": "1", + "BUILDKITE_COMMIT": "def456", + "BUILDKITE_PIPELINE_SLUG": "release", + "BUILDKITE_BUILD_URL": "https://buildkite.example/vllm/builds/2", + "NIGHTLY": "1", + }, + ) + + assert build_args(args) == { + "VLLM_BUILD_COMMIT": "def456", + "VLLM_BUILD_PIPELINE": "release", + "VLLM_BUILD_URL": "https://buildkite.example/vllm/builds/2", + "VLLM_IMAGE_TAG": "vllm/vllm-openai:nightly-def456-ubuntu2404", + } + expected_tag = ( + "public.ecr.aws/q9t5s3a7/vllm-release-repo:" + f"def456-{os.uname().machine}-ubuntu2404" + ) + assert option_values(args, "--tag") == [expected_tag] + + +def test_local_metadata_args_use_local_overrides() -> None: + args = run_helper( + env={ + "VLLM_IMAGE_TAG": "local/test:dev", + "VLLM_BUILD_COMMIT": "localsha", + "VLLM_BUILD_PIPELINE": "local-pipeline", + "VLLM_BUILD_URL": "https://buildkite.example/local", + }, + ) + + assert build_args(args) == { + "VLLM_BUILD_COMMIT": "localsha", + "VLLM_BUILD_PIPELINE": "local-pipeline", + "VLLM_BUILD_URL": "https://buildkite.example/local", + "VLLM_IMAGE_TAG": "local/test:dev", + } + assert option_values(args, "--tag") == ["local/test:dev"] + + +def test_release_version_lookup_failure_falls_back_to_commit( + tmp_path: Path, +) -> None: + fake_bin = tmp_path / "bin" + fake_bin.mkdir() + buildkite_agent = fake_bin / "buildkite-agent" + buildkite_agent.write_text("#!/bin/sh\nexit 1\n") + buildkite_agent.chmod(0o755) + + args = run_helper( + "cu129", + env={ + "BUILDKITE": "1", + "BUILDKITE_COMMIT": "fallback123", + "BUILDKITE_PIPELINE_SLUG": "release", + }, + path=f"{fake_bin}:{os.environ['PATH']}", + ) + + assert build_args(args)["VLLM_IMAGE_TAG"] == ("vllm/vllm-openai:vfallback123-cu129") + + +def test_vllm_openai_image_embeds_metadata_contract() -> None: + dockerfile = (REPO_ROOT / "docker" / "Dockerfile").read_text() + + for expected in ( + "ARG VLLM_BUILD_COMMIT", + "ARG VLLM_BUILD_PIPELINE", + "ARG VLLM_BUILD_URL", + "ARG VLLM_IMAGE_TAG", + "VLLM_BUILD_COMMIT=${VLLM_BUILD_COMMIT:-unknown}", + "VLLM_BUILD_PIPELINE=${VLLM_BUILD_PIPELINE:-local}", + "VLLM_BUILD_URL=${VLLM_BUILD_URL:-}", + "VLLM_IMAGE_TAG=${VLLM_IMAGE_TAG:-local/vllm-openai:dev}", + 'ai.vllm.build.commit="${VLLM_BUILD_COMMIT}"', + 'ai.vllm.build.pipeline="${VLLM_BUILD_PIPELINE}"', + 'ai.vllm.build.url="${VLLM_BUILD_URL}"', + 'ai.vllm.image.tag="${VLLM_IMAGE_TAG}"', + ): + assert expected in dockerfile