mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-07 08:26:10 +00:00
163 lines
6.6 KiB
Python
163 lines
6.6 KiB
Python
"""Static guardrails for how CircleCI provisions Rust.
|
|
|
|
The root package builds `litellm-rust` through maturin, so any job that runs
|
|
`uv sync` or `uv build` compiles the bridge. The `cimg/python` images ship no
|
|
Rust toolchain, and when cargo is missing maturin's `puccinialin` helper
|
|
quietly provisions one itself: it fetches `rustup-init` from the unversioned
|
|
`https://static.rust-lang.org/rustup/dist/<triple>/` path with no checksum and
|
|
installs a floating `stable` toolchain. uv suppresses build-backend output on a
|
|
successful sync, so that happens with nothing in the job log to show for it,
|
|
and the compiler a job builds with changes whenever upstream publishes.
|
|
|
|
Two invariants are pinned here:
|
|
|
|
1. No step list (job or reusable command) reaches a `uv sync` / `uv build`
|
|
without a Rust toolchain already provisioned ahead of it. That is the
|
|
`install_rust` command on Linux and an inline pinned rustup install in the
|
|
Windows job, so the check accepts either. A new job that syncs without one
|
|
falls back to the unpinned path, which is exactly the regression a static
|
|
check catches at PR time and a green CI run does not.
|
|
2. Both installers pin what they download: an explicit rustup version, a
|
|
verified SHA-256, and the exact toolchain in `rust-toolchain.toml`.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import re
|
|
from pathlib import Path
|
|
from typing import Final
|
|
|
|
import pytest
|
|
import yaml
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[2]
|
|
CONFIG = REPO_ROOT / ".circleci" / "config.yml"
|
|
TOOLCHAIN: Final = REPO_ROOT / "rust-toolchain.toml"
|
|
|
|
BUILDS_WORKSPACE = re.compile(r"\buv\s+(?:sync|build)\b")
|
|
RUSTUP_ARCHIVE_URL = re.compile(r"https://static\.rust-lang\.org/rustup/archive/\d+\.\d+\.\d+/")
|
|
EXACT_TOOLCHAIN = re.compile(r"--default-toolchain\s+\"?(\d+\.\d+\.\d+)\"?")
|
|
TOOLCHAIN_CHANNEL: Final = re.compile(r'^channel = "(\d+\.\d+\.\d+)"$', re.MULTILINE)
|
|
|
|
|
|
def _config() -> dict[str, object]:
|
|
return yaml.safe_load(CONFIG.read_text())
|
|
|
|
|
|
def _step_text(step: object) -> str:
|
|
"""Flatten one step into the shell text it runs, or '' for a command reference."""
|
|
if isinstance(step, dict):
|
|
run = step.get("run")
|
|
if isinstance(run, str):
|
|
return run
|
|
if isinstance(run, dict):
|
|
command = run.get("command")
|
|
return command if isinstance(command, str) else ""
|
|
return ""
|
|
|
|
|
|
def _pinned_toolchain() -> str:
|
|
match: Final = TOOLCHAIN_CHANNEL.search(TOOLCHAIN.read_text())
|
|
assert match is not None, "rust-toolchain.toml must pin an exact channel"
|
|
return match.group(1)
|
|
|
|
|
|
def _without_comments(text: str) -> str:
|
|
return "\n".join(line for line in text.splitlines() if not line.lstrip().startswith("#"))
|
|
|
|
|
|
def _provisions_rust(step: object) -> bool:
|
|
if step == "install_rust":
|
|
return True
|
|
text = _step_text(step)
|
|
return "rustup-init" in text and ("sha256sum" in text or "SHA256" in text)
|
|
|
|
|
|
def _step_lists() -> dict[str, list[object]]:
|
|
config = _config()
|
|
lists: dict[str, list[object]] = {}
|
|
for kind in ("jobs", "commands"):
|
|
section = config.get(kind)
|
|
if not isinstance(section, dict):
|
|
continue
|
|
for name, body in section.items():
|
|
steps = body.get("steps") if isinstance(body, dict) else None
|
|
if isinstance(steps, list):
|
|
lists[f"{kind[:-1]} {name}"] = steps
|
|
return lists
|
|
|
|
|
|
def _first_unprovisioned_build(steps: list[object]) -> str | None:
|
|
"""Return the shell text of the first workspace build reached without Rust, if any."""
|
|
rust_ready = False
|
|
for step in steps:
|
|
if _provisions_rust(step):
|
|
rust_ready = True
|
|
text = _step_text(step)
|
|
if BUILDS_WORKSPACE.search(_without_comments(text)) and not rust_ready:
|
|
return text
|
|
return None
|
|
|
|
|
|
def test_step_lists_exist() -> None:
|
|
lists = _step_lists()
|
|
assert "command install_rust" in lists
|
|
building = {
|
|
name
|
|
for name, steps in lists.items()
|
|
if any(BUILDS_WORKSPACE.search(_without_comments(_step_text(s))) for s in steps)
|
|
}
|
|
assert len(building) > 10, f"expected many workspace-building step lists, found {sorted(building)}"
|
|
|
|
|
|
def test_no_workspace_build_without_a_provisioned_rust_toolchain() -> None:
|
|
offenders = {
|
|
name: build for name, steps in _step_lists().items() if (build := _first_unprovisioned_build(steps)) is not None
|
|
}
|
|
assert not offenders, (
|
|
"these CircleCI step lists run `uv sync`/`uv build` with no Rust toolchain provisioned first, "
|
|
"so maturin will download an unpinned rustup and a floating toolchain instead: "
|
|
f"{ {name: build.strip().splitlines()[0] for name, build in offenders.items()} }"
|
|
)
|
|
|
|
|
|
@pytest.fixture(name="install_rust_command")
|
|
def _install_rust_command() -> str:
|
|
steps = _step_lists()["command install_rust"]
|
|
return "\n".join(_step_text(step) for step in steps)
|
|
|
|
|
|
def test_install_rust_pins_the_rustup_version_in_the_url(install_rust_command: str) -> None:
|
|
assert RUSTUP_ARCHIVE_URL.search(install_rust_command), (
|
|
"install_rust must download rustup-init from a version-pinned /rustup/archive/<x.y.z>/ URL; "
|
|
"the /rustup/dist/ path always serves whatever rustup is current"
|
|
)
|
|
assert "/rustup/dist/" not in install_rust_command
|
|
|
|
|
|
def test_install_rust_verifies_the_installer_checksum(install_rust_command: str) -> None:
|
|
assert "sha256sum -c" in install_rust_command
|
|
assert re.search(r"RUSTUP_SHA256=[0-9a-f]{64}\b", install_rust_command), (
|
|
"install_rust must compare the downloaded installer against a hardcoded SHA-256 "
|
|
"taken from rust-lang's published .sha256 sidecar"
|
|
)
|
|
checksum_index = install_rust_command.index("sha256sum -c")
|
|
execute_index = install_rust_command.index("/tmp/rustup-init -y")
|
|
assert checksum_index < execute_index, "the checksum must be verified before the installer is executed"
|
|
|
|
|
|
def test_install_rust_pins_an_exact_toolchain_version(install_rust_command: str) -> None:
|
|
match: Final = EXACT_TOOLCHAIN.search(install_rust_command)
|
|
assert match is not None, (
|
|
"install_rust must pin an exact toolchain version (e.g. 1.98.0); a channel name like "
|
|
"stable/beta/nightly makes the compiler drift with whatever upstream published that day"
|
|
)
|
|
assert match.group(1) == _pinned_toolchain()
|
|
|
|
|
|
def test_windows_installer_matches_the_repo_toolchain() -> None:
|
|
windows_steps: Final = _step_lists()["job using_litellm_on_windows"]
|
|
windows_command: Final = "\n".join(_step_text(step) for step in windows_steps)
|
|
match: Final = EXACT_TOOLCHAIN.search(windows_command)
|
|
assert match is not None
|
|
assert match.group(1) == _pinned_toolchain()
|