chore: import upstream snapshot with attribution
This commit is contained in:
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
7.5.0
|
||||
@@ -0,0 +1 @@
|
||||
2023-12-20
|
||||
@@ -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"),
|
||||
],
|
||||
)
|
||||
@@ -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.
|
||||
@@ -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"
|
||||
@@ -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: ""
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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
|
||||
;
|
||||
@@ -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}}"
|
||||
@@ -0,0 +1,4 @@
|
||||
group: forge
|
||||
steps:
|
||||
- name: forge
|
||||
wanda: ci/docker/forge.wanda.yaml
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1,6 @@
|
||||
group: forge
|
||||
sort_key: "_forge"
|
||||
steps:
|
||||
- name: forge
|
||||
instance_type: builder-x86_64
|
||||
wanda: ci/docker/forge.wanda.yaml
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
macos/macos.rayci.yml
|
||||
+1
@@ -0,0 +1 @@
|
||||
../always.rules.test.txt
|
||||
+1
@@ -0,0 +1 @@
|
||||
../always.rules.txt
|
||||
@@ -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
|
||||
@@ -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
@@ -0,0 +1 @@
|
||||
../test.rules.test.txt
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../test.rules.txt
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
@@ -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
@@ -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
@@ -0,0 +1 @@
|
||||
../_forge.rayci.yml
|
||||
+1
@@ -0,0 +1 @@
|
||||
../_images.rayci.yml
|
||||
@@ -0,0 +1 @@
|
||||
../_wheel-build.rayci.yml
|
||||
@@ -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"
|
||||
@@ -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
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
;
|
||||
@@ -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
|
||||
@@ -0,0 +1,7 @@
|
||||
BasedOnStyle: Google
|
||||
ColumnLimit: 90
|
||||
DerivePointerAlignment: false
|
||||
IndentCaseLabels: false
|
||||
PointerAlignment: Right
|
||||
BinPackArguments: false
|
||||
BinPackParameters: false
|
||||
+86
@@ -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: "*"
|
||||
@@ -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
|
||||
@@ -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 -->
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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")
|
||||
@@ -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/`.
|
||||
@@ -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
|
||||
@@ -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
@@ -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
|
||||
@@ -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: []
|
||||
@@ -0,0 +1,2 @@
|
||||
# Formatted Python code with Black
|
||||
7f1bacc7dc9caf6d0ec042e39499bbf1d9a7d065
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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"
|
||||
@@ -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 }}
|
||||
@@ -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)
|
||||
@@ -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
@@ -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/
|
||||
@@ -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
|
||||
@@ -0,0 +1,3 @@
|
||||
singleQuote = true
|
||||
bracketSpacing = false
|
||||
htmlWhitespaceSensitivity = 'ignore'
|
||||
@@ -0,0 +1 @@
|
||||
0.46.0
|
||||
@@ -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
|
||||
@@ -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-]+\)=$)
|
||||
@@ -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]\.'
|
||||
@@ -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
|
||||
@@ -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
Reference in New Issue
Block a user