Skip to content

ci(uv): run cross-built wheels on native-arch runners - #1505

Closed
xangcastle wants to merge 1 commit into
mainfrom
xangcastle/crossbuild-exec-verify
Closed

xangcastle wants to merge 1 commit into
mainfrom
xangcastle/crossbuild-exec-verify

Conversation

@xangcastle

@xangcastle xangcastle commented Aug 28, 2026

Copy link
Copy Markdown
Member

No description provided.

@coderabbitai

coderabbitai Bot commented Aug 28, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 802b191a-b033-4dfa-82d3-c40b885b89df

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@aspect-workflows

aspect-workflows Bot commented Aug 28, 2026

Copy link
Copy Markdown

✨ Aspect Workflows Tasks

📅 Sat Aug 29 06:07:52 UTC 2026

✅ 44 successful tasks

  • ✅ buildifier · ⏱ 23.4s · 🐙 GitHub Actions · ☑️ Check
    💬 Format complete (clean)
  • ✅ gazelle · ⏱ 17.2s · 🐙 GitHub Actions · ☑️ Check
    💬 Gazelle complete (clean)
  • ✅ test-e2e-bazel-8 [test] · ⏱ 5m 45s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (316/316 passed)
  • ✅ test-e2e-bazel-9 [test] · ⏱ 4m 47s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (306/306 passed)
  • ✅ test-e2e-crossbuild-bazel-8 [test] · ⏱ 6m 22s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (48/48 passed)
  • ✅ test-e2e-crossbuild-bazel-9 [test] · ⏱ 8m 11s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (48/48 passed)
  • ✅ test-e2e-interpreter-build-config-bazel-8 [test] · ⏱ 19.4s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-e2e-interpreter-build-config-bazel-9 [test] · ⏱ 33.9s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-e2e-interpreter-input-validation-bazel-8 [test] · ⏱ 20.6s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-e2e-interpreter-input-validation-bazel-9 [test] · ⏱ 46.2s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-e2e-interpreter-runtime-metadata-bazel-8 [test] · ⏱ 29.5s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (2/2 passed)
  • ✅ test-e2e-interpreter-runtime-metadata-bazel-9 [test] · ⏱ 53.3s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (2/2 passed)
  • ✅ test-e2e-interpreter-toolchain-settings-bazel-8 [test] · ⏱ 17.1s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-e2e-interpreter-toolchain-settings-bazel-9 [test] · ⏱ 46.7s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-e2e-rules-proto-grpc-python-bazel-8 [test] · ⏱ 1m 29s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-e2e-rules-proto-grpc-python-bazel-9 [test] · ⏱ 1m 15s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-e2e-rules-python-interop-bazel-8 [test] · ⏱ 53s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (15/15 passed)
  • ✅ test-e2e-rules-python-interop-bazel-9 [test] · ⏱ 1m 3s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (15/15 passed)
  • ✅ test-e2e-rules-python-provider-compat-bazel-8 [test] · ⏱ 22.9s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (4/4 passed)
  • ✅ test-e2e-rules-python-provider-compat-bazel-9 [test] · ⏱ 50.6s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (4/4 passed)
  • ✅ test-examples-debugger-bazel-8 [test] · ⏱ 25.3s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-examples-debugger-bazel-9 [test] · ⏱ 55.9s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-examples-dev_deps-bazel-8 [test] · ⏱ 27.1s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-examples-dev_deps-bazel-9 [test] · ⏱ 44.6s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-examples-django-bazel-8 [test] · ⏱ 24.2s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed · 1 cached)
  • ✅ test-examples-django-bazel-9 [test] · ⏱ 45s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed · 1 cached)
  • ✅ test-examples-multi_version-bazel-8 [test] · ⏱ 27.1s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (2/2 passed)
  • ✅ test-examples-multi_version-bazel-9 [test] · ⏱ 51.1s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (2/2 passed)
  • ✅ test-examples-protobuf-bazel-8 [test] · ⏱ 1m 24s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-examples-protobuf-bazel-9 [test] · ⏱ 1m 39s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-examples-py_binary-bazel-8 [test] · ⏱ 23.7s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed · 1 cached)
  • ✅ test-examples-py_binary-bazel-9 [test] · ⏱ 47s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed · 1 cached)
  • ✅ test-examples-py_pex_binary-bazel-8 [test] · ⏱ 22.2s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed · 1 cached)
  • ✅ test-examples-py_pex_binary-bazel-9 [test] · ⏱ 25.7s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed · 1 cached)
  • ✅ test-examples-py_venv-bazel-8 [test] · ⏱ 21.8s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (3/3 passed · 3 cached)
  • ✅ test-examples-py_venv-bazel-9 [test] · ⏱ 35.5s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (3/3 passed)
  • ✅ test-examples-pytest-bazel-8 [test] · ⏱ 42.8s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (11/11 passed)
  • ✅ test-examples-pytest-bazel-9 [test] · ⏱ 1m 4s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (11/11 passed)
  • ✅ test-examples-uv_pip_compile-bazel-8 [test] · ⏱ 28s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-examples-uv_pip_compile-bazel-9 [test] · ⏱ 40.8s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-examples-virtual_deps-bazel-8 [test] · ⏱ 29.1s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-examples-virtual_deps-bazel-9 [test] · ⏱ 55.4s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (1/1 passed)
  • ✅ test-root-bazel-8 [test] · ⏱ 3m 3s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (312/312 passed)
  • ✅ test-root-bazel-9 [test] · ⏱ 3m 23s · 🐙 GitHub Actions · ☑️ Check
    💬 Bazel test complete (311/311 passed)

⏱ Last updated Sat Aug 29 06:16:05 UTC 2026 · 📊 GitHub API quota 1,112/15,000 (7% used, resets in 40m)
🚀 Powered by Aspect CLI (v2026.28.2)  |  Aspect Build · X · LinkedIn · YouTube

@github-actions

github-actions Bot commented Aug 28, 2026

Copy link
Copy Markdown

py_binary startup benchmark

Version Mean (ms) Median (ms) ± stddev vs BCR vs main Build (s)
BCR 1.11.7 (baseline) 138.859 137.890 ±5.892 1.51
HEAD main 53.168 52.972 ±1.360 -61.6% 1.75
This PR 54.284 54.059 ±1.538 -60.8% +2.1% 1.62

Measured with hyperfine --warmup 5 --runs 50 --shell=none on Linux
Gate: PR vs HEAD main median (threshold: 10%, and must exceed the 2×SE noise floor, here 1.1%). BCR is shown only as a historical baseline.
Build time: cold bazel build //:bench with isolated output base, no disk cache; external repos prefetched so network is excluded.

sys.path quality

Version sys.path entries distinct site-packages roots duplicate realpaths
BCR 1.11.7 (baseline) 6 1 0
HEAD main 7 2 0
This PR 7 2 0

sys.path quality measured by bench_syspath inside the assembled venv. Duplicate realpaths indicate symlink redundancy; many distinct site-packages roots suggest an inefficient venv layout.

Bazel analysis benchmark

Version Mean (ms) Median (ms) ± stddev vs BCR vs main Targets Actions
BCR 2.0.0-alpha.6 (baseline) 1389.817 1363.098 ±215.359 304 13746
HEAD main 1403.787 1359.921 ±234.471 -0.2% 304 13546
This PR 1344.717 1255.292 ±246.271 -7.9% -7.7% 304 13546

Measured with hyperfine --warmup 1 --runs 10 on Linux
Gate: PR vs HEAD main median (threshold: 10%, and must exceed the 2×SE noise floor, here 15.8%). BCR is shown only as a historical baseline.
Command: warm-server bazel build --nobuild //workspace/..., analysis cache discarded each run via a fresh --action_env value; no disk cache.

py_image_layer benchmark

Scenario Version Mean (s) Median (s) ± stddev Actions vs BCR vs main
Analysis BCR 2.0.0-alpha.6 (baseline) 0.76 0.75 ±0.14 747
Analysis HEAD main 0.72 0.66 ±0.13 726 -11.1%
Analysis This PR 0.73 0.71 ±0.15 726 -5.0% +6.9%
1p Source Change BCR 2.0.0-alpha.6 (baseline) 0.74 0.73 ±0.04 4
1p Source Change HEAD main 0.75 0.74 ±0.05 5 +1.2%
1p Source Change This PR 0.75 0.74 ±0.04 5 +1.8% +0.7%
3p Source Change BCR 2.0.0-alpha.6 (baseline) 0.87 0.86 ±0.03 5
3p Source Change HEAD main 0.92 0.92 ±0.03 6 +6.1%
3p Source Change This PR 0.92 0.92 ±0.02 6 +6.6% +0.5%

Measured with hyperfine on Linux, building //workspace:image_layers (10 binaries, ~30-wheel dep pool, grouped first-party/pip/interpreter tier) with isolated output base, no disk cache.
Scenarios: analysis = warm-server bazel build --nobuild, re-analyzed each run via a fresh --action_env value; incrementals run against a built state with warm analysis: source = append to the last package's lib.py, wheel = rewrite click post_install_patches content.
Actions: for Analysis, the total action count behind the image target from aquery deps(...); for incrementals, actions re-executed for the mutation, from a single instrumented run's BEP build metrics (deterministic; per-mnemonic breakdown in the *-actions.json artifacts). Informational only, not gated.
Gate: PR vs HEAD main median per scenario (threshold: 10%, and must exceed the 2×SE noise floor). BCR is shown only as a historical baseline.

@xangcastle xangcastle changed the title ci(uv): run cross-built wheels in containers on native-arch runners ci(uv): run cross-built wheels on native-arch runners Aug 28, 2026
@xangcastle
xangcastle force-pushed the xangcastle/crossbuild-exec-verify branch 3 times, most recently from 89d07df to 50df2a5 Compare August 29, 2026 05:55
…alidation

Adds pycross-{bcrypt,geohash,msgpack,numpy,psutil,rpds_py,tiktoken,compile_pyc}
with their corresponding BUILD, setup.MODULE, pyproject, uv.lock and tests.
Build helper gains setuptools-rust detection and meson setup-args merging.

Replaces OCI exec-image verification with a wheel-only flow modeled after the
spike's crossbuild CI:

- pycross_wheel_export (tools/wheel_export.bzl) exports per-arch wheels via
  a platform transition and a predictable bazel-bin path.
- crossbuild-wheels-amd64 builds arm64 wheels on an amd64 runner.
- crossbuild-wheels-arm64 builds amd64 wheels on an arm64 runner.
- crossbuild-run-amd64-built installs and runs the amd64-built arm64 wheels
  on a native arm64 runner with Python 3.12 + pip.
- crossbuild-run-arm64-built installs and runs the arm64-built amd64 wheels
  on a native amd64 runner with Python 3.12 + pip.
- crossbuild-wheels-darwin / crossbuild-run-darwin-built provide the same
  darwin->linux coverage, gated to main and '*macos*' branches.

Removes rules_oci and the ubuntu base image from the crossbuild workspace
since containers are no longer used.

Validated in e2e/crossbuild: 47 pass, 1 skipped (compile_pyc on non-Linux).
@xangcastle

Copy link
Copy Markdown
Member Author

Superseded by #1507 (branch renamed to trigger the macOS cross-build pipeline).

@xangcastle xangcastle closed this Aug 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant