Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion ci/docker/forge.Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,25 @@ apt-get install -y \
python3-pip openjdk-8-jre wget jq \
azure-cli="${AZ_VER}"-1~"${AZ_DIST}"

# Install uv
wget -qO- https://astral.sh/uv/install.sh | sudo env UV_UNMANAGED_INSTALL="/usr/local/bin" sh

mkdir -p /usr/local/python
# Install Python 3.9 using uv
uv python install --install-dir /usr/local/python 3.9
uv python pin 3.9

export UV_PYTHON_INSTALL_DIR=/usr/local/python
# Make Python 3.9 from uv the default by creating symlinks
PYTHON39_PATH=$(uv python find 3.9)
echo $PYTHON39_PATH
ln -s $PYTHON39_PATH /usr/local/bin/python3.9
ln -s $PYTHON39_PATH /usr/local/bin/python3
ln -s $PYTHON39_PATH /usr/local/bin/python
Comment on lines +58 to +72
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hate to ask, but could you split this forge change into a separate PR?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nevermind.. I will merge this altogether this time.

next time please split this to another PR since it deserves its own step of change.


# 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.
python -m pip install pip==25.0 cffi==1.16.0
uv pip install --system pip==25.0 cffi==1.16.0

# Needs to be synchronized to the host group id as we map /var/run/docker.sock
# into the container.
Expand Down
5 changes: 3 additions & 2 deletions ci/lint/lint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,10 @@ banned_words() {
./ci/lint/check-banned-words.sh
}

# Use system python to avoid conflicts with uv python in forge image
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should say that we want to use the system python for python version 3.xx

doc_readme() {
pip install -c python/requirements_compiled.txt docutils
cd python && python setup.py check --restructuredtext --strict --metadata
/usr/bin/python -m pip install -c python/requirements_compiled.txt docutils
cd python && /usr/bin/python setup.py check --restructuredtext --strict --metadata
}

dashboard_format() {
Expand Down
1 change: 1 addition & 0 deletions ci/ray_ci/oss_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ release_byod:
byod_ecr_region: us-west-2
aws_cr: 029272617770.dkr.ecr.us-west-2.amazonaws.com
gcp_cr: us-west1-docker.pkg.dev/anyscale-oss-ci
azure_cr: rayreleasetest.azurecr.io
aws2gce_credentials: release/aws2gce_iam.json
ci_pipeline:
premerge:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
cloud_id: {{env["ANYSCALE_CLOUD_ID"]}}
region: us-west-2

head_node_type:
name: head_node
instance_type: 4CPU-16GB

worker_node_types: []
4 changes: 2 additions & 2 deletions release/ray_release/buildkite/step.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@
get_test_project_id,
)
from ray_release.env import DEFAULT_ENVIRONMENT, load_environment
from ray_release.template import get_test_env_var
from ray_release.util import DeferredEnvVar
from ray_release.custom_byod_build_init_helper import (
generate_custom_build_step_key,
get_prerequisite_step,
)
from ray_release.template import get_test_env_var
from ray_release.util import DeferredEnvVar

DEFAULT_ARTIFACTS_DIR_HOST = "/tmp/ray_release_test_artifacts"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from urllib.parse import urlparse
from typing import Optional, List, Tuple

AZURE_STORAGE_ACCOUNT = "rayreleasetests"
OUTPUT_JSON_FILENAME = "output.json"
AWS_CP_TIMEOUT = 300
TIMEOUT_RETURN_CODE = 124 # same as bash timeout
Expand Down Expand Up @@ -69,6 +70,8 @@ def run_storage_cp(source: str, target: str):
return False

storage_service = urlparse(target).scheme
if target.startswith(f"https://{AZURE_STORAGE_ACCOUNT}.dfs.core.windows.net"):
storage_service = "azure_blob"
cp_cmd_args = []
if storage_service == "s3":
cp_cmd_args = [
Expand All @@ -88,7 +91,7 @@ def run_storage_cp(source: str, target: str):
source,
target,
]
elif storage_service == "abfss":
elif storage_service == "azure_blob":
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Azure Blob Storage URL Scheme Issue

The update to the storage service detection logic removes support for abfss:// URLs. While urlparse().scheme correctly identifies abfss for these URLs, the elif condition now expects azure_blob, which is only set for a specific https:// pattern. This causes abfss:// URLs to fall through to an unsupported storage service exception.

Fix in Cursor Fix in Web

subprocess.run(["azcopy", "login", "--identity"], check=True)
cp_cmd_args = [
"azcopy",
Expand Down
5 changes: 5 additions & 0 deletions release/ray_release/configs/global_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class GlobalConfig(TypedDict):
byod_ecr_region: str
byod_aws_cr: str
byod_gcp_cr: str
byod_azure_cr: str
state_machine_pr_aws_bucket: str
state_machine_branch_aws_bucket: str
state_machine_disabled: bool
Expand Down Expand Up @@ -82,6 +83,10 @@ def _init_global_config(config_file: str):
config_content.get("byod", {}).get("gcp_cr")
or config_content.get("release_byod", {}).get("gcp_cr")
),
byod_azure_cr=(
config_content.get("byod", {}).get("azure_cr")
or config_content.get("release_byod", {}).get("azure_cr")
),
aws2gce_credentials=(
config_content.get("credentials", {}).get("aws2gce")
or config_content.get("release_byod", {}).get("aws2gce_credentials")
Expand Down
5 changes: 5 additions & 0 deletions release/ray_release/environments/azure.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
ANYSCALE_HOST=https://console.anyscale-staging.com
RELEASE_AWS_ANYSCALE_SECRET_ARN="arn:aws:secretsmanager:us-west-2:029272617770:secret:release-automation/anyscale-staging-token20231008005227440600000001-JTgxb0"
RELEASE_DEFAULT_CLOUD_ID="cld_5nnv7pt2jn2312x2e5v72z53n2"
RELEASE_DEFAULT_PROJECT="prj_y8syktydl7ltabhz5axdelwnce"
ANYSCALE_CLOUD_STORAGE_PROVIDER=abfss
2 changes: 2 additions & 0 deletions release/ray_release/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -594,6 +594,8 @@ def get_byod_ecr(self) -> str:
"""
if self.is_gce() or self.is_kuberay():
return get_global_config()["byod_gcp_cr"]
if self.is_azure():
return get_global_config()["byod_azure_cr"]
byod_ecr = get_global_config()["byod_aws_cr"]
if byod_ecr:
return byod_ecr
Expand Down
5 changes: 5 additions & 0 deletions release/release_tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@

variations:
- __suffix__: aws
- __suffix__: azure
env: azure
frequency: manual
cluster:
cluster_compute: hello_world_compute_config_azure.yaml

- name: hello_world_custom_byod
team: reef
Expand Down