| 1 | #!/bin/bash |
| 2 | # SPDX-License-Identifier: Apache-2.0 |
| 3 | # SPDX-FileCopyrightText: Copyright contributors to the vLLM project |
| 4 | # |
| 5 | # Push a ROCm-family nightly base image and nightly image from ECR to Docker Hub |
| 6 | # under vllm/vllm-openai-rocm, as base-nightly[-<variant>], nightly[-<variant>] |
| 7 | # and their -<commit> forms. |
| 8 | # Run when NIGHTLY=1 after the matching build-*-release-image step has pushed to ECR. |
| 9 | # |
| 10 | # Usage: push-nightly-builds-rocm.sh [ECR_TAG_SUFFIX TAG_VARIANT] |
| 11 | # Pass both arguments or neither. With none, the default ROCm apt build is |
| 12 | # published as :nightly. The TheRock build passes "rock" (the source ECR tag |
| 13 | # suffix) and "rocm714" (the Docker Hub tag flavor), giving :nightly-rocm714. |
| 14 | # |
| 15 | # Local testing (no push to Docker Hub): |
| 16 | # BASE_ECR_IMAGE=<full-base-image-reference> \ |
| 17 | # BUILDKITE_COMMIT=<commit-with-image-in-ecr> DRY_RUN=1 \ |
| 18 | # bash .buildkite/scripts/push-nightly-builds-rocm.sh |
| 19 | # Requires: AWS CLI configured (for ECR public login), Docker. For full run: Docker Hub login. |
| 20 | |
| 21 | set -euxo pipefail |
| 22 | |
| 23 | usage() { |
| 24 | echo "Usage: $0 [ECR_TAG_SUFFIX TAG_VARIANT]" >&2 |
| 25 | } |
| 26 | |
| 27 | DOCKERHUB_REPO="vllm/vllm-openai-rocm" |
| 28 | |
| 29 | case "$#" in |
| 30 | 0) |
| 31 | ECR_TAG_SUFFIX="rocm" |
| 32 | TAG_VARIANT="" |
| 33 | ;; |
| 34 | 2) |
| 35 | if [[ -z "$1" || -z "$2" ]]; then |
| 36 | usage |
| 37 | exit 2 |
| 38 | fi |
| 39 | ECR_TAG_SUFFIX="$1" |
| 40 | TAG_VARIANT="$2" |
| 41 | ;; |
| 42 | *) |
| 43 | usage |
| 44 | exit 2 |
| 45 | ;; |
| 46 | esac |
| 47 | |
| 48 | # Use BUILDKITE_COMMIT from env (required; set to a commit that has the image in ECR for local test) |
| 49 | BUILDKITE_COMMIT="${BUILDKITE_COMMIT:?Set BUILDKITE_COMMIT to the commit SHA that has the image in ECR (e.g. from a previous release pipeline run)}" |
| 50 | DRY_RUN="${DRY_RUN:-0}" |
| 51 | |
| 52 | ECR_REPO="public.ecr.aws/q9t5s3a7/vllm-release-repo" |
| 53 | |
| 54 | # Get the base image ECR tag (set by the build-*-release-image pipeline step) |
| 55 | BASE_METADATA_KEY="${ECR_TAG_SUFFIX}-base-ecr-tag" |
| 56 | if [[ -n "${BASE_ECR_IMAGE:-}" ]]; then |
| 57 | if [[ "$DRY_RUN" != "1" ]]; then |
| 58 | echo "ERROR: BASE_ECR_IMAGE may only be used with DRY_RUN=1" >&2 |
| 59 | exit 1 |
| 60 | fi |
| 61 | BASE_ORIG_TAG="$BASE_ECR_IMAGE" |
| 62 | elif ! BASE_ORIG_TAG="$(buildkite-agent meta-data get "$BASE_METADATA_KEY")"; then |
| 63 | echo "ERROR: Failed to read required Buildkite metadata '$BASE_METADATA_KEY'" >&2 |
| 64 | exit 1 |
| 65 | fi |
| 66 | if [[ -z "$BASE_ORIG_TAG" ]]; then |
| 67 | echo "ERROR: Required Buildkite metadata '$BASE_METADATA_KEY' is empty" >&2 |
| 68 | echo "Set BASE_ECR_IMAGE to the full ECR base image reference for local testing" >&2 |
| 69 | exit 1 |
| 70 | fi |
| 71 | |
| 72 | ORIG_TAG="${BUILDKITE_COMMIT}-${ECR_TAG_SUFFIX}" |
| 73 | VARIANT_SUFFIX="" |
| 74 | [[ -n "$TAG_VARIANT" ]] && VARIANT_SUFFIX="-$TAG_VARIANT" |
| 75 | BASE_TAG_NAME="base-nightly${VARIANT_SUFFIX}" |
| 76 | TAG_NAME="nightly${VARIANT_SUFFIX}" |
| 77 | BASE_TAG_NAME_COMMIT="base-nightly${VARIANT_SUFFIX}-${BUILDKITE_COMMIT}" |
| 78 | TAG_NAME_COMMIT="nightly${VARIANT_SUFFIX}-${BUILDKITE_COMMIT}" |
| 79 | |
| 80 | echo "Pushing base image from ECR: $BASE_ORIG_TAG" |
| 81 | echo "Pushing release image from ECR tag: $ORIG_TAG to Docker Hub as $DOCKERHUB_REPO:$TAG_NAME and $DOCKERHUB_REPO:$TAG_NAME_COMMIT" |
| 82 | [[ "$DRY_RUN" == "1" ]] && echo "[DRY_RUN] Skipping push to Docker Hub" |
| 83 | |
| 84 | # Login to ECR and pull the images built by build-*-release-image |
| 85 | aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7 |
| 86 | docker pull "$BASE_ORIG_TAG" |
| 87 | docker pull "${ECR_REPO}:${ORIG_TAG}" |
| 88 | |
| 89 | # Tag for Docker Hub (base-nightly and base-nightly-<commit>, nightly and nightly-<commit>) |
| 90 | docker tag "$BASE_ORIG_TAG" "$DOCKERHUB_REPO":"$BASE_TAG_NAME" |
| 91 | docker tag "$BASE_ORIG_TAG" "$DOCKERHUB_REPO":"$BASE_TAG_NAME_COMMIT" |
| 92 | docker tag "${ECR_REPO}:${ORIG_TAG}" "$DOCKERHUB_REPO":"$TAG_NAME" |
| 93 | docker tag "${ECR_REPO}:${ORIG_TAG}" "$DOCKERHUB_REPO":"$TAG_NAME_COMMIT" |
| 94 | |
| 95 | if [[ "$DRY_RUN" == "1" ]]; then |
| 96 | echo "[DRY_RUN] Would push $DOCKERHUB_REPO:$BASE_TAG_NAME and $DOCKERHUB_REPO:$BASE_TAG_NAME_COMMIT" |
| 97 | echo "[DRY_RUN] Would push $DOCKERHUB_REPO:$TAG_NAME and $DOCKERHUB_REPO:$TAG_NAME_COMMIT" |
| 98 | echo "[DRY_RUN] Local tags created. Exiting without push." |
| 99 | exit 0 |
| 100 | fi |
| 101 | |
| 102 | # Push to Docker Hub (docker-login plugin runs before this step in CI) |
| 103 | docker push "$DOCKERHUB_REPO":"$BASE_TAG_NAME" |
| 104 | docker push "$DOCKERHUB_REPO":"$BASE_TAG_NAME_COMMIT" |
| 105 | docker push "$DOCKERHUB_REPO":"$TAG_NAME" |
| 106 | docker push "$DOCKERHUB_REPO":"$TAG_NAME_COMMIT" |
| 107 | |
| 108 | echo "Pushed $DOCKERHUB_REPO:$BASE_TAG_NAME and $DOCKERHUB_REPO:$BASE_TAG_NAME_COMMIT" |
| 109 | echo "Pushed $DOCKERHUB_REPO:$TAG_NAME and $DOCKERHUB_REPO:$TAG_NAME_COMMIT" |