chore: import upstream snapshot with attribution

This commit is contained in:
wehub-resource-sync
2026-07-13 13:17:40 +08:00
commit f1825c8ceb
10096 changed files with 2364182 additions and 0 deletions
+272
View File
@@ -0,0 +1,272 @@
common --noenable_bzlmod
# Must be first. Enables build:windows, build:linux, build:macos, build:freebsd, build:openbsd
build --enable_platform_specific_config
build --incompatible_strict_action_env
build:strict --incompatible_strict_action_env
build:linux --workspace_status_command="bash ./bazel/workspace_status.sh"
# To distinguish different incompatible environments.
build --action_env=RAY_BUILD_ENV
###############################################################################
# On Windows, provide: BAZEL_SH, and BAZEL_LLVM (if using clang-cl)
# On all platforms, provide: PYTHON3_BIN_PATH=python
###############################################################################
build:windows --action_env=PATH
# For --compilation_mode=dbg, consider enabling checks in the standard library as well (below).
build --compilation_mode=opt
# Using C++ 17 on all platforms.
build:linux --host_cxxopt="-std=c++17"
build:macos --host_cxxopt="-std=c++17"
build:clang-cl --host_cxxopt="-std=c++17"
build:msvc-cl --host_cxxopt="/std:c++17"
build:windows --host_cxxopt="/std:c++17"
build:linux --cxxopt="-std=c++17"
build:macos --cxxopt="-std=c++17"
build:clang-cl --cxxopt="-std=c++17"
build:msvc-cl --cxxopt="/std:c++17"
build:windows --cxxopt="/std:c++17"
build:windows --cxxopt="/utf-8"
# This workaround is needed to prevent Bazel from compiling the same file twice (once PIC and once not).
build:linux --copt="-fPIC"
build:macos --copt="-fPIC"
build:clang-cl --compiler=clang-cl
build:msvc-cl --compiler=msvc-cl
# `LC_ALL` and `LANG` is needed for cpp worker tests, because they will call "ray start".
# If we don't add them, python's `click` library will raise an error.
test --test_env=LC_ALL
test --test_env=LANG
# Allow C++ worker tests to execute "ray start" with the correct version of Python.
test --test_env=VIRTUAL_ENV
test --test_env=PYENV_VIRTUAL_ENV
test --test_env=PYENV_VERSION
test --test_env=PYENV_SHELL
# Do not send usage stats to the server for tests
test --test_env=RAY_USAGE_STATS_REPORT_URL="http://127.0.0.1:8000"
# Enable cluster mode for OSX and Windows. By default, Ray
# will not allow multinode OSX and Windows clusters.
test --test_env=RAY_ENABLE_WINDOWS_OR_OSX_CLUSTER="1"
# Work around an NVIDIA driver bug that breaks NCCL cuMem host buffer
# registration on non-P2P GPUs (e.g. T4) with CUDA error 217 (peer access not
# supported), failing multi-GPU collectives. Affects drivers 560-575
# (CUDA 12.6-12.9); NVIDIA fixed it in r580+ (see NVIDIA/nccl#1838).
# TODO(elliot-barn): remove once the CI GPU fleet is on driver r580 or newer.
test --test_env=NCCL_CUMEM_HOST_ENABLE=0
# This is needed for some core tests to run correctly
build:windows --enable_runfiles
# TODO(mehrdadn): Revert the "-\\.(asm|S)$" exclusion when this Bazel bug
# for compiling assembly files is fixed on Windows:
# https://github.com/bazelbuild/bazel/issues/8924
# Warnings should be errors
build:linux --per_file_copt="-\\.(asm|S)$@-Werror"
build:macos --per_file_copt="-\\.(asm|S)$@-Werror"
build:clang-cl --per_file_copt="-\\.(asm|S)$@-Werror"
build:msvc-cl --per_file_copt="-\\.(asm|S)$@-WX"
# Ignore warnings for protobuf generated files and external projects.
build --per_file_copt="\\.pb\\.cc$@-w"
build --per_file_copt="src/ray/thirdparty/.*$@-w"
build:linux --per_file_copt="-\\.(asm|S)$,external/.*@-w,-Wno-error=implicit-function-declaration,-Wno-error=unused-function"
build:macos --per_file_copt="-\\.(asm|S)$,external/.*@-w,-Wno-error=implicit-function-declaration,-Wno-error=unused-function,-Wno-missing-template-arg-list-after-template-kw"
# Ignore warnings for host tools, which we generally can't control.
# Ideally we only want to ignore warnings for external project
# but the current bazel version doesn't support host_per_file_copt yet.
build:macos --host_copt="-w"
build:clang-cl --host_copt="-Wno-inconsistent-missing-override"
build:clang-cl --host_copt="-Wno-microsoft-unqualified-friend"
# This workaround is needed due to https://github.com/bazelbuild/bazel/issues/4341
build --per_file_copt="-\\.(asm|S)$,external/com_github_grpc_grpc/.*@-DGRPC_BAZEL_BUILD"
# Ignore wchar_t -> char conversion warning on MSVC
build:msvc-cl --per_file_copt="external/boost/libs/regex/src/wc_regex_traits\\.cpp@-wd4244"
build --http_timeout_scaling=5.0
build --verbose_failures
build:iwyu --aspects @com_github_storypku_bazel_iwyu//bazel/iwyu:iwyu.bzl%iwyu_aspect
build:iwyu --output_groups=report
# Print relative paths when possible
build:windows --attempt_to_print_relative_paths
# Save disk space by hardlinking cache hits instead of copying
build:windows --experimental_repository_cache_hardlinks
# For colored output (seems necessary on Windows)
build:windows --color=yes
# For compiler colored output (seems necessary on Windows)
build:clang-cl --per_file_copt="-\\.(asm|S)$@-fansi-escape-codes"
build:clang-cl --per_file_copt="-\\.(asm|S)$@-fcolor-diagnostics"
# Debug build flags. Uncomment in '-c dbg' builds to enable checks in the C++ standard library:
build:linux-debug --config linux
build:linux-debug --cxxopt="-D_GLIBCXX_DEBUG=1"
build:linux-debug --cxxopt="-D_GLIBCXX_DEBUG_PEDANTIC=1"
build:linux-debug --cxxopt="-D_LIBCPP_DEBUG=1"
build:macos-debug --config macos
build:macos-debug --cxxopt="-D_GLIBCXX_DEBUG=1"
build:macos-debug --cxxopt="-D_GLIBCXX_DEBUG_PEDANTIC=1"
build:windows-debug --config windows
build:windows-debug --cxxopt="-D_ITERATOR_DEBUG_LEVEL=2"
# LLVM (clang & libc++) build flags common across Linux installations and systems.
# On Ubuntu, the remaining configurations can be generated by running ci/env/install-llvm-binaries.sh
build:llvm --action_env=CXXFLAGS=-stdlib=libc++
build:llvm --action_env=LDFLAGS=-stdlib=libc++
build:llvm --action_env=BAZEL_CXXOPTS=-stdlib=libc++
build:llvm --action_env=BAZEL_LINKLIBS=-l%:libc++.a:-l%:libc++abi.a
build:llvm --action_env=BAZEL_LINKOPTS=-lm:-pthread
build:llvm --define force_libcpp=enabled
# Thread sanitizer configuration:
build:tsan --per_file_copt="-bazel-ray/external/com_github_antirez_redis/.*$@-fsanitize=thread"
build:tsan --per_file_copt="-bazel-ray/external/com_github_antirez_redis/.*$@-DTHREAD_SANITIZER"
build:tsan --strip=never
build:tsan --copt -O2
build:tsan --copt -g
build:tsan --copt -fno-omit-frame-pointer
build:tsan --copt -Wno-uninitialized
build:tsan --linkopt -fsanitize=thread
build:tsan --cxxopt="-D_RAY_TSAN_BUILD"
build:tsan --no//:jemalloc_flag
# This config is only for running TSAN with LLVM toolchain on Linux.
build:tsan-clang --config=tsan
build:tsan-clang --config=llvm
test:tsan --test_env=TSAN_OPTIONS="report_atomic_races=0"
# Memory sanitizer configuration
build:asan --strip=never
build:asan --copt -g
build:asan --copt -fsanitize=address
build:asan --copt -DADDRESS_SANITIZER
build:asan --copt -fno-omit-frame-pointer
build:asan --linkopt -fsanitize=address
build:asan --no//:jemalloc_flag
test:asan --jobs=1
test:asan --test_env=ASAN_OPTIONS="detect_leaks=0"
# This config is only for running ASAN with LLVM toolchain on Linux.
# https://github.com/google/sanitizers/issues/1017
build:asan-clang --config=asan
build:asan-clang --config=llvm
build:asan-clang --copt -mllvm
build:asan-clang --copt -asan-use-private-alias=1
build:asan-build --strip=never
build:asan-build -c dbg
build:asan-build --copt -fsanitize=address
build:asan-build --copt -DADDRESS_SANITIZER
build:asan-build --copt -O1
build:asan-build --copt -g
build:asan-build --copt -fno-omit-frame-pointer
build:asan-build --copt -static-libasan
build:asan-build --linkopt -fsanitize=address
build:asan-build --linkopt -static-libasan
# For example, for Ubuntu 18.04 libasan can be found here:
# test:asan --test_env=LD_PRELOAD="/usr/lib/gcc/x86_64-linux-gnu/7/libasan.so"
test:asan-buildkite --test_env=LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libasan.so.5"
# CI configuration:
aquery:ci --color=no
aquery:ci --noshow_progress
test:ci-base --test_output=errors
test:ci-base --test_verbose_timeout_warnings
test:ci-base --flaky_test_attempts=2
# Sending in PATH is required for tests to run on CI, after we enable
# --incompatible_strict_action_env, until we either convert all Python tests to
# hermetic tests -- which not only requires pinning all Python dependencies with bazel,
# but also requires building ray(test) wheel with bazel. Alternatively, we can
# also stop using bazel test to run ray's Python tests.
#
# This PATH test_env is intentionally not enabled on non-CI so that C/C++
# tests, which are all hermetic, can build, test and cache as intended, ray
# Python developers do not really use bazel test to run tests locally, but more
# often just run tests with "pytest" directly.
test:ci-base --test_env=PATH
build:ci --color=yes
build:ci --curses=no
build:ci --keep_going
build:ci --progress_report_interval=100
build:ci --show_progress_rate_limit=15
build:ci --ui_actions_shown=1024
build:ci --show_timestamps
# Retry on CacheNotFoundException from raw-S3 remote cache (AC/CAS eviction mismatch).
# Remove once the cache is fronted by a server that coordinates AC/CAS eviction (bazel-remote, Buildbarn, etc.).
build:ci --experimental_remote_cache_eviction_retries=3
# Retry repository rule HTTP downloads (e.g. http_archive) on transient failures (502/504).
build:ci --experimental_repository_downloader_retries=3
# Disable test result caching because py_test under Bazel can import from outside of sandbox, but Bazel only looks at
# declared dependencies to determine if a result should be cached. More details at:
# https://github.com/bazelbuild/bazel/issues/7091, https://github.com/bazelbuild/rules_python/issues/382
test:ci --config=ci-base
test:ci --nocache_test_results
test:ci --spawn_strategy=local
test:ci --experimental_ui_max_stdouterr_bytes=-1
test:ci-debug --config=ci-base
test:ci-debug -c dbg
test:ci-debug --copt="-g"
# Disable test result caching for the same reason above.
test:ci-debug --nocache_test_results
test:ci-debug --spawn_strategy=local
aquery:get-toolchain --include_commandline=false
aquery:get-toolchain --noimplicit_deps
# [Linux] Uncomment this line (or use --config) to print a stack trace on exit.
#test:linux --config=strace
test:strace --run_under="bash -c 'if command -v strace >/dev/null && strace -qq -k -e exit true 2>/dev/null; then strace -qq -k -e exit -e trace=\"!all\" -s 32768 -f -o >(awk \"/^[0-9]+ / { y = \\$3 != \\\"SIGCHLD\\\" && \\$3 != \\\"SIGTERM\\\" && \\$5 != \\\"SIGTERM\\\" && \\$5 != \\\"SIGKILL2\\\"; } y { print; }\" 1>&2 && cat 1>&2) -- \"$@\"; else \"$@\"; fi' -"
# [Linux] Uncomment this line (or use --config) to preload libSegFault.so if available, to print a stack trace on aborts and segfault. (Note: This doesn't always work.)
#test:linux --config=segfault
test:segfault --run_under="bash -c 'unset GREP_OPTIONS && if ! grep -q -o Microsoft /proc/version 2>/dev/null; then libs=\"$(command -v ldconfig >/dev/null && ldconfig -p | grep -F -o -e \"libSegFault.so\" | uniq | tr \"\\\\n\" :)\" && if [ -n \"${libs%:}\" ]; then export SEGFAULT_SIGNALS=\"abrt segv\" LD_PRELOAD=\"${libs}${LD_PRELOAD-}\"; fi; fi && \"$@\"' -"
# Debug build:
build:debug -c dbg
build:debug --copt="-g"
build:debug --copt -fno-omit-frame-pointer
build:debug --copt -fstack-protector-strong
build:debug --copt -fcf-protection=full
build:debug --strip="never"
# Undefined Behavior Sanitizer
build:ubsan --strip=never
build:ubsan --copt -fno-sanitize=vptr
build:ubsan --copt -fno-sanitize-recover=all
build:ubsan --copt -g
build:ubsan --linkopt -fsanitize=undefined
build:ubsan --linkopt -fno-sanitize-recover=all
build:ubsan --per_file_copt="-external/com_github_grpc_grpc/.*@-fsanitize=undefined"
build:cgroup --sandbox_writable_path=/sys/fs/cgroup --config=llvm
# Import local specific llvm config options, which can be generated by
# ci/env/install-llvm-dependencies.sh
try-import %workspace%/.llvm-local.bazelrc
# Allow users to define custom options.
try-import %workspace%/.user.bazelrc
# Even with sandbox mode bazel prioritizes system headers over the ones in the sandbox.
# It picks up the system headers when someone has protobuf installed via Homebrew.
# Work around for https://github.com/bazelbuild/bazel/issues/8053
build:macos --sandbox_block_path=/usr/local/
build:macos --copt="-Wno-error=deprecated-declarations"
# Disable build_bazel_apple_support's Apple CC toolchain on macOS CI machines
# that only have Xcode CLT (no full Xcode.app). With BAZEL_NO_APPLE_CPP_TOOLCHAIN=1,
# apple_cc_configure's _apple_cc_autoconf generates an empty local_config_apple_cc,
# and Bazel falls back to the generic @local_config_cc (CLT clang), which worked
# fine with Bazel 6.5. Without this, apple_cc_toolchain fails at analysis time with
# "Xcode version must be specified to use an Apple CROSSTOOL" on CLT-only machines.
build:macos --repo_env=BAZEL_NO_APPLE_CPP_TOOLCHAIN=1
# The generic @local_config_cc CC toolchain (CLT-based, used when
# BAZEL_NO_APPLE_CPP_TOOLCHAIN=1) defaults to -mmacosx-version-min=10.11 from
# Bazel's built-in template. That's too old for std::filesystem (10.15+) and
# std::visit/std::variant (10.13+) used by Ray and opentelemetry. Override to
# 12.0 which matches the arm64 CI machines (Apple Silicon requires macOS 11+).
build:macos --copt=-mmacosx-version-min=12.0
build:macos --linkopt=-mmacosx-version-min=12.0
# Host/exec-configuration builds (e.g. flatc, protoc built as tools) also need
# the deployment target override; --host_copt applies to the exec configuration.
build:macos --host_copt=-mmacosx-version-min=12.0
build:macos --host_linkopt=-mmacosx-version-min=12.0
# This option controls whether javac checks for missing direct dependencies.
build --experimental_strict_java_deps=off
+1
View File
@@ -0,0 +1 @@
7.5.0
+1
View File
@@ -0,0 +1 @@
2023-12-20
+12
View File
@@ -0,0 +1,12 @@
load("@py_deps_py310//:requirements.bzl", ci_require = "requirement")
load("@rules_python//python:defs.bzl", "py_binary")
py_binary(
name = "copy_files",
srcs = ["copy_files.py"],
visibility = ["//visibility:private"],
deps = [
ci_require("boto3"),
ci_require("aws_requests_auth"),
],
)
+18
View File
@@ -0,0 +1,18 @@
# Buildkite pipelines
This directory contains the Buildkite pipeline definitions for Ray CI, plus the rules that decide which tests run on a given change.
## Pipelines
Pipelines are defined in the `*.rayci.yml` files in this directory and are generated and run by [rayci](https://github.com/ray-project/rayci), Ray's CI orchestration tool. Each file groups the steps for one area (for example, `core.rayci.yml`, `data.rayci.yml`, `doc.rayci.yml`).
## Conditional test selection
Which steps run on a given pull request is determined by mapping changed file paths to *tags*. Two rule files drive this:
- `test.rules.txt` is the conditional rule set. Rules are evaluated in order and the first match wins. A rule with no `@` tags is a skip rule (it matches but emits nothing), and a trailing `*` catch-all fans unmatched changes out to the full suite.
- `always.rules.txt` is an always-on overlay applied to every change.
rayci parses these files (its `test-rules` command) and runs the steps whose tags are emitted. See the header comment in each rules file for the full format.
`ci/pipeline/determine_tests_to_run.py` is an in-repo reference implementation of the same rule-file format. It is not the live evaluator; rayci is.
+11
View File
@@ -0,0 +1,11 @@
group: forge
sort_key: "_forge"
steps:
- name: forge
wanda: ci/docker/forge.wanda.yaml
- name: manylinux-x86_64
wanda: ci/docker/manylinux.wanda.yaml
env_file: rayci.env
env:
HOSTTYPE: "x86_64"
+241
View File
@@ -0,0 +1,241 @@
group: images
sort_key: "_images"
steps:
- name: raycpubase
label: "wanda: ray-py{{array.python}}-cpu-base"
tags:
- python_dependencies
- docker
wanda: docker/base-deps/cpu.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
env:
PYTHON_VERSION: "{{array.python}}"
ARCH_SUFFIX: ""
- name: raycpubaseextra
label: "wanda: ray-py{{array.python}}-cpu-base-extra"
wanda: docker/base-extra/cpu.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
env:
PYTHON_VERSION: "{{array.python}}"
IMAGE_TYPE: "ray"
ARCH_SUFFIX: ""
depends_on: raycpubase($)
- name: raytpubase
label: "wanda: ray-py{{array.python}}-tpu-base"
tags:
- python_dependencies
- docker
wanda: docker/base-deps/tpu.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
env:
PYTHON_VERSION: "{{array.python}}"
ARCH_SUFFIX: ""
- name: raycudabase
label: "wanda: ray-py{{array.python}}-cu{{array.cuda}}-base"
tags:
- python_dependencies
- docker
wanda: docker/base-deps/cuda.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
cuda:
- "11.7.1-cudnn8"
- "11.8.0-cudnn8"
- "12.1.1-cudnn8"
- "12.3.2-cudnn9"
- "12.4.1-cudnn"
- "12.5.1-cudnn"
- "12.6.3-cudnn"
- "12.8.1-cudnn"
- "12.9.1-cudnn"
- "13.0.0-cudnn"
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
ARCH_SUFFIX: ""
- name: raycudabaseextra
label: "wanda: ray-py{{array.python}}-cu{{array.cuda}}-base-extra"
wanda: docker/base-extra/cuda.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
cuda:
- "11.7.1-cudnn8"
- "11.8.0-cudnn8"
- "12.1.1-cudnn8"
- "12.3.2-cudnn9"
- "12.4.1-cudnn"
- "12.5.1-cudnn"
- "12.6.3-cudnn"
- "12.8.1-cudnn"
- "12.9.1-cudnn"
- "13.0.0-cudnn"
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
IMAGE_TYPE: "ray"
ARCH_SUFFIX: ""
depends_on: raycudabase($)
- name: ray-llmbase
label: "wanda: ray-llm-py{{array.python}}-cu{{array.cuda}}-base"
tags:
- python_dependencies
- docker
wanda: docker/ray-llm/cuda.wanda.yaml
depends_on: raycudabase($)
array:
python:
- "3.12"
cuda:
- "13.0.0-cudnn"
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
- name: ray-llmbaseextra
label: "wanda: ray-llm-py{{array.python}}-cu{{array.cuda}}-base-extra"
wanda: docker/base-extra/cuda.wanda.yaml
array:
python:
- "3.12"
cuda:
- "13.0.0-cudnn"
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
IMAGE_TYPE: "ray-llm"
ARCH_SUFFIX: ""
depends_on: ray-llmbase($)
- name: ray-mlcpubase
label: "wanda: ray-ml-py{{array.python}}-cpu-base"
tags:
- python_dependencies
- docker
wanda: docker/ray-ml/cpu.wanda.yaml
depends_on: raycpubase($)
array:
python:
- "3.10"
- "3.11"
env:
PYTHON_VERSION: "{{array.python}}"
- name: ray-mlcpubaseextra
label: "wanda: ray-ml-py{{array.python}}-cpu-base-extra"
wanda: docker/base-extra/cpu.wanda.yaml
array:
python:
- "3.10"
- "3.11"
env:
PYTHON_VERSION: "{{array.python}}"
IMAGE_TYPE: "ray-ml"
ARCH_SUFFIX: ""
depends_on: ray-mlcpubase($)
- name: ray-mlcudabase
label: "wanda: ray-ml-py{{array.python}}-cu{{array.cuda}}-base"
tags:
- python_dependencies
- docker
wanda: docker/ray-ml/cuda.wanda.yaml
depends_on: raycudabase($)
array:
python:
- "3.10"
- "3.11"
cuda:
- "12.1.1-cudnn8"
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
- name: ray-mlcudabaseextra
label: "wanda: ray-ml-py{{array.python}}-cu{{array.cuda}}-base-extra"
wanda: docker/base-extra/cuda.wanda.yaml
array:
python:
- "3.10"
- "3.11"
cuda:
- "12.1.1-cudnn8"
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
IMAGE_TYPE: "ray-ml"
ARCH_SUFFIX: ""
depends_on: ray-mlcudabase($)
- name: ray-slimcpubase
label: "wanda: ray-slim-py{{array.python}}-cpu-base"
tags:
- python_dependencies
- docker
- skip-on-release-tests
wanda: docker/base-slim/cpu.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
env:
PYTHON_VERSION: "{{array.python}}"
ARCH_SUFFIX: ""
- name: ray-slimcudabase
label: "wanda: ray-slim-py{{array.python}}-cu{{array.cuda}}-base"
tags:
- python_dependencies
- docker
- skip-on-release-tests
wanda: docker/base-slim/cuda.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
cuda:
- "11.7.1"
- "11.8.0"
- "12.1.1"
- "12.3.2"
- "12.4.1"
- "12.5.1"
- "12.6.3"
- "12.8.1"
- "12.9.1"
- "13.0.0"
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
ARCH_SUFFIX: ""
+84
View File
@@ -0,0 +1,84 @@
group: wheel build
sort_key: "_wheel-build"
steps:
- name: ray-core-build
label: "wanda: core binary parts py{{array.python}} (x86_64)"
wanda: ci/docker/ray-core.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- "3.14"
env_file: rayci.env
env:
PYTHON_VERSION: "{{array.python}}"
ARCH_SUFFIX: ""
HOSTTYPE: "x86_64"
tags:
- release_wheels
- name: ray-dashboard-build
label: "wanda: dashboard (x86_64)"
wanda: ci/docker/ray-dashboard.wanda.yaml
env_file: rayci.env
env:
ARCH_SUFFIX: ""
HOSTTYPE: "x86_64"
tags:
- release_wheels
- name: ray-java-build
label: "wanda: java build (x86_64)"
wanda: ci/docker/ray-java.wanda.yaml
env_file: rayci.env
env:
ARCH_SUFFIX: ""
HOSTTYPE: "x86_64"
tags:
- release_wheels
- java
- name: ray-wheel-build
label: "wanda: wheel py{{array.python}} (x86_64)"
wanda: ci/docker/ray-wheel.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- "3.14"
env_file: rayci.env
env:
PYTHON_VERSION: "{{array.python}}"
ARCH_SUFFIX: ""
HOSTTYPE: "x86_64"
JDK_SUFFIX: "-jdk"
RAY_JAVA_IMAGE: "cr.ray.io/rayproject/ray-java-build"
RAY_DASHBOARD_IMAGE: "cr.ray.io/rayproject/ray-dashboard"
tags:
- release_wheels
- linux_wheels
depends_on:
- ray-core-build($)
- ray-java-build
- ray-dashboard-build
- name: ray-wheel-minimal-build
label: "wanda: wheel-minimal py3.13 (x86_64)"
wanda: ci/docker/ray-wheel.wanda.yaml
env_file: rayci.env
env:
PYTHON_VERSION: "3.13"
ARCH_SUFFIX: ""
HOSTTYPE: "x86_64"
JDK_SUFFIX: ""
RAY_JAVA_IMAGE: "scratch"
RAY_DASHBOARD_IMAGE: "scratch"
tags:
- release_wheels
- linux_wheels
depends_on:
- ray-core-build(python=3.13)
+10
View File
@@ -0,0 +1,10 @@
# Unit tests for always.rules.txt
#
# Format: file_path: tag1 tag2 tag3
#
# This rules file adds "always lint" to all files via wildcard fallthrough.
# Any file gets always lint tags
some/random/file.txt: always lint
python/ray/actor.py: always lint
doc/source/index.rst: always lint
+20
View File
@@ -0,0 +1,20 @@
# Ray CI conditional testing rules definition files. Applied to all files.
#
# Comment content, after '#', will be ignored.
# Empty lines will be ignored too.
#
# ! tag1 tag2 tag3 # Declares a tag. A tag must be declared first to be used.
# # Tags must be declared at the beginning.
#
# dir/ # Directory to match
# file # File to match
# dir/*.py # Pattern to match, using fnmatch, matches dir/a.py dir/dir/b.py or dir/.py
# @ tag1 tag2 tag3 # Tags to emit for a rule. A rule without tags is a skipping rule.
#
# ; # Semicolon to separate rules
! always lint
*
@ always lint
;
+78
View File
@@ -0,0 +1,78 @@
group: base
steps:
- name: oss-ci-base_test-multipy
label: "wanda: oss-ci-base_test-py{{array.python}}"
wanda: ci/docker/base.test.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- "3.14"
env:
PYTHON: "{{array.python}}"
- name: oss-ci-base_build-multipy
label: "wanda: oss-ci-base_build-py{{array.python}}"
wanda: ci/docker/base.build.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
env:
PYTHON: "{{array.python}}"
depends_on: oss-ci-base_test-multipy($)
tags: cibase
- name: oss-ci-base_test-aarch64
wanda: ci/docker/base.test.aarch64.wanda.yaml
instance_type: builder-arm64
- name: oss-ci-base_build-aarch64
wanda: ci/docker/base.build.aarch64.wanda.yaml
depends_on: oss-ci-base_test-aarch64
env:
PYTHON: "3.10"
instance_type: builder-arm64
- name: oss-ci-base_ml-multipy
label: "wanda: oss-ci-base_ml-py{{array.python}}"
wanda: ci/docker/base.ml.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
env:
PYTHON: "{{array.python}}"
depends_on: oss-ci-base_test-multipy($)
- name: oss-ci-base_gpu-multipy
label: "wanda: oss-ci-base_gpu-py{{array.python}}"
wanda: ci/docker/base.gpu.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
env:
PYTHON: "{{array.python}}"
tags: cibase
- name: oss-ci-base_cu128-multipy
label: "wanda: oss-ci-base_cu128-py3.11"
wanda: ci/docker/base.cu128.wanda.yaml
env:
PYTHON: "3.11"
- name: oss-ci-base_cu130-multipy
label: "wanda: oss-ci-base_cu130-py{{array.python}}"
wanda: ci/docker/base.cu130.wanda.yaml
array:
python:
- "3.10"
- "3.12"
env:
PYTHON: "{{array.python}}"
+4
View File
@@ -0,0 +1,4 @@
group: forge
steps:
- name: forge
wanda: ci/docker/forge.wanda.yaml
+23
View File
@@ -0,0 +1,23 @@
group: bisect
depends_on:
- forge
steps:
- name: macos test
if: build.env("RAYCI_TEST_TYPE") != null && build.env("RAYCI_TEST_TYPE") == "macos_test"
commands:
- if [[ "$(buildkite-agent meta-data get test-type)" != "macos_test" ]]; then exit 0; fi
- RAYCI_BISECT_RUN=1 ./ci/ray_ci/macos/macos_ci.sh bisect "$(buildkite-agent meta-data get test-name)"
"$(buildkite-agent meta-data get passing-commit)" "$(buildkite-agent meta-data get failing-commit)"
mount_buildkite_agent: true
job_env: MACOS
instance_type: macos-arm64
priority: 10
- name: linux or windows test
if: build.env("RAYCI_TEST_TYPE") != null && (build.env("RAYCI_TEST_TYPE") == "linux_test" || build.env("RAYCI_TEST_TYPE") == "windows_test")
commands:
- if [[ "$(buildkite-agent meta-data get test-type)" != "linux_test" && "$(buildkite-agent meta-data get test-type)" != "windows_test" ]]; then exit 0; fi
- bazel run //ci/ray_ci/bisect:bisect_test "$(buildkite-agent meta-data get test-name)"
"$(buildkite-agent meta-data get passing-commit)" "$(buildkite-agent meta-data get failing-commit)"
mount_buildkite_agent: true
priority: 10
+21
View File
@@ -0,0 +1,21 @@
name: ray-bisect
artifacts_bucket: ray-ci-artifact-branch-public
ci_temp: s3://ray-ci-artifact-branch-public/ci-temp/
ci_work_repo: 029272617770.dkr.ecr.us-west-2.amazonaws.com/rayproject/citemp
forge_prefix: cr.ray.io/rayproject/
builder_queues:
builder: builder_queue_branch
runner_queues:
default: runner_queue_small_branch
macos-arm64: macos-branch-arm64
buildkite_dirs:
- .buildkite/bisect
build_env_keys:
- RAYCI_TEST_TYPE
env:
BUILDKITE_BAZEL_CACHE_URL: https://bazel-cache-dev.s3.us-west-2.amazonaws.com
RAYCI_SKIP_UPLOAD: "true"
hook_env_keys:
- RAYCI_CHECKOUT_DIR
docker_plugin:
allow_mount_buildkite_agent: true
+437
View File
@@ -0,0 +1,437 @@
group: build
steps:
- label: ":arrow_up: upload: wheel py{{array.python}} (x86_64)"
key: linux_wheels_upload
instance_type: small
commands:
- bazel run //ci/ray_ci/automation:extract_wanda_artifact --
--wanda-image-name=ray-wheel-py{{array.python}}
--file-glob='*.whl'
--output-dir=.whl
- ./ci/build/copy_build_artifacts.sh wheel
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- "3.14"
depends_on:
- ray-wheel-build($)
- forge
tags:
- release_wheels
- linux_wheels
- oss
- skip-on-premerge
- name: ray-cpp-core-build
label: "wanda: cpp core (x86_64)"
wanda: ci/docker/ray-cpp-core.wanda.yaml
env_file: rayci.env
env:
ARCH_SUFFIX: ""
HOSTTYPE: "x86_64"
tags:
- release_wheels
- oss
- name: ray-cpp-wheel-build
label: "wanda: cpp wheel (x86_64)"
wanda: ci/docker/ray-cpp-wheel.wanda.yaml
env_file: rayci.env
env:
PYTHON_VERSION: "3.10" # Used for upstream images; wheel is Python-agnostic
ARCH_SUFFIX: ""
HOSTTYPE: "x86_64"
tags:
- release_wheels
- linux_wheels
- oss
depends_on:
- ray-core-build(python=3.10)
- ray-cpp-core-build
- ray-java-build
- ray-dashboard-build
- label: ":arrow_up: upload: cpp wheel (x86_64)"
key: linux_cpp_wheels_upload
instance_type: small
commands:
- bazel run //ci/ray_ci/automation:extract_wanda_artifact --
--wanda-image-name=ray-cpp-wheel
--file-glob='*.whl'
--output-dir=.whl
- ./ci/build/copy_build_artifacts.sh wheel
depends_on:
- ray-cpp-wheel-build
- forge
tags:
- release_wheels
- linux_wheels
- oss
- skip-on-premerge
- label: ":tapioca: build: jar"
key: java_wheels
tags:
- java
- oss
instance_type: medium
commands:
- ./ci/build/build-manylinux-ray.sh
- ./ci/build/build-manylinux-jar.sh
- ./ci/build/copy_build_artifacts.sh jar
depends_on: manylinux-x86_64
job_env: manylinux-x86_64
- name: ray-image-cpu-build
label: "wanda: ray py{{array.python}} cpu (x86_64)"
wanda: ci/docker/ray-image-cpu.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
env_file: rayci.env
env:
PYTHON_VERSION: "{{array.python}}"
ARCH_SUFFIX: ""
tags:
- python_dependencies
- docker
- oss
depends_on:
- ray-wheel-build($)
- raycpubase($)
- name: ray-image-tpu-build
label: "wanda: ray py{{array.python}} tpu (x86_64)"
wanda: ci/docker/ray-image-tpu.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
env_file: rayci.env
env:
PYTHON_VERSION: "{{array.python}}"
ARCH_SUFFIX: ""
tags:
- python_dependencies
- docker
- oss
depends_on:
- ray-wheel-build($)
- raytpubase($)
- label: ":tapioca: smoke test: ray tpu image"
instance_type: small
tags:
- python_dependencies
- docker
- oss
commands:
- aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 029272617770.dkr.ecr.us-west-2.amazonaws.com
- docker run --rm
"$${RAYCI_WORK_REPO}":"$${RAYCI_BUILD_ID}"-ray-py3.10-tpu
/bin/bash -c "python -c \"import ray; print('ray', ray.__version__); import jax; print('jax', jax.__version__)\""
depends_on:
- ray-image-tpu-build(python=3.10)
- forge
- name: ray-image-cuda-build
label: "wanda: ray py{{array.python}} cu{{array.cuda}} (x86_64)"
wanda: ci/docker/ray-image-cuda.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
cuda:
- "11.7.1-cudnn8"
- "11.8.0-cudnn8"
- "12.1.1-cudnn8"
- "12.3.2-cudnn9"
- "12.4.1-cudnn"
- "12.5.1-cudnn"
- "12.6.3-cudnn"
- "12.8.1-cudnn"
- "12.9.1-cudnn"
- "13.0.0-cudnn"
env_file: rayci.env
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
ARCH_SUFFIX: ""
tags:
- python_dependencies
- docker
- oss
depends_on:
- ray-wheel-build($)
- raycudabase($)
- label: ":crane: publish: ray py{{array.python}} (x86_64)"
key: ray_images_push
instance_type: small
commands:
- bazel run //.buildkite:copy_files -- --destination docker_login
- bazel run //ci/ray_ci/automation:push_ray_image --
--python-version {{array.python}}
--platform cpu
--platform tpu
--platform cu11.7.1-cudnn8
--platform cu11.8.0-cudnn8
--platform cu12.1.1-cudnn8
--platform cu12.3.2-cudnn9
--platform cu12.4.1-cudnn
--platform cu12.5.1-cudnn
--platform cu12.6.3-cudnn
--platform cu12.8.1-cudnn
--platform cu12.9.1-cudnn
--platform cu13.0.0-cudnn
--image-type ray
--architecture x86_64
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
depends_on:
- ray-image-cpu-build($)
- ray-image-tpu-build($)
- ray-image-cuda-build($)
tags:
- python_dependencies
- docker
- oss
- skip-on-premerge
- name: ray-extra-image-cpu-build
label: "wanda: ray-extra py{{array.python}} cpu (x86_64)"
wanda: ci/docker/ray-extra-image-cpu.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
env_file: rayci.env
env:
PYTHON_VERSION: "{{array.python}}"
ARCH_SUFFIX: ""
tags:
- python_dependencies
- docker
- oss
depends_on:
- ray-wheel-build($)
- raycpubaseextra($)
- name: ray-extra-image-cuda-build
label: "wanda: ray-extra py{{array.python}} cu{{array.cuda}} (x86_64)"
wanda: ci/docker/ray-extra-image-cuda.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
cuda:
- "11.7.1-cudnn8"
- "11.8.0-cudnn8"
- "12.1.1-cudnn8"
- "12.3.2-cudnn9"
- "12.4.1-cudnn"
- "12.5.1-cudnn"
- "12.6.3-cudnn"
- "12.8.1-cudnn"
- "12.9.1-cudnn"
- "13.0.0-cudnn"
env_file: rayci.env
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
ARCH_SUFFIX: ""
tags:
- python_dependencies
- docker
- oss
depends_on:
- ray-wheel-build($)
- raycudabaseextra($)
- name: ray-llm-image-cuda-build
label: "wanda: ray-llm py{{array.python}} cu{{array.cuda}} (x86_64)"
wanda: ci/docker/ray-llm-image-cuda.wanda.yaml
array:
python:
- "3.12"
cuda:
- "13.0.0-cudnn"
env_file: rayci.env
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
ARCH_SUFFIX: ""
tags:
- python_dependencies
- docker
- oss
depends_on:
- ray-wheel-build($)
- ray-llmbase($)
- name: ray-llm-extra-image-cuda-build
label: "wanda: ray-llm-extra py{{array.python}} cu{{array.cuda}} (x86_64)"
wanda: ci/docker/ray-llm-extra-image-cuda.wanda.yaml
array:
python:
- "3.12"
cuda:
- "13.0.0-cudnn"
env_file: rayci.env
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
ARCH_SUFFIX: ""
tags:
- python_dependencies
- docker
- oss
depends_on:
- ray-wheel-build($)
- ray-llmbaseextra($)
- label: ":crane: publish: ray-extra py{{array.python}} (x86_64)"
key: ray_extra_images_push
instance_type: small
commands:
- bazel run //.buildkite:copy_files -- --destination docker_login
- bazel run //ci/ray_ci/automation:push_ray_image --
--python-version {{array.python}}
--platform cpu
--platform cu11.7.1-cudnn8
--platform cu11.8.0-cudnn8
--platform cu12.1.1-cudnn8
--platform cu12.3.2-cudnn9
--platform cu12.4.1-cudnn
--platform cu12.5.1-cudnn
--platform cu12.6.3-cudnn
--platform cu12.8.1-cudnn
--platform cu12.9.1-cudnn
--platform cu13.0.0-cudnn
--image-type ray-extra
--architecture x86_64
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
depends_on:
- ray-extra-image-cpu-build($)
- ray-extra-image-cuda-build($)
tags:
- python_dependencies
- docker
- oss
- skip-on-premerge
- label: ":crane: publish: ray-llm py{{array.python}} {{array.platform}} (x86_64)"
key: ray_llm_images_cuda_push
instance_type: small
commands:
- bazel run //.buildkite:copy_files -- --destination docker_login
- bazel run //ci/ray_ci/automation:push_ray_image --
--python-version {{array.python}}
--platform {{array.platform}}
--image-type ray-llm
--architecture x86_64
array:
python:
- "3.12"
platform:
- cu13.0.0-cudnn
depends_on:
- ray-llm-image-cuda-build($)
tags:
- python_dependencies
- docker
- oss
- skip-on-premerge
- label: ":crane: publish: ray-llm-extra py{{array.python}} {{array.platform}} (x86_64)"
key: ray_llm_extra_images_cuda_push
instance_type: small
commands:
- bazel run //.buildkite:copy_files -- --destination docker_login
- bazel run //ci/ray_ci/automation:push_ray_image --
--python-version {{array.python}}
--platform {{array.platform}}
--image-type ray-llm-extra
--architecture x86_64
array:
python:
- "3.12"
platform:
- cu13.0.0-cudnn
depends_on:
- ray-llm-extra-image-cuda-build($)
tags:
- python_dependencies
- docker
- oss
- skip-on-premerge
- label: ":tapioca: smoke test build-wheel.sh --help"
tags:
- tools
instance_type: small
commands:
- ./build-wheel.sh --help
depends_on:
- forge
- label: ":tapioca: smoke test build-docker.sh"
tags:
- python_dependencies
- docker
- oss
instance_type: medium
soft_fail: true
commands:
- export WHEEL_URL="https://files.pythonhosted.org/packages/93/f1/9108c4f878e3cacb767b7dfbbc3a26537c79ab516d2530b9f63b558ba4bb/ray-2.44.1-cp310-cp310-manylinux2014_x86_64.whl"
- export CPP_WHEEL_URL="https://files.pythonhosted.org/packages/d3/cf/ef6d5a9a688001f73e4749c48f840455ecec11acde982eb70f387b0dc445/ray_cpp-2.44.1-cp310-cp310-manylinux2014_x86_64.whl"
- bash build-docker.sh --progress-plain
- docker run -ti --rm rayproject/ray:dev python -c "import ray; print(ray.__version__)"
depends_on:
- forge
- label: ":tapioca: smoke test build-image.sh --help"
tags:
- tools
instance_type: small
commands:
- ./build-image.sh --help
depends_on:
- forge
- label: ":tapioca: generate nightly indexes"
instance_type: small
tags:
- docker
- oss
- skip-on-premerge
commands:
- bazel run .buildkite:copy_files -- --destination docker_login
- bazel run //ci/ray_ci/automation:generate_index -- --prefix nightly
depends_on:
- ray_images_push(*)
- ray_images_push_aarch64(*)
- forge
+6
View File
@@ -0,0 +1,6 @@
group: forge
sort_key: "_forge"
steps:
- name: forge
instance_type: builder-x86_64
wanda: ci/docker/forge.wanda.yaml
+70
View File
@@ -0,0 +1,70 @@
group: cicd-cron
steps:
# NOTE(andrew-anyscale): 'name' is used for both naming the wanda image, as
# well as for generating step names. Step name cannot contain a {{}} placeholder,
# so we cannot use a matrix here.
# See: https://github.com/ray-project/rayci/blob/74cdca5848d8ff0c9dcad464d74fc2e5cd61fa13/raycicmd/wanda.go#L53
- name: manylinux-cibase-x86_64
label: ":magic_wand: wanda: manylinux-cibase-x86_64"
wanda: ci/docker/manylinux-cibase.wanda.yaml
instance_type: builder-x86_64
env:
RAYCI_DISABLE_JAVA: "true"
RAYCI_WANDA_ALWAYS_REBUILD: "true"
JDK_SUFFIX: ""
HOSTTYPE: "x86_64"
- name: manylinux-cibase-aarch64
label: ":magic_wand: wanda: manylinux-cibase-aarch64"
wanda: ci/docker/manylinux-cibase.wanda.yaml
instance_type: builder-aarch64
env:
RAYCI_DISABLE_JAVA: "true"
RAYCI_WANDA_ALWAYS_REBUILD: "true"
JDK_SUFFIX: ""
HOSTTYPE: "aarch64"
- name: manylinux-cibase-jdk-x86_64
label: ":magic_wand: wanda: manylinux-cibase-jdk-x86_64"
wanda: ci/docker/manylinux-cibase.wanda.yaml
instance_type: builder-x86_64
env:
RAYCI_DISABLE_JAVA: "false"
RAYCI_WANDA_ALWAYS_REBUILD: "true"
JDK_SUFFIX: "-jdk"
HOSTTYPE: "x86_64"
- name: manylinux-cibase-jdk-aarch64
label: ":magic_wand: wanda: manylinux-cibase-jdk-aarch64"
wanda: ci/docker/manylinux-cibase.wanda.yaml
instance_type: builder-aarch64
env:
RAYCI_DISABLE_JAVA: "false"
RAYCI_WANDA_ALWAYS_REBUILD: "true"
JDK_SUFFIX: "-jdk"
ARCH_SUFFIX: "aarch64"
HOSTTYPE: "aarch64"
- label: ":docker: push: Push manylinux-cibase{{matrix.jdk_suffix}}{{matrix.host_suffix}} to Docker Hub"
depends_on:
- manylinux-cibase-x86_64
- manylinux-cibase-aarch64
- manylinux-cibase-jdk-x86_64
- manylinux-cibase-jdk-aarch64
- forge
job_env: forge
matrix:
setup:
host_suffix:
- "-x86_64"
- "-aarch64"
jdk_suffix:
- ""
- "-jdk"
commands:
- bazel run //.buildkite:copy_files -- --destination docker_login
- bazel run //ci/ray_ci/automation:copy_wanda_image --
--wanda-image-name manylinux-cibase{{matrix.jdk_suffix}}{{matrix.host_suffix}}
--destination-repository rayproject/manylinux2014
--tag-suffix {{matrix.jdk_suffix}}{{matrix.host_suffix}}
--upload
+18
View File
@@ -0,0 +1,18 @@
name: ray-cicd-cron
artifacts_bucket: ray-ci-artifact-branch-public
ci_temp: s3://ray-ci-artifact-branch-public/ci-temp/
ci_work_repo: 029272617770.dkr.ecr.us-west-2.amazonaws.com/rayproject/citemp
forge_prefix: cr.ray.io/rayproject/
builder_queues:
builder-x86_64: builder_queue_branch
builder-aarch64: builder_queue_arm64_branch
runner_queues:
default: runner_queue_small_branch
buildkite_dirs:
- .buildkite/cicd-cron
env:
BUILDKITE_BAZEL_CACHE_URL: https://bazel-cache-dev.s3.us-west-2.amazonaws.com
hook_env_keys:
- RAYCI_CHECKOUT_DIR
docker_plugin:
allow_mount_buildkite_agent: true
+51
View File
@@ -0,0 +1,51 @@
group: reef tests
depends_on:
- forge
steps:
- label: ":test_tube: test-rules"
key: test-rules
commands:
- curl -sfL "https://raw.githubusercontent.com/ray-project/rayci/stable/run_rayci.sh" | bash -s -- test-rules
instance_type: small
tags:
- tools
- always
- label: ":coral: reef: ci+release tooling tests"
key: reef-tests
commands:
- bazel run //ci/ray_ci:test_in_docker --
//ci/ray_ci/... //ci/build/... //release/... //ci/pipeline/... ci
--only-tags=release_unit,ci_unit
--cache-test-results --parallelism-per-worker 2
--build-name forge
--build-type skip
instance_type: small
tags: tools
- label: ":coral: reef: raydepsets tests"
key: raydepsets-tests
commands:
- bazel run //ci/ray_ci:test_in_docker --
//ci/raydepsets/... ci
--cache-test-results
--build-name forge
--build-type skip
instance_type: small
tags: tools
- label: ":coral: reef: privileged container tests"
commands:
- bazel run //ci/ray_ci:test_in_docker --
//ci/ray_ci:test_privileged ci
--cache-test-results
--build-name oss-ci-base_test-py3.10
--build-type cgroup
--privileged
instance_type: small
depends_on: oss-ci-base_test-multipy(python=3.10)
tags: tools
- label: ":coral: reef: iwyu tests"
commands:
- bazel test --config iwyu //bazel/tests/cpp:example_test
instance_type: small
depends_on: oss-ci-base_build-multipy(python=3.10)
job_env: oss-ci-base_build-py3.10
tags: tools
+127
View File
@@ -0,0 +1,127 @@
import argparse
import os
import subprocess
import sys
import time
from collections import OrderedDict
import requests
from aws_requests_auth.boto_utils import BotoAWSRequestsAuth
def retry(f):
def inner():
resp = None
for _ in range(5):
resp = f()
print("Getting Presigned URL, status_code", resp.status_code)
if resp.status_code >= 500:
print("errored, retrying...")
print(resp.text)
time.sleep(5)
else:
return resp
if resp is None or resp.status_code >= 500:
print("still errorred after many retries")
sys.exit(1)
return inner
@retry
def perform_auth():
auth = BotoAWSRequestsAuth(
aws_host="vop4ss7n22.execute-api.us-west-2.amazonaws.com",
aws_region="us-west-2",
aws_service="execute-api",
)
resp = requests.get(
"https://vop4ss7n22.execute-api.us-west-2.amazonaws.com/endpoint/",
auth=auth,
params={"job_id": os.environ["BUILDKITE_JOB_ID"]},
)
return resp
def handle_docker_login(resp):
pwd = resp.json()["docker_password"]
subprocess.check_call(
["docker", "login", "--username", "raydockerreleaser", "--password", pwd]
)
def gather_paths(dir_path):
dir_path = dir_path.replace("/", os.path.sep)
assert os.path.exists(dir_path)
if os.path.isdir(dir_path):
paths = [os.path.join(dir_path, f) for f in os.listdir(dir_path)]
else:
paths = [dir_path]
return paths
dest_resp_mapping = {
"wheels": "presigned_resp_prod_wheels",
"branch_wheels": "presigned_resp_prod_wheels",
"jars": "presigned_resp_prod_wheels",
"branch_jars": "presigned_resp_prod_wheels",
"logs": "presigned_logs",
}
def upload_paths(paths, resp, destination):
dest_key = dest_resp_mapping[destination]
c = resp.json()[dest_key]
of = OrderedDict(c["fields"])
sha = os.environ["BUILDKITE_COMMIT"]
branch = os.environ["BUILDKITE_BRANCH"]
bk_job_id = os.environ["BUILDKITE_JOB_ID"]
current_os = sys.platform
for path in paths:
fn = os.path.split(path)[-1]
of["key"] = {
"wheels": f"latest/{fn}",
"branch_wheels": f"{branch}/{sha}/{fn}",
"jars": f"jars/latest/{current_os}/{fn}",
"branch_jars": f"jars/{branch}/{sha}/{current_os}/{fn}",
"logs": f"bazel_events/{branch}/{sha}/{bk_job_id}/{fn}",
}[destination]
of["file"] = open(path, "rb")
r = requests.post(c["url"], files=of)
print(f"Uploaded {path} to {of['key']}", r.status_code)
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Helper script to upload files to S3 bucket"
)
parser.add_argument("--path", type=str, required=False)
parser.add_argument("--destination", type=str)
args = parser.parse_args()
if os.environ.get("RAYCI_SKIP_UPLOAD", "false") == "true":
print("Skipping upload.")
sys.exit(0)
assert args.destination in {
"branch_jars",
"branch_wheels",
"jars",
"logs",
"wheels",
"docker_login",
}
assert "BUILDKITE_JOB_ID" in os.environ
assert "BUILDKITE_COMMIT" in os.environ
resp = perform_auth()
if args.destination == "docker_login":
handle_docker_login(resp)
else:
paths = gather_paths(args.path)
print("Planning to upload", paths)
upload_paths(paths, resp, args.destination)
+670
View File
@@ -0,0 +1,670 @@
group: core tests
depends_on:
- forge
- ray-core-build(*)
- ray-dashboard-build
steps:
# builds
- name: corebuild-multipy
label: "wanda: corebuild-py{{array.python}}"
wanda: ci/docker/core.build.wanda.yaml
tags: cibase
array:
python:
- "3.10"
- "3.12"
env:
PYTHON: "{{array.python}}"
BASE_TYPE: "build"
BUILD_VARIANT: "build"
depends_on: oss-ci-base_build-multipy($)
- name: coregpubuild-multipy
label: "wanda: coregpubuild-py{{array.python}}"
wanda: ci/docker/core.build.wanda.yaml
tags: cibase
depends_on: oss-ci-base_gpu-multipy($)
env:
PYTHON: "{{array.python}}"
BASE_TYPE: "gpu"
BUILD_VARIANT: "gpubuild"
RAYCI_IS_GPU_BUILD: "true"
array:
python:
- "3.10"
- name: coregpu-cu130-build-multipy
label: "wanda: coregpu-cu130-build-py{{array.python}}"
wanda: ci/docker/core.build.wanda.yaml
tags: cibase
depends_on: oss-ci-base_cu130-multipy($)
env:
PYTHON: "{{array.python}}"
BASE_TYPE: "cu130"
BUILD_VARIANT: "gpu-cu130-build"
RAYCI_IS_GPU_BUILD: "true"
array:
python:
- "3.10"
- name: minbuild-core
label: "wanda: minbuild-core-py{{array.python}}"
wanda: ci/docker/min.build.wanda.yaml
depends_on: oss-ci-base_test-multipy($)
tags: cibase
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- "3.14"
env:
PYTHON_VERSION: "{{array.python}}"
EXTRA_DEPENDENCY: core
- wait: ~
depends_on:
- corebuild-multipy(python=3.10)
# tests
- label: ":ray: core: python tests"
tags:
- core_python
- dashboard
instance_type: large
parallelism: 4
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //python/ray/_common/tests/... //python/ray/autoscaler/v2/... core
--install-mask all-ray-libraries
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--python-version 3.10 --build-name corebuild-py3.10
--except-tags custom_setup
--install-mask all-ray-libraries
- label: ":ray: core: python {{array.python}} tests ({{array.worker_id}})"
key: core_python_tests
if: build.pull_request.labels includes "continuous-build" || pipeline.id == "0189e759-8c96-4302-b6b5-b4274406bf89" || pipeline.id == "018f4f1e-1b73-4906-9802-92422e3badaa"
tags:
- core_python
- dashboard
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //python/ray/autoscaler/v2/... core
--install-mask all-ray-libraries
--workers 4 --worker-id "{{array.worker_id}}" --parallelism-per-worker 3
--python-version {{array.python}} --build-name corebuild-py{{array.python}}
--except-tags custom_setup
depends_on: corebuild-multipy($)
array:
python: ["3.12"]
worker_id: ["0", "1", "2", "3"]
- label: ":ray: core: ray client tests"
tags:
- ray_client
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... core
--install-mask all-ray-libraries
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--python-version 3.10 --build-name corebuild-py3.10
--only-tags ray_client
# Conditionally runs on premerge via the `redis_tests` tag (see
# .buildkite/test.rules.txt) when src/ray/gcs/store_client/ is
# modified. Always runs on postmerge.
- label: ":ray: core: redis tests"
tags:
- redis_tests
- oss
instance_type: large
parallelism: 4
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //python/ray/dag/... //python/ray/autoscaler/v2/... core
--install-mask all-ray-libraries
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--test-env=TEST_EXTERNAL_REDIS=1
--except-tags custom_setup
--python-version 3.10 --build-name corebuild-py3.10
# REP-64 GCS FT with the embedded RocksDB backend. Mirrors the redis
# tests above but selects rocksdb-mode via TEST_GCS_ROCKSDB=1 (see
# python/ray/tests/conftest.py::_setup_rocksdb_gcs). Conditionally
# runs on premerge via the `rocksdb_tests` tag (see
# .buildkite/test.rules.txt) when src/ray/gcs/store_client/ or the
# rocksdb build config is modified. Always runs on postmerge.
- label: ":ray: core: rocksdb tests"
tags:
- rocksdb_tests
- oss
instance_type: large
parallelism: 4
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //python/ray/dag/... //python/ray/autoscaler/v2/... core
--install-mask all-ray-libraries
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--test-env=TEST_GCS_ROCKSDB=1
--except-tags custom_setup
--python-version 3.10 --build-name corebuild-py3.10
- label: ":ray: core: memory pressure tests"
tags:
- core_python
- oss
- skip-on-premerge
instance_type: medium
commands:
- cleanup() { ./ci/build/upload_build_info.sh; }; trap cleanup EXIT
- (cd python/ray/dashboard/client && npm ci && npm run build)
- pip install -e python[client]
- bazel test --config=ci --jobs=1 $(./ci/run/bazel_export_options)
--test_tag_filters=mem_pressure -- //python/ray/tests/...
job_env: corebuild-py3.10
- label: ":ray: core: out of disk tests"
tags:
- core_python
- oss
instance_type: small
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... core
--python-version 3.10 --build-name corebuild-py3.10
--only-tags=tmpfs --tmp-filesystem=tmpfs
- label: ":ray: core: out of disk redis tests"
tags:
- redis_tests
- oss
instance_type: small
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... core
--test-env=TEST_EXTERNAL_REDIS=1
--only-tags=tmpfs --tmp-filesystem=tmpfs
--python-version 3.10 --build-name corebuild-py3.10
- label: ":ray: core: out of disk rocksdb tests"
tags:
- rocksdb_tests
- oss
instance_type: small
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... core
--test-env=TEST_GCS_ROCKSDB=1
--only-tags=tmpfs --tmp-filesystem=tmpfs
--python-version 3.10 --build-name corebuild-py3.10
- label: ":ray: core: doc tests"
if: '!(build.pull_request.labels includes "docs-go")'
tags:
- core_python
- doc
instance_type: large
commands:
# doc tests
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/... //doc/... core
--only-tags doctest
--python-version 3.10 --build-name corebuild-py3.10
--parallelism-per-worker 3
# doc examples
- bazel run //ci/ray_ci:test_in_docker -- //doc/... core
--install-mask all-ray-libraries
--except-tags doctest,post_wheel_build,gpu,multi_gpu,mem_pressure
--parallelism-per-worker 3
--python-version 3.10 --build-name corebuild-py3.10
--skip-ray-installation
# doc memory pressure example
- bazel run //ci/ray_ci:test_in_docker -- //doc/... core
--only-tags mem_pressure
--except-tags gpu
--python-version 3.10 --build-name corebuild-py3.10
--skip-ray-installation
- label: ":ray: core: dask tests"
tags:
- dask
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker --
python/ray/util/dask/... core
--install-mask all-ray-libraries
--python-version 3.12
--build-name datalbuild-py3.12
depends_on:
- datalbuild-multipy(python=3.12)
- forge
- label: ":ray: core: modin tests"
tags:
- skip-on-premerge
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker --
python/ray/tests/modin/... core
--python-version 3.10
--build-name datalbuild-py3.10
depends_on:
- datalbuild-multipy(python=3.10)
- forge
- label: ":ray: core: dashboard tests"
tags:
- core_python
- dashboard
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- python/ray/dashboard/... core
--parallelism-per-worker 3
--python-version 3.10 --build-name corebuild-py3.10
# ui tests
- docker run -i --rm --volume /tmp/artifacts:/artifact-mount --shm-size=2.5gb
"$${RAYCI_WORK_REPO}":"$${RAYCI_BUILD_ID}"-corebuild-py3.10 /bin/bash -iecuo pipefail
"./python/ray/dashboard/tests/run_ui_tests.sh"
- label: ":ray: core: debug tests"
tags:
- core_python
- skip-on-premerge
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... core
--install-mask all-ray-libraries
--build-type debug
--parallelism-per-worker 3
--python-version 3.10 --build-name corebuild-py3.10
--only-tags debug_tests
--except-tags kubernetes,manual
- label: ":ray: core: asan tests"
tags:
- core_python
- skip-on-premerge
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... core
--install-mask all-ray-libraries
--build-type asan
--parallelism-per-worker 2
--python-version 3.10 --build-name corebuild-py3.10
--only-tags asan_tests
--except-tags kubernetes,manual
- label: ":ray: core: wheel tests"
key: core-wheel-tests
tags: linux_wheels
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //doc/... core
--install-mask all-ray-libraries
--build-type wheel
--parallelism-per-worker 3
--python-version 3.10 --build-name corebuild-py3.10
--only-tags post_wheel_build
--test-env=RAY_CI_POST_WHEEL_TESTS=True
depends_on:
- manylinux-x86_64
- corebuild-multipy(python=3.10)
- forge
- ray-wheel-build(python=3.10)
# Premerge runs only the lowest and highest supported Python versions. The
# intermediate versions are covered by the postmerge-only step below.
- label: ":ray: core: minimal tests {{array.python}}"
key: core_minimal_tests
tags:
- core_python
- dashboard
- oss
- min_build
instance_type: medium
commands:
# validate minimal installation
- python ./ci/env/check_minimal_install.py
# core tests
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //python/ray/dashboard/... core
--parallelism-per-worker 3
--python-version {{array.python}}
--build-name minbuild-core-py{{array.python}}
--test-env=RAY_MINIMAL=1
--test-env=EXPECTED_PYTHON_VERSION={{array.python}}
--only-tags minimal
--except-tags basic_test,manual,cgroup
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //python/ray/dashboard/... core
--parallelism-per-worker 3
--python-version {{array.python}}
--build-name minbuild-core-py{{array.python}}
--test-env=RAY_MINIMAL=1
--test-env=EXPECTED_PYTHON_VERSION={{array.python}}
--only-tags minimal
--except-tags no_basic_test,manual
--skip-ray-installation
# core redis tests
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //python/ray/dashboard/... core
--parallelism-per-worker 3
--python-version {{array.python}}
--build-name minbuild-core-py{{array.python}}
--test-env=RAY_MINIMAL=1
--test-env=TEST_EXTERNAL_REDIS=1
--test-env=EXPECTED_PYTHON_VERSION={{array.python}}
--only-tags minimal
--except-tags no_basic_test,manual
--skip-ray-installation
# serve tests
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //python/ray/dashboard/... serve
--parallelism-per-worker 3
--python-version {{array.python}}
--build-name minbuild-core-py{{array.python}}
--test-env=RAY_MINIMAL=1
--only-tags minimal
--skip-ray-installation
depends_on:
- minbuild-core($)
array:
python:
- "3.10"
- "3.14"
# Intermediate Python versions only run on postmerge (skipped on premerge).
- label: ":ray: core: minimal tests {{array.python}}"
key: core_minimal_tests_postmerge
tags:
- python
- dashboard
- oss
- min_build
- skip-on-premerge
instance_type: medium
commands:
# validate minimal installation
- python ./ci/env/check_minimal_install.py
# core tests
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //python/ray/dashboard/... core
--parallelism-per-worker 3
--python-version {{array.python}}
--build-name minbuild-core-py{{array.python}}
--test-env=RAY_MINIMAL=1
--test-env=EXPECTED_PYTHON_VERSION={{array.python}}
--only-tags minimal
--except-tags basic_test,manual,cgroup
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //python/ray/dashboard/... core
--parallelism-per-worker 3
--python-version {{array.python}}
--build-name minbuild-core-py{{array.python}}
--test-env=RAY_MINIMAL=1
--test-env=EXPECTED_PYTHON_VERSION={{array.python}}
--only-tags minimal
--except-tags no_basic_test,manual
--skip-ray-installation
# core redis tests
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //python/ray/dashboard/... core
--parallelism-per-worker 3
--python-version {{array.python}}
--build-name minbuild-core-py{{array.python}}
--test-env=RAY_MINIMAL=1
--test-env=TEST_EXTERNAL_REDIS=1
--test-env=EXPECTED_PYTHON_VERSION={{array.python}}
--only-tags minimal
--except-tags no_basic_test,manual
--skip-ray-installation
# serve tests
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //python/ray/dashboard/... serve
--parallelism-per-worker 3
--python-version {{array.python}}
--build-name minbuild-core-py{{array.python}}
--test-env=RAY_MINIMAL=1
--only-tags minimal
--skip-ray-installation
depends_on:
- minbuild-core($)
array:
python:
- "3.11"
- "3.12"
- "3.13"
- label: ":ray: core: cgroup tests"
tags:
- core_cpp
- core_python
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //:all
//python/ray/tests/resource_isolation:test_resource_isolation_integration
//python/ray/tests/resource_isolation:test_resource_isolation_config core
--privileged --cache-test-results
--python-version 3.10 --build-name corebuild-py3.10
- bazel run //ci/ray_ci:test_in_docker -- //:all //src/ray/common/cgroup2/tests/... core
--build-type clang --cache-test-results
--python-version 3.10 --build-name corebuild-py3.10
- docker run --privileged -i --rm --volume /tmp/artifacts:/artifact-mount --shm-size=2.5gb
"$${RAYCI_WORK_REPO}":"$${RAYCI_BUILD_ID}"-corebuild-py3.10 /bin/bash
"./src/ray/common/cgroup2/integration_tests/sysfs_cgroup_driver_integration_test_entrypoint.sh"
- label: ":ray: core: cpp tests"
tags: core_cpp
instance_type: medium
commands:
- RAYCI_DISABLE_TEST_DB=1 bazel run //ci/ray_ci:test_in_docker --
//:all //src/... core --except-tags=cgroup --build-type clang
--python-version 3.10 --build-name corebuild-py3.10
--cache-test-results --parallelism-per-worker 2
# block on premerge and microcheck
- block: "run cpp sanitizer tests"
if: build.env("BUILDKITE_PIPELINE_ID") == "0189942e-0876-4b8f-80a4-617f988ec59b" || build.env("BUILDKITE_PIPELINE_ID") == "018f4f1e-1b73-4906-9802-92422e3badaa"
key: block-core-cpp-sanitizer-tests
depends_on: []
- label: ":ray: core: cpp asan tests"
tags: core_cpp
instance_type: medium
commands:
- RAYCI_DISABLE_TEST_DB=1 bazel run //ci/ray_ci:test_in_docker -- //:all //src/... core --except-tags=cgroup
--build-type asan-clang --cache-test-results --parallelism-per-worker 2
--python-version 3.10 --build-name corebuild-py3.10
depends_on:
- block-core-cpp-sanitizer-tests
- corebuild-multipy(python=3.10)
- label: ":ray: core: cpp ubsan tests"
tags: core_cpp
instance_type: large
commands:
- RAYCI_DISABLE_TEST_DB=1 bazel run //ci/ray_ci:test_in_docker -- //:all //src/... core
--python-version 3.10 --build-name corebuild-py3.10
--build-type ubsan --except-tags no_ubsan,cgroup
--cache-test-results --parallelism-per-worker 2
depends_on:
- block-core-cpp-sanitizer-tests
- corebuild-multipy(python=3.10)
- label: ":ray: core: cpp tsan tests"
tags: core_cpp
instance_type: medium
commands:
- RAYCI_DISABLE_TEST_DB=1 bazel run //ci/ray_ci:test_in_docker -- //:all //src/... core
--python-version 3.10 --build-name corebuild-py3.10
--build-type tsan-clang --except-tags no_tsan,cgroup
--cache-test-results --parallelism-per-worker 2
depends_on:
- block-core-cpp-sanitizer-tests
- corebuild-multipy(python=3.10)
- block: "run dag tests"
key: block-dag-tests
depends_on: []
- label: ":ray: core: dag tests"
key: core_dag_tests
tags:
- core_python
- cgraphs_direct_transport
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/dag/... core
--install-mask all-ray-libraries
--python-version 3.10 --build-name corebuild-py3.10
--only-tags ray_dag_tests,compiled_graphs
--except-tags custom_setup
depends_on:
- block-dag-tests
- corebuild-multipy(python=3.10)
- label: ":ray: core: flaky tests"
key: core_flaky_tests
tags:
- core_python
- flaky
- skip-on-premerge
instance_type: large
soft_fail: true
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/... //doc/... core
--python-version 3.10 --build-name corebuild-py3.10
--install-mask all-ray-libraries
--run-flaky-tests
--except-tags multi_gpu,cgroup
depends_on:
- corebuild-multipy(python=3.10)
- label: ":ray: core: flaky gpu tests"
key: core_flaky_gpu_tests
tags:
- gpu
- core_python
- skip-on-premerge
instance_type: gpu-large
soft_fail: true
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/... //python/ray/dag/... //doc/... core
--install-mask all-ray-libraries
--run-flaky-tests
--gpus 4
--build-name coregpubuild-py3.10
--python-version 3.10
--only-tags multi_gpu
depends_on: coregpubuild-multipy(python=3.10)
- label: ":ray: core: cpp worker tests"
tags:
- core_cpp
- cpp
- oss
instance_type: medium
commands:
- if [[ "$${BUILDKITE_CACHE_READONLY:-}" == "true" ]]; then
echo "build --remote_upload_local_results=false" >> ~/.bazelrc;
fi
# cpp worker tests has one that tests cross-language with Java.
- RAY_INSTALL_JAVA=1 ci/ci.sh build
- ci/ci.sh test_cpp
depends_on: oss-ci-base_build-multipy(python=3.10)
job_env: oss-ci-base_build-py3.10
- label: ":ray: core: java worker tests"
tags:
- java
- core_python
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... core
--python-version 3.10 --build-name corebuild-py3.10
--build-type java
--only-tags needs_java
depends_on: corebuild-multipy(python=3.10)
- label: ":ray: core: HA integration tests"
tags:
- core_python
- docker
instance_type: large
commands:
- bazel run //ci/ray_ci:build_in_docker -- docker --python-version 3.10
--platform cpu --canonical-tag ha_integration
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... core --only-tags ha_integration
--python-version 3.10 --build-name corebuild-py3.10
depends_on:
- manylinux-x86_64
- forge
- raycpubase(python=3.10)
- corebuild-multipy(python=3.10)
- label: ":ray: core: runtime env container tests"
tags:
- docker
- runtime_env_container
- oss
instance_type: medium
commands:
- bazel run //ci/ray_ci:build_in_docker -- docker --python-version 3.10
--platform cpu --canonical-tag test_container
- docker build --progress=plain --build-arg BASE_IMAGE="rayproject/ray:test_container"
-t rayproject/ray:runtime_env_container -f ci/docker/runtime_env_container/Dockerfile .
# Disable test DB, these tests will never succeed if run in the flaky step.
- RAYCI_DISABLE_TEST_DB=1 bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... core
--python-version 3.10 --build-name corebuild-py3.10
--install-mask all-ray-libraries
--only-tags runtime_env_container
depends_on:
- manylinux-x86_64
- forge
- raycpubase(python=3.10)
- corebuild-multipy(python=3.10)
- label: ":core: core: spark-on-ray tests"
# NOTE: The Spark-on-Ray tests intentionally aren't triggered by the `java` tag to
# avoid running them for every C++ code change.
tags:
- spark_on_ray
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... core
--build-type debug
--test-env=RAY_ON_SPARK_BACKGROUND_JOB_STARTUP_WAIT=1
--test-env=RAY_ON_SPARK_RAY_WORKER_NODE_STARTUP_INTERVAL=5
--only-tags spark_on_ray
--python-version 3.10 --build-name corebuild-py3.10
depends_on:
- corebuild-multipy(python=3.10)
# block gpu tests on premerge and microcheck
- block: "run multi gpu tests"
if: build.env("BUILDKITE_PIPELINE_ID") == "0189942e-0876-4b8f-80a4-617f988ec59b" || build.env("BUILDKITE_PIPELINE_ID") == "018f4f1e-1b73-4906-9802-92422e3badaa"
key: block-core-gpu-tests
depends_on: []
- label: ":ray: core: multi gpu tests"
key: core-multi-gpu-tests
tags:
- cgraphs_direct_transport
- gpu
instance_type: gpu-large
# we're running some cgraph doc tests here as well since they need gpus
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //python/ray/dag/... //doc/... core
--gpus 4
--build-name coregpubuild-py3.10
--python-version 3.10
--only-tags multi_gpu
--install-mask all-ray-libraries
depends_on:
- block-core-gpu-tests
- coregpubuild-multipy(python=3.10)
- label: ":ray: core: multi gpu cu130 tests"
key: core-multi-gpu-cu130-tests
tags:
- cgraphs_direct_transport
- gpu
instance_type: gpu-large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //python/ray/dag/... //doc/... core
--gpus 4
--build-name coregpu-cu130-build-py3.10
--python-version 3.10
--only-tags multi_gpu
--install-mask all-ray-libraries
depends_on:
- block-core-gpu-tests
- coregpu-cu130-build-multipy(python=3.10)
+379
View File
@@ -0,0 +1,379 @@
group: data tests
depends_on:
- forge
- oss-ci-base_ml-multipy(*)
- ray-core-build(*)
- ray-dashboard-build
steps:
# builds
- name: data17build-multipy
label: "wanda: data17build-py{{array.python}}"
wanda: ci/docker/data17.build.wanda.yaml
array:
python:
- "3.10"
env:
PYTHON: "{{array.python}}"
tags: cibase
- name: datalbuild-multipy
label: "wanda: datalbuild-py{{array.python}}"
wanda: ci/docker/datal.build.wanda.yaml
array:
python:
- "3.10"
- "3.12"
env:
PYTHON: "{{array.python}}"
tags: cibase
- name: datanbuild-multipy
wanda: ci/docker/datan.build.wanda.yaml
env:
PYTHON: "3.10"
tags: cibase
- name: datamongobuild-multipy
label: "wanda: datamongobuild-py3.10"
wanda: ci/docker/datamongo.build.wanda.yaml
env:
PYTHON: "3.10"
tags: cibase
- name: datatfdsbuild-multipy
label: "wanda: datatfdsbuild-py3.12"
wanda: ci/docker/datatfds.build.wanda.yaml
env:
PYTHON: "3.12"
tags: cibase
- name: docgpubuild-py312
label: "wanda: docgpubuild-py3.12"
wanda: ci/docker/docgpu.build.wanda.yaml
env:
PYTHON: "3.12"
depends_on: oss-ci-base_gpu-multipy(python=3.12)
tags: cibase
# type check
- label: ":python: pyrefly type check"
tags:
- data
instance_type: small
commands:
- bash ci/lint/pyrefly-check.sh
depends_on: data17build-multipy(python=3.10)
job_env: data17build-py3.10
# tests
- label: ":database: data: arrow v17 tests"
tags:
- data
instance_type: large
parallelism: 8
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... //python/ray/air/... data
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}"
--worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--build-name data17build-py3.10 --python-version 3.10
--except-tags data_integration,doctest,data_non_parallel,dask,needs_credentials,tensorflow_datasets,cudf
depends_on: data17build-multipy(python=3.10)
- label: ":database: data: tensorflow-datasets tests"
key: data_tensorflow_datasets_tests
tags:
- data
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... data
--build-name datatfdsbuild-py3.12 --python-version 3.12
--only-tags tensorflow_datasets
depends_on: datatfdsbuild-multipy
- label: ":database: data: arrow v17 tests (data_non_parallel)"
tags:
- data
- data_non_parallel
instance_type: medium
parallelism: 3
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... //python/ray/air/... data
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}"
--worker-id "$${BUILDKITE_PARALLEL_JOB}"
--build-name data17build-py3.10 --python-version 3.10
--only-tags data_non_parallel
--except-tags data_non_parallel_postmerge_only,cudf
depends_on: data17build-multipy(python=3.10)
- label: ":database: data: arrow v23 tests"
tags:
- data
- skip-on-premerge
instance_type: medium
parallelism: 8
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... //python/ray/air/... data
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}"
--worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--build-name datalbuild-py3.10 --python-version 3.10
--except-tags data_integration,doctest,data_non_parallel,dask,needs_credentials,tensorflow_datasets,cudf
depends_on: datalbuild-multipy(python=3.10)
- label: ":database: data: arrow v23 tests (data_non_parallel)"
tags:
- data
- data_non_parallel
- skip-on-premerge
instance_type: medium
parallelism: 3
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... //python/ray/air/... data
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}"
--worker-id "$${BUILDKITE_PARALLEL_JOB}"
--build-name datalbuild-py3.10 --python-version 3.10
--only-tags data_non_parallel
--except-tags data_non_parallel_postmerge_only,cudf
depends_on: datalbuild-multipy(python=3.10)
- label: ":database: data: arrow v23 py{{array.python}} tests ({{array.worker_id}})"
key: datal_python_tests
if: build.pull_request.labels includes "continuous-build" || pipeline.id == "0189e759-8c96-4302-b6b5-b4274406bf89" || pipeline.id == "018f4f1e-1b73-4906-9802-92422e3badaa"
tags:
- data
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... //python/ray/air/... data
--workers 2 --worker-id {{array.worker_id}} --parallelism-per-worker 3
--build-name datalbuild-py{{array.python}} --python-version {{array.python}}
--except-tags data_integration,doctest,data_non_parallel,dask,needs_credentials,tensorflow_datasets,cudf
depends_on: datalbuild-multipy($)
array:
python: ["3.12"]
worker_id: ["0", "1"]
- label: ":database: data: arrow v23 py{{array.python}} tests (data_non_parallel)"
key: datal_python_non_parallel_tests
if: build.pull_request.labels includes "continuous-build" || pipeline.id == "0189e759-8c96-4302-b6b5-b4274406bf89" || pipeline.id == "018f4f1e-1b73-4906-9802-92422e3badaa"
tags:
- data
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... //python/ray/air/... data
--build-name datalbuild-py{{array.python}} --python-version {{array.python}}
--only-tags data_non_parallel
--except-tags data_non_parallel_postmerge_only,cudf
depends_on: datalbuild-multipy($)
array:
python: ["3.12"]
- label: ":database: data: arrow nightly tests"
tags:
- data
- skip-on-premerge
- oss
- disabled
instance_type: medium
parallelism: 2
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... //python/ray/air/... data
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}"
--worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--build-name datanbuild-py3.10 --python-version 3.10
--except-tags data_integration,doctest,data_non_parallel,dask,needs_credentials,tensorflow_datasets,cudf
depends_on: datanbuild-multipy
soft_fail: true
- label: ":database: data: arrow nightly tests (data_non_parallel)"
tags:
- data
- skip-on-premerge
- oss
- disabled
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... //python/ray/air/... data
--build-name datanbuild-py3.10 --python-version 3.10
--only-tags data_non_parallel
--except-tags data_non_parallel_postmerge_only,cudf
depends_on: datanbuild-multipy
soft_fail: true
- label: ":database: data: postmerge arrow v17 tests"
tags:
- data
- skip-on-premerge
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... //python/ray/air/... data
--build-name data17build-py3.10 --python-version 3.10
--only-tags data_non_parallel_postmerge_only
depends_on: data17build-multipy(python=3.10)
- label: ":database: data: postmerge arrow v23 tests"
tags:
- data
- skip-on-premerge
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... //python/ray/air/... data
--build-name datalbuild-py3.10 --python-version 3.10
--only-tags data_non_parallel_postmerge_only
depends_on: datalbuild-multipy(python=3.10)
- label: ":database: data: dask tests"
tags:
- data
- dask
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... data
--build-name datalbuild-py3.12 --python-version 3.12
--only-tags dask
depends_on: datalbuild-multipy(python=3.12)
- label: ":database: data: doc tests"
if: '!(build.pull_request.labels includes "docs-go")'
tags:
- data
- doc
instance_type: medium
commands:
# doc tests
- bazel run //ci/ray_ci:test_in_docker -- python/ray/... //doc/... data
--build-name datalbuild-py3.10
--python-version 3.10
--except-tags gpu
--only-tags doctest
--parallelism-per-worker 2
# doc examples
- bazel run //ci/ray_ci:test_in_docker -- //doc/... data
--build-name datalbuild-py3.10
--python-version 3.10
--except-tags gpu,post_wheel_build,doctest,dask
--parallelism-per-worker 2
--skip-ray-installation
depends_on: datalbuild-multipy(python=3.10)
- label: ":database: data: dask doc tests"
if: '!(build.pull_request.labels includes "docs-go")'
tags:
- data
- doc
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //doc/... data
--build-name datalbuild-py3.12
--python-version 3.12
--only-tags dask
--parallelism-per-worker 2
depends_on: datalbuild-multipy(python=3.12)
- label: ":database: data: doc gpu tests"
if: '!(build.pull_request.labels includes "docs-go")'
tags:
- data
- doc
- gpu
instance_type: gpu-large
commands:
# doc tests
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... //doc/... data
--build-name docgpubuild-py3.10
--only-tags doctest
--except-tags cpu
--python-version 3.10
# doc examples
- bazel run //ci/ray_ci:test_in_docker -- //doc/... data
--build-name docgpubuild-py3.10
--except-tags doctest
--only-tags gpu
--skip-ray-installation
--python-version 3.10
depends_on: docgpubuild
- label: ":database: data: cuDF batch format tests"
tags:
- data
- gpu
- cudf
instance_type: gpu-large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... data
--build-name docgpubuild-py3.12
--only-tags cudf
--gpus 1
--python-version 3.12
depends_on: docgpubuild-py312
- label: ":database: data: integration tests"
tags:
- data
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... data
--build-name datamongobuild-py3.10
--python-version 3.10
--build-type java
--only-tags data_integration
--except-tags doctest
depends_on: datamongobuild-multipy
- label: ":database: data: dashboard tests"
tags:
- data
- dashboard
instance_type: small
commands:
- bazel run //ci/ray_ci:test_in_docker -- python/ray/dashboard/... data
--build-name datalbuild-py3.10
--python-version 3.10
--parallelism-per-worker 3
depends_on: datalbuild-multipy(python=3.10)
- label: ":database: data: flaky tests"
key: data_flaky_tests
tags:
- data
- flaky
- skip-on-premerge
instance_type: medium
soft_fail: true
commands:
- bazel run //ci/ray_ci:test_in_docker -- //... data --run-flaky-tests
--parallelism-per-worker 3
--build-name datalbuild-py3.10
--python-version 3.10
--except-tags gpu_only,gpu
depends_on: datalbuild-multipy(python=3.10)
- label: ":database: data: flaky gpu tests"
key: data_flaky_gpu_tests
tags:
- data
- skip-on-premerge
instance_type: gpu-large
soft_fail: true
commands:
- bazel run //ci/ray_ci:test_in_docker -- //... data --run-flaky-tests
--build-name docgpubuild-py3.10
--only-tags gpu,gpu_only
--python-version 3.10
depends_on: docgpubuild
- label: ":database: data: postmerge authenticated tests"
key: data_postmerge_authenticated_tests
tags:
- data
- oss
- skip-on-premerge
instance_type: medium
commands:
- $(python ci/env/setup_credentials.py)
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... data
--build-name datalbuild-py3.10
--python-version 3.10
--only-tags needs_credentials
--test-env=SNOWFLAKE_USER --test-env=SNOWFLAKE_ACCOUNT
--test-env=SNOWFLAKE_DATABASE --test-env=SNOWFLAKE_SCHEMA
--test-env=SNOWFLAKE_WAREHOUSE --test-env=SNOWFLAKE_PRIVATE_KEY
depends_on: datalbuild-multipy(python=3.10)
+45
View File
@@ -0,0 +1,45 @@
group: dependencies
depends_on:
- forge
steps:
# dependencies
- label: ":tapioca: build: pip-compile dependencies"
key: pip_compile_dependencies
tags: python_dependencies
instance_type: small
commands:
# uncomment the following line to update the pinned versions of pip dependencies
# to the latest versions; otherwise, the pinned versions will be re-used as much
# as possible
# - rm ./python/requirements_compiled.txt
- cp ./python/requirements_compiled.txt requirements_compiled_backup.txt
- ./ci/ci.sh compile_pip_dependencies
- cp -f ./python/requirements_compiled.txt /artifact-mount/
- diff ./python/requirements_compiled.txt requirements_compiled_backup.txt || (echo "requirements_compiled.txt is not up to date. Please download it from Artifacts tab and git push the changes." && exit 1)
job_env: oss-ci-base_test-py3.11
depends_on: oss-ci-base_test-multipy(python=3.11)
- label: ":tapioca: build: pip-compile py3.13 dependencies"
key: pip_compile_313_dependencies
tags: python_dependencies
instance_type: small
commands:
# uncomment the following line to update the pinned versions of pip dependencies
# to the latest versions; otherwise, the pinned versions will be re-used as much
# as possible
# - rm ./python/requirements_compiled_py3.13.txt
- cp ./python/requirements_compiled_py3.13.txt requirements_compiled_py3.13_backup.txt
- ./ci/ci.sh compile_313_pip_dependencies
- cp -f ./python/requirements_compiled_py3.13.txt /artifact-mount/
- diff ./python/requirements_compiled_py3.13.txt requirements_compiled_py3.13_backup.txt || (echo "requirements_compiled_py3.13.txt is not up to date. Please download it from Artifacts tab and git push the changes." && exit 1)
job_env: oss-ci-base_test-py3.11
depends_on: oss-ci-base_test-multipy(*)
- label: ":tapioca: build: raydepsets: compile all dependencies"
key: raydepsets_compile_all_dependencies
tags: python_dependencies
instance_type: small
commands:
- bazel run //ci/raydepsets:raydepsets -- build --all-configs --check
job_env: manylinux-x86_64
depends_on: manylinux-x86_64
+93
View File
@@ -0,0 +1,93 @@
group: doc
steps:
- name: docbuild
label: "wanda: docbuild-py{{matrix}}"
wanda: ci/docker/doc.build.wanda.yaml
depends_on:
- oss-ci-base_build-multipy(python=3.11)
- ray-core-build(python=3.11)
- ray-dashboard-build
matrix:
- "3.11"
env:
PYTHON: "{{matrix}}"
REQUIREMENTS_FILE: "python/deplocks/docs/docbuild_depset_py{{matrix}}.lock"
tags: cibase
- name: docgpubuild
label: "wanda: docgpubuild-py3.10"
wanda: ci/docker/docgpu.build.wanda.yaml
depends_on: oss-ci-base_gpu-multipy(python=3.10)
env:
PYTHON: "3.10"
tags: cibase
- label: ":book: doc: build"
key: doc_build
instance_type: medium
commands:
- bazel run //ci/ray_ci/doc:cmd_build
depends_on: docbuild
job_env: docbuild-py3.11
tags:
- oss
- doc
- skip-on-premerge
- label: ":book: doc: check API annotations"
if: '!(build.pull_request.labels includes "docs-go")'
tags:
- oss
- core_python
- dashboard
- ray_client
- data
- serve
- ml
- tune
- train
- llm
- rllib
- rllib_gpu
- doc
key: doc_api_annotations
instance_type: medium
depends_on: docbuild
job_env: docbuild-py3.11
commands:
- bash ci/lint/lint.sh api_annotations
- label: ":book: doc: check API doc consistency"
if: '!(build.pull_request.labels includes "docs-go")'
tags:
- oss
- core_python
- dashboard
- ray_client
- data
- serve
- ml
- tune
- train
- llm
- rllib
- rllib_gpu
- doc
key: doc_api_policy_check
instance_type: medium
depends_on: docbuild
job_env: docbuild-py3.11
commands:
- bash ci/lint/lint.sh api_policy_check
- label: ":book: doc: linkcheck"
key: doc_linkcheck
instance_type: medium
commands:
- make -C doc/ linkcheck_all
depends_on: docbuild
job_env: docbuild-py3.11
tags:
- oss
- skip-on-premerge
soft_fail: true
+31
View File
@@ -0,0 +1,31 @@
#!/bin/bash
# This script is executed by Buildkite on the host machine.
# In contrast, our build jobs are run in Docker containers.
# This means that even though our build jobs write to
# `/artifact-mount`, the directory on the host machine is
# actually `/tmp/artifacts`.
# We clean up the artifacts directory before any command and
# after uploading artifacts to make sure no stale artifacts
# remain on the node when a Buildkite runner is re-used.
set -ex
if [ -d "/tmp/artifacts" ]; then
echo "Cleaning up artifacts after upload."
echo "Artifact directory contents before cleanup:"
find /tmp/artifacts -print || true
if [ "$(ls -A /tmp/artifacts)" ]; then
echo "Directory not empty, cleaning up..."
if [[ "${OSTYPE}" = darwin* ]]; then
rm -rf /tmp/artifacts
mkdir -p /tmp/artifacts
else
# Need to run in docker to avoid permission issues
docker run --rm -v /tmp/artifacts:/artifact-mount alpine:latest /bin/sh -c 'rm -rf /artifact-mount/*; rm -rf /artifact-mount/.[!.]*' || true
fi
else
echo "Directory already empty, no need to clean up."
fi
echo "Artifact directory contents after cleanup:"
find /tmp/artifacts -print || true
fi
+33
View File
@@ -0,0 +1,33 @@
#!/bin/bash
# This script is executed by Buildkite on the host machine.
# In contrast, our build jobs are run in Docker containers.
# This means that even though our build jobs write to
# `/artifact-mount`, the directory on the host machine is
# actually `/tmp/artifacts`.
# Here, we cat all text files in artifact-mount/test-summaries
# and upload them as a Buildkite annotation.
# These files contain a condensed summary of all failing pytest
# tests to make it easy for users to see which tests are failing.
# Because we upload them to Buildkite, we don't need to
# upload them as artifacts and delete them afterwards.
set -ex
if [ -d "/tmp/artifacts/test-summaries" ] && [ "$(ls -A /tmp/artifacts/test-summaries)" ]; then
# Only upload annotations if there are at least 2 files in the directory:
# 1 header and 1 failed test.
if [ "$(find /tmp/artifacts/test-summaries -maxdepth 1 -name '*.txt' | wc -l)" -ge 2 ]; then
echo "Test summaries for ${BUILDKITE_JOB_ID} ${BUILDKITE_LABEL}" | buildkite-agent annotate --job "${BUILDKITE_JOB_ID}" --style error --context "${BUILDKITE_JOB_ID}"
cat /tmp/artifacts/test-summaries/*.txt | head -n 20 | buildkite-agent annotate --job "${BUILDKITE_JOB_ID}" --append --style error --context "${BUILDKITE_JOB_ID}"
fi
# Remove test summaries files (don't actually upload as artifacts)
# This has to be done with docker to avoid permission issues
echo "--- Cleaning up"
docker run --rm -v /tmp/artifacts:/artifact-mount alpine:latest /bin/sh -c 'rm -rf /artifact-mount/test-summaries' || true
fi
# clean up bazel logs if any, this only has effect when the bazel test runs in the same
# environment as the buildkite job commands, and has no effect when the tests run
# inside another test container
rm -rf /tmp/bazel_event_logs
rm -rf /tmp/artifacts/test-summaries
+38
View File
@@ -0,0 +1,38 @@
#!/bin/bash
# This script is executed by Buildkite on the host machine.
# In contrast, our build jobs are run in Docker containers.
# This means that even though our build jobs write to
# `/artifact-mount`, the directory on the host machine is
# actually `/tmp/artifacts`.
# We clean up the artifacts directory before any command and
# after uploading artifacts to make sure no stale artifacts
# remain on the node when a Buildkite runner is re-used.
set -ex
echo "Creating artifact directory..."
if [[ "${OSTYPE}" == linux* ]]; then
if [[ -d "/tmp/artifacts" ]]; then
echo "Cleaning up old artifacts before command."
echo "Artifact directory contents before cleanup:"
find /tmp/artifacts -print || true
if [[ "$(ls -A /tmp/artifacts)" ]]; then
echo "Directory not empty, cleaning up..."
# Need to run in docker to avoid permission issues
docker run --rm -v /tmp/artifacts:/artifact-mount alpine:latest /bin/sh -c 'rm -rf /artifact-mount/*; rm -rf /artifact-mount/.[!.]*' || true
else
echo "Directory already empty, no need to clean up."
fi
fi
docker run --rm -v /tmp/artifacts:/artifact-mount alpine:latest /bin/sh -c 'chown -R 2000 /artifact-mount/' || true
elif [[ "${OSTYPE}" == msys ]]; then
if [[ -d "/c/tmp/artifacts" ]]; then
rm -rf /c/tmp/artifacts/*
fi
mkdir -p /c/tmp/artifacts
fi
RAYCI_CHECKOUT_DIR="$(pwd)"
export RAYCI_CHECKOUT_DIR
+51
View File
@@ -0,0 +1,51 @@
group: "kuberay tests"
steps:
- name: k8sbuild
wanda: ci/docker/k8s.build.wanda.yaml
depends_on:
- oss-ci-base_build-multipy(python=3.10)
tags: cibase
- label: ":kubernetes: operator"
tags:
- core_python
- docker
instance_type: large
commands:
- bash ci/k8s/run-operator-tests.sh
docker_network: "host"
depends_on:
- k8sbuild
- manylinux-x86_64
- forge
- raycpubase(python=3.10)
- ray-core-build(python=3.10)
- ray-dashboard-build
- label: ":kubernetes: chaos {{matrix.workload}} under {{matrix.fault}}"
key: kuberay_tests
tags:
- core_python
- docker
- oss
- skip-on-premerge
instance_type: medium
commands:
- bash ci/k8s/run-chaos-test.sh {{matrix.fault}} {{matrix.workload}}
docker_network: "host"
matrix:
setup:
fault:
- "no_fault"
- "chaos_network_delay"
- "chaos_network_bandwidth"
workload:
- "test_potato_passer"
- "test_streaming_llm"
- "test_many_job_submissions"
depends_on:
- manylinux-x86_64
- forge
- raycpubase(python=3.10)
- ray-core-build(python=3.10)
- ray-dashboard-build
+52
View File
@@ -0,0 +1,52 @@
group: lint
steps:
- label: ":lint-roller: lint: {{matrix}}"
key: lint-small
tags:
- lint
- always
depends_on:
- forge
commands:
- ./ci/lint/lint.sh {{matrix}}
matrix:
- clang_format
- pre_commit
- semgrep_lint
- banned_words
- doc_readme
- dashboard_format
- copyright_format
- bazel_team
- bazel_buildifier
- pytest_format
- test_coverage
- documentation_style
- doc_no_new_rst
- label: ":lint-roller: pre-commit pydoclint"
key: pydoclint-small
tags:
- oss
- lint
- always
depends_on:
- forge
commands:
- ./ci/lint/lint.sh pre_commit_pydoclint
# Scope guard for the "docs-go" label: runs only when the label is present,
# and fails unless the PR is content-only (changes under doc/, excluding
# BUILD files). This is the check the label cannot turn off, so the label
# can skip doc/library tests on a content PR but never on a code, CI, or
# build change.
- label: ":lint-roller: lint: validate docs-go scope"
key: docs-go-scope
if: build.pull_request.labels includes "docs-go"
tags:
- oss
- always
depends_on:
- forge
commands:
- ./ci/lint/validate_docs_go_scope.sh
+470
View File
@@ -0,0 +1,470 @@
group: aarch64 tests
sort_key: "~aarch64"
steps:
# block on premerge and microcheck
- block: "Run Linux aarch64 tests"
if: build.env("BUILDKITE_PIPELINE_ID") == "0189942e-0876-4b8f-80a4-617f988ec59b" || build.env("BUILDKITE_PIPELINE_ID") == "018f4f1e-1b73-4906-9802-92422e3badaa"
- name: forge-aarch64
wanda: ci/docker/forge.aarch64.wanda.yaml
instance_type: builder-arm64
- name: manylinux-aarch64
wanda: ci/docker/manylinux.wanda.yaml
env_file: rayci.env
env:
HOSTTYPE: "aarch64"
instance_type: builder-arm64
- name: ray-java-build-aarch64
label: "wanda: java build (aarch64)"
wanda: ci/docker/ray-java.wanda.yaml
tags:
- release_wheels
- java
env_file: rayci.env
env:
ARCH_SUFFIX: "-aarch64"
HOSTTYPE: "aarch64"
instance_type: builder-arm64
- name: raycpubase-aarch64
label: "wanda: ray.py{{array.python}}.cpu.base (aarch64)"
tags:
- python_dependencies
- docker
wanda: docker/base-deps/cpu.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
instance_type: builder-arm64
env:
PYTHON_VERSION: "{{array.python}}"
ARCH_SUFFIX: "-aarch64"
- name: raycpubaseextra-aarch64
label: "wanda: ray.py{{array.python}}.cpu.base-extra (aarch64)"
wanda: docker/base-extra/cpu.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
instance_type: builder-arm64
env:
PYTHON_VERSION: "{{array.python}}"
IMAGE_TYPE: "ray"
ARCH_SUFFIX: "-aarch64"
depends_on: raycpubase-aarch64($)
- name: raycudabase-aarch64
label: "wanda: ray.py{{array.python}}.cu{{array.cuda}}.base (aarch64)"
tags:
- python_dependencies
- docker
wanda: docker/base-deps/cuda.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
cuda:
- "11.7.1-cudnn8"
- "11.8.0-cudnn8"
- "12.1.1-cudnn8"
- "12.3.2-cudnn9"
- "12.4.1-cudnn"
- "12.5.1-cudnn"
- "12.6.3-cudnn"
- "12.8.1-cudnn"
- "12.9.1-cudnn"
- "13.0.0-cudnn"
instance_type: builder-arm64
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
ARCH_SUFFIX: "-aarch64"
- name: raycudabaseextra-aarch64
label: "wanda: ray.py{{array.python}}.cu{{array.cuda}}.base-extra (aarch64)"
wanda: docker/base-extra/cuda.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
cuda:
- "11.7.1-cudnn8"
- "11.8.0-cudnn8"
- "12.1.1-cudnn8"
- "12.3.2-cudnn9"
- "12.4.1-cudnn"
- "12.5.1-cudnn"
- "12.6.3-cudnn"
- "12.8.1-cudnn"
- "12.9.1-cudnn"
- "13.0.0-cudnn"
instance_type: builder-arm64
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
IMAGE_TYPE: "ray"
ARCH_SUFFIX: "-aarch64"
depends_on: raycudabase-aarch64($)
# NOTE(andrew-anyscale): dashboard is architecture agnostic, but wanda pulls
# images for the architecture of the machine running the build. In the future,
# we can remove the arch suffix and pull from the x86_64 image to avoid
# duplicating this step.
- name: ray-dashboard-build-aarch64
label: "wanda: dashboard (aarch64)"
wanda: ci/docker/ray-dashboard.wanda.yaml
env_file: rayci.env
env:
ARCH_SUFFIX: "-aarch64"
HOSTTYPE: "aarch64"
tags: release_wheels
instance_type: builder-arm64
- name: ray-core-build-aarch64
label: "wanda: core binary parts py{{array.python}} (aarch64)"
wanda: ci/docker/ray-core.wanda.yaml
env_file: rayci.env
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- "3.14"
env:
PYTHON_VERSION: "{{array.python}}"
ARCH_SUFFIX: "-aarch64"
HOSTTYPE: "aarch64"
tags: release_wheels
instance_type: builder-arm64
- name: ray-wheel-build-aarch64
label: "wanda: wheel py{{array.python}} (aarch64)"
wanda: ci/docker/ray-wheel.wanda.yaml
env_file: rayci.env
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- "3.14"
env:
PYTHON_VERSION: "{{array.python}}"
ARCH_SUFFIX: "-aarch64"
HOSTTYPE: "aarch64"
JDK_SUFFIX: "-jdk"
RAY_JAVA_IMAGE: "cr.ray.io/rayproject/ray-java-build-aarch64"
RAY_DASHBOARD_IMAGE: "cr.ray.io/rayproject/ray-dashboard-aarch64"
tags:
- release_wheels
- linux_wheels
depends_on:
- ray-core-build-aarch64($)
- ray-java-build-aarch64
- ray-dashboard-build-aarch64
instance_type: builder-arm64
- label: ":arrow_up: upload: wheel py{{array.python}} (aarch64)"
key: linux_wheels_upload_aarch64
instance_type: small # x86_64 instance since crane is currently only x86_64
commands:
- bazel run //ci/ray_ci/automation:extract_wanda_artifact --
--wanda-image-name=ray-wheel-py{{array.python}}-aarch64
--file-glob='*.whl'
--output-dir=.whl
- ./ci/build/copy_build_artifacts.sh wheel
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- "3.14"
depends_on:
- ray-wheel-build-aarch64($)
- forge
tags:
- release_wheels
- linux_wheels
- oss
- skip-on-premerge
- name: ray-cpp-core-build-aarch64
label: "wanda: cpp core (aarch64)"
wanda: ci/docker/ray-cpp-core.wanda.yaml
env_file: rayci.env
env:
ARCH_SUFFIX: "-aarch64"
HOSTTYPE: "aarch64"
tags:
- release_wheels
- oss
instance_type: builder-arm64
- name: ray-cpp-wheel-build-aarch64
label: "wanda: cpp wheel (aarch64)"
wanda: ci/docker/ray-cpp-wheel.wanda.yaml
env_file: rayci.env
env:
PYTHON_VERSION: "3.10" # Used for upstream images; wheel is Python-agnostic
ARCH_SUFFIX: "-aarch64"
HOSTTYPE: "aarch64"
tags:
- release_wheels
- linux_wheels
- oss
depends_on:
- ray-core-build-aarch64(python=3.10)
- ray-cpp-core-build-aarch64
- ray-java-build-aarch64
- ray-dashboard-build-aarch64
instance_type: builder-arm64
- label: ":arrow_up: upload: cpp wheel (aarch64)"
key: linux_cpp_wheels_upload_aarch64
instance_type: small # x86_64 instance since crane is currently only x86_64
commands:
- bazel run //ci/ray_ci/automation:extract_wanda_artifact --
--wanda-image-name=ray-cpp-wheel-aarch64
--file-glob='*.whl'
--output-dir=.whl
- ./ci/build/copy_build_artifacts.sh wheel
depends_on:
- ray-cpp-wheel-build-aarch64
- forge
tags:
- release_wheels
- linux_wheels
- oss
- skip-on-premerge
- name: ray-image-cpu-build-aarch64
label: "wanda: ray py{{array.python}} cpu (aarch64)"
wanda: ci/docker/ray-image-cpu.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
env_file: rayci.env
env:
PYTHON_VERSION: "{{array.python}}"
ARCH_SUFFIX: "-aarch64"
tags:
- python_dependencies
- docker
- oss
depends_on:
- ray-wheel-build-aarch64($)
- raycpubase-aarch64($)
instance_type: builder-arm64
- name: ray-image-cuda-build-aarch64
label: "wanda: ray py{{array.python}} cu{{array.cuda}} (aarch64)"
wanda: ci/docker/ray-image-cuda.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
cuda:
- "11.7.1-cudnn8"
- "11.8.0-cudnn8"
- "12.1.1-cudnn8"
- "12.3.2-cudnn9"
- "12.4.1-cudnn"
- "12.5.1-cudnn"
- "12.6.3-cudnn"
- "12.8.1-cudnn"
- "12.9.1-cudnn"
- "13.0.0-cudnn"
env_file: rayci.env
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
ARCH_SUFFIX: "-aarch64"
tags:
- python_dependencies
- docker
- oss
depends_on:
- ray-wheel-build-aarch64($)
- raycudabase-aarch64($)
instance_type: builder-arm64
- label: ":crane: publish: ray py{{array.python}} (aarch64)"
key: ray_images_push_aarch64
instance_type: small # x86_64 instance since crane is currently only x86_64
commands:
- bazel run //.buildkite:copy_files -- --destination docker_login
- bazel run //ci/ray_ci/automation:push_ray_image --
--python-version {{array.python}}
--platform cpu
--platform cu11.7.1-cudnn8
--platform cu11.8.0-cudnn8
--platform cu12.1.1-cudnn8
--platform cu12.3.2-cudnn9
--platform cu12.4.1-cudnn
--platform cu12.5.1-cudnn
--platform cu12.6.3-cudnn
--platform cu12.8.1-cudnn
--platform cu12.9.1-cudnn
--platform cu13.0.0-cudnn
--image-type ray
--architecture aarch64
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
depends_on:
- ray-image-cpu-build-aarch64($)
- ray-image-cuda-build-aarch64($)
tags:
- python_dependencies
- docker
- oss
- skip-on-premerge
- name: ray-extra-image-cpu-build-aarch64
label: "wanda: ray-extra py{{array.python}} cpu (aarch64)"
wanda: ci/docker/ray-extra-image-cpu.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
env_file: rayci.env
env:
PYTHON_VERSION: "{{array.python}}"
ARCH_SUFFIX: "-aarch64"
tags:
- python_dependencies
- docker
- oss
depends_on:
- ray-wheel-build-aarch64($)
- raycpubaseextra-aarch64($)
instance_type: builder-arm64
- name: ray-extra-image-cuda-build-aarch64
label: "wanda: ray-extra py{{array.python}} cu{{array.cuda}} (aarch64)"
wanda: ci/docker/ray-extra-image-cuda.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
cuda:
- "11.7.1-cudnn8"
- "11.8.0-cudnn8"
- "12.1.1-cudnn8"
- "12.3.2-cudnn9"
- "12.4.1-cudnn"
- "12.5.1-cudnn"
- "12.6.3-cudnn"
- "12.8.1-cudnn"
- "12.9.1-cudnn"
- "13.0.0-cudnn"
env_file: rayci.env
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
ARCH_SUFFIX: "-aarch64"
tags:
- python_dependencies
- docker
- oss
depends_on:
- ray-wheel-build-aarch64($)
- raycudabaseextra-aarch64($)
instance_type: builder-arm64
- label: ":crane: publish: ray-extra py{{array.python}} (aarch64)"
key: ray_extra_images_push_aarch64
instance_type: small
commands:
- bazel run //.buildkite:copy_files -- --destination docker_login
- bazel run //ci/ray_ci/automation:push_ray_image --
--python-version {{array.python}}
--platform cpu
--platform cu11.7.1-cudnn8
--platform cu11.8.0-cudnn8
--platform cu12.1.1-cudnn8
--platform cu12.3.2-cudnn9
--platform cu12.4.1-cudnn
--platform cu12.5.1-cudnn
--platform cu12.6.3-cudnn
--platform cu12.8.1-cudnn
--platform cu12.9.1-cudnn
--platform cu13.0.0-cudnn
--image-type ray-extra
--architecture aarch64
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
depends_on:
- ray-extra-image-cpu-build-aarch64($)
- ray-extra-image-cuda-build-aarch64($)
tags:
- python_dependencies
- docker
- oss
- skip-on-premerge
- label: ":ray: core: wheel-aarch64 tests"
tags: linux_wheels
instance_type: medium-arm64
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... //doc/... core
--build-type wheel-aarch64
--build-name oss-ci-base_build-aarch64
--parallelism-per-worker 3
--only-tags post_wheel_build
--test-env=RAY_CI_POST_WHEEL_TESTS=True
--python-version 3.10
depends_on:
- manylinux-aarch64
- oss-ci-base_build-aarch64
- forge-aarch64
- ray-wheel-build-aarch64(python=3.10)
job_env: forge-aarch64
- label: ":ray-serve: serve: wheel-aarch64 tests"
tags: linux_wheels
instance_type: medium-arm64
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/serve/... //doc/... serve
--build-type wheel-aarch64
--build-name oss-ci-base_build-aarch64
--parallelism-per-worker 3
--only-tags post_wheel_build
--test-env=RAY_CI_POST_WHEEL_TESTS=True
--python-version 3.10
depends_on:
- manylinux-aarch64
- oss-ci-base_build-aarch64
- forge-aarch64
- ray-wheel-build-aarch64(python=3.10)
job_env: forge-aarch64
+88
View File
@@ -0,0 +1,88 @@
group: llm tests
depends_on:
- forge
- ray-core-build(*)
- ray-dashboard-build
steps:
- name: llmbuild
wanda: ci/docker/llm.build.wanda.yaml
depends_on:
- oss-ci-base_build-multipy(python=3.12)
env:
PYTHON: "3.12"
BASE_TYPE: "build"
BUILD_VARIANT: "build"
RAY_CUDA_CODE: "cpu"
tags: cibase
- name: llmgpubuild
wanda: ci/docker/llm.build.wanda.yaml
depends_on:
- oss-ci-base_cu130-multipy(python=3.12)
env:
PYTHON: "3.12"
BASE_TYPE: "cu130"
BUILD_VARIANT: "gpubuild"
RAY_CUDA_CODE: "cu130"
tags: cibase
# Dedicated image for the custom-vllm-model docs example: the LLM GPU image
# plus a vllm plugin for model with custom architecture.
- name: custom-vllm-plugin-gpubuild
wanda: ci/docker/custom-vllm-plugin.build.wanda.yaml
depends_on: llmgpubuild
tags: cibase
- label: "llm cpu tests"
if: '!(build.pull_request.labels includes "docs-go")'
key: "llm-cpu-tests"
tags:
- llm
- cpu
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/llm/... //doc/... llm
--python-version 3.12 --build-name llmbuild
--except-tags gpu
depends_on: llmbuild
- label: "llm gpu tests"
if: '!(build.pull_request.labels includes "docs-go")'
key: "llm-gpu-tests"
tags:
- llm
- gpu
instance_type: g6-large
commands:
- RAYCI_DISABLE_TEST_DB=1 bazel run //ci/ray_ci:test_in_docker -- //python/ray/llm/... //doc/... llm
--python-version 3.12 --build-name llmgpubuild --only-tags gpu
--except-tags multi_gpu_4,custom_vllm_plugin
depends_on: llmgpubuild
- label: "llm gpu tests (4 GPUs)"
if: '!(build.pull_request.labels includes "docs-go")'
key: "llm-gpu-tests-4gpu"
tags:
- llm
- gpu
instance_type: gpu-large
commands:
- RAYCI_DISABLE_TEST_DB=1 bazel run //ci/ray_ci:test_in_docker -- //doc/... llm
--python-version 3.12 --build-name llmgpubuild
--only-tags multi_gpu_4
--gpus 4
depends_on: llmgpubuild
# Custom vLLM model docs example: runs on the dedicated image that has the
# qwen3_reward_plugin baked in.
- label: "llm custom vllm plugin gpu test"
key: "llm-custom-vllm-plugin-gpu-test"
tags:
- llm
- gpu
instance_type: g6-large
commands:
- RAYCI_DISABLE_TEST_DB=1 bazel run //ci/ray_ci:test_in_docker -- //doc/... llm
--python-version 3.12 --build-name custom-vllm-plugin-gpubuild
--only-tags custom_vllm_plugin
depends_on: custom-vllm-plugin-gpubuild
+1
View File
@@ -0,0 +1 @@
macos/macos.rayci.yml
+1
View File
@@ -0,0 +1 @@
../always.rules.test.txt
+1
View File
@@ -0,0 +1 @@
../always.rules.txt
+18
View File
@@ -0,0 +1,18 @@
name: ray-postmerge-macos
artifacts_bucket: ray-ci-artifact-branch-public
ci_temp: s3://ray-ci-artifact-branch-public/ci-temp/
ci_work_repo: 029272617770.dkr.ecr.us-west-2.amazonaws.com/rayproject/citemp
forge_prefix: cr.ray.io/rayproject/
builder_queues:
builder: builder_queue_branch
runner_queues:
macos: macos-branch
macos-arm64: macos-branch-arm64
buildkite_dirs:
- .buildkite/macos
env:
BUILDKITE_BAZEL_CACHE_URL: https://bazel-cache-dev.s3.us-west-2.amazonaws.com
hook_env_keys:
- RAYCI_CHECKOUT_DIR
skip_tags:
- disabled
+123
View File
@@ -0,0 +1,123 @@
group: macos tests
sort_key: "~macos"
steps:
- label: ":ray: core: :mac: smoke test"
if: build.env("BUILDKITE_PIPELINE_ID") == "0189942e-0876-4b8f-80a4-617f988ec59b" || build.env("BUILDKITE_PIPELINE_ID") == "018f4f1e-1b73-4906-9802-92422e3badaa"
tags:
- core_cpp
- macos_wheels
job_env: MACOS
instance_type: macos-arm64
commands:
- ./ci/ray_ci/macos/macos_ci.sh run_smoke_test
# block full test suite on premerge and microcheck
- block: "run macos tests"
key: block-macos-tests
if: build.env("BUILDKITE_PIPELINE_ID") == "0189942e-0876-4b8f-80a4-617f988ec59b" || build.env("BUILDKITE_PIPELINE_ID") == "018f4f1e-1b73-4906-9802-92422e3badaa"
depends_on: []
- label: ":tapioca: build: :mac: wheels and jars (aarch64)"
key: macos_wheels_arm64
if: build.env("BUILDKITE_PIPELINE_ID") != "0189e759-8c96-4302-b6b5-b4274406bf89"
tags:
- macos_wheels
- python_dependencies
- release_wheels
job_env: MACOS
instance_type: macos-arm64
commands:
- bash ci/ray_ci/macos/macos_ci_build.sh
depends_on: block-macos-tests
# test
- label: ":ray: core: :mac: small & client tests"
if: build.env("BUILDKITE_PIPELINE_ID") != "0189e759-8c96-4302-b6b5-b4274406bf89"
tags:
- core_cpp
- core_python
- macos_wheels
job_env: MACOS
instance_type: macos-arm64
commands:
- ./ci/ray_ci/macos/macos_ci.sh run_small_test
depends_on: block-macos-tests
- label: ":ray: core: :mac: medium tests (shard 1)"
if: build.env("BUILDKITE_PIPELINE_ID") != "0189e759-8c96-4302-b6b5-b4274406bf89"
tags:
- core_cpp
- core_python
- macos_wheels
job_env: MACOS
instance_type: macos-arm64
commands:
- ./ci/ray_ci/macos/macos_ci.sh run_medium_test_shard_0
depends_on: block-macos-tests
- label: ":ray: core: :mac: medium tests (shard 2)"
if: build.env("BUILDKITE_PIPELINE_ID") != "0189e759-8c96-4302-b6b5-b4274406bf89"
tags:
- core_cpp
- core_python
- macos_wheels
job_env: MACOS
instance_type: macos-arm64
commands:
- ./ci/ray_ci/macos/macos_ci.sh run_medium_test_shard_1
depends_on: block-macos-tests
- label: ":ray: core: :mac: large tests"
if: build.env("BUILDKITE_PIPELINE_ID") != "0189e759-8c96-4302-b6b5-b4274406bf89"
tags:
- core_cpp
- core_python
- macos_wheels
- oss
job_env: MACOS
instance_type: macos-arm64
parallelism: 3
commands:
- ./ci/ray_ci/macos/macos_ci.sh run_large_test
depends_on: block-macos-tests
- label: ":ray: core: :mac: core and dashboard tests"
if: build.env("BUILDKITE_PIPELINE_ID") != "0189e759-8c96-4302-b6b5-b4274406bf89"
tags:
- core_cpp
- core_python
- dashboard
- macos_wheels
job_env: MACOS
instance_type: macos-arm64
commands:
- ./ci/ray_ci/macos/macos_ci.sh run_core_dashboard_test
depends_on: block-macos-tests
- label: ":ray: core: :mac: core c++ and java tests"
if: build.env("BUILDKITE_PIPELINE_ID") != "0189e759-8c96-4302-b6b5-b4274406bf89"
tags:
- cpp
- java
- macos_wheels
job_env: MACOS
instance_type: macos-arm64
commands:
- RAY_INSTALL_JAVA=0 ./ci/ray_ci/macos/macos_ci.sh run_ray_cpp
depends_on: block-macos-tests
- label: ":ray: core: :mac: flaky tests"
key: macos_flaky_tests
if: build.env("BUILDKITE_PIPELINE_ID") != "0189e759-8c96-4302-b6b5-b4274406bf89"
tags:
- core_cpp
- core_python
- macos_wheels
- flaky
- skip_on_premerge
job_env: MACOS
instance_type: macos-arm64
soft_fail: true
commands:
- ./ci/ray_ci/macos/macos_ci.sh run_flaky_tests
depends_on: block-macos-tests
+1
View File
@@ -0,0 +1 @@
../test.rules.test.txt
+1
View File
@@ -0,0 +1 @@
../test.rules.txt
+391
View File
@@ -0,0 +1,391 @@
group: ml tests
depends_on:
- forge
- ray-core-build(*)
- ray-dashboard-build
steps:
# builds
- name: minbuild-ml
label: "wanda: minbuild-ml-py{{array.python}}"
wanda: ci/docker/min.build.wanda.yaml
depends_on: oss-ci-base_test-multipy($)
array:
python:
- "3.10"
env:
PYTHON_VERSION: "{{array.python}}"
EXTRA_DEPENDENCY: ml
tags: cibase
- name: mlbuild-multipy
label: "wanda: mlbuild-py{{array.python}}"
wanda: ci/docker/ml.build.wanda.yaml
depends_on: oss-ci-base_ml-multipy($)
env:
PYTHON: "{{array.python}}"
BASE_TYPE: "ml"
IMAGE_TYPE: "build"
RAYCI_IS_GPU_BUILD: "false"
array:
python:
- "3.10"
- "3.12"
tags: cibase
- name: mltorchft
label: "wanda: mltorchft-py3.10"
wanda: ci/docker/ml.build.wanda.yaml
depends_on: oss-ci-base_ml-multipy(python=3.10)
env:
PYTHON: "3.10"
BASE_TYPE: "ml"
IMAGE_TYPE: "torchft"
RAYCI_IS_GPU_BUILD: "false"
tags: cibase
- name: mllightning1gpubuild
wanda: ci/docker/ml.build.wanda.yaml
env:
PYTHON: "3.10"
BASE_TYPE: "gpu"
IMAGE_TYPE: "lightning1gpubuild"
RAYCI_IS_GPU_BUILD: "true"
tags: cibase
depends_on: oss-ci-base_gpu-multipy(python=3.10)
- name: mlgpubuild-multipy
label: "wanda: mlgpubuild-py{{array.python}}"
wanda: ci/docker/ml.build.wanda.yaml
depends_on: oss-ci-base_gpu-multipy($)
env:
PYTHON: "{{array.python}}"
BASE_TYPE: "gpu"
IMAGE_TYPE: "gpubuild"
RAYCI_IS_GPU_BUILD: "true"
array:
python:
- "3.10"
- "3.12"
tags: cibase
# tests
- label: ":train: ml: train v1 tests"
tags: train
instance_type: large
parallelism: 2
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/train/... ml
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--except-tags gpu,minimal,tune,doctest,needs_credentials,train_v2,train_v2_gpu,data_integration
--python-version 3.10 --build-name mlbuild-py3.10
depends_on: [ "mlbuild-multipy(python=3.10)", "forge" ]
- label: ":bullettrain_front: ml: train v2 tests"
tags: train
instance_type: large
parallelism: 2
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/train/... ml
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--python-version 3.10 --build-name mlbuild-py3.10
--only-tags train_v2
--except-tags needs_credentials,data_integration,torchft
depends_on: [ "mlbuild-multipy(python=3.10)", "forge" ]
- label: ":bullettrain_front: ml: train v2 torch trainer tests (torchft image)"
tags: train
instance_type: small
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/train/... ml
--python-version 3.10 --build-name mltorchft-py3.10
--only-tags torchft
--except-tags needs_credentials,data_integration
depends_on: [ "mltorchft", "forge" ]
- label: ":bullettrain_front: ml: train v2 gpu tests"
tags:
- train_gpu
- gpu
instance_type: gpu-large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/train/... //doc/... ml
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 2
--build-name mlgpubuild-py3.10 --python-version 3.10
--only-tags train_v2_gpu
--except-tags data_integration
depends_on: [ "mlgpubuild-multipy(python=3.10)", "forge" ]
- label: ":bullettrain_front: :python: ml: train v2 {{array.python}} tests ({{array.worker_id}})"
key: ml_train_v2_python_tests
if: build.pull_request.labels includes "continuous-build" || pipeline.id == "0189e759-8c96-4302-b6b5-b4274406bf89" || pipeline.id == "018f4f1e-1b73-4906-9802-92422e3badaa"
tags:
- train
- tune
- ml
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/train/... ml
--workers 2 --worker-id {{array.worker_id}} --parallelism-per-worker 3
--python-version {{array.python}} --build-name mlbuild-py{{array.python}}
--only-tags train_v2
--except-tags needs_credentials,torchft
depends_on: [ "mlbuild-multipy($)", "forge" ]
array:
python: ["3.12"]
worker_id: ["0", "1"]
- label: ":train: ml: train v1 gpu tests"
tags:
- train_gpu
- gpu
instance_type: gpu-large
parallelism: 2
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/train/... //python/ray/air/... //doc/... ml
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 2
--build-name mlgpubuild-py3.10 --python-version 3.10
--only-tags gpu
--except-tags data_integration
depends_on: [ "mlgpubuild-multipy(python=3.10)", "forge" ]
- label: ":train: ml: data integration tests"
tags:
- data
- train
instance_type: gpu
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/train/... ml
--python-version 3.10 --build-name mlgpubuild-py3.10
--only-tags data_integration
depends_on: [ "mlgpubuild-multipy(python=3.10)", "forge" ]
- label: ":bullettrain_front: :python: ml: train v2 gpu {{array.python}} tests ({{array.worker_id}})"
key: ml_train_v2_gpu_python_tests
if: build.pull_request.labels includes "continuous-build" || pipeline.id == "0189e759-8c96-4302-b6b5-b4274406bf89" || pipeline.id == "018f4f1e-1b73-4906-9802-92422e3badaa"
tags:
- train_gpu
- gpu
instance_type: gpu-large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/train/... //python/ray/air/... //doc/... ml
--workers 2 --worker-id {{array.worker_id}} --parallelism-per-worker 2
--python-version {{array.python}}
--build-name mlgpubuild-py{{array.python}}
--only-tags train_v2_gpu
--except-tags doctest,data_integration
depends_on: [ "mlgpubuild-multipy($)", "forge" ]
array:
python: ["3.12"]
worker_id: ["0", "1"]
- label: ":train: ml: train authentication tests"
tags:
- train
- branch
- skip-on-premerge
- oss
instance_type: medium
commands:
- $(python ci/env/setup_credentials.py)
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/train/... ml
--parallelism-per-worker 3
--python-version 3.10 --build-name mlbuild-py3.10
--only-tags needs_credentials
--test-env=WANDB_API_KEY --test-env=COMET_API_KEY
depends_on: [ "mlbuild-multipy(python=3.10)", "forge" ]
- label: ":train: ml: tune tests"
tags: tune
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tune/... ml
--parallelism-per-worker 3
--python-version 3.10 --build-name mlbuild-py3.10
--except-tags doctest,soft_imports,rllib
depends_on: [ "mlbuild-multipy(python=3.10)", "forge" ]
- label: ":bullettrain_front: :python: ml: tune {{array.python}} tests"
key: ml_tune_python_tests
if: build.pull_request.labels includes "continuous-build" || pipeline.id == "0189e759-8c96-4302-b6b5-b4274406bf89" || pipeline.id == "018f4f1e-1b73-4906-9802-92422e3badaa"
tags: tune
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tune/... ml
--parallelism-per-worker 3
--python-version {{array.python}} --build-name mlbuild-py{{array.python}}
--except-tags doctest,soft_imports,rllib
depends_on: [ "mlbuild-multipy($)", "forge" ]
array:
python: ["3.12"]
- label: ":train: ml: tune soft import tests"
tags: tune
instance_type: small
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tune/... ml
--only-tags soft_imports
--build-name oss-ci-base_build-py3.10 --python-version 3.10
depends_on: [ "oss-ci-base_build-multipy(python=3.10)", "forge" ]
- label: ":train: ml: air tests"
tags: ml
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/air/... ml
--parallelism-per-worker 3
--python-version 3.10 --build-name mlbuild-py3.10
--except-tags gpu,doctest
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/data/... ml
--python-version 3.10 --build-name mlbuild-py3.10
--parallelism-per-worker 3
--only-tags ray_air
--skip-ray-installation
depends_on: [ "mlbuild-multipy(python=3.10)", "forge" ]
- label: ":train: ml: train+tune tests"
tags: train
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/train/... ml
--parallelism-per-worker 3
--python-version 3.10 --build-name mlbuild-py3.10
--only-tags tune
--except-tags ray_air,gpu,doctest,needs_credentials
depends_on: [ "mlbuild-multipy(python=3.10)", "forge" ]
- label: ":train: ml: rllib+tune tests"
tags:
- tune
- rllib
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tune/... ml
--python-version 3.10 --build-name mlbuild-py3.10
--parallelism-per-worker 3
--only-tags rllib
--except-tags gpu
depends_on: [ "mlbuild-multipy(python=3.10)", "forge" ]
- label: ":train: ml: release tests"
tags:
- ml
- core_python
- release_tests
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //release/... ml
--python-version 3.10 --build-name mlbuild-py3.10
--parallelism-per-worker 3
depends_on: [ "mlbuild-multipy(python=3.10)", "forge" ]
- label: ":train: ml: train minimal"
tags:
- train
- min_build
instance_type: small
commands:
- python ./ci/env/check_minimal_install.py
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/train/... ml
--parallelism-per-worker 2
--build-name minbuild-ml-py3.10 --python-version 3.10
--only-tags minimal
depends_on: [ "minbuild-ml(python=3.10)", "forge" ]
- label: ":train: ml: doc tests"
if: '!(build.pull_request.labels includes "docs-go")'
tags:
- train
- tune
- doc
instance_type: large
parallelism: 2
commands:
# doc tests
- bazel run //ci/ray_ci:test_in_docker -- python/ray/... //doc/... ml
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}"
--python-version 3.10 --build-name mlbuild-py3.10
--only-tags doctest
--except-tags gpu
--parallelism-per-worker 3
# doc examples
- bazel run //ci/ray_ci:test_in_docker -- //doc/... ml
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}"
--python-version 3.10 --build-name mlbuild-py3.10
--except-tags gpu,post_wheel_build,doctest,highly_parallel
--parallelism-per-worker 3
--skip-ray-installation
depends_on: [ "mlbuild-multipy(python=3.10)", "forge" ]
- label: ":train: ml: lightning 1.x compatibility tests"
tags:
- train_gpu
- gpu
instance_type: gpu-large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/train/... ml
--build-name mllightning1gpubuild-py3.10 --python-version 3.10
--only-tags ptl_v1
depends_on: [ "mllightning1gpubuild", "forge" ]
- label: ":train: ml: flaky tests"
key: ml_flaky_tests
tags:
- train
- flaky
- skip-on-premerge
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //... ml --run-flaky-tests
--python-version 3.10 --build-name mlbuild-py3.10
--parallelism-per-worker 2
--except-tags gpu,needs_credentials,train_v2_gpu,data_integration,torchft
depends_on: [ "mlbuild-multipy(python=3.10)", "forge" ]
soft_fail: true
- label: ":train: ml: flaky authentication tests"
tags:
- train
- branch
- skip-on-premerge
- oss
instance_type: medium
commands:
- $(python ci/env/setup_credentials.py)
- bazel run //ci/ray_ci:test_in_docker -- //... ml --run-flaky-tests
--python-version 3.10 --build-name mlbuild-py3.10
--parallelism-per-worker 3
--only-tags needs_credentials
--test-env=WANDB_API_KEY --test-env=COMET_API_KEY
depends_on: [ "mlbuild-multipy(python=3.10)", "forge" ]
soft_fail: true
- label: ":bullettrain_front: ml: train v2 torch trainer flaky tests (torchft image)"
key: ml_torch_trainer_flaky_tests
tags:
- train
- flaky
- skip-on-premerge
instance_type: small
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/train/... ml --run-flaky-tests
--python-version 3.10 --build-name mltorchft-py3.10
--only-tags torchft
--except-tags needs_credentials,data_integration
depends_on: [ "mltorchft", "forge" ]
soft_fail: true
- label: ":train: ml: train gpu flaky tests"
key: ml_flaky_gpu_tests
tags:
- train
- skip-on-premerge
- gpu
instance_type: gpu-large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //... ml --run-flaky-tests
--parallelism-per-worker 2
--python-version 3.10 --build-name mlgpubuild-py3.10
--only-tags gpu,train_v2_gpu
--except-tags data_integration
depends_on: [ "mlgpubuild-multipy(python=3.10)", "forge" ]
soft_fail: true
+85
View File
@@ -0,0 +1,85 @@
group: others
depends_on:
- forge
steps:
# docs
- name: doctestbuild
wanda: ci/docker/doctest.build.wanda.yaml
depends_on: oss-ci-base_build-multipy(python=3.10)
env:
PYTHON: "3.10"
tags: cibase
- label: doc tests
tags: python
instance_type: large
commands:
# Disable test DB to avoid any hidden failures going forward.
- RAYCI_DISABLE_TEST_DB=1 bazel run //ci/ray_ci:test_in_docker -- //python/ray/... //doc/... none
--build-name doctestbuild
--only-tags doctest
--except-tags gpu
--parallelism-per-worker 3
--python-version 3.10
depends_on:
- doctestbuild
- ray-core-build(python=3.10)
- ray-dashboard-build
# java
- label: ":java: java tests"
tags: java
instance_type: medium
commands:
# Java tests need the C++ API for multi-langauge worker tests.
- bazel run //ci/ray_ci:test_in_docker -- //... core --build-type multi-lang --build-only
--python-version 3.10 --build-name corebuild-py3.10
- docker run -i --rm --volume /tmp/artifacts:/artifact-mount --shm-size=2.5gb
"$${RAYCI_WORK_REPO}":"$${RAYCI_BUILD_ID}"-corebuild-py3.10 /bin/bash -iecuo pipefail
"./java/test.sh"
depends_on: corebuild-multipy(python=3.10)
# bot
- label: ":robot_face: CI weekly green metric"
tags:
- skip-on-premerge
- oss
if: build.branch == "master"
instance_type: small
commands:
- bazel run //ci/ray_ci/automation:weekly_green_metric -- --production
- label: ":robot_face: {{matrix}} microcheck test coverage"
tags:
- skip-on-premerge
- oss
if: build.branch == "master"
instance_type: small
commands:
- bazel run //ci/ray_ci/automation:determine_microcheck_tests -- {{matrix}} 100 --test-prefix linux:__ --production
# we use master branch to determine microcheck tests for darwin and windows, because darwin and windows tests do not run on premerge branches
- bazel run //ci/ray_ci/automation:determine_microcheck_tests -- {{matrix}} 100 --test-prefix darwin:__ --consider-master-branch --production
- bazel run //ci/ray_ci/automation:determine_microcheck_tests -- {{matrix}} 100 --test-prefix windows:__ --consider-master-branch --production
matrix:
- "core"
- "serve"
- "data"
- "ml"
- "rllib"
- "ci"
- name: fossa-base
wanda: ci/docker/fossa.wanda.yaml
depends_on: forge
- label: "fossa analyze"
key: fossa-analyze
tags:
- skip-on-premerge
- fossa
- oss
instance_type: small
commands:
- bash ci/fossa/analyze.sh
depends_on: fossa-base
job_env: fossa-base
@@ -0,0 +1,10 @@
#!/bin/bash
set -euo pipefail
set -x
if [[ "${BUILDKITE_COMMIT}" != "$(git rev-parse HEAD)" ]]; then
echo "Commit hash mismatch"
exit 1
else echo "Commit hash matches"; fi
+26
View File
@@ -0,0 +1,26 @@
name: ray-release-automation
artifacts_bucket: ray-ci-artifact-pr-public
ci_temp: s3://ray-ci-artifact-pr-public/ci-temp/
ci_work_repo: 029272617770.dkr.ecr.us-west-2.amazonaws.com/rayproject/citemp
forge_prefix: cr.ray.io/rayproject/
builder_queues:
builder: builder_queue_pr
builder-arm64: builder_queue_arm64_pr
builder-windows: builder_queue_windows_pr
runner_queues:
default: runner_queue_small_pr
medium-arm64: runner_queue_arm64_medium_pr
macos: macos
macos-arm64: macos-pr-arm64
windows: windows_queue_pr
small_branch: runner_queue_small_branch
builder_priority: 5
runner_priority: 5
buildkite_dirs:
- .buildkite/release-automation
env:
BUILDKITE_BAZEL_CACHE_URL: https://bazel-cache-dev.s3.us-west-2.amazonaws.com
RAYCI_SKIP_UPLOAD: "true"
skip_tags:
- disabled
allow_trigger_step: true
@@ -0,0 +1,8 @@
group: forge
steps:
- name: forge
wanda: .buildkite/release-automation/forge_x86_64.wanda.yaml
- name: forge-arm64
wanda: .buildkite/release-automation/forge_arm64.wanda.yaml
instance_type: builder-arm64
@@ -0,0 +1,55 @@
# syntax=docker/dockerfile:1.3-labs
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN <<EOF
#!/bin/bash
set -euo pipefail
apt-get update
apt-get upgrade -y
apt-get install -y curl zip clang-14
ln -s /usr/bin/clang-14 /usr/bin/clang
# Install miniforge3
curl -fsSL https://github.com/conda-forge/miniforge/releases/download/25.3.0-1/Miniforge3-25.3.0-1-Linux-aarch64.sh > /tmp/miniforge3.sh
bash /tmp/miniforge3.sh -b -u -p /usr/local/bin/miniforge3
rm /tmp/miniforge3.sh
/usr/local/bin/miniforge3/bin/conda init bash
# Install Bazelisk
curl -fsSL https://github.com/bazelbuild/bazelisk/releases/download/v1.19.0/bazelisk-linux-arm64 --output /usr/local/bin/bazelisk
chmod +x /usr/local/bin/bazelisk
ln -s /usr/local/bin/bazelisk /usr/local/bin/bazel
# Install uv
curl -fsSL https://astral.sh/uv/install.sh | env UV_UNMANAGED_INSTALL="/usr/local/bin" sh
mkdir -p /usr/local/python
# Install Python using uv
UV_PYTHON_VERSION=3.10
uv python install --install-dir /usr/local/python "$UV_PYTHON_VERSION"
export UV_PYTHON_INSTALL_DIR=/usr/local/python
# Make Python from uv the default by creating symlinks
UV_PYTHON_BIN="$(uv python find --no-project "$UV_PYTHON_VERSION")"
echo "uv python binary location: $UV_PYTHON_BIN"
ln -s "$UV_PYTHON_BIN" "/usr/local/bin/python${UV_PYTHON_VERSION}"
ln -s "$UV_PYTHON_BIN" /usr/local/bin/python3
ln -s "$UV_PYTHON_BIN" /usr/local/bin/python
# As a convention, we pin all python packages to a specific version. This
# is to to make sure we can control version upgrades through code changes.
uv pip install --system pip==25.2 cffi==1.16.0
EOF
ENV CC=clang
ENV CXX=clang++-14
CMD ["echo", "ray release-automation forge"]
@@ -0,0 +1,4 @@
name: "forge-arm64"
froms:
- ubuntu:22.04
dockerfile: .buildkite/release-automation/forge_arm64.Dockerfile
@@ -0,0 +1,66 @@
# syntax=docker/dockerfile:1.3-labs
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN <<EOF
#!/bin/bash
set -euo pipefail
apt-get update
apt-get upgrade -y
apt-get install -y curl zip clang-14 git
# Needs to be synchronized to the host group id as we map /var/run/docker.sock
# into the container.
addgroup --gid 993 docker
addgroup --gid 992 docker1 # docker group on buildkite AMI as of 2025-06-07
ln -s /usr/bin/clang-14 /usr/bin/clang
# Install miniforge3
curl -fsSL https://github.com/conda-forge/miniforge/releases/download/25.3.0-1/Miniforge3-25.3.0-1-Linux-x86_64.sh > /tmp/miniforge3.sh
bash /tmp/miniforge3.sh -b -u -p /usr/local/bin/miniforge3
rm /tmp/miniforge3.sh
/usr/local/bin/miniforge3/bin/conda init bash
# Install Bazelisk
curl -fsSL https://github.com/bazelbuild/bazelisk/releases/download/v1.19.0/bazelisk-linux-amd64 --output /usr/local/bin/bazelisk
chmod +x /usr/local/bin/bazelisk
ln -s /usr/local/bin/bazelisk /usr/local/bin/bazel
# Install uv
curl -fsSL https://astral.sh/uv/install.sh | env UV_UNMANAGED_INSTALL="/usr/local/bin" sh
mkdir -p /usr/local/python
# Install Python using uv
UV_PYTHON_VERSION=3.10
uv python install --install-dir /usr/local/python "$UV_PYTHON_VERSION"
export UV_PYTHON_INSTALL_DIR=/usr/local/python
# Make Python from uv the default by creating symlinks
UV_PYTHON_BIN="$(uv python find --no-project "$UV_PYTHON_VERSION")"
echo "uv python binary location: $UV_PYTHON_BIN"
ln -s "$UV_PYTHON_BIN" "/usr/local/bin/python${UV_PYTHON_VERSION}"
ln -s "$UV_PYTHON_BIN" /usr/local/bin/python3
ln -s "$UV_PYTHON_BIN" /usr/local/bin/python
# As a convention, we pin all python packages to a specific version. This
# is to to make sure we can control version upgrades through code changes.
uv pip install --system pip==25.2 cffi==1.16.0
# A non-root user. Use 2000, which is the same as our buildkite agent VM uses.
adduser --home /home/forge --uid 2000 forge --gid 100
usermod -a -G docker forge
usermod -a -G docker1 forge
EOF
USER forge
ENV CC=clang
ENV CXX=clang++-14
CMD ["echo", "ray release-automation forge"]
@@ -0,0 +1,4 @@
name: "forge"
froms:
- ubuntu:22.04
dockerfile: .buildkite/release-automation/forge_x86_64.Dockerfile
@@ -0,0 +1,137 @@
group: Pre-release checks
depends_on:
- forge
steps:
- block: "Run pre-release checks"
if: build.env("RAY_VERSION") != null
key: block-pre-release-checks
depends_on: []
- label: "Check release blockers"
key: check-release-blockers
instance_type: small_branch
commands:
- bazel run //ci/ray_ci/automation:weekly_green_metric -- --check
- label: "Check commit hash"
key: check-commit-hash
commands:
- bash .buildkite/release-automation/check-commit-hash.sh
- label: "Build update version binary"
key: build-update-version-zip
instance_type: default
commands:
- bazel build --build_python_zip --incompatible_use_python_toolchains=false --python_path=python //ci/ray_ci/automation:update_version
- cp bazel-bin/ci/ray_ci/automation/update_version /artifact-mount/
- label: "Trigger Postmerge test"
if: build.env("RAYCI_WEEKLY_RELEASE_NIGHTLY") != "1"
trigger: "postmerge"
key: trigger-postmerge
depends_on: check-commit-hash
build:
commit: "${BUILDKITE_COMMIT}"
branch: "${BUILDKITE_BRANCH}"
message: "Triggered by release-automation build #${BUILDKITE_BUILD_NUMBER}"
env:
RAYCI_RELEASE: 1
RAYCI_DISABLE_TEST_DB: "1"
- label: "Trigger Postmerge nightly build & test"
if: build.env("RAYCI_WEEKLY_RELEASE_NIGHTLY") == "1"
trigger: "postmerge"
key: trigger-postmerge-nightly
depends_on: check-commit-hash
build:
commit: "${BUILDKITE_COMMIT}"
branch: "${BUILDKITE_BRANCH}"
message: "Triggered by release-automation build #${BUILDKITE_BUILD_NUMBER}"
env:
RAYCI_RELEASE: "1"
RAYCI_SCHEDULE: "nightly"
RAYCI_DISABLE_TEST_DB: "1"
- label: "Check commit in nightly images"
key: check-ray-commit
if: build.branch !~ /^releases\// && build.env("RAYCI_WEEKLY_RELEASE_NIGHTLY") == "1"
depends_on: trigger-postmerge-nightly
allow_dependency_failure: true
commands:
- bazel run //ci/ray_ci/automation:check_nightly_ray_commit -- --ray_type=ray --expected_commit="${BUILDKITE_COMMIT}"
- label: "Trigger :kubernetes: Kuberay CI Tests"
if: build.env("RAYCI_WEEKLY_RELEASE_NIGHTLY") == "1"
trigger: "ray-ecosystem-ci-kuberay-ci"
key: trigger-kuberay
depends_on: check-ray-commit
build:
branch: "release-1.6"
message: "Triggered by release-automation build #${BUILDKITE_BUILD_NUMBER}"
env:
# KubeRay CI will pull an image based on this commit and the current date
RAY_NIGHTLY_COMMIT: "${BUILDKITE_COMMIT}"
IS_FROM_RAY_RELEASE_AUTOMATION: "1"
- label: "Trigger Postmerge MacOS test"
key: trigger-postmerge-macos
trigger: "postmerge-macos"
depends_on: check-commit-hash
build:
commit: "${BUILDKITE_COMMIT}"
branch: "${BUILDKITE_BRANCH}"
message: "Triggered by release-automation build #${BUILDKITE_BUILD_NUMBER}"
env:
RAYCI_RELEASE: "1"
RAYCI_DISABLE_TEST_DB: "1"
- block: "Trigger Release nightly test"
if: build.env("RAYCI_WEEKLY_RELEASE_NIGHTLY") != "1"
key: block-release-nightly-test
depends_on: check-commit-hash
- label: "Trigger Release nightly test"
key: trigger-release-nightly
trigger: "release"
depends_on: block-release-nightly-test
build:
commit: "${BUILDKITE_COMMIT}"
branch: "${BUILDKITE_BRANCH}"
message: "Nightly test - triggered by release-automation build #${BUILDKITE_BUILD_NUMBER}"
env:
AUTOMATIC: 1
RELEASE_FREQUENCY: "nightly"
- block: "Trigger Release nightly-3x test"
if: build.env("RAYCI_WEEKLY_RELEASE_NIGHLTY_3X") != "1"
key: block-release-nightly-3x-test
depends_on: check-commit-hash
- label: "Trigger Release nightly-3x test"
key: trigger-release-nightly-3x
depends_on: block-release-nightly-3x-test
trigger: "release"
build:
commit: "${BUILDKITE_COMMIT}"
branch: "${BUILDKITE_BRANCH}"
message: "Nightly-3x test - triggered by release-automation build #${BUILDKITE_BUILD_NUMBER}"
env:
AUTOMATIC: 1
RELEASE_FREQUENCY: "nightly-3x"
- block: "Trigger Release weekly test"
if: build.env("RAYCI_WEEKLY_RELEASE_WEEKLY") != "1"
key: block-release-weekly-test
depends_on: check-commit-hash
- label: "Trigger Release weekly test"
key: trigger-release-weekly
trigger: "release"
depends_on: block-release-weekly-test
build:
commit: "${BUILDKITE_COMMIT}"
branch: "${BUILDKITE_BRANCH}"
message: "Weekly test - triggered by release-automation build #${BUILDKITE_BUILD_NUMBER}"
env:
AUTOMATIC: 1
RELEASE_FREQUENCY: "weekly"
@@ -0,0 +1,26 @@
#!/bin/bash
set -euo pipefail
if [[ -z "${RAY_VERSION:-}" ]]; then
RAY_VERSION="$(python3 python/ray/_version.py | cut -d' ' -f1)"
if [[ "${RAY_VERSION}" =~ dev0 ]]; then
echo "RAY_VERSION is not set, value is ${RAY_VERSION}" >/dev/stderr
exit 1
fi
fi
if [[ "${RAY_COMMIT:-}" == "" ]]; then
if [[ "${BUILDKITE_COMMIT:-}" == "" ]]; then
echo "neither BUILDKITE_COMMIT nor RAY_COMMIT is set" >/dev/stderr
exit 1
fi
RAY_COMMIT="${BUILDKITE_COMMIT:-}"
fi
export RAY_VERSION
export RAY_COMMIT
# Print it out for information.
echo "RAY_VERSION=$RAY_VERSION"
echo "RAY_COMMIT=$RAY_COMMIT"
+37
View File
@@ -0,0 +1,37 @@
#!/bin/bash
set -euo pipefail
set -x
# Sets RAY_COMMIT and RAY_VERSION
source .buildkite/release-automation/set-ray-version.sh
if [[ "${PYTHON_VERSION}" == "" ]]; then
echo "Python version not set" >/dev/stderr
exit 1
fi
export PYTHON_VERSION
export PATH="/usr/local/bin/miniforge3/bin:${PATH}"
source "/usr/local/bin/miniforge3/etc/profile.d/conda.sh"
conda create -n rayio python="${PYTHON_VERSION}" -y
conda activate rayio
pip install \
--index-url https://test.pypi.org/simple/ \
--extra-index-url https://pypi.org/simple \
"ray[cpp]==${RAY_VERSION}"
(
cd release/util
python sanity_check.py --ray_version="${RAY_VERSION}" --ray_commit="${RAY_COMMIT}"
)
(
cd release/util
bash sanity_check_cpp.sh
)
+72
View File
@@ -0,0 +1,72 @@
#!/bin/bash
set -euo pipefail
set -x
# TODO(#54047): Python 3.13 is skipped due to the bug
# we should re-enable it when the bug is fixed.
PYTHON_VERSIONS=("3.10" "3.11" "3.12")
BAZELISK_VERSION="v1.16.0"
# Sets RAY_VERSION and RAY_COMMIT
source .buildkite/release-automation/set-ray-version.sh
install_bazel() {
URL="https://github.com/bazelbuild/bazelisk/releases/download/${BAZELISK_VERSION}/bazelisk-darwin-arm64"
TARGET="$TMP_DIR/bin/bazel"
curl -sfL -R -o "${TARGET}" "${URL}"
chmod +x "${TARGET}"
}
install_miniforge() {
# Install miniforge3 based on the architecture used
mkdir -p "$TMP_DIR/miniforge3"
curl -sfL https://github.com/conda-forge/miniforge/releases/download/25.3.0-1/Miniforge3-25.3.0-1-MacOSX-arm64.sh -o "$TMP_DIR/miniforge3/miniforge.sh"
bash "$TMP_DIR/miniforge3/miniforge.sh" -b -u -p "$TMP_DIR/miniforge3"
rm -rf "$TMP_DIR/miniforge3/miniforge.sh"
# Initialize conda. This replaces calling `conda init bash`.
# Conda init command requires a shell restart which should not be done on BK.
source "$TMP_DIR/miniforge3/etc/profile.d/conda.sh"
}
run_sanity_check() {
local PYTHON_VERSION="$1"
conda create -n "rayio_${PYTHON_VERSION}" python="${PYTHON_VERSION}" -y
conda activate "rayio_${PYTHON_VERSION}"
pip install \
--index-url https://test.pypi.org/simple/ \
--extra-index-url https://pypi.org/simple \
"ray[cpp]==${RAY_VERSION}"
(
cd release/util
python sanity_check.py --ray_version="${RAY_VERSION}" --ray_commit="${RAY_COMMIT}"
bash sanity_check_cpp.sh
)
conda deactivate
}
_clean_up() {
bazel clean || true
rm -rf "$TMP_DIR"
}
# Create tmp directory unique for the run
TMP_DIR="$(mktemp -d "$HOME/tmp.XXXXXXXXXX")"
mkdir -p "$TMP_DIR/bin"
export PATH="$TMP_DIR/bin:$PATH"
trap _clean_up EXIT
install_miniforge
install_bazel
# Install Ray & run sanity checks for each python version
for V in "${PYTHON_VERSIONS[@]}"; do
run_sanity_check "$V"
done
@@ -0,0 +1,96 @@
group: Upload & Validate wheels
steps:
- block: "Upload wheels from S3 to TestPyPI"
key: block-upload-wheels-testpypi
depends_on:
- forge
- label: "Upload wheels from S3 to TestPyPI"
key: upload-wheels-testpypi
depends_on:
- block-upload-wheels-testpypi
job_env: forge
instance_type: small_branch
commands:
- export RAY_VERSION="$RAY_VERSION"
- export RAY_COMMIT="$RAY_COMMIT"
- source .buildkite/release-automation/set-ray-version.sh
- bazel run //ci/ray_ci/automation:upload_wheels_pypi --
--ray_version="$$RAY_VERSION" --commit_hash="$$RAY_COMMIT"
--pypi_env=test
- block: "Download & validate Ray wheels from TestPyPI Linux x86_64"
key: block-validate-linux-x86_64-wheels
depends_on:
- forge
- label: "Linux x86_64 Python {{matrix}}"
key: validate-linux-x86_64-wheels
job_env: forge
depends_on:
- block-validate-linux-x86_64-wheels
commands:
- export PYTHON_VERSION={{matrix}}
- export RAY_VERSION="$RAY_VERSION"
- export RAY_COMMIT="$RAY_COMMIT"
- bash -i .buildkite/release-automation/verify-linux-wheels.sh
matrix:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- "3.14"
- block: "Download & validate Ray wheels from TestPyPI Linux arm64"
key: block-validate-linux-arm64-wheels
depends_on:
- forge-arm64
- label: "Linux arm64 Python {{matrix}}"
key: validate-linux-arm64-wheels
instance_type: medium-arm64
job_env: forge-arm64
depends_on:
- block-validate-linux-arm64-wheels
commands:
- export PYTHON_VERSION={{matrix}}
- export RAY_VERSION="$RAY_VERSION"
- export RAY_COMMIT="$RAY_COMMIT"
- bash -i .buildkite/release-automation/verify-linux-wheels.sh
matrix:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- "3.14"
- block: "Download & validate Ray wheels from TestPyPI Mac"
key: block-validate-macos-wheels
depends_on: []
- label: "MacOS arm64"
key: validate-macos-arm64-wheels
depends_on:
- block-validate-macos-wheels
job_env: MACOS
instance_type: macos-arm64
commands:
- bash .buildkite/release-automation/verify-macos-wheels.sh
- block: "Upload wheels to PyPI"
key: block-upload-wheels-pypi
depends_on: []
- label: "Upload wheels to PyPI"
key: upload-wheels-pypi
depends_on:
- block-upload-wheels-pypi
job_env: forge
instance_type: small_branch
commands:
- export RAY_VERSION="$RAY_VERSION"
- export RAY_COMMIT="$RAY_COMMIT"
- source .buildkite/release-automation/set-ray-version.sh
- bazel run //ci/ray_ci/automation:upload_wheels_pypi --
--ray_version="$$RAY_VERSION" --commit_hash="$$RAY_COMMIT"
--pypi_env=prod
+1
View File
@@ -0,0 +1 @@
../_forge.rayci.yml
+1
View File
@@ -0,0 +1 @@
../_images.rayci.yml
+1
View File
@@ -0,0 +1 @@
../_wheel-build.rayci.yml
+238
View File
@@ -0,0 +1,238 @@
group: release build
steps:
- name: raycpubaseextra-testdeps
label: "wanda: ray.py{{array.python}}.cpu.base-extra-testdeps"
wanda: docker/base-extra-testdeps/cpu.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
env:
PYTHON_VERSION: "{{array.python}}"
IMAGE_TYPE: "ray"
depends_on:
- raycpubaseextra($)
- name: raycudabaseextra-testdeps
label: "wanda: ray.py{{array.python}}.cu{{array.cuda}}.base-extra-testdeps"
wanda: docker/base-extra-testdeps/cuda.wanda.yaml
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
cuda:
- "12.3.2-cudnn9"
- "13.0.0-cudnn"
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
IMAGE_TYPE: "ray"
depends_on:
- raycudabaseextra($)
- name: ray-llmbaseextra-testdeps
label: "wanda: ray.py{{array.python}}.llm.base-extra-testdeps (cuda {{array.cuda}})"
wanda: docker/base-extra-testdeps/cuda.wanda.yaml
array:
python:
- "3.12"
cuda:
- "13.0.0-cudnn"
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
IMAGE_TYPE: "ray-llm"
depends_on:
- ray-llmbaseextra($)
- name: ray-mlcudabaseextra-testdeps
label: "wanda: ray.py{{array.python}}.cu{{array.cuda}}.ml.base-extra-testdeps"
wanda: docker/base-extra-testdeps/cuda.wanda.yaml
array:
python:
- "3.10"
cuda:
- "12.1.1-cudnn8"
env:
PYTHON_VERSION: "{{array.python}}"
CUDA_VERSION: "{{array.cuda}}"
IMAGE_TYPE: "ray-ml"
depends_on:
- ray-mlcudabaseextra($)
- name: ray-anyscale-cpu-build
label: "wanda: ray-anyscale py{{array.python}} cpu"
wanda: ci/docker/ray-anyscale-cpu.wanda.yaml
env_file: rayci.env
array:
python:
# This list should be kept in sync with the list of supported Python in
# release test suite
- "3.10"
- "3.11"
- "3.12"
- "3.13"
env:
PYTHON_VERSION: "{{array.python}}"
ARCH_SUFFIX: ""
tags:
- oss
depends_on:
- ray-wheel-build($)
- raycpubaseextra-testdeps($)
- name: ray-anyscale-cuda-build
label: "wanda: ray-anyscale py{{array.python}} {{array.gpu}}"
wanda: ci/docker/ray-anyscale-cuda.wanda.yaml
env_file: rayci.env
array:
gpu:
- "cu12.3.2-cudnn9"
- "cu13.0.0-cudnn"
python:
# This list should be kept in sync with the list of supported Python in
# release test suite
- "3.10"
- "3.11"
- "3.12"
- "3.13"
env:
PYTHON_VERSION: "{{array.python}}"
GPU: "{{array.gpu}}"
ARCH_SUFFIX: ""
tags:
- oss
depends_on:
- ray-wheel-build($)
- raycudabaseextra-testdeps($)
- label: ":crane: publish: ray-anyscale py{{array.python}} cpu"
key: anyscalecpubuild
instance_type: release-medium
mount_buildkite_agent: true
tags:
- oss
commands:
- bazel run //ci/ray_ci/automation:push_release_test_image --
--python-version {{array.python}}
--platform cpu
--image-type ray
--upload
depends_on:
- forge
- ray-anyscale-cpu-build($)
array:
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- label: ":crane: publish: ray-anyscale py{{array.python}} {{array.gpu}}"
key: anyscalecudabuild
instance_type: release-medium
mount_buildkite_agent: true
tags:
- oss
commands:
- bazel run //ci/ray_ci/automation:push_release_test_image --
--python-version {{array.python}}
--platform {{array.gpu}}
--image-type ray
--upload
depends_on:
- forge
- ray-anyscale-cuda-build($)
array:
gpu:
- cu12.3.2-cudnn9
- cu13.0.0-cudnn
python:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- name: ray-llm-anyscale-cuda-build
label: "wanda: ray-llm-anyscale py{{array.python}} {{array.gpu}}"
wanda: ci/docker/ray-llm-anyscale-cuda.wanda.yaml
env_file: rayci.env
array:
gpu:
- "cu13.0.0-cudnn"
python:
- "3.12"
env:
PYTHON_VERSION: "{{array.python}}"
GPU: "{{array.gpu}}"
ARCH_SUFFIX: ""
tags:
- oss
depends_on:
- ray-wheel-build($)
- ray-llmbaseextra-testdeps($)
- label: ":crane: publish: ray-llm-anyscale py{{array.python}} {{array.gpu}}"
key: anyscalellmbuild
instance_type: release-medium
mount_buildkite_agent: true
tags:
- oss
commands:
- bazel run //ci/ray_ci/automation:push_release_test_image --
--python-version {{array.python}}
--platform {{array.gpu}}
--image-type ray-llm
--upload
depends_on:
- forge
- ray-llm-anyscale-cuda-build($)
array:
gpu:
- cu13.0.0-cudnn
python:
- "3.12"
- name: ray-ml-anyscale-cuda-build
label: "wanda: ray-ml-anyscale py{{array.python}} {{array.gpu}}"
wanda: ci/docker/ray-ml-anyscale-cuda.wanda.yaml
env_file: rayci.env
array:
gpu:
- "cu12.1.1-cudnn8"
python:
# This list should be kept in sync with the list of supported Python in
# release test suite
- "3.10"
env:
PYTHON_VERSION: "{{array.python}}"
GPU: "{{array.gpu}}"
ARCH_SUFFIX: ""
tags:
- oss
depends_on:
- ray-wheel-build($)
- ray-mlcudabaseextra-testdeps($)
- label: ":crane: publish: ray-ml-anyscale py{{array.python}} cu12.1.1-cudnn8"
key: anyscalemlbuild
instance_type: release-medium
mount_buildkite_agent: true
tags:
- oss
commands:
- bazel run //ci/ray_ci/automation:push_release_test_image --
--python-version {{array.python}}
--platform cu12.1.1-cudnn8
--image-type ray-ml
--upload
depends_on:
- forge
- ray-ml-anyscale-cuda-build($)
array:
python:
- "3.10"
+25
View File
@@ -0,0 +1,25 @@
name: ray-release
artifacts_bucket: ray-ci-artifact-branch-public
ci_temp: s3://ray-ci-artifact-branch-public/ci-temp/
ci_work_repo: 029272617770.dkr.ecr.us-west-2.amazonaws.com/rayproject/citemp
forge_prefix: cr.ray.io/rayproject/
builder_queues:
builder: builder_queue_branch
runner_queues:
release: release_queue_small
release-medium: release_queue_medium
buildkite_dirs:
- .buildkite/release
env:
BUILDKITE_BAZEL_CACHE_URL: https://bazel-cache-dev.s3.us-west-2.amazonaws.com
RAYCI_SKIP_UPLOAD: "true"
hook_env_keys:
- RAYCI_CHECKOUT_DIR
skip_tags:
- disabled
- skip-on-release-tests
build_env_keys:
- AUTOMATIC
- RELEASE_FREQUENCY
docker_plugin:
allow_mount_buildkite_agent: true
+73
View File
@@ -0,0 +1,73 @@
#!/bin/bash
set -euo pipefail
if [[ ${BUILDKITE_COMMIT} == "HEAD" ]]; then
BUILDKITE_COMMIT="$(git rev-parse HEAD)"
export BUILDKITE_COMMIT
fi
# Get build ID from environment variables
BUILD_ID="${RAYCI_BUILD_ID:-}"
if [[ -z "${BUILD_ID}" ]]; then
if [[ -n "${BUILDKITE_BUILD_ID:-}" ]]; then
# Generate SHA256 hash of BUILDKITE_BUILD_ID and take first 8 chars
BUILD_ID=$(echo -n "${BUILDKITE_BUILD_ID}" | sha256sum | cut -c1-8)
fi
fi
export RAYCI_BUILD_ID="${BUILD_ID}"
echo "RAYCI_BUILD_ID: ${RAYCI_BUILD_ID}"
if [[ "${AUTOMATIC:-0}" == "1" && -n "${RAYCI_SELECT:-}" ]]; then
echo "Skipping custom image build and test init because RAYCI_SELECT is set"
echo "RAYCI_SELECT: ${RAYCI_SELECT}"
exit 0
fi
aws ecr get-login-password --region us-west-2 | \
docker login --username AWS --password-stdin 029272617770.dkr.ecr.us-west-2.amazonaws.com
bash release/gcloud_docker_login.sh release/aws2gce_iam.json
export PATH="${PWD}/google-cloud-sdk/bin:$PATH"
echo "--- Install Bazel"
curl -sSfLo /tmp/bazel https://github.com/bazelbuild/bazelisk/releases/download/v1.19.0/bazelisk-linux-amd64
chmod +x /tmp/bazel
echo "--- Install uv"
UV_PYTHON_VERSION=3.10
curl -LsSf https://astral.sh/uv/install.sh | sh
UV_BIN="${HOME}/.local/bin/uv"
"${UV_BIN}" python install "${UV_PYTHON_VERSION}"
UV_PYTHON_BIN="$("${UV_BIN}" python find --no-project "${UV_PYTHON_VERSION}")"
echo "--- Generate custom build steps"
if [[ "${AUTOMATIC:-0}" == "1" && "${BUILDKITE_BRANCH}" == "master" ]]; then
export REPORT_TO_RAY_TEST_DB=1
fi
RUN_FLAGS=()
if [[ "${AUTOMATIC:-0}" == "0" || "${BUILDKITE_BRANCH}" == "releases/"* ]]; then
RUN_FLAGS+=(--run-jailed-tests)
fi
if [[ "${BUILDKITE_BRANCH}" != "releases/"* ]]; then
RUN_FLAGS+=(--run-unstable-tests)
fi
/tmp/bazel build --python_path="${UV_PYTHON_BIN}" \
--build_python_zip --enable_runfiles \
--incompatible_use_python_toolchains=false \
//release:custom_image_build_and_test_init
BUILD_WORKSPACE_DIRECTORY="${PWD}" bazel-bin/release/custom_image_build_and_test_init \
"${RUN_FLAGS[@]}" \
--custom-build-jobs-output-file .buildkite/release/custom_build_jobs.rayci.yaml \
--test-jobs-output-file .buildkite/release/release_tests.json \
--rayci-select-output-file /tmp/rayci_select.txt \
--upload-to-buildkite
+273
View File
@@ -0,0 +1,273 @@
group: rllib tests
depends_on:
- forge
- ray-core-build(*)
- ray-dashboard-build
steps:
# builds
- name: rllibbuild-multipy
label: "wanda: rllibbuild-py{{array.python}}"
wanda: ci/docker/rllib.build.wanda.yaml
tags: cibase
array:
python:
- "3.10"
- "3.12"
env:
PYTHON: "{{array.python}}"
BASE_TYPE: "ml"
BUILD_VARIANT: "build"
RAYCI_IS_GPU_BUILD: "false"
depends_on: oss-ci-base_ml-multipy($)
- name: rllibgpubuild
wanda: ci/docker/rllib.build.wanda.yaml
depends_on: oss-ci-base_gpu-multipy(python=3.12)
env:
PYTHON: "3.12"
BASE_TYPE: "gpu"
BUILD_VARIANT: "gpubuild"
RAYCI_IS_GPU_BUILD: "true"
tags: cibase
# tests
- label: ":brain: rllib: component testing"
tags: rllib_directly
parallelism: 4
instance_type: large
commands:
# All tests to with tags for components without gpu or multi_gpu tags
- bazel run //ci/ray_ci:test_in_docker -- //rllib/... rllib
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--only-tags env,evaluation,models,offline,policy,utils,algorithms,callbacks,core
--except-tags gpu,multi_gpu,manual
--test-env RAY_USE_MULTIPROCESSING_CPU_COUNT=1
--build-name rllibbuild-py3.12
--python-version 3.12
depends_on: rllibbuild-multipy(python=3.12)
- label: ":brain: rllib: examples"
tags: rllib
parallelism: 6
instance_type: large
commands:
# Tests all examples without gpu, multi_gpu or examples_use_all_cores tag
- bazel run //ci/ray_ci:test_in_docker -- //rllib/... rllib
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 2
--only-tags examples
--except-tags gpu,multi_gpu,manual,examples_use_all_core
--test-env RAY_USE_MULTIPROCESSING_CPU_COUNT=1
--build-name rllibbuild-py3.12
--python-version 3.12
# Tests all examples without gpu or multi_gpu
- bazel run //ci/ray_ci:test_in_docker -- //rllib/... rllib
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}"
--only-tags examples_use_all_core
--except-tags gpu,multi_gpu,manual
--test-env RAY_USE_MULTIPROCESSING_CPU_COUNT=1
--build-name rllibbuild-py3.12
--python-version 3.12
--skip-ray-installation # reuse the same docker image as the previous run
depends_on: rllibbuild-multipy(python=3.12)
- label: ":brain: rllib: learning tests"
tags: rllib
parallelism: 5
instance_type: large
commands:
# learning tests without a gpu
- bazel run //ci/ray_ci:test_in_docker -- //rllib/... rllib
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--only-tags learning_tests
--except-tags gpu,multi_gpu,learning_tests_use_all_core,manual
--test-arg --framework=torch
--build-name rllibbuild-py3.12
--python-version 3.12
# learning tests without a gpu but use all cores
- bazel run //ci/ray_ci:test_in_docker -- //rllib/... rllib
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}"
--only-tags learning_tests_use_all_core
--except-tags gpu,multi_gpu,manual
--test-arg --framework=torch
--build-name rllibbuild-py3.12
--python-version 3.12
--skip-ray-installation # reuse the same docker image as the previous run
depends_on: rllibbuild-multipy(python=3.12)
- label: ":brain: rllib: gpu tests"
tags:
- rllib_gpu
- gpu
- skip-on-microcheck
parallelism: 5
instance_type: gpu
commands:
# All gpu tagged tests
- bazel run //ci/ray_ci:test_in_docker -- //rllib/... rllib
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}"
--only-tags gpu
--except-tags multi_gpu,manual
--test-env=RAY_USE_MULTIPROCESSING_CPU_COUNT=1
--test-env=RLLIB_NUM_GPUS=1
--build-name rllibgpubuild-py3.12
--python-version 3.12
depends_on: rllibgpubuild
- label: ":brain: rllib: multi-gpu tests"
tags:
- rllib_gpu
- gpu
- skip-on-microcheck
parallelism: 5
instance_type: gpu-large
commands:
# All multi-gpu tagged tests (including all learning, examples and component testings)
- bazel run //ci/ray_ci:test_in_docker -- //rllib/... rllib
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}"
--parallelism-per-worker 2
--gpus 4
--only-tags multi_gpu
--except-tags manual
--build-name rllibgpubuild-py3.12
--python-version 3.12
depends_on: rllibgpubuild
- label: ":brain: rllib: doc tests"
if: '!(build.pull_request.labels includes "docs-go")'
tags:
- rllib_directly
- doc
- skip-on-microcheck
instance_type: medium
commands:
# doc tests
- bazel run //ci/ray_ci:test_in_docker -- python/ray/... //doc/... rllib
--only-tags doctest
--except-tags gpu,manual
--parallelism-per-worker 2
--build-name rllibbuild-py3.12
--python-version 3.12
# doc examples
- bazel run //ci/ray_ci:test_in_docker -- //doc/... rllib
--except-tags gpu,post_wheel_build,timeseries_libs,doctest
--parallelism-per-worker 2
--build-name rllibbuild-py3.12
--python-version 3.12
--skip-ray-installation # reuse the same docker image as the previous run
# documentation test
- bazel run //ci/ray_ci:test_in_docker -- //rllib/... rllib
--only-tags documentation
--parallelism-per-worker 2
--build-name rllibbuild-py3.12
--python-version 3.12
--skip-ray-installation # reuse the same docker image as the previous run
depends_on: rllibbuild-multipy(python=3.12)
- label: ":brain: rllib: python 3.10 component testing ({{matrix.worker_id}})"
if: build.pull_request.labels includes "continuous-build" || pipeline.id == "0189e759-8c96-4302-b6b5-b4274406bf89" || pipeline.id == "018f4f1e-1b73-4906-9802-92422e3badaa"
tags: rllib_directly
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //rllib/... rllib
--workers 4 --worker-id {{matrix.worker_id}} --parallelism-per-worker 3
--only-tags env,evaluation,models,offline,policy,utils,algorithms,callbacks,core
--except-tags gpu,multi_gpu,manual
--test-env RAY_USE_MULTIPROCESSING_CPU_COUNT=1
--build-name rllibbuild-py3.10
--python-version 3.10
depends_on: rllibbuild-multipy(python=3.10)
matrix:
setup:
worker_id: ["0", "1", "2", "3"]
- label: ":brain: rllib: flaky component & examples tests"
key: rllib_flaky_tests_02
tags:
- rllib
- rllib_flaky
- skip-on-premerge
instance_type: large
commands:
# flaky components
- bazel run //ci/ray_ci:test_in_docker -- //rllib/... rllib --run-flaky-tests --parallelism-per-worker 3
--only-tags env,evaluation,models,offline,policy,utils,algorithms,callbacks,core
--except-tags learning_tests,examples,documentation,gpu,multi_gpu,manual
--test-env RAY_USE_MULTIPROCESSING_CPU_COUNT=1
--build-name rllibbuild-py3.12
--python-version 3.12
# flaky examples
- bazel run //ci/ray_ci:test_in_docker -- //rllib/... rllib --run-flaky-tests --parallelism-per-worker 3
--only-tags examples
--except-tags multi_gpu,gpu,manual,examples_use_all_core
--test-env RAY_USE_MULTIPROCESSING_CPU_COUNT=1
--build-name rllibbuild-py3.12
--python-version 3.12
--skip-ray-installation # reuse the same docker image as the previous run
# flaky examples use all core
- bazel run //ci/ray_ci:test_in_docker -- //rllib/... rllib --run-flaky-tests --parallelism-per-worker 3
--only-tags examples_use_all_core
--except-tags gpu,multi_gpu,manual
--test-env RAY_USE_MULTIPROCESSING_CPU_COUNT=1
--build-name rllibbuild-py3.12
--python-version 3.12
--skip-ray-installation # reuse the same docker image as the previous run
depends_on: rllibbuild-multipy(python=3.12)
soft_fail: true
- label: ":brain: rllib: flaky learning tests"
key: rllib_flaky_tests_01
tags:
- rllib
- rllib_flaky
- skip-on-premerge
instance_type: large
commands:
# torch
- bazel run //ci/ray_ci:test_in_docker -- //rllib/... rllib --run-flaky-tests
--only-tags learning_tests
--except-tags gpu,multi_gpu,manual
--test-arg --framework=torch
--build-name rllibbuild-py3.12
--python-version 3.12
depends_on: rllibbuild-multipy(python=3.12)
soft_fail: true
- label: ":brain: rllib: flaky gpu tests"
key: rllib_flaky_gpu_tests
tags:
- rllib_gpu
- gpu
- rllib_flaky
- skip-on-premerge
instance_type: gpu
commands:
- bazel run //ci/ray_ci:test_in_docker -- //rllib/... rllib --run-flaky-tests
--only-tags gpu
--except-tags multi_gpu,manual
--test-env=RAY_USE_MULTIPROCESSING_CPU_COUNT=1
--test-env=RLLIB_NUM_GPUS=1
--build-name rllibgpubuild-py3.12
--python-version 3.12
depends_on: rllibgpubuild
soft_fail: true
- label: ":brain: rllib: flaky multi-gpu tests"
key: rllib_flaky_multi_gpu_tests
tags:
- rllib_gpu
- gpu
- rllib_flaky
- skip-on-premerge
instance_type: gpu-large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //rllib/... rllib --run-flaky-tests
--parallelism-per-worker 2
--gpus 4
--only-tags multi_gpu
--except-tags manual
--build-name rllibgpubuild-py3.12
--python-version 3.12
depends_on: rllibgpubuild
soft_fail: true
+293
View File
@@ -0,0 +1,293 @@
group: serve tests
depends_on:
- forge
- oss-ci-base_build-multipy(*)
- ray-core-build(*)
- ray-dashboard-build
steps:
# builds
- name: servebuild-multipy
label: "wanda: servebuild-py{{array.python}}"
wanda: ci/docker/serve.build.wanda.yaml
array:
python:
- "3.10"
- "3.12"
env:
PYTHON: "{{array.python}}"
tags: cibase
- name: servetracingbuild
wanda: ci/docker/servetracing.build.wanda.yaml
- name: minbuild-serve
label: "wanda: minbuild-{{array.extra}}-py{{array.python}}"
wanda: ci/docker/min.build.wanda.yaml
depends_on: oss-ci-base_test-multipy(python=3.10)
array:
python: ["3.10"]
extra: ["serve", "default"]
env:
PYTHON_VERSION: "{{array.python}}"
EXTRA_DEPENDENCY: "{{array.extra}}"
tags: cibase
# tests
- label: ":ray-serve: serve: tests"
parallelism: 2
tags:
- serve
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/serve/... //python/ray/tests/... serve
--except-tags post_wheel_build,gpu,ha_integration,serve_tracing,direct_ingress,haproxy
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--build-name servebuild-py3.10 --test-env=EXPECTED_PYTHON_VERSION=3.10 --python-version 3.10
depends_on: servebuild-multipy(python=3.10)
- label: ":ray-serve: serve: gRPC tests"
parallelism: 2
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/serve/... //python/ray/tests/... serve
--except-tags post_wheel_build,gpu,ha_integration,haproxy
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--build-name servebuild-py3.10 --python-version 3.10
--test-env=RAY_SERVE_USE_GRPC_BY_DEFAULT=1
--test-env=RAY_SERVE_REPLICA_GRPC_MAX_MESSAGE_LENGTH=10500000
depends_on: servebuild-multipy(python=3.10)
tags:
- serve
- label: ":ray-serve: serve: same event loop tests"
parallelism: 2
tags:
- serve
- skip-on-premerge
instance_type: large
soft_fail: true
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/serve/... //python/ray/tests/... serve
--except-tags post_wheel_build,gpu,ha_integration,serve_tracing,direct_ingress,haproxy
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--build-name servebuild-py3.10 --test-env=EXPECTED_PYTHON_VERSION=3.10 --test-env=RAY_SERVE_RUN_USER_CODE_IN_SEPARATE_THREAD=0
--python-version 3.10
depends_on: servebuild-multipy(python=3.10)
- label: ":ray-serve: serve: python {{array.python}} tests ({{array.worker_id}})"
key: serve_python_tests
if: build.pull_request.labels includes "continuous-build" || pipeline.id == "0189e759-8c96-4302-b6b5-b4274406bf89" || pipeline.id == "018f4f1e-1b73-4906-9802-92422e3badaa"
tags:
- serve
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/serve/... //python/ray/tests/... serve
--except-tags post_wheel_build,gpu,ha_integration,serve_tracing,direct_ingress,haproxy
--workers 2 --worker-id {{array.worker_id}} --parallelism-per-worker 3
--python-version {{array.python}}
--test-env=EXPECTED_PYTHON_VERSION={{array.python}}
depends_on: servebuild-multipy($)
array:
python: ["3.12"]
worker_id: ["0", "1"]
- label: ":ray-serve: serve: release tests"
tags:
- serve
- release_tests
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //release/... serve --parallelism-per-worker 3
--build-name servebuild-py3.10
--python-version 3.10
depends_on: servebuild-multipy(python=3.10)
- label: ":ray-serve: serve: wheel tests"
tags:
- serve
- linux_wheels
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/serve/... //doc/... serve
--build-type wheel
--parallelism-per-worker 3
--only-tags post_wheel_build
--test-env=RAY_CI_POST_WHEEL_TESTS=True
--build-name servebuild-py3.10
--python-version 3.10
depends_on:
- manylinux-x86_64
- servebuild-multipy(python=3.10)
- forge
- ray-wheel-build(python=3.10)
- label: ":ray-serve: serve: doc tests"
if: '!(build.pull_request.labels includes "docs-go")'
tags:
- serve
- doc
instance_type: large
commands:
# doc tests
- bazel run //ci/ray_ci:test_in_docker -- python/ray/... //doc/... serve
--only-tags doctest
--parallelism-per-worker 3
--build-name servebuild-py3.10
--python-version 3.10
# doc examples
- bazel run //ci/ray_ci:test_in_docker -- //doc/... serve
--except-tags gpu,post_wheel_build,timeseries_libs,doctest
--parallelism-per-worker 3
--skip-ray-installation
--build-name servebuild-py3.10
--python-version 3.10
depends_on: servebuild-multipy(python=3.10)
- label: ":ray-serve: serve: default minimal"
tags:
- serve
- min_build
instance_type: small
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/dashboard/... serve
--parallelism-per-worker 2
--build-name minbuild-default-py3.10
--python-version 3.10
--test-env=RAY_DEFAULT=1
--only-tags minimal
depends_on: minbuild-serve(python=3.10, extra=default)
- label: ":ray-serve: serve: serve minimal"
tags:
- serve
- min_build
instance_type: small
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/serve/tests/... serve
--parallelism-per-worker 2
--build-name minbuild-serve-py3.10
--python-version 3.10
--test-env=EXPECTED_PYTHON_VERSION=3.10
--test-env=RAY_DEFAULT=1
--only-tags minimal
depends_on: minbuild-serve(python=3.10, extra=serve)
- label: ":ray-serve: serve: dashboard tests"
tags:
- serve
- dashboard
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- python/ray/dashboard/... serve
--parallelism-per-worker 3
--build-name servebuild-py3.10
--python-version 3.10
depends_on: servebuild-multipy(python=3.10)
- label: ":ray-serve: serve: HA integration tests"
tags:
- serve
instance_type: large
commands:
- bazel run //ci/ray_ci:build_in_docker -- docker --platform cpu --canonical-tag ha_integration --python-version 3.10
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/serve/tests/... serve
--only-tags ha_integration --python-version 3.10 --build-name servebuild-py3.10
depends_on:
- manylinux-x86_64
- forge
- raycpubase(python=3.10)
- servebuild-multipy(python=3.10)
- label: ":ray-serve: serve: tracing tests"
tags:
- serve
instance_type: medium
commands:
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/serve/... //python/ray/tests/... serve
--only-tags serve_tracing --build-name servetracingbuild
--python-version 3.10
depends_on: servetracingbuild
- label: ":ray-serve: serve: HAProxy tests"
parallelism: 3
tags:
- serve
instance_type: large
commands:
# Exit 42 skips whole-step retry (per @kouroshHakha); per-test retry is enough.
- bazel run //ci/ray_ci:test_in_docker -- $(cat ci/ray_ci/serve_hap_test_names.txt) serve
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}"
--build-name servebuild-py3.10 --python-version 3.10
--test-env=RAY_SERVE_ENABLE_HA_PROXY=1
--test-env=RAY_SERVE_ENABLE_DIRECT_INGRESS=0
--test-env=RAY_SERVE_DIRECT_INGRESS_MIN_DRAINING_PERIOD_S=0.01
--test-env=SERVE_SOCKET_REUSE_PORT_ENABLED=1 || exit 42
depends_on: servebuild-multipy(python=3.10)
- label: ":ray-serve: serve: direct ingress tests"
tags:
- serve
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- $(cat ci/ray_ci/serve_di_test_names.txt) serve
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--build-name servebuild-py3.10 --python-version 3.10
--test-env=RAY_SERVE_ENABLE_DIRECT_INGRESS=1
--test-env=RAY_SERVE_DIRECT_INGRESS_MIN_DRAINING_PERIOD_S=0.01
depends_on: servebuild-multipy(python=3.10)
- label: ":ray-serve: serve: direct ingress tests (same loop)"
tags:
- serve
instance_type: large
commands:
- bazel run //ci/ray_ci:test_in_docker -- $(cat ci/ray_ci/serve_di_test_names.txt) serve
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 3
--build-name servebuild-py3.10 --python-version 3.10
--test-env=RAY_SERVE_ENABLE_DIRECT_INGRESS=1
--test-env=RAY_SERVE_DIRECT_INGRESS_MIN_DRAINING_PERIOD_S=0.01
--test-env=RAY_SERVE_RUN_USER_CODE_IN_SEPARATE_THREAD=0
depends_on: servebuild-multipy(python=3.10)
- label: ":ray-serve: serve: doc gpu tests"
if: '!(build.pull_request.labels includes "docs-go")'
tags:
- serve
- doc
- gpu
instance_type: gpu
commands:
- bazel run //ci/ray_ci:test_in_docker -- //doc/... serve
--build-name docgpubuild-py3.10
--only-tags gpu --python-version 3.10
depends_on: docgpubuild
- label: ":ray-serve: serve: flaky tests"
key: serve_flaky_tests
tags:
- serve
- flaky
- skip-on-premerge
instance_type: large
soft_fail: true
commands:
- bazel run //ci/ray_ci:test_in_docker -- //... serve --run-flaky-tests --parallelism-per-worker 3
--python-version 3.10 --build-name servebuild-py3.10
--except-tags gpu
depends_on: servebuild-multipy(python=3.10)
- label: ":ray-serve: serve: flaky gpu tests"
key: serve_flaky_gpu_tests
tags:
- serve
- gpu
- flaky
- skip-on-premerge
instance_type: gpu
soft_fail: true
commands:
- bazel run //ci/ray_ci:test_in_docker -- //... serve --run-flaky-tests
--python-version 3.10 --build-name docgpubuild-py3.10
--only-tags gpu
depends_on: docgpubuild
+115
View File
@@ -0,0 +1,115 @@
# Test cases for Ray CI test rules
# Based on ci/pipeline/test_conditional_testing.py _TESTS_YAML
#
# Format: file: tag1 tag2 tag3
# === CI/Pipeline ===
ci/pipeline/test_conditional_testing.py: tools
# === Ray Libraries ===
python/ray/data/__init__.py: data
python/ray/air/__init__.py: ml train train_gpu tune data linux_wheels
python/ray/llm/llm.py: llm
python/ray/workflow/workflow.py: workflow
python/ray/tune/tune.py: ml train tune linux_wheels
python/ray/train/train.py: ml train train_gpu linux_wheels
python/ray/serve/serve.py: serve linux_wheels java
python/ray/dashboard/dashboard.py: dashboard linux_wheels core_python
# === Ray Utilities ===
python/ray/util/dask/dask.py: core_python dask
python/ray/dag/dag.py: core_python cgraphs_direct_transport
python/ray/experimental/rdt/rdt_manager.py: core_python cgraphs_direct_transport
# === RLlib ===
rllib/rllib.py: rllib rllib_gpu rllib_directly
# === Python Core ===
python/core.py: ml tune train data serve llm core_python dashboard linux_wheels macos_wheels java
python/setup.py: ml tune train serve workflow data core_python dashboard linux_wheels macos_wheels java python_dependencies min_build
python/requirements/test-requirements.txt: ml tune train serve workflow data core_python dashboard linux_wheels macos_wheels java python_dependencies min_build
python/requirements_compiled.txt: ml tune train serve workflow data core_python dashboard linux_wheels macos_wheels java python_dependencies min_build
python/requirements_compiled_py3.13.txt: ml tune train serve workflow data core_python dashboard linux_wheels macos_wheels java python_dependencies min_build
python/_raylet.pyx: ml tune train data serve llm core_python dashboard linux_wheels macos_wheels java
# === Raydepsets lock files and configs ===
# macos_depset lock is consumed by the mac smoke test (macos_wheels) AND
# also needs to run the raydepsets --check verification (python_dependencies).
python/deplocks/ci/macos_depset_py3.10.lock: macos_wheels python_dependencies
# Other deplock updates should NOT trigger the mac smoke test (no macos_wheels).
python/deplocks/base_deps/ray_base_deps_py3.10.lock: ml tune train serve workflow data core_python dashboard linux_wheels java python_dependencies min_build
python/deplocks/ci/data-base-ci_depset_py3.10.lock: ml tune train serve workflow data core_python dashboard linux_wheels java python_dependencies min_build
# LLM deplocks hit the dedicated llm-lock rule block and also emit
# python_dependencies so lock updates run the raydepsets --check verification.
python/deplocks/llm/ray_py311_cpu.lock: llm python_dependencies
# Raydepsets config changes drive lock regeneration, so they get the same
# tag set as deplock updates (no macos_wheels).
ci/raydepsets/configs/ci_core.depsets.yaml: ml tune train serve workflow data core_python dashboard linux_wheels java python_dependencies min_build
ci/raydepsets/configs/rayimg.depsets.yaml: ml tune train serve workflow data core_python dashboard linux_wheels java python_dependencies min_build
# Raydepsets tool code changes can alter compiled lock output, so they
# emit python_dependencies in addition to tools.
ci/raydepsets/raydepsets.py: tools python_dependencies
# === Buildkite Configs ===
.buildkite/ml.rayci.yml: ml train train_gpu tune
.buildkite/core.rayci.yml: core_python core_cpp
.buildkite/others.rayci.yml: java
.buildkite/lint.rayci.yml: tools
.buildkite/macos.rayci.yml: macos_wheels
.buildkite/base.rayci.yml: docker linux_wheels tools
# === Min installation ===
ci/docker/min.build.Dockerfile: min_build
ci/docker/min.build.wanda.yaml: min_build
# === Java/C++ ===
java/ray.java: java
cpp/ray.cc: cpp
src/ray.cpp: core_cpp cpp java core_python linux_wheels macos_wheels dashboard release_tests
# === Docker ===
docker/Dockerfile.ray: docker linux_wheels
# === Documentation ===
doc/code.py: doc
doc/example.ipynb: doc
.readthedocs.yaml: doc
.vale.ini: doc
.vale/styles/config/vocabularies/Core/accept.txt: doc
doc/requirements-doc.txt: doc
python/deplocks/docs/docbuild_depset_py3.10.lock: doc python_dependencies
ci/raydepsets/configs/docs.depsets.yaml: doc python_dependencies
# === Release ===
release/requirements.txt: release_tests
release/requirements_py310.txt: tools
release/release_tests.yaml: tools
# === CI Scripts ===
ci/lint/lint.sh: tools
ci/ray_ci/tester.py: tools
ci/ci.sh: tools
# Windows CI driver scripts trigger the Windows test steps, not just tools.
ci/ray_ci/windows/build_base.sh: windows tools
ci/ray_ci/windows/install_tools.sh: windows tools
# === Build Scripts ===
build-wheel.sh: tools
ci/build/build_common.py: tools
# === Root Files ===
BUILD.bazel: ml tune train data serve core_cpp cpp java core_python doc linux_wheels macos_wheels dashboard tools release_tests
+364
View File
@@ -0,0 +1,364 @@
# Ray CI conditional testing rules definition files
#
# Comment content, after '#', will be ignored.
# Empty lines will be ignored too.
#
# ! tag1 tag2 tag3 # Declares a tag. A tag must be declared first to be used.
# # Tags must be declared at the beginning.
#
# dir/ # Directory to match
# file # File to match
# dir/*.py # Pattern to match, using fnmatch, matches dir/a.py dir/dir/b.py or dir/.py
# @ tag1 tag2 tag3 # Tags to emit for a rule. A rule without tags is a skipping rule.
#
# ; # Semicolon to separate rules
! always lint
! core_python cpp core_cpp java workflow cgraphs_direct_transport dashboard
! ray_client runtime_env_container
! data dask serve ml tune train train_gpu llm rllib rllib_gpu rllib_directly
! linux_wheels macos_wheels docker doc python_dependencies min_build tools windows
! release_tests spark_on_ray rocksdb_tests redis_tests
# Documentation prose (.md and .rst) does not block premerge. A content-only
# change to narrative docs triggers no library test steps: prose can't change
# tested code, and the post-merge documentation build is the coverage for these
# changes. Executable doc assets such as .py and .ipynb are matched by the rules
# below and still run tests.
doc/*.md
doc/*.rst
# pass
;
python/ray/air/
@ ml train train_gpu tune data linux_wheels
;
python/deplocks/llm/*.lock
@ llm python_dependencies
;
python/ray/llm/
doc/source/llm/
doc/source/data/doc_code/working-with-llms/
ci/docker/llm.build.Dockerfile
@ llm
;
python/ray/data/
ci/docker/data.build.Dockerfile
ci/docker/data.build.wanda.yaml
ci/docker/datan.build.wanda.yaml
ci/docker/data9.build.wanda.yaml
ci/docker/datal.build.wanda.yaml
@ data
;
python/ray/workflow/
@ workflow
;
python/ray/tune/
@ ml train tune linux_wheels
;
python/ray/train/
@ ml train train_gpu linux_wheels
;
ci/docker/ml.build.wanda.yaml
ci/docker/mllightning2gpu.build.wanda.yaml
ci/docker/ml.build.Dockerfile
ci/ray_ci/ml.tests.yml
@ ml train train_gpu tune
;
ci/docker/min.build.Dockerfile
ci/docker/min.build.wanda.yaml
@ min_build
;
rllib/
python/ray/rllib/
ci/ray_ci/rllib.tests.yml
@ rllib rllib_gpu rllib_directly
;
python/ray/serve/
ci/docker/serve.build.Dockerfile
@ serve linux_wheels java
;
python/ray/dashboard/
@ dashboard linux_wheels core_python
;
# The macOS smoke test installs this specific lock file
# (ci/ray_ci/macos/macos_ci.sh), so changes here must still trigger
# macos_wheels. Must precede the general python/deplocks/ rule below.
# Also emits python_dependencies so lock file changes still run the
# raydepsets --check verification in dependencies.rayci.yml.
python/deplocks/ci/macos_depset_py*
@ macos_wheels python_dependencies
;
# Short-circuit deps handling for docs-specific.
python/deplocks/docs/*.lock
ci/raydepsets/configs/docs.depsets.yaml
@ doc python_dependencies
;
# Raydepsets-generated lock files and raydepsets configs that drive
# their generation. These do NOT affect the macOS smoke test (which
# only consumes macos_depset_py*, handled above), so we deliberately
# omit macos_wheels here to avoid running mac tests on unrelated lock
# updates. Otherwise mirrors the python/setup.py rule's tag set so
# general dependency changes still fan out across CI.
python/deplocks/
ci/raydepsets/configs/
@ ml tune train serve workflow data min_build
@ core_python dashboard linux_wheels java
@ python_dependencies
;
python/setup.py
python/requirements.txt
python/requirements_compiled.txt
python/requirements_compiled_py*
python/requirements/
@ ml tune train serve workflow data min_build
@ core_python dashboard linux_wheels macos_wheels java
@ python_dependencies
;
# Things that need to execute on GPU's
python/ray/dag/
python/ray/experimental/channel/
python/ray/experimental/rdt/
python/ray/experimental/collective/
python/ray/tests/rdt/
python/ray/dashboard/modules/reporter/gpu_providers.py
python/ray/tests/test_gpu_provider_on_gpu.py
@ core_python cgraphs_direct_transport
;
python/ray/util/client/
@ core_python ray_client
;
python/ray/util/dask/
@ core_python dask
;
python/ray/util/spark/
@ core_python spark_on_ray
;
python/ray/runtime_env/
@ core_python runtime_env_container
;
python/
# Run library tests on core Python code change.
@ core_python llm ml tune train data serve
# Python changes might impact cross language stack in Java.
# Java also depends on Python CLI to manage processes.
@ core_python dashboard linux_wheels macos_wheels java
;
.buildkite/core.rayci.yml
@ core_python core_cpp
;
java/
@ java
;
cpp/
@ cpp
;
docker/
.buildkite/pipeline.build_cpp.yml
.buildkite/_images.rayci.yml
.buildkite/release/_images.rayci.yml
@ docker linux_wheels
;
.readthedocs.yaml
@ doc
;
doc/*.py
doc/*.ipynb
doc/BUILD
doc/*/BUILD
doc/*.rst
doc/requirements-doc.txt
.vale.ini
.vale/
.buildkite/doc.rayci.yml
@ doc
;
ci/docker/doctest.build.Dockerfile
ci/docker/doctest.build.wanda.yaml
# pass
;
release/ray_release/
release/requirements_*
release/*.md
release/*.yaml
@ tools
;
release/
@ release_tests
;
doc/
examples/
dev/
kubernetes/
site/
# pass
;
ci/lint/
.buildkite/cicd.rayci.yml
.buildkite/lint.rayci.yml
.buildkite/bisect/
ci/fossa/
ci/docker/fossa.Dockerfile
ci/docker/fossa.wanda.yaml
bazel/tests/
@ tools
;
# Raydepsets tool code. Changes here can alter what gets compiled into
# lock files, so emit python_dependencies to re-run the compile/check.
# The configs/ subdir is handled earlier with the deplock rule block.
ci/raydepsets/
@ tools python_dependencies
;
.buildkite/macos.rayci.yml
.buildkite/pipeline.macos.yml
ci/ray_ci/macos/macos_ci.sh
ci/ray_ci/macos/macos_ci_build.sh
@ macos_wheels
;
# Windows CI driver scripts (base image build, tool install, cleanup) feed the
# windowsbuild image that every Windows test consumes. Emit 'windows' so the
# Windows test steps (tagged 'windows') run, not just the image rebuild. Must
# precede the general ci/ray_ci/ rule below, which would otherwise swallow
# these into 'tools' only.
ci/ray_ci/windows/
@ windows tools
;
ci/pipeline/
ci/build/
ci/ray_ci/
.buildkite/_forge.rayci.yml
.buildkite/_forge.aarch64.rayci.yml
ci/docker/forge.wanda.yaml
ci/docker/forge.aarch64.wanda.yaml
.buildkite/pipeline.build.yml
.buildkite/hooks/post-command
.buildkite/release/
.buildkite/release-automation/
build-wheel.sh
build-image.sh
@ tools
;
.buildkite/base.rayci.yml
.buildkite/build.rayci.yml
.buildkite/pipeline.arm64.yml
ci/docker/manylinux.Dockerfile
ci/docker/manylinux.wanda.yaml
ci/docker/manylinux.aarch64.wanda.yaml
ci/docker/windows.build.Dockerfile
ci/docker/windows.build.wanda.yaml
build-docker.sh
@ docker linux_wheels tools
;
ci/run/
ci/ci.sh
.buildkite/*.rules.test.txt
.buildkite/*.rules.txt
@ tools
;
# Per-library pipeline definition files trigger only that library's suite,
# instead of falling through to the wildcard '*' below (which would fan out to
# the full library suite). These must stay after the specific '.buildkite/...'
# rules above (core/doc/lint/macos/base/*.rules.txt) and before the final '*';
# the generic '.buildkite/*.rayci.yml' fallback must come last so the
# per-library rules win.
.buildkite/data.rayci.yml
@ data
;
.buildkite/serve.rayci.yml
@ serve linux_wheels java
;
.buildkite/ml.rayci.yml
@ ml train train_gpu tune
;
.buildkite/llm.rayci.yml
@ llm
;
.buildkite/*.rayci.yml
@ java
;
src/ray/core_worker/experimental*.h
src/ray/core_worker/experimental*.cc
@ cgraphs_direct_transport
;
# REP-64: changes to the GCS store_client API or backend implementations
# (rocksdb, redis, in-memory) must re-run the GCS FT premerge suites for
# both backends. Also covers rocksdb build-flag changes. The broader
# `core_cpp ...` tags below mirror the catch-all `src/` rule so this
# path keeps its normal build coverage on top of the FT suites.
src/ray/gcs/store_client/
bazel/rocksdb.BUILD
@ rocksdb_tests redis_tests
@ core_cpp cpp java core_python linux_wheels macos_wheels dashboard release_tests
;
src/
@ core_cpp cpp
@ java core_python linux_wheels macos_wheels
@ dashboard release_tests
;
.github/
README.rst
SECURITY.md
CONTRIBUTING.rst
LICENSE
pylintrc
semgrep.yml
setup_hooks.sh
.pre-commit-config.yaml
.isort.cfg
.prettierrc.toml
.fossa.yml
# pass
;
*
@ ml tune train data serve
@ core_cpp cpp java core_python doc
@ linux_wheels macos_wheels dashboard tools release_tests
;
+199
View File
@@ -0,0 +1,199 @@
group: windows tests
sort_key: "~windows"
steps:
- name: windowsbuild
wanda: ci/docker/windows.build.wanda.yaml
instance_type: builder-windows
- label: ":ray: core: :windows: smoke test"
if: build.env("BUILDKITE_PIPELINE_ID") == "0189942e-0876-4b8f-80a4-617f988ec59b" || build.env("BUILDKITE_PIPELINE_ID") == "018f4f1e-1b73-4906-9802-92422e3badaa"
tags:
- core_cpp
- windows
job_env: WINDOWS
instance_type: windows
commands:
- bash ci/ray_ci/windows/install_tools.sh
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests:test_basic core
--build-name windowsbuild
--operating-system windows
--except-tags no_windows
--test-env=CI="1"
--test-env=USERPROFILE
depends_on: windowsbuild
# block full test suite on premerge and microcheck
- block: "run windows tests"
key: block-windows-tests
if: build.env("BUILDKITE_PIPELINE_ID") == "0189942e-0876-4b8f-80a4-617f988ec59b" || build.env("BUILDKITE_PIPELINE_ID") == "018f4f1e-1b73-4906-9802-92422e3badaa"
depends_on: []
- label: ":windows: wheel {{matrix}}"
# we have linux/mac wheels tag, but do not have a windows wheels tag..
# so using python and core_cpp here, to make sure at least it builds
key: windows_wheels
tags:
- oss
- core_python
- core_cpp
- release_wheels
job_env: WINDOWS
instance_type: windows
commands:
- bash ci/ray_ci/windows/install_tools.sh
- bazel run //ci/ray_ci:build_in_docker_windows -- wheel --python-version {{matrix}} --operating-system windows --upload
matrix:
- "3.10"
- "3.11"
- "3.12"
depends_on:
- windowsbuild
- block-windows-tests
- label: ":ray: core: :windows: cpp tests"
tags:
- core_cpp
- windows
job_env: WINDOWS
instance_type: windows
commands:
- bash ci/ray_ci/windows/install_tools.sh
- bazel run //ci/ray_ci:test_in_docker -- //:all //src/... core
--build-name windowsbuild
--operating-system windows
--except-tags no_windows,cgroup
--test-env=CI="1"
--test-env=RAY_CI_POST_WHEEL_TESTS="1"
--test-env=USERPROFILE
--parallelism-per-worker 2
depends_on:
- windowsbuild
- block-windows-tests
- label: ":ray: core: :windows: python tests"
tags:
- core_python
- windows
job_env: WINDOWS
instance_type: windows
parallelism: 5
commands:
- bash ci/ray_ci/windows/install_tools.sh
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/tests/... core
--build-name windowsbuild
--operating-system windows
--except-tags no_windows
--test-env=CI="1"
--test-env=RAY_CI_POST_WHEEL_TESTS="1"
--test-env=USERPROFILE
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 2
depends_on:
- windowsbuild
- block-windows-tests
- label: ":ray-serve: serve: :windows: tests"
tags:
- serve
- windows
job_env: WINDOWS
instance_type: windows
parallelism: 2
commands:
- bash ci/ray_ci/windows/install_tools.sh
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/serve/... serve
--build-name windowsbuild
--operating-system windows
--except-tags no_windows,use_all_core_windows
--test-env=CI="1"
--test-env=RAY_CI_POST_WHEEL_TESTS="1"
--test-env=USERPROFILE
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}" --parallelism-per-worker 1
depends_on:
- windowsbuild
- block-windows-tests
- label: ":ray-serve: serve: :windows: enormous tests"
tags:
- serve
- windows
job_env: WINDOWS
instance_type: windows
commands:
- bash ci/ray_ci/windows/install_tools.sh
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/serve/... serve
--build-name windowsbuild
--operating-system windows
--only-tags use_all_core_windows
--except-tags no_windows
--test-env=CI="1"
--test-env=RAY_CI_POST_WHEEL_TESTS="1"
--test-env=USERPROFILE
depends_on:
- windowsbuild
- block-windows-tests
- label: ":train: ml: :windows: tests"
tags:
- train
- windows
job_env: WINDOWS
instance_type: windows
commands:
- bash ci/ray_ci/windows/install_tools.sh
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/train:test_windows ml
--build-name windowsbuild
--operating-system windows
--test-env=CI="1"
--test-env=RAY_CI_POST_WHEEL_TESTS="1"
--test-env=USERPROFILE
depends_on:
- windowsbuild
- block-windows-tests
- label: "flaky :windows: core tests"
key: windows_core_flaky_tests
tags:
- flaky
- windows
- skip-on-premerge
job_env: WINDOWS
instance_type: windows
parallelism: 2
commands:
- bash ci/ray_ci/windows/install_tools.sh
- bazel run //ci/ray_ci:test_in_docker -- //:all //src/... //python/ray/tests/... core
--run-flaky-tests
--except-tags no_windows
--build-name windowsbuild
--operating-system windows
--test-env=CI="1"
--test-env=RAY_CI_POST_WHEEL_TESTS="1"
--test-env=USERPROFILE
--workers "$${BUILDKITE_PARALLEL_JOB_COUNT}" --worker-id "$${BUILDKITE_PARALLEL_JOB}"
depends_on:
- windowsbuild
- block-windows-tests
soft_fail: true
- label: "flaky :windows: serve tests"
key: windows_serve_flaky_tests
tags:
- flaky
- windows
- skip-on-premerge
job_env: WINDOWS
instance_type: windows
commands:
- bash ci/ray_ci/windows/install_tools.sh
- bazel run //ci/ray_ci:test_in_docker -- //python/ray/serve/... serve
--except-tags no_windows
--run-flaky-tests
--build-name windowsbuild
--operating-system windows
--test-env=CI="1"
--test-env=RAY_CI_POST_WHEEL_TESTS="1"
--test-env=USERPROFILE
depends_on:
- windowsbuild
- block-windows-tests
soft_fail: true
+7
View File
@@ -0,0 +1,7 @@
BasedOnStyle: Google
ColumnLimit: 90
DerivePointerAlignment: false
IndentCaseLabels: false
PointerAlignment: Right
BinPackArguments: false
BinPackParameters: false
+86
View File
@@ -0,0 +1,86 @@
# Disable the following checks with reasons in parenthesis:
#
# -bugprone-macro-parentheses (inconsistent style)
# -google-readability-todo (potentially too restrictive)
# -misc-non-private-member-variables-in-classes (potentially too restrictive)
# -misc-unused-parameters (can be cleaned up in batch and enabled)
# -modernize-avoid-c-arrays (too restrictive)
# -modernize-concat-nested-namespaces (inconsistent style)
# -modernize-pass-by-value (too restrictive)
# -modernize-return-braced-init-list (inconsistent style)
# -modernize-use-emplace (more subtle behavior)
# -modernize-use-nodiscard (too much noise)
# -modernize-use-trailing-return-type (inconsistent style)
# -modernize-use-override (TODO(mwtian): re-enable after fixing existing derived classes)
# -modernize-avoid-bind (incorrect conversion)
# -modernize-loop-convert (more subtle behavior)
# -modernize-replace-disallow-copy-and-assign-macro (inconsistent style)
# -modernize-make-unique (doesn't work with private constructor)
# -modernize-make-shared (doesn't work with private constructor)
# Other readability-* rules (potentially too noisy, inconsistent style)
# Other rules not mentioned here or below (not yet evaluated)
#
# TODO: enable google-* and readability-* families of checks.
Checks: >
abseil-*,
bugprone-*,
-bugprone-macro-parentheses,
-bugprone-easily-swappable-parameters,
-bugprone-narrowing-conversions,
-bugprone-implicit-widening-of-multiplication-result,
cert-*,
cppcoreguidelines-*,
-cppcoreguidelines-non-private-member-variables-in-classes,
-cppcoreguidelines-narrowing-conversions,
-cppcoreguidelines-avoid-magic-numbers,
-cppcoreguidelines-avoid-do-while,
google-*,
-google-readability-todo,
-google-default-arguments,
misc-*,
-misc-non-private-member-variables-in-classes,
-misc-unused-parameters,
-misc-include-cleaner,
-misc-const-correctness,
modernize-*,
-modernize-concat-nested-namespaces,
-modernize-return-braced-init-list,
-modernize-use-nodiscard,
-modernize-use-trailing-return-type,
-modernize-avoid-bind,
-modernize-loop-convert,
performance-*,
readability-braces-around-statements,
readability-const-return-type,
readability-container-contains,
readability-container-data-pointer,
readability-container-size-empty,
readability-delete-null-pointer,
readability-duplicate-include,
readability-implicit-bool-conversion,
readability-make-member-function-const,
readability-misleading-indentation,
readability-misplaced-array-index,
readability-named-parameter,
readability-non-const-parameter,
readability-redundant-*,
-readability-redundant-access-specifiers,
readability-static-definition-in-anonymous-namespace,
readability-string-compare,
readability-suspicious-call-argument,
CheckOptions:
# Reduce noisiness of the bugprone-narrowing-conversions check.
- key: bugprone-narrowing-conversions.IgnoreConversionFromTypes
value: 'size_t;ptrdiff_t;size_type;difference_type'
- key: bugprone-narrowing-conversions.WarnOnEquivalentBitWidth
value: 'false'
- key: cppcoreguidelines-special-member-functions.AllowMissingMoveFunctionsWhenCopyIsDeleted
value: 'true'
- key: cppcoreguidelines-special-member-functions.AllowSoleDefaultDtor
value: 'true'
- key: performance-move-const-arg.CheckTriviallyCopyableMove
value: 'false'
# Turn all the warnings from the checks above into errors.
WarningsAsErrors: "*"
+33
View File
@@ -0,0 +1,33 @@
<!-- Version-controlled. Personal config → CLAUDE.local.md -->
<!-- Library-specific guidance → each library's .claude/CLAUDE.md -->
# Ray
Ray is a unified framework for scaling AI and Python applications.
## Building & Linting
Refer to doc/source/ray-contribute/development.md for the most up-to date information.
Use the /rebuild skill for guided rebuilds and the /lint skill for linting.
## Testing
See per-library .claude/CLAUDE.md for library-specific test paths.
Default test timeout: 180s (pytest.ini).
## Structure
- src/ray/ — C++ core runtime
- python/ray/ — Python API and AI libraries (data, serve, train, tune)
- rllib/ — RLlib (symlinked from python/ray/rllib)
- doc/source/ — Sphinx documentation
## Development Workflow
- After making C++ or Cython changes, use /rebuild to determine the correct build steps
- After making code changes, use /lint to fix lint issues on modified files
- When investigating CI failures, use /fetch-buildkite-logs to fetch and analyze build logs
## Contributing
See @CONTRIBUTING.rst and @doc/source/ray-contribute/getting-involved.md
+4
View File
@@ -0,0 +1,4 @@
<!-- Project-specific Claude Code subagents. -->
<!-- See https://code.claude.com/docs/en/sub-agents -->
<!-- To create: .claude/agents/<name>/<name>.md -->
<!-- Example use cases: docs specialist, security reviewer -->
+10
View File
@@ -0,0 +1,10 @@
---
paths:
- "**/*.py"
---
<!-- Python coding guidelines — derived from docs.ray.io/en/master/ray-contribute/getting-involved.html -->
<!-- Source of truth: doc/source/ray-contribute/getting-involved.md "Code Style" section -->
- Place type annotations in function signatures so tooling (mypy, pyright) can use them directly
- Use @pytest.mark.parametrize to cover multiple cases in a single test function, reducing duplication
- Extract common test setup/teardown into reusable helper functions
- Use @classmethod setUpClass/tearDownClass to reuse Ray clusters across test suites (avoids ~4.4s startup per test)
+3
View File
@@ -0,0 +1,3 @@
<!-- Security rules applying to all code -->
- Add token-based authentication to all new gRPC endpoints and RPC handlers to maintain Ray's security model
- Propagate auth tokens in new API calls (both C++ and Python sides) so that end-to-end authentication remains consistent
+9
View File
@@ -0,0 +1,9 @@
---
paths:
- "src/**/*.{cc,h}"
---
- Excluding the Clock implementation and benchmarks, read the current time only through an injected `ray::ClockInterface` (`src/ray/util/clock.h`) so time can be faked and unit tested deterministically. Do not call `absl::Now()`, `std::chrono::{system,steady,high_resolution}_clock::now()`, or other similar functions.
- Inject `ClockInterface &clock_` via the constructor. Pass a `Clock` from the production entrypoint (e.g. `raylet/main.cc`) and a `FakeClock` in tests. Declare the concrete clock member before any object that holds a `ClockInterface &` so it is constructed first and outlives the holder.
- Use `clock_.Now()` / `clock_.NowUnixMillis()` for wall-clock timestamps and deadlines, and `clock_.SteadyNow()` for elapsed/duration measurements
- In unit tests use `FakeClock::AdvanceTime`/`SetTime` instead of `sleep` or wall-clock time. Ensure that the tests are written to be fast and deterministic.
+18
View File
@@ -0,0 +1,18 @@
{
"permissions": {
"allow": [
"Bash(bazel build *)",
"Bash(bazel test *)",
"Bash(bazel run *)",
"Bash(bazel query *)",
"Bash(bazel info *)",
"Bash(python -m pytest *)",
"Bash(pip install -e *)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(git branch *)"
],
"deny": []
}
}
@@ -0,0 +1,54 @@
---
name: fetch-buildkite-logs
description: Fetch and analyze Buildkite CI build logs for failures
---
# Fetch Buildkite Logs
## Prerequisites
- `BUILDKITE_API_TOKEN` must be set in the environment (typically `~/.bashrc`)
- If not configured, direct user to `doc/source/ray-contribute/agent-development.md` for setup
## Parsing the Buildkite URL
A Buildkite URL has the form:
```
https://buildkite.com/ray-project/<PIPELINE>/builds/<BUILD_NUM>#<JOB_ID>
```
Always extract `<PIPELINE>` (e.g. `premerge`, `postmerge`) and `<BUILD_NUM>` from the URL the user provides. **Do not hardcode `premerge`** — the same skill is used for all pipelines. If a `#<JOB_ID>` fragment is present, it identifies a specific real job (not a group/wait job) and can be queried directly.
## Steps
1. Verify token: `echo $BUILDKITE_API_TOKEN | head -c4`
2. If token missing, stop and show setup instructions from the dev docs
3. Fetch build (use the pipeline from the URL):
```bash
curl -s -H "Authorization: Bearer $BUILDKITE_API_TOKEN" \
"https://api.buildkite.com/v2/organizations/ray-project/pipelines/<PIPELINE>/builds/<BUILD_NUM>"
```
4. If a job ID is present in the URL fragment, look it up directly:
```bash
curl -s -H "Authorization: Bearer $BUILDKITE_API_TOKEN" \
"https://api.buildkite.com/v2/organizations/ray-project/pipelines/<PIPELINE>/builds/<BUILD_NUM>" \
| python3 -c "import sys,json; jobs=json.load(sys.stdin)['jobs']; [print(f\"{j['id']} {j.get('name')} -> {j.get('state')}\") for j in jobs if j['id']=='<JOB_ID>']"
```
5. Otherwise list failed/broken jobs:
```bash
curl -s -H "Authorization: Bearer $BUILDKITE_API_TOKEN" \
"https://api.buildkite.com/v2/organizations/ray-project/pipelines/<PIPELINE>/builds/<BUILD_NUM>" \
| python3 -c "import sys,json; jobs=json.load(sys.stdin)['jobs']; [print(f\"{j['id']} {j['name']} -> {j['state']}\") for j in jobs if j.get('state') in ('failed','broken')]"
```
6. Fetch individual job log:
```bash
curl -s -H "Authorization: Bearer $BUILDKITE_API_TOKEN" \
"https://api.buildkite.com/v2/organizations/ray-project/pipelines/<PIPELINE>/builds/<BUILD_NUM>/jobs/<JOB_ID>/log" \
> /tmp/log_<JOB_ID>.json
```
Logs come back as JSON with a `content` field containing ANSI escape codes — strip them with `re.sub(r'\x1b\[[0-9;]*m', '', content)` before grepping.
7. Summarize failures and suggest fixes.
## Authentication note
If `curl` returns `{"message":"No organization found"}`, the configured token does not have access to `ray-project`. The user may have a separate org-scoped token — ask them which env var to source.
+43
View File
@@ -0,0 +1,43 @@
---
name: lint
description: Run linting and formatting checks on Ray code
---
# Lint Modified Files
Run pre-commit on the files you changed:
```bash
pre-commit run --files $(git diff --name-only HEAD)
```
`pre-commit run` without `--files` only operates on staged files, so pass the
modified file list explicitly.
If pre-commit is not installed:
```bash
pip install -c python/requirements_compiled.txt pre-commit && pre-commit install
```
## Handling remaining errors
Pre-commit auto-fixes simple issues (formatting, long lines, unused imports).
Review any remaining errors — these typically need code changes such as adding a
missing import, resolving a name conflict, or restructuring logic. Fix them by
editing the source code directly.
Use `# noqa` only for false positives that cannot be resolved by changing the code,
and include the rule code and reason: `# noqa: E501 — URL cannot be split`.
## Exclusions
pyproject.toml lists files in `per-file-ignores` and `extend-exclude`. When the PR
modifies a file that is on one of these lists, fix the lint issues in your changes
and consider removing the file from the list. Leave exclusion entries for files
outside the PR scope untouched.
## Reference
- Hook config: .pre-commit-config.yaml
- Ruff config: pyproject.toml (`[tool.ruff]` section)
- Docs: doc/source/ray-contribute/development.md ("Development tooling")
+433
View File
@@ -0,0 +1,433 @@
---
name: ray-dependencies
description: Manage Python dependencies in Ray — add/remove/upgrade packages, work with raydepsets lock files, debug dependency conflicts, and regenerate compiled requirements. Covers `python/requirements*`, `python/requirements/**`, `python/deplocks/**`, and `ci/raydepsets/configs/*.depsets.yaml`.
user-invocable: true
argument-hint: <question or task>
---
# Ray Dependencies
Expert skill for managing Python dependencies across the Ray repository: the monorepo `requirements_compiled*.txt` lock files, the raydepsets DAG-based lock file manager, modular `python/requirements/**` source files, and Docker image dependency chains.
---
## When to use this skill
**Use this skill when the user wants to:**
- Add, remove, or upgrade a Python dependency in Ray
- Create or modify a `.depsets.yaml` config file
- Understand how dependencies flow between Ray Docker images
- Debug dependency conflicts or version resolution failures
- Regenerate lock files after requirement changes
- Create a new CI test environment with locked dependencies
- Understand why a specific package version was chosen
**Not for:**
- General Python packaging questions unrelated to Ray
- Ray runtime/API questions (use Ray docs)
- Docker image build issues unrelated to dependencies
---
## Workflow rules (project preferences)
These take precedence over generic packaging advice:
1. **Source-file pins only.** Resolve conflicts by editing `python/requirements.txt`, `python/requirements/**/*.txt`, or `python/requirements/**/*.in`. Do **not** hand-edit `python/requirements_compiled*.txt` — it is a build artifact and gets overwritten on the next compile.
2. **No `ci/ci.sh` post-process hooks** for individual package fixes. Only touch `ci/ci.sh` for genuinely structural changes (new functions, new input files passed to the compiler). Never as an after-the-fact lock mutator.
3. **Use the dual-exact-pin-with-markers pattern** when a package needs different versions on different Python versions and the lock is consumed as a constraint across multiple Python targets. See *Marker preservation* below.
4. **`python/requirements.txt``python/setup.py` must stay in sync.** The packages under the `## setup.py install_requires` block in `python/requirements.txt` are mirrored into `setup_spec.install_requires` in `python/setup.py` (around line 405). When you add, remove, or change a version bound for any package in that block, edit **both** files in the same change. The list in `setup.py` is what end users actually install via `pip install ray`; `requirements.txt` is the dev-side source of truth. Drift between them ships broken installs.
5. **`python/requirements/llm/llm-requirements.txt``setup_spec.extras["llm"]` must stay in sync.** The `ray[llm]` extra in `python/setup.py` (around line 377) and `python/requirements/llm/llm-requirements.txt` are paired source-of-truth files for the LLM install set — both have explicit "keep in sync" comments. When you add, remove, or change a permanent version bound for any package in the LLM extra, edit **both** files. **Exception:** temporary upper-bound workaround pins (`<=X.Y.Z` to dodge a bug) may live only in `llm-requirements.txt`. They must NOT be added to `setup.py`, since `setup.py` is the public install constraint and should not advertise short-lived workarounds as future API. Strip the `<=` pin from both files once the upstream fix lands.
6. **When presenting options, list source-file fixes first.** Mention lock or `ci.sh` edits only as fallbacks with downsides called out.
---
## Ray Dependency Architecture
Ray uses a two-tier dependency management system:
1. **`requirements_compiled*.txt`** — monorepo-wide pinned dependency files, compiled via `ci/ci.sh compile_pip_dependencies`. One per Python version: `requirements_compiled.txt` (default), `requirements_compiled_py3.10.txt`, `requirements_compiled_py3.11.txt`, etc.
2. **raydepsets** — a DAG-based lock file manager (`ci/raydepsets/`) that generates per-image, per-environment lock files from `.depsets.yaml` configs. Lock files live in `python/deplocks/` and `release/ray_release/byod/`.
### Key file locations
| Path | Purpose |
|---|---|
| `python/requirements.txt` | Base Ray installation requirements |
| `python/requirements_compiled.txt` | Monorepo pinned dependencies (per-Python-version variants exist) |
| `python/requirements/` | Modular requirement files by component (test, ml, data, train, tune, serve, rllib, llm) |
| `python/requirements/ml/py313/` | ML requirements organized by Python version |
| `python/requirements/data/` | Ray Data variant requirements (pyarrow versions, mongo, etc.) |
| `python/requirements/llm/` | LLM requirements (`llm-requirements.txt`, `llm-test-requirements.txt`) |
| `python/requirements/serve/` | Serve requirements and overrides |
| `python/deplocks/` | Generated lock files (output of raydepsets) |
| `docker/base-deps/requirements.in` | Docker base-deps layer requirements |
| `docker/base-extra/requirements.in` | Docker base-extra layer requirements |
| `docker/base-slim/requirements.in` | Docker slim image requirements |
| `release/ray_release/byod/` | BYOD (Bring Your Own Dependencies) files for release tests |
---
## Generating the constraints (`requirements_compiled*.txt`)
The two compiled lock files are produced by two `bash` functions in `ci/ci.sh`:
| Function | Output | Source set |
|---|---|---|
| `compile_pip_dependencies` (`ci/ci.sh:16`) | `python/requirements_compiled.txt` | shared `python/requirements/**` files (test, cloud, docker, `ml/*`, security) |
| `compile_313_pip_dependencies` (`ci/ci.sh:82`) | `python/requirements_compiled_py3.13.txt` | py313 overrides under `python/requirements/py313/**` and `python/requirements/ml/py313/**`, falling back to shared files |
### How to invoke
```bash
# Default-Python lock (currently py3.10/3.11/3.12 generic)
ci/ci.sh compile_pip_dependencies
# py3.13 lock (uses py313 override directories)
ci/ci.sh compile_313_pip_dependencies
# Custom output filename (rare)
ci/ci.sh compile_pip_dependencies my_custom_lock.txt
```
Run inside an environment matching the target Python version (the function `pip install`s `pip-tools==7.4.1` and `wheel==0.45.1` itself). aarch64/arm64 is a no-op — the function returns early because not all pinned packages have aarch64 wheels.
### What it does
Both functions wrap `pip-compile` (pip-tools 7.4.1) with the same flags:
```
pip-compile --verbose --resolver=backtracking \
--pip-args --no-deps --strip-extras --no-header \
--unsafe-package ray --unsafe-package pip --unsafe-package setuptools \
-o "python/$TARGET" \
<list of source requirement files>
```
Then two post-process `sed` passes on the output:
1. `sed -i "/@ file/d"` — strips local file:// install lines.
2. `sed -i -E 's/==([\.0-9]+)\+[^\b]*cpu/==\1/g'` — strips `+cpu` / `+pt20cpu` device-tag suffixes that the resolver inserts (otherwise `pip install` later complains about irresolvable constraints).
The function `pip install`s `numpy` and `torch` before compilation. **Why:** `pip-compile` runs with `--pip-args --no-deps`, but it still has to extract each candidate's own `install_requires` to feed the resolver. For legacy sdists (no wheel, no PEP 517 `pyproject.toml`), the only way to get metadata is to execute `setup.py egg_info` — which runs the package's `setup.py` as Python. If that `setup.py` does `import numpy` / `import torch` at module level (common for packages using `numpy.distutils` or `torch.utils.cpp_extension` for C-extension config), the import has to succeed or pip-compile aborts. pip-compile doesn't sandbox these in an isolated PEP 517 build env, so the calling Python must already have those modules installed. `dragonfly-opt` was the canonical offender (no longer in the tree); the preinstall stays because the same shape of failure recurs whenever a new sdist-only dep with imperative `setup.py` imports gets added.
### Source file lists
If you add a brand-new source requirement file under `python/requirements/**`, it will NOT be picked up automatically — you must extend the `pip-compile` source list inside the relevant function in `ci/ci.sh`. This is one of the few legitimate reasons to edit `ci/ci.sh` (see workflow rule 2). Update both `compile_pip_dependencies` and `compile_313_pip_dependencies` if the new file applies to both Python tracks; if py3.13 needs an override, place it under `python/requirements/py313/` or `python/requirements/ml/py313/` and reference the override in `compile_313_pip_dependencies` only.
### Recompile + relock everything
After editing source requirements, the full refresh is:
```bash
ci/ci.sh compile_pip_dependencies && \
ci/ci.sh compile_313_pip_dependencies && \
bazelisk run //ci/raydepsets:raydepsets -- build --all-configs
```
The compiled `requirements_compiled*.txt` files feed raydepsets as constraints (via the `remove-compiled-headers.sh` pre-hook, which copies them to `/tmp/ray-deps/` with GPU index URLs stripped).
---
## raydepsets System
### What it does
raydepsets models relationships between lock files as a directed acyclic graph (DAG), so when a dependency changes, downstream lock files regenerate in the correct order. It wraps `uv pip compile` with cross-file consistency guarantees.
### Architecture
```
YAML configs --> Config parser (workspace.py) --> Template expansion --> DAG (NetworkX DiGraph) --> Topological execution --> uv pip compile --> Lock files
```
**Source files:**
- `ci/raydepsets/raydepsets.py` — entry point
- `ci/raydepsets/cli.py` — CLI (`build` command) and `DependencySetManager` class
- `ci/raydepsets/workspace.py` — config parsing, `Depset` dataclass, `Workspace` class, template substitution
### Four operations
#### 1. `compile`
Runs `uv pip compile` to resolve dependencies from `.in`/`.txt` requirement files into a hash-verified lock file.
**Fields:** `requirements` (input files), `constraints` (version constraint files), `packages` (inline package specs via stdin), `output` (lock file path)
```yaml
- name: ray_img_depset_${PYTHON_SHORT}
operation: compile
requirements:
- python/deplocks/ray_img/ray_dev.in
constraints:
- /tmp/ray-deps/requirements_compiled_py${PYTHON_VERSION}.txt
output: python/deplocks/ray_img/ray_img_py${PYTHON_SHORT}.lock
append_flags:
- --python-version=${PYTHON_VERSION}
- --unsafe-package ray
- --python-platform=linux
build_arg_sets: [py310, py311, py312, py313]
pre_hooks:
- ci/raydepsets/pre_hooks/build-placeholder-wheel.sh
- ci/raydepsets/pre_hooks/remove-compiled-headers.sh ${PYTHON_VERSION}
```
#### 2. `subset`
Extracts a subset of already-resolved packages from another depset's lock file. Validates all requested requirements exist in the source.
**Fields:** `source_depset`, `requirements`, `output`
```yaml
- name: ray_base_deps_${PYTHON_SHORT}
operation: subset
source_depset: ray_base_extra_testdeps_${PYTHON_SHORT}
requirements:
- docker/base-deps/requirements.in
output: python/deplocks/base_deps/ray_base_deps_py${PYTHON_VERSION}.lock
```
#### 3. `expand`
Combines multiple depsets into one, optionally adding new requirements. Recursively collects all transitive requirements from referenced depsets and recompiles.
**Fields:** `depsets` (depset names to combine), `requirements`, `constraints`, `output`
```yaml
- name: compiled_ray_llm_test_depset_${PYTHON_VERSION}_${CUDA_CODE}
operation: expand
depsets:
- ray_base_test_depset_${PYTHON_VERSION}_${CUDA_CODE}
requirements:
- python/requirements/llm/llm-requirements.txt
- python/requirements/llm/llm-test-requirements.txt
constraints:
- python/deplocks/llm/ray_test_${PYTHON_VERSION}_${CUDA_CODE}.lock
output: python/deplocks/llm/rayllm_test_${PYTHON_VERSION}_${CUDA_CODE}.lock
```
#### 4. `relax`
Removes specified packages from another depset's lock file. Does NOT re-resolve — simple removal. Use with caution; can create inconsistent environments.
**Fields:** `source_depset`, `packages`, `output`
```yaml
- name: relaxed_data_ci_depset_${PYTHON_SHORT}
operation: relax
source_depset: data_base_ci_depset_${PYTHON_SHORT}
packages:
- pyarrow
- numpy
- datasets
output: python/deplocks/ci/relaxed_data-ci_depset_py${PYTHON_VERSION}.lock
```
### Config file format
Configs use the `.depsets.yaml` extension and live in `ci/raydepsets/configs/`.
**Top-level keys:**
- `build_arg_sets` (optional) — template variable sets for matrix expansion
- `depsets` — list of dependency set definitions
**Template variables** use `${VARIABLE_NAME}`. When a depset lists multiple `build_arg_sets`, it expands into one concrete depset per set.
| Field | Type | Description |
|---|---|---|
| `name` | string | Unique identifier (supports `${VAR}` substitution) |
| `operation` | string | `compile`, `subset`, `expand`, or `relax` |
| `output` | string | Output lock file path relative to workspace root |
| `build_arg_sets` | list | Which build arg sets to expand with |
| `append_flags` | list | Additional flags passed to `uv pip compile` |
| `override_flags` | list | Flags that replace matching defaults |
| `pre_hooks` | list | Shell commands to run before execution |
| `include_setuptools` | bool | Allow setuptools in output (default: `false`) |
**YAML anchors** are supported for DRY config:
```yaml
.common_settings: &common_settings
append_flags:
- --python-version=${PYTHON_VERSION_STR}
- --unsafe-package ray
build_arg_sets: [cpu, cu128]
depsets:
- name: my_depset
<<: *common_settings
operation: compile
requirements: [requirements.txt]
output: output.lock
```
### Default `uv pip compile` flags
Applied automatically to every `compile` call:
```
--no-header
--generate-hashes
--index-strategy unsafe-best-match
--no-strip-markers
--emit-index-url
--emit-find-links
--quiet
--unsafe-package setuptools (unless include_setuptools: true)
```
### Pre-hooks
Shell scripts that run before a depset executes. Modeled as nodes in the DAG.
- `ci/raydepsets/pre_hooks/build-placeholder-wheel.sh` — builds a placeholder Ray wheel so `uv pip compile` can resolve Ray as a dependency
- `ci/raydepsets/pre_hooks/remove-compiled-headers.sh ${PYTHON_VERSION}` — copies `requirements_compiled` to `/tmp/ray-deps/` and strips GPU index URLs (`--extra-index-url`, `--find-links`) so they don't leak into CPU lock files
### Existing config files
| Config | Purpose |
|---|---|
| `rayimg.depsets.yaml` | Core Ray Docker images (`ray_img_depset_*`, `ray_base_deps_*`, `ray_base_extra_*`, `ray_base_slim_*`, CPU/GPU/ML/LLM variants) |
| `rayllm.depsets.yaml` | RayLLM dependencies |
| `ci_data.depsets.yaml` | Ray Data CI tests (pyarrow latest/v9/nightly variants, mongo) |
| `ci_serve.depsets.yaml` | Ray Serve CI tests |
| `data_test.depsets.yaml` | Data test dependencies |
| `docs.depsets.yaml` | Documentation build dependencies |
| `llm_release_tests.depsets.yaml` | LLM release benchmarks |
| `release_compiled_graph_gpu_cu130.depsets.yaml` | Compiled graph GPU tests |
| `release_multimodal_inference_benchmarks_tests.depsets.yaml` | Multimodal benchmarks (audio, embedding, image, video) |
### Docker image hierarchy
The Ray Docker image layer structure (from `rayimg.depsets.yaml`):
```
ray_img_depset_* (compile: core Ray image deps)
├── ray_base_slim_* (expand: minimal slim image)
├── ray_base_extra_testdeps_* (expand: full test deps, CPU)
│ ├── ray_base_deps_* (subset: first Docker layer)
│ └── ray_base_extra_* (subset: second Docker layer)
├── ray_base_extra_testdeps_gpu_* (expand: GPU test deps with CUDA)
├── ray_base_extra_testdeps_llm_cuda_* (expand: LLM+CUDA test deps)
├── ray_ml_base_extra_testdeps_cuda_* (expand: ML+CUDA test deps)
└── ray_base_deps_tpu_* (expand: TPU deps)
```
Cross-config dependencies are supported — e.g., `ci_data.depsets.yaml` references `ray_img_depset_*` from `rayimg.depsets.yaml`.
---
## Marker preservation (pip-compile, py313 / multi-Python locks)
`pip-compile` (pip-tools 7.4.1, the version `ci/ci.sh` uses) **strips `python_version` markers** from output pins UNLESS the source declaration is **an exact-version pin with the marker attached**. This matters because `requirements_compiled_py3.13.txt` is consumed as a constraint at multiple `--python-version` targets via uv.
**What works (markers survive):**
```
onnxruntime==1.18.0 ; ... and python_version <= '3.10'
onnxruntime==1.24.4 ; ... and python_version > '3.10'
```
Both exact pins, each with a marker. pip-compile at py3.11 evaluates the first as false → dropped; second as true → kept. Output retains the marker. When uv consumes the lock as constraint at `--python-version=3.10`, the marker is false → constraint skipped → resolver picks an older version from the source `.in` / `.txt`.
**What does NOT work (markers get stripped):**
```
scipy<1.16 ; python_version < '3.11'
scipy ; python_version >= '3.11'
```
A range cap + an unconstrained entry. Because scipy is also pulled transitively by many other packages with no marker, the consolidated pin loses the marker. Output: bare `scipy==1.17.1`, which then forces py3.10 depset compiles to fail (no cp310 wheel).
**Fix pattern — two exact pins:**
```
scipy==1.15.3 ; python_version < '3.11'
scipy==1.17.1 ; python_version >= '3.11'
```
Even though only one branch wins at compile time, the winning exact pin survives the transitive merge because its `==A.B.C` is more specific than any transitive range.
**Where to put the pins:**
- Broad cross-cutting compat → `python/requirements.txt`
- ML-specific compat → `python/requirements/ml/py313/ml-requirements.txt`
- Test-stack compat → `python/requirements/py313/test-requirements.txt`
- Don't pin in `python/requirements/ml/py313/dl-cpu-requirements.txt` for things unrelated to CPU torch.
**Classes of cliff to watch for when bumping py313 lock:**
1. Dropped cp310 wheels (most common; detectable via PyPI `Requires-Python` ≥ 3.11).
2. Transitive upper bounds from py<3.11-only deps (e.g. `tensorflow-metadata==1.17.3` caps `protobuf<=6.32` on py<3.11; not auto-detectable from `Requires-Python`).
3. Transitive extras that pull new deps in newer versions (e.g. `jsonschema==4.25+` adds `rfc3987-syntax` to its `format-nongpl` extra, which pulls `lark==1.3.1` and clashes with vllm's `lark==1.2.2`).
4. CPU-compile transitive pulls that conflict with GPU depsets (e.g. xgboost's unpinned `nvidia-nccl-cu12` can resolve to a version that conflicts with cu128 torch's pinned nccl — fix by pinning `nvidia-nccl-cu12==<cu128-matching-version>` in `dl-cpu-requirements.txt`).
---
## Commands
### Build all depsets from a config
```bash
bazelisk run //ci/raydepsets:raydepsets -- build ci/raydepsets/configs/rayimg.depsets.yaml
```
### Build a single named depset (and its dependencies)
```bash
bazelisk run //ci/raydepsets:raydepsets -- build ci/raydepsets/configs/rayimg.depsets.yaml --name ray_img_depset_313
```
### Build all configs at once
```bash
bazelisk run //ci/raydepsets:raydepsets -- build --all-configs
```
### Validate lock files are up-to-date (CI check mode)
```bash
bazelisk run //ci/raydepsets:raydepsets -- build ci/raydepsets/configs/rayimg.depsets.yaml --check
```
### Recompile everything (compiled requirements + all lock files)
```bash
ci/ci.sh compile_pip_dependencies && bazelisk run //ci/raydepsets:raydepsets -- build --all-configs
```
### Run raydepsets tests
```bash
bazel test //ci/raydepsets:test_cli
bazel test //ci/raydepsets:test_workspace
```
---
## Common workflows
### Adding a new dependency to a Ray component
1. Identify the correct source requirements file (e.g., `python/requirements/ml/py313/data-requirements.txt` for Ray Data on py313).
2. Add the package with appropriate version bounds (`>=min,<max`). Use the dual-exact-pin-with-markers pattern if the version differs across Python versions.
3. Recompile monorepo deps: `ci/ci.sh compile_pip_dependencies`.
4. Rebuild affected lock files: `bazelisk run //ci/raydepsets:raydepsets -- build ci/raydepsets/configs/<relevant>.depsets.yaml`.
5. Verify with `--check`.
### Creating a new CI test environment
1. Create a `.in` file listing the extra packages.
2. Create or edit a `.depsets.yaml` config in `ci/raydepsets/configs/`.
3. Choose the right base depset to expand from (usually `ray_img_depset_*` for CPU, or a GPU variant).
4. Define the depset with `operation: expand`, referencing the base and your new requirements.
5. Output to `python/deplocks/ci/<name>.lock` or appropriate path.
6. Build and verify with `bazelisk run //ci/raydepsets:raydepsets -- build ci/raydepsets/configs/<your-config>.depsets.yaml`.
### Debugging a dependency conflict
1. Read the failing lock file and the error from `uv pip compile`.
2. Check constraints — the constraints file pins versions; conflicts arise when a new requirement is incompatible.
3. Decide whether the right fix is a source-file pin (preferred), a marker-gated dual pin, or — as a last resort — a `relax` on the base depset.
4. Check cross-config dependencies — a depset in one config may depend on depsets from another config.
5. Use `--name` to rebuild just the failing depset for faster iteration.
### Upgrading a package across all lock files
1. Update the version in the source requirements file.
2. Recompile: `ci/ci.sh compile_pip_dependencies`.
3. Rebuild: `bazelisk run //ci/raydepsets:raydepsets -- build --all-configs`.
4. Review diffs in the generated lock files to verify the upgrade propagated.
---
## Patterns and gotchas
- **CUDA variants:** GPU depsets typically use `--index https://download.pytorch.org/whl/<cuda_code>` to pull PyTorch from the correct CUDA index.
- **Platform targeting:** Use `--python-platform=linux` or `--python-platform=x86_64-manylinux_2_31` for Linux-specific resolution.
- **`--unsafe-package ray`:** Always include so `uv` doesn't try to resolve Ray from PyPI (we use a local build).
- **Constraint files at `/tmp/ray-deps/`:** Created by `remove-compiled-headers.sh`; GPU-stripped versions of `requirements_compiled`.
- **`include_setuptools: true`:** Only set for base-deps and TPU depsets that need setuptools at runtime.
- **Cross-config references:** A depset in `ci_data.depsets.yaml` can reference `ray_img_depset_*` defined in `rayimg.depsets.yaml` because all configs are loaded under `--all-configs` (or pulled in transitively when one config's depset depends on a node from another).
- **Lock file output paths:** Docker image deps go to `python/deplocks/`; release test deps go to `release/ray_release/byod/`.
+82
View File
@@ -0,0 +1,82 @@
---
name: rebuild
description: Rebuild Ray from source — determines the right build mode based on what changed
---
# Rebuild Ray
Canonical build docs: doc/source/ray-contribute/development.md
Use the user's configured Python from CLAUDE.local.md, or fall back to `which python`.
Update this skill if any changes are detected in development.rst.
## Determine what to rebuild
1. Check what files changed: `git diff --name-only HEAD` (or ask the user)
2. Pick the appropriate build mode:
- **Only .py files changed** (no .h, .cc, .pyx, .pxd) → Python-only rebuild (not required if installed with `pip install -e .` — editable mode auto-picks up Python changes)
- **.h, .cc, .pyx, .pxd files changed** → C++/Cython rebuild
- **Dashboard files changed** (python/ray/dashboard/client/) → Dashboard rebuild first
- **First time / clean build** → Full source build
**Running Python tests that exercise C++ changes:** When a Python test depends on
C++ or Cython code (raylet, GCS, core_worker, etc.), run the C++/Cython rebuild
below before running the test. Editable Python installs do not rebuild the compiled
extensions, so stale binaries will run otherwise.
## Python-only rebuild
For changes to Tune, RLlib, Autoscaler, and most Python files.
Two approaches depending on how Ray was installed:
### If installed with `pip install -e .` (editable/full source build)
No rebuild needed — Python changes are picked up automatically.
### If installed from nightly wheel + setup-dev.py
1. Ensure a nightly wheel is installed (see doc/source/ray-contribute/development.md
for the correct wheel URL for the user's platform and Python version)
2. Link local files: `python python/ray/setup-dev.py`
3. Can skip specific dirs: `python python/ray/setup-dev.py -y --skip _private dashboard`
**Warning:** With setup-dev.py, don't run `pip uninstall ray` or `pip install -U`.
Instead: `rm -rf <site-packages>/ray`, reinstall wheel, re-run setup-dev.py.
## C++/Cython rebuild (after initial full build)
### Full package rebuild
```bash
bazel run //:gen_ray_pkg
```
### Build individual modules (faster)
```bash
bazel build //src/ray/raylet:raylet # Raylet only
bazel build //src/ray/gcs:gcs_server # GCS server only
bazel build //src/ray/core_worker:core_worker # Core worker only
bazel build //:ray_pkg # All C++ and Cython
```
### Build variants
- `bazel run -c fastbuild //:gen_ray_pkg` — fast build (less optimization)
- `bazel run -c dbg //:gen_ray_pkg` — debug build with symbols (for gdb)
- `bazel run -c opt //:gen_ray_pkg` — optimized build
Make permanent in `~/.bazelrc`: `build --compilation_mode=fastbuild`
## Full source build (first time)
1. If dashboard changed: `cd python/ray/dashboard/client && npm ci && npm run build && cd -`
2. Install deps: `cd python/ && pip install -r requirements.txt`
3. Build: `pip install -e . --verbose`
## Resource-constrained builds
Add to `~/.bazelrc` if machine runs out of memory:
```
build --local_ram_resources=HOST_RAM*.5 --local_cpu_resources=4
build --disk_cache=~/bazel-cache
```
## Worktree notes
- Verify build paths: `bazel info execution_root`
- If build fails, check .bazelversion matches installed Bazel
- Each worktree may need its own `pip install -e .`
- If in a worktree and bazel targets fail, ensure symlinks are correct
+28
View File
@@ -0,0 +1,28 @@
root = true
[*]
indent_style = space
end_of_line = lf
[*.{bzl,bazel}]
indent_size = 4
[*.{h,hpp,hxx,cpp,cxx,cc,c}]
indent_size = 2
max_line_length = 90
[*.html]
indent_size = 2
[*.java]
indent_size = 2
[*.proto]
indent_size = 2
[*.{py,pyx,pxd,pxi}]
indent_size = 4
max_line_length = 79
[*.sh]
indent_size = 2
+19
View File
@@ -0,0 +1,19 @@
version: 3
paths:
only:
- ./bazel
- ./ci
- ./cpp
- ./docker
- ./java
- ./python
- ./rllib
- ./scripts
- ./src
- ./thirdparty
- ./BUILD.bazel
- ./LICENSE
- ./SECURITY.md
- ./WORKSPACE
- ./pyproject.toml
+10
View File
@@ -0,0 +1,10 @@
have_fun: false
code_review:
disable: false
comment_severity_threshold: MEDIUM
max_review_comments: -1
pull_request_opened:
help: false
summary: false
code_review: true
ignore_patterns: []
+2
View File
@@ -0,0 +1,2 @@
# Formatted Python code with Black
7f1bacc7dc9caf6d0ec042e39499bbf1d9a7d065
View File
+160
View File
@@ -0,0 +1,160 @@
# See https://help.github.com/articles/about-codeowners/
# for more info about CODEOWNERS file
# It uses the same pattern rule for gitignore file,
# see https://git-scm.com/docs/gitignore#_pattern_format.
# ==== Documentation ====
# Authors responsible for documentation infrastructure and layout.
# ray-ci co-owns doc CI/build config; ray-docs-reviewers is a silent fallback
# (notifications disabled) so docs leads can unblock docs-required reviews.
/doc/ @ray-project/ray-docs @ray-project/ray-ci @ray-project/ray-docs-reviewers
# ==== Ray core ====
# All C++ code.
/src/ @ray-project/ray-core
# Python worker.
/python/ray/ @ray-project/ray-core
# Java worker.
/java/ @kfstorm @raulchen @WangTaoTheTonic @SongGuyang @ray-project/ray-core
# C++ worker
/cpp/ @SongGuyang @raulchen @kfstorm @ray-project/ray-core
/doc/source/cluster/ @ray-project/ray-core @ray-project/ray-docs
/doc/source/ray-core/ @ray-project/ray-core @ray-project/ray-docs
/doc/source/cluster/kubernetes/ @andrewsykim @ray-project/ray-core @ray-project/ray-docs
# Public protobuf files.
/src/ray/protobuf/public/ @edoakes @dayshah @MengjinYan
# Azure autoscaler
/python/ray/autoscaler/azure/ @ray-project/ray-core @marosset @jackfrancis @alimaazamat
/python/ray/autoscaler/_private/_azure/ @ray-project/ray-core @marosset @jackfrancis @alimaazamat
# ==== Libraries and frameworks ====
# Dependencies
/python/setup.py @richardliaw @edoakes @ray-project/ray-ci
# Common directory shared by core and the libraries.
# Stricter enforcement because this defines the public boundary supported by core.
/python/ray/_common/ @edoakes @dayshah @MengjinYan
# Ray data.
/python/ray/data/ @ray-project/ray-data
/doc/source/data/ @ray-project/ray-data @ray-project/ray-docs
/python/ray/dashboard/modules/data/ @ray-project/ray-data
/python/ray/dashboard/modules/metrics/dashboards/data_dashboard_panels.py @ray-project/ray-data
# RLlib.
/rllib/ @ray-project/ray-rllib
/doc/source/rllib/ @ray-project/ray-rllib @ray-project/ray-docs
# Ray Tune
/python/ray/tune/ @ray-project/ray-tune
/doc/source/tune/ @ray-project/ray-tune @ray-project/ray-docs
# Ray Train
/python/ray/train/ @ray-project/ray-train
/doc/source/train/ @ray-project/ray-train @ray-project/ray-docs
# Ray AIR
/python/ray/air/ @ray-project/ray-train
# Ray Serve
/python/ray/serve/ @ray-project/ray-serve
/java/serve/ @ray-project/ray-serve
/src/ray/protobuf/serve.proto @ray-project/ray-serve
/python/ray/dashboard/modules/serve/ @ray-project/ray-serve
/doc/source/serve/ @ray-project/ray-serve @ray-project/ray-docs
# LLM
/python/ray/llm/ @ray-project/ray-llm
/python/ray/data/llm.py @ray-project/ray-llm
/python/ray/dashboard/modules/metrics/dashboards/serve_llm_dashboard_panels.py @ray-project/ray-llm
/python/ray/dashboard/modules/metrics/dashboards/serve_llm_grafana_dashboard_base.json @ray-project/ray-llm
/python/ray/serve/llm/ @ray-project/ray-llm
/doc/source/serve/llm/ @ray-project/ray-llm @ray-project/ray-docs
/doc/source/data/working-with-llms.rst @ray-project/ray-llm @ray-project/ray-docs
/doc/source/data/doc_code/working-with-llms/ @ray-project/ray-llm @ray-project/ray-docs
# LLM dependencies
/python/requirements/llm/llm-requirements.txt @ray-project/ray-llm
/python/deplocks/llm/ @ray-project/ray-llm
# ML Docker Dependencies
/python/requirements/ml/dl-cpu-requirements.txt @richardliaw @matthewdeng
/python/requirements/ml/dl-gpu-requirements.txt @richardliaw @matthewdeng
# Ray symbol export
/src/ray/ray_version_script.lds @ray-project/ray-core
/src/ray/ray_exported_symbols.lds @ray-project/ray-core
# Ray usage stats
/python/ray/_private/usage/ @edoakes @richardliaw
/python/ray/dashboard/modules/usage_stats/ @edoakes @richardliaw
/src/ray/protobuf/usage.proto @pcmoritz @thomasdesr
# ==== Build and CI ====
# Bazel.
/BUILD.bazel @ray-project/ray-core @ray-project/ray-ci
/WORKSPACE @ray-project/ray-core @ray-project/ray-ci
/bazel/ @ray-project/ray-core @ray-project/ray-ci
# CI scripts. More specific /ci/ rules below override this catch-all.
/ci/ @ray-project/ray-core @ray-project/ray-ci
# CI
/ci/docker @ray-project/ray-ci
/ci/ray_ci @ray-project/ray-ci
/ci/ray_ci/serve_di_test_names.txt @ray-project/ray-serve
/ci/ray_ci/serve_hap_test_names.txt @ray-project/ray-serve
/.rayciversion @ray-project/ray-ci
# Buildkite pipeline management
.buildkite/hooks @ray-project/ray-ci
# Buildkite pipeline definitions and the change-detection rules that decide
# what CI runs for every PR. Editing these changes what runs for everyone.
/.buildkite/*.rayci.yml @ray-project/ray-ci
/.buildkite/test.rules.txt @ray-project/ray-ci
/.buildkite/always.rules.txt @ray-project/ray-ci
# Compiled dependency lockfile. Gates the build and test environment.
/python/requirements_compiled.txt @ray-project/ray-ci
# Read the Docs build configuration. ray-docs owns the docs build; ray-ci
# co-owns, and ray-docs-reviewers is a silent fallback for backup approval.
/.readthedocs.yaml @ray-project/ray-docs @ray-project/ray-ci @ray-project/ray-docs-reviewers
/release/ray_release @ray-project/ray-ci
/release/release_tests.yaml @ray-project/ray-ci
# Allow people to add BYOD post-installation shell scripts
# on their own.
/release/ray_release/byod/*.sh
/release/ray_release/byod/*.lock
/release/ray_release/byod/requirements_*.in
/release/ray_release/byod/requirements_*.txt
/.github/ISSUE_TEMPLATE/ @ray-project/ray-ci
/.github/workflows/ @ray-project/ray-ci
/.gemini/ @edoakes @ray-project/ray-ci
# TPU
/python/ray/util/tpu.py @andrewsykim @edoakes @ryanaoleary
/python/ray/tests/test_tpu.py @andrewsykim @edoakes @ryanaoleary
/python/ray/tests/accelerators/test_tpu.py @andrewsykim @edoakes @ryanaoleary
/python/ray/_private/accelerators/tpu.py @andrewsykim @edoakes @ryanaoleary
+62
View File
@@ -0,0 +1,62 @@
name: Bug report
title: "[<Ray component: Core|RLlib|etc...>] "
description: Problems and issues with code of Ray
labels: [bug, triage]
body:
- type: markdown
attributes:
value: |
Thank you for reporting the problem!
Please make sure what you are reporting is a bug with reproducible steps. To ask questions
or share ideas, please post on our [Discussion page](https://discuss.ray.io/) instead.
- type: textarea
attributes:
label: What happened + What you expected to happen
description: Describe 1. the bug 2. expected behavior 3. useful information (e.g., logs)
placeholder: >
Please provide the context in which the problem occurred and explain what happened. Further,
please also explain why you think the behaviour is erroneous. It is extremely helpful if you can
copy and paste the fragment of logs showing the exact error messages or wrong behaviour here.
**NOTE**: please copy and paste texts instead of taking screenshots of them for easy future search.
validations:
required: true
- type: textarea
attributes:
label: Versions / Dependencies
description: Please specify the versions of Ray, Python, OS, and other libraries that are used.
placeholder: >
Please specify the versions of dependencies.
validations:
required: true
- type: textarea
attributes:
label: Reproduction script
description: >
Please provide a reproducible script. Providing a narrow reproduction (minimal / no external dependencies) will
help us triage and address issues in the timely manner!
placeholder: >
Please provide a short code snippet (less than 50 lines if possible) that can be copy-pasted to
reproduce the issue. The snippet should have **no external library dependencies**
(i.e., use fake or mock data / environments).
**NOTE**: If the code snippet cannot be run by itself, the issue will be marked as "needs-repro-script"
until the repro instruction is updated.
validations:
required: true
- type: dropdown
attributes:
label: Issue Severity
description: |
How does this issue affect your experience as a Ray user?
multiple: false
options:
- "Low: It annoys or frustrates me."
- "Medium: It is a significant difficulty but I can work around it."
- "High: It blocks me from completing my task."
validations:
required: false
+5
View File
@@ -0,0 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: Ask a question or get support
url: https://discuss.ray.io/
about: Ask a question or request support for using Ray
@@ -0,0 +1,26 @@
name: Documentation
title: "[<Ray component: Core|RLlib|etc...>] "
description: Report an issue with the Ray documentation
labels: [docs, triage]
body:
- type: markdown
attributes:
value: Thank you for helping us improve the Ray documentation!
- type: textarea
attributes:
label: Description
description: |
Tell us about the change you'd like to see. For example, "I'd like to
see more examples of how to use `ray.remote`."
validations:
required: true
- type: textarea
attributes:
label: Link
description: |
If the problem is related to an existing section, please add a link to
the section. For example, https://docs.ray.io/en/master/ray-core/package-ref.html#ray.remote.
validations:
required: false
@@ -0,0 +1,25 @@
name: Ray feature request
description: Suggest an idea for Ray project
title: "[<Ray component: Core|RLlib|etc...>] "
labels: [enhancement, triage]
body:
- type: markdown
attributes:
value: |
Thank you for finding the time to propose a new feature!
We really appreciate the community efforts to improve Ray.
- type: textarea
attributes:
label: Description
description: A short description of your feature
- type: textarea
attributes:
label: Use case
description: >
Describe the use case of your feature request. It will help us understand and
prioritize the feature request.
placeholder: >
Rather than telling us how you might implement this feature, try to take a
step back and describe what you are trying to achieve.
+15
View File
@@ -0,0 +1,15 @@
> Thank you for contributing to Ray! 🚀
> Please review the [Ray Contribution Guide](https://docs.ray.io/en/master/ray-contribute/getting-involved.html) before opening a pull request.
> ⚠️ Remove these instructions before submitting your PR.
> 💡 Tip: Mark as draft if you want early feedback, or ready for review when it's complete.
## Description
> Briefly describe what this PR accomplishes and why it's needed.
## Related issues
> Link related issues: "Fixes #1234", "Closes #1234", or "Related to #1234".
## Additional information
> Optional: Add implementation details, API changes, usage examples, screenshots, etc.
+43
View File
@@ -0,0 +1,43 @@
version: 2
updates:
# ML Requirements.
- package-ecosystem: "pip"
# If we want to add more requirements here (Core, Serve, etc.), then we should
# make additional subdirectories for each one.
directory: "/python/requirements/ml"
schedule:
# Automatic upgrade checks Saturday at 12 AM.
# Dependabot updates can still be manually triggered via Github at any time.
interval: "weekly"
day: "saturday"
# 12 AM
time: "00:00"
# Use Pacific Standard Time.
timezone: "America/Los_Angeles"
commit-message:
prefix: "[air]"
include: "scope"
# Only 5 upgrade PRs open at a time.
open-pull-requests-limit: 5
reviewers:
- "ray-project/ray-tune"
# Data Requirements.
- package-ecosystem: "pip"
directory: "/python/requirements/data_processing"
schedule:
# Automatic upgrade checks Saturday at 12 AM.
# Dependabot updates can still be manually triggered via Github at any time.
interval: "weekly"
day: "saturday"
# 12 AM
time: "00:00"
# Use Pacific Standard Time.
timezone: "America/Los_Angeles"
commit-message:
prefix: "[data]"
include: "scope"
# Only 5 upgrade PRs open at a time.
open-pull-requests-limit: 5
reviewers:
- "scv119"
- "clarkzinzow"
+136
View File
@@ -0,0 +1,136 @@
name: Notify Slack on Labeled Issue or PR
on:
issues:
types: [labeled]
pull_request:
types: [labeled]
jobs:
notify:
runs-on: ubuntu-latest
steps:
- name: Notify Slack Channel Based on Label
uses: actions/github-script@v7
with:
script: |
// ── Label → Slack webhook secret name mapping ──────────────────────
// Add or remove entries here as you add/remove Ray library channels.
// The key is the GitHub label name; the value is the name of the
// GitHub Actions secret that holds that channel's Incoming Webhook URL.
const LABEL_TO_SECRET = {
"serve": "SLACK_WEBHOOK_SERVE",
"train": "SLACK_WEBHOOK_TRAIN",
"tune": "SLACK_WEBHOOK_TUNE",
"rllib": "SLACK_WEBHOOK_RLLIB",
"data": "SLACK_WEBHOOK_DATA",
"air": "SLACK_WEBHOOK_AIR",
"core": "SLACK_WEBHOOK_CORE",
"workflow": "SLACK_WEBHOOK_WORKFLOW",
"cluster": "SLACK_WEBHOOK_CLUSTER",
};
// ── Resolve the webhook URLs from secrets ──────────────────────────
// We pass secrets in as env vars so the script can read them safely.
const SECRET_VALUES = {
"SLACK_WEBHOOK_SERVE": process.env.SLACK_WEBHOOK_SERVE,
"SLACK_WEBHOOK_TRAIN": process.env.SLACK_WEBHOOK_TRAIN,
"SLACK_WEBHOOK_TUNE": process.env.SLACK_WEBHOOK_TUNE,
"SLACK_WEBHOOK_RLLIB": process.env.SLACK_WEBHOOK_RLLIB,
"SLACK_WEBHOOK_DATA": process.env.SLACK_WEBHOOK_DATA,
"SLACK_WEBHOOK_AIR": process.env.SLACK_WEBHOOK_AIR,
"SLACK_WEBHOOK_CORE": process.env.SLACK_WEBHOOK_CORE,
"SLACK_WEBHOOK_WORKFLOW": process.env.SLACK_WEBHOOK_WORKFLOW,
"SLACK_WEBHOOK_CLUSTER": process.env.SLACK_WEBHOOK_CLUSTER,
};
// ── Determine event type and payload ──────────────────────────────
const isPR = !!context.payload.pull_request;
const item = isPR ? context.payload.pull_request : context.payload.issue;
const type = isPR ? "Pull Request" : "Issue";
const action = context.payload.action; // "opened" | "labeled"
const labels = (item.labels || []).map(l => l.name);
// On "labeled" events, only act on the label that was just added
// (avoids duplicate messages when multiple labels already exist).
const triggeredLabel = action === "labeled"
? context.payload.label.name
: null;
const labelsToProcess = triggeredLabel ? [triggeredLabel] : labels;
// ── Send a message for each matching label ─────────────────────────
for (const label of labelsToProcess) {
const secretName = LABEL_TO_SECRET[label];
if (!secretName) continue; // label not mapped
const webhookUrl = SECRET_VALUES[secretName];
if (!webhookUrl) {
core.warning(`Secret ${secretName} is not set — skipping #${label}`);
continue;
}
// Build a rich Slack Block Kit message
const allLabelNames = labels.map(l => `\`${l}\``).join(" ");
const body = {
blocks: [
{
type: "section",
text: {
type: "mrkdwn",
text: `*New ${type} in <https://github.com/${context.repo.owner}/${context.repo.repo}|${context.repo.owner}/${context.repo.repo}>*`
}
},
{
type: "section",
fields: [
{ type: "mrkdwn", text: `*Title*\n<${item.html_url}|${item.title}>` },
{ type: "mrkdwn", text: `*Author*\n<${item.user.html_url}|${item.user.login}>` },
{ type: "mrkdwn", text: `*Labels*\n${allLabelNames || "_none_"}` },
{ type: "mrkdwn", text: `*#*\n${item.number}` },
]
},
...(item.body ? [{
type: "section",
text: {
type: "mrkdwn",
// Truncate long bodies so the message stays readable
text: `*Description*\n${item.body.slice(0, 300)}${item.body.length > 300 ? "…" : ""}`
}
}] : []),
{
type: "actions",
elements: [
{
type: "button",
text: { type: "plain_text", text: `View ${type}` },
url: item.html_url,
style: "primary"
}
]
}
]
};
const response = await fetch(webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body)
});
if (!response.ok) {
core.error(`Failed to post to Slack for label "${label}": ${response.status} ${response.statusText}`);
} else {
core.info(`Posted to Slack channel for label "${label}"`);
}
}
env:
SLACK_WEBHOOK_SERVE: ${{ secrets.SLACK_WEBHOOK_SERVE }}
SLACK_WEBHOOK_TRAIN: ${{ secrets.SLACK_WEBHOOK_TRAIN }}
SLACK_WEBHOOK_TUNE: ${{ secrets.SLACK_WEBHOOK_TUNE }}
SLACK_WEBHOOK_RLLIB: ${{ secrets.SLACK_WEBHOOK_RLLIB }}
SLACK_WEBHOOK_DATA: ${{ secrets.SLACK_WEBHOOK_DATA }}
SLACK_WEBHOOK_AIR: ${{ secrets.SLACK_WEBHOOK_AIR }}
SLACK_WEBHOOK_CORE: ${{ secrets.SLACK_WEBHOOK_CORE }}
SLACK_WEBHOOK_WORKFLOW: ${{ secrets.SLACK_WEBHOOK_WORKFLOW }}
SLACK_WEBHOOK_CLUSTER: ${{ secrets.SLACK_WEBHOOK_CLUSTER }}
+19
View File
@@ -0,0 +1,19 @@
name: Auto merge enabled
on:
pull_request_target:
types:
- auto_merge_enabled
jobs:
add-go-label:
runs-on: ubuntu-latest
steps:
- name: Add go label
uses: actions/github-script@v5
with:
script: |
github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
labels: ['go']
})
@@ -0,0 +1,47 @@
name: Pull request synchronized
on:
pull_request_target:
types:
- synchronize
branches:
- "master"
- "releases/**"
jobs:
disable-automerge:
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v7
with:
script: |
const prQuery = `query PullRequest($owner: String!, $repo: String!, $pullRequestNumber: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $pullRequestNumber) {
id
autoMergeRequest {
enabledAt
}
}
}
}`;
const prVariables = {
owner: context.repo.owner,
repo: context.repo.repo,
pullRequestNumber: context.issue.number
}
const prResult = await github.graphql(prQuery, prVariables)
if (!prResult.repository.pullRequest.autoMergeRequest) {
console.log('Auto merge is not enabled')
return
}
const automergeQuery = `mutation DisablePullRequestAutoMerge($pullRequestId: ID!) {
disablePullRequestAutoMerge(input: {pullRequestId: $pullRequestId}) {
pullRequest {
id
}
}
}`;
const automergeVariables = {
pullRequestId: prResult.repository.pullRequest.id
}
const result = await github.graphql(automergeQuery, automergeVariables)
console.log(result)
+75
View File
@@ -0,0 +1,75 @@
name: Mark and Close Stale Pull Requests
on:
schedule:
# Runs twice a day at 15 minutes past midnight and noon UTC
- cron: '15 */12 * * *'
jobs:
stale:
runs-on: ubuntu-latest
permissions:
pull-requests: write # Required to add labels, comment, close PRs.
steps:
- name: Mark and Close Stale Pull Requests
uses: actions/stale@v9
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
# --- Ignore Issues ---
# Set to -1 so we never mark issues as stale or closed.
days-before-issue-stale: -1
days-before-issue-close: -1
# --- Pull Request Specific Settings ---
# Number of days of inactivity before a Pull Request becomes stale (currently 2 weeks)
days-before-pr-stale: 14
# Number of days of inactivity after being marked stale before a Pull Request is closed (2 more weeks)
days-before-pr-close: 14
# Label to use when marking a PR as stale
stale-pr-label: 'stale'
# Comment to post when marking a PR as stale
stale-pr-message: |
This pull request has been automatically marked as stale because it has not had
any activity for 14 days. It will be closed in another 14 days if no further activity occurs.
Thank you for your contributions.
You can always ask for help on our [discussion forum](https://discuss.ray.io/) or [Ray's public slack channel](https://github.com/ray-project/ray#getting-involved).
If you'd like to keep this open, just leave any comment, and the stale label will be removed.
# Comment to post when closing a stale PR
close-pr-message: |
This pull request has been automatically closed because there has been no more activity in the 14 days
since being marked stale.
Please feel free to reopen or open a new pull request if you'd still like this to be addressed.
Again, you can always ask for help on our [discussion forum](https://discuss.ray.io) or [Ray's public slack channel](https://github.com/ray-project/ray#getting-involved).
Thanks again for your contribution!
# Pull Requests with these labels will never be considered stale
exempt-pr-labels: >
weekly-release-blocker,
release-blocker,
unstale
# Set to true to ignore PRs in a milestone (defaults to false)
exempt-all-pr-milestones: true
# --- Shared Settings & Other Options ---
# Limit the number of actions per run.
operations-per-run: 500
# Remove stale label from PRs on update (default is true)
remove-pr-stale-when-updated: true
# Add unstale label. Whenever a PR is marked as 'unstale' it will not be marked stale again.
labels-to-add-when-unstale: unstale
ascending: true
+256
View File
@@ -0,0 +1,256 @@
# The build output should clearly not be checked in
*test-output.xml
/bazel-*
/python/ray/core
/python/ray/thirdparty_files/
/python/ray/_private/runtime_env/agent/thirdparty_files/
/python/ray/pyarrow_files/
/python/ray/jars/
/python/ray/cpp/
/python/build
/python/dist
/python/python-driver-*
/python/ray/serve/generated
/thirdparty/pkg/
/build/java
.jar
/dashboard/client/build
/.whl
# KubeRay config lives in a separate repository
python/ray/autoscaler/kuberay/config
# Files generated by flatc should be ignored
/src/ray/gcs/format/*_generated.h
/src/ray/object_manager/format/*_generated.h
/src/ray/raylet/format/*_generated.h
/java/runtime/src/main/java/io/ray/runtime/generated/*
/java/serve/src/main/java/io/ray/serve/generated/*
# Files genrated by c++ worker should be ignored.
/cpp/example/thirdparty/
/cpp/example/bazel-*
/python/ray/cpp
# Redis temporary files
*dump.rdb
# Python byte code files
*.pyc
__pycache__/
python/.eggs
.eggs
# Backup files
*.bak
# Emacs temporary files
*~
*#
# Compiled Object files
*.slo
*.lo
*.o
*.xo
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
python/ray/_raylet.pyd
# Incremental linking files
*.ilk
# Library export files
*.exp
# Debug symbols
*.pdb
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
# Visual Studio files
/packages
*.suo
*.user
*.VC.db
*.VC.opendb
# Protobuf-generated files
*_pb2.py
*.pb.h
*.pb.cc
# Ray cluster configuration
scripts/nodes.txt
# OS X folder attributes
.DS_Store
# Debug files
*.dSYM/
*.su
# Python setup files
*.egg-info
# Compressed files
*.gz
# Datasets from examples
**/MNIST_data/
**/cifar-10-batches-bin/
# Generated documentation files
/doc/_build
/doc/source/_static/thumbs
/doc/source/tune/generated_guides/
/doc/source/**/doc/
# User-specific stuff:
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/dictionaries
.llvm-local.bazelrc
.user.bazelrc
.aider*
# Sensitive or high-churn files:
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.xml
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
# Gradle:
.idea/**/gradle.xml
.idea/**/libraries
.idea
# Website
/site/Gemfile.lock
/site/.sass-cache
/site/_site
# Pytest Cache
**/.pytest_cache
**/.cache
.benchmarks
python-driver-*
# Ray Train unit test artifacts
lightning_logs/
hf-internal-testing/
# Vscode
.vscode/
*.iml
# Java
java/**/target
java/**/lib
java/**/.settings
java/**/.classpath
java/**/.project
java/runtime/native_dependencies/
java/testng_custom.xml
test-output
dependency-reduced-pom.xml
# Cpp
cpp/example/thirdparty/
.clwb
# pom.xml files generated from pom_template.xml
java/**/pom.xml
# python virtual env
venv
.venv
.conda
# pyenv version file
.python-version
# Vim
.*.swp
*.swp
.*.swo
*.swo
tags
tags.lock
tags.temp
*.vim
# Emacs
.#*
# tools
tools/prometheus*
# ray project files
project-id
.mypy_cache/
# release test related
.anyscale.yaml
test_state.json
# workflow storage
workflow_data/
# vscode java extention generated
.factorypath
# Jupyter notebook autosave checkpoints
**/.ipynb_checkpoints/
# Jupyter notebook temporary documents used by LSP
.virtual_documents/
### Added by Hedron's Bazel Compile Commands Extractor: https://github.com/hedronvision/bazel-compile-commands-extractor
# The external link: Differs on Windows vs macOS/Linux, so we can't check it in. The pattern needs to not have a trailing / because it's a symlink on macOS/Linux.
/external
# Compiled output -> don't check in
/compile_commands.json
# Directory where clangd puts its indexing work
/.cache/
# Auto-generated tag mapping
tag-mapping.json
# Temporary files generated by import sorting linter.
*.isorted
# Custom BYOD build rayci yaml file
.buildkite/release/custom_byod_build.rayci.yml
# Claude Code — track shared config, ignore personal/local files
/.claude/settings.local.json
/CLAUDE.md
/CLAUDE-*.md
CLAUDE.local.md
# Worktrees
.worktrees/
.claude/worktrees/
+246
View File
@@ -0,0 +1,246 @@
exclude: |
(?x)^(
python/ray/core/generated/|
python/ray/serve/generated/|
python/ray/cloudpickle/|
python/ray/dashboard/client/public/|
python/ray/tests/test_cli_patterns|
python/ray/_private/runtime_env/_clonevirtualenv.py|
python/ray/data/examples/data/|
release/release_logs/|
rllib/offline/tests/data|
thirdparty/patches/|
python/requirements/llm/patches/|
src/ray/thirdparty/|
doc/external/|
doc/source/|
doc/.claude/skills/sphinx-fix/tests/
)
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-added-large-files
- id: check-ast
exclude: |
(?x)(
python/ray/serve/tests/test_config_files/syntax_error\.py
)$
- id: check-json
exclude: |
(?x)^(
# Intentionally bad json schema
python/ray/tests/unit/test_runtime_env_validation_bad_schema.json
)
- id: check-toml
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.8.4
hooks:
- id: ruff
args: [ --fix, --exit-non-zero-on-fix ]
- id: ruff
args: [ --select, "I", --fix, --exit-non-zero-on-fix ]
- repo: https://github.com/jsh9/pydoclint
rev: "0.8.3"
hooks:
- id: pydoclint
args: [
--style=google,
--baseline=ci/lint/pydoclint-baseline.txt,
--exclude=thirdparty|^python/ray/serve/tests/test_config_files/syntax_error\.py$|^python/ray/_private/parameter\.py$,
# --generate-baseline=True, # Not generally needed, but documenting since this is how we generate the initial baseline
--auto-regenerate-baseline=True,
# Current settings (not because we think they're right, but because we
# don't want a baseline the size of the codebase)
--arg-type-hints-in-docstring=False,
--skip-checking-raises=True,
--check-return-types=False,
--allow-init-docstring=True,
--check-class-attributes=False,
--check-style-mismatch=True,
]
types: [python]
files: '^python/ray/'
- repo: https://github.com/cpplint/cpplint
rev: 2.0.0
hooks:
- id: cpplint
args: ["--filter=-whitespace/braces,-whitespace/line_length,-build/c++11,-build/c++14,-build/c++17,-readability/braces,-whitespace/indent_namespace,-runtime/int,-runtime/references,-build/include_order"]
files: ^src/ray/(gcs/actor|common/cgroup2|common/scheduling|common/ray_syncer|common/test|util|raylet_client|internal|scheduling|pubsub|object_manager|rpc(?:/.*)?|raylet|core_worker|ipc)/.*\.(h|cc)$
exclude: |
(?x)^(
src/ray/raylet/scheduling/.*\.(h|cc)$ |
src/ray/core_worker/lib/java/.*\.h$
)
- repo: https://github.com/keith/pre-commit-buildifier
rev: 8.0.1
hooks:
- id: buildifier
files: ^(src|cpp|python|rllib|ci|release|java)(/[^/]+)*/BUILD(\.bazel)?$|^BUILD.bazel$
- id: buildifier-lint
files: ^(src|cpp|python|rllib|ci|release|java)(/[^/]+)*/BUILD(\.bazel)?$|^BUILD.bazel$
- repo: https://github.com/psf/black
rev: 22.10.0
hooks:
- id: black
exclude: |
(?x)^(
python/ray/cloudpickle/|
python/build/|
python/ray/core/src/ray/gcs/|
python/ray/thirdparty_files/|
python/ray/_private/thirdparty/|
python/ray/serve/tests/test_config_files/syntax_error\.py|
python/ray/serve/_private/benchmarks/streaming/_grpc/test_server_pb2_grpc\.py|
doc/external/
)
types_or: [python]
- repo: https://github.com/pre-commit/mirrors-prettier
rev: v3.0.3
hooks:
- id: prettier
files: 'doc/'
types_or: [javascript, ts, tsx, html, css]
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.7.0
hooks:
- id: mypy
args: ['--follow-imports=skip', '--ignore-missing-imports']
files: |
(?x)^(
python/ray/autoscaler/node_provider.py|
python/ray/autoscaler/sdk/__init__.py|
python/ray/autoscaler/sdk/sdk.py|
python/ray/autoscaler/_private/commands.py|
python/ray/autoscaler/_private/autoscaler.py|
python/ray/_private/gcs_utils.py|
python/ray/serve/handle.py|
python/ray/serve/tests/typing_files/check_handle_typing.py
)
additional_dependencies:
[
types-PyYAML==6.0.12.2,
]
- repo: https://github.com/pre-commit/pygrep-hooks
rev: v1.10.0
hooks:
- id: rst-directive-colons
- id: rst-inline-touching-normal
- id: python-no-log-warn
- id: python-check-mock-methods
- repo: https://github.com/shellcheck-py/shellcheck-py
rev: v0.9.0.1
hooks:
- id: shellcheck
args: ['--exclude=1090,1091,2207']
# 1090: Can't follow non-constant source. Use a directive to specify location.
# 1091: Not following {file} due to some error
# 2207: Prefer mapfile or read -a to split command output (or quote to avoid splitting). -- these aren't compatible with macOS's old Bash
- repo: https://github.com/pre-commit/mirrors-clang-format
# `rev` specifies a tag on the above repo that mirrors the corresponding clang-format version.
rev: v12.0.1
hooks:
- id: clang-format
- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks
rev: v2.11.0
hooks:
- id: pretty-format-java
args: [--autofix, --google-java-formatter-version=1.7]
exclude: |
(?x)^(
java/api/src/main/java/io/ray/api/ActorCall.java|
java/api/src/main/java/io/ray/api/CppActorCall.java|
java/api/src/main/java/io/ray/api/PyActorCall.java|
java/api/src/main/java/io/ray/api/RayCall.java
)
- repo: local
hooks:
- id: docstyle
name: Check for Ray docstyle violations
entry: ci/lint/check-docstyle.sh
language: system
types: [python]
- repo: https://github.com/semgrep/pre-commit
rev: v1.32.0
hooks:
- id: semgrep
args: [--config=semgrep.yml, --error]
- repo: https://github.com/errata-ai/vale
rev: v3.4.1
hooks:
- id: vale
files: ^doc/source/data/.*\.(md|rst)$
- repo: https://github.com/MarcoGorelli/cython-lint
rev: v0.18.1
hooks:
- id: cython-lint
args: [--no-pycodestyle]
- repo: local
hooks:
- id: check-import-order
name: Check for Ray import order violations
entry: python ci/lint/check_import_order.py
language: python
types: [python]
pass_filenames: false
args: [".", "-s", "ci", "-s", "python/ray/thirdparty_files", "-s", "python/build", "-s", "lib"]
- repo: local
hooks:
- id: check-cpp-files-inclusion
name: Check ray core C++ files inclusion violations
entry: ci/lint/check_cpp_files_inclusion.py
language: python
files: '^src/ray/'
types: [c++]
- repo: local
hooks:
- id: check-train-circular-imports
name: Check Ray Train circular imports
entry: python python/ray/train/lint/check_circular_imports.py
language: system
types: [python]
files: '^python/ray/train/.*\.py$'
pass_filenames: false
args: ["--patch_dir", "ray/train/v2"]
- repo: https://github.com/pre-commit/mirrors-eslint
rev: v8.26.0
hooks:
- id: eslint
files: ^python/ray/dashboard/client/src/.*\.(tsx|ts)$
types: [file]
args:
- --max-warnings=0
additional_dependencies:
- eslint@8.26.0
- eslint-plugin-react@7.31.10
- eslint-plugin-import@2.26.0
- eslint-config-react-app@7.0.1
- eslint-plugin-prefer-arrow@1.2.3
- '@typescript-eslint/parser@5.41.0'
- '@typescript-eslint/eslint-plugin@5.41.0'
# Pin typescript: eslint-config-react-app declares `typescript: "*"`,
# which otherwise floats to a TS major incompatible with
# @typescript-eslint 5.41 and breaks plugin load in CI. Matches the
# dashboard client's own typescript devDependency.
- typescript@4.8.4
+3
View File
@@ -0,0 +1,3 @@
singleQuote = true
bracketSpacing = false
htmlWhitespaceSensitivity = 'ignore'
+1
View File
@@ -0,0 +1 @@
0.46.0
+84
View File
@@ -0,0 +1,84 @@
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
# Set the version of Python and other tools you might need
build:
os: ubuntu-24.04
tools:
python: "3.11"
jobs:
# On PR builds, skip the Sphinx build when the PR doesn't touch any
# files that affect documentation output. Reduces queue pressure on
# the shared RTD build slots when several PRs are open at once.
# Tag/branch builds (master, stable, etc.) always run.
# The guard matches doc/ but excludes doc/.claude/ (Claude Code skills
# and agent files), which never participate in the Sphinx build, so a
# PR that changes only those paths skips the build instead of running one.
# Code sources (python/ray/, rllib/) are intentionally not matched, so a
# code-only PR skips this PR preview. The RTD PR check is not a required
# merge gate, and the post-merge master build and the Buildkite doc_build
# still render docstring-driven API-reference changes. This trades a
# non-gating premerge preview for less pressure on the shared RTD slots.
# See https://docs.readthedocs.com/platform/stable/guides/build/skip-build.html
#
# Some constructs are avoided deliberately because RTD's job runner
# silently drops scripts that contain them: use echo (not printf
# with a backslash-escape format string), avoid backslash escapes
# in general, and keep shell comments out of this block so that
# backticks/$() inside comments don't confuse the preprocessor.
# The runner also strips the surrounding single quotes from arguments,
# so use git's :! exclude shorthand rather than :(exclude): unquoted
# parentheses reach /bin/sh (dash) and abort the script with a syntax error.
post_checkout:
- |
if [ "${READTHEDOCS_VERSION_TYPE:-}" != "external" ]; then
echo "Not a PR build (version type: '${READTHEDOCS_VERSION_TYPE:-unset}'); building docs."
exit 0
fi
git fetch --depth=500 origin master 2>/dev/null || true
if ! git merge-base origin/master HEAD >/dev/null 2>&1; then
echo "Could not determine merge-base with origin/master; building docs to be safe."
exit 0
fi
if git diff --quiet origin/master...HEAD -- doc/ ':!doc/.claude/' .readthedocs.yaml; then
echo "No doc-affecting files changed in this PR; skipping Sphinx build."
echo "Files changed in PR:"
git diff --name-only origin/master...HEAD
exit 183
fi
echo "Doc-affecting files changed; building docs. Changed doc-relevant paths:"
git diff --name-only origin/master...HEAD -- doc/ ':!doc/.claude/' .readthedocs.yaml
# Override the html build step so every build runs a full clean Sphinx
# build via the doc/Makefile html target, for PR (external) previews and
# branch/tag builds alike.
#
# The incremental-from-master-cache path added in #64277 is disabled for
# now. On every PR preview Sphinx discards the restored cache because a
# config value differs between the environment that produced the cache and
# the RTD build environment, so it rebuilds all documents anyway while
# still paying the cache download and extract cost, and it risks a second
# clean rebuild when the incremental leg trips a warning. A clean build is
# faster and lower-variance in practice today. Re-enable the incremental
# path only once cache reuse is confirmed (Sphinx logs "N changed" rather
# than "NNNN added") and stale-artifact pruning lands for PRs that rename
# or delete sources. The rtd and rtd-fallback Makefile targets and
# doc/load_doc_cache.py stay in the tree for that re-enable.
build:
html:
- |
make -C doc html HTMLDIR="$READTHEDOCS_OUTPUT/html"
# Build documentation in the docs/ directory with Sphinx
sphinx:
configuration: doc/source/conf.py
fail_on_warning: true
# We recommend specifying your dependencies to enable reproducible builds:
# https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
python:
install:
- requirements: doc/requirements-doc.lock.txt
+24
View File
@@ -0,0 +1,24 @@
StylesPath = .vale/styles
Vocab = General, Core, Data, RLlib, Train
MinAlertLevel = suggestion
Packages = Google
[*.rst]
# HACK(@bveeramani): I have no clue why we need to include `(:class:`.*`)` in addition
# to `(:.*:`.*`)`, but we get false positives if we don't. `TokenIgnores` is weird.
TokenIgnores = (:class:`.*`)|(:.*:`.*`)|(`.*`)
[*.{md,rst}]
BasedOnStyles = Vale, Google
# We're disabling "Colons" because we disagree with Google's suggestion to lowercase the
# first word after a colon.
Google.Colons = No
# TODO(@bveeramani): We're temporarily disabling "Heading". In the future, we'll update
# all headings and enable this rule.
Google.Headings = No
# ignore the anchors of headers.
BlockIgnores = (?m)(^\([\w-]+\)=$)
+9
View File
@@ -0,0 +1,9 @@
extends: existence
message: "Use 'AM' or 'PM' (preceded by a space)."
link: 'https://developers.google.com/style/word-list'
level: error
nonword: true
tokens:
- '\d{1,2}[AP]M'
- '\d{1,2} ?[ap]m'
- '\d{1,2} ?[aApP]\.[mM]\.'
+79
View File
@@ -0,0 +1,79 @@
extends: conditional
message: "Spell out '%s', if it's unfamiliar to the audience."
link: 'https://developers.google.com/style/abbreviations'
level: error
ignorecase: false
# Ensures that the existence of 'first' implies the existence of 'second'.
first: '\b([A-Z]{3,5})\b'
second: '(?:\b[A-Z][a-z]+ )+\(([A-Z]{3,5})\)'
# ... with the exception of these:
exceptions:
- API
- ASP
- AWS
- CLI
- CPU
- CRD
- CSS
- CSV
- CUDA
- DEBUG
- DOM
- DPI
- DRF
- ETL
- FAQ
- GCC
- GCE
- GCP
- GCS
- GDB
- GET
- GPU
- GTK
- GUI
- HTML
- HTTP
- HTTPS
- IDE
- JAR
- JSON
- JSONL
- JSX
- KAI
- LESS
- LLDB
- MPS
- NET
- NFS
- NIXL
- NOTE
- NVDA
- OSS
- PATH
- PDF
- PHP
- PNG
- POST
- RAM
- RAG
- REPL
- RSA
- SCM
- SCSS
- SDK
- SQL
- SSH
- SSL
- SVG
- TBD
- TCP
- TODO
- URI
- URL
- USB
- UTF
- XML
- XSS
- YAML
- ZIP
+8
View File
@@ -0,0 +1,8 @@
extends: existence
message: "'%s' should be in lowercase."
link: 'https://developers.google.com/style/colons'
nonword: true
level: suggestion
scope: sentence
tokens:
- ':\s[A-Z]'

Some files were not shown because too many files have changed in this diff Show More