Skip to content

ci_estimate: count one build per variant (Python version) - #203

Merged
Tobias-Fischer merged 1 commit into
mainfrom
ci/estimate-python-variants
Nov 10, 2026
Merged

Tobias-Fischer merged 1 commit into
mainfrom
ci/estimate-python-variants

Conversation

@Tobias-Fischer

Copy link
Copy Markdown
Collaborator

The PR build estimate counted recipes, not builds. With several Python versions pinned (#193 for lyrical), a recipe with Python content makes one build per version. #193's linux-64 run started 3474 builds while the estimate said 2487 packages (about 12.8 h instead of about 23 h).

Changes

  • build_timings.variant_builds(recipes, platform)
    • Counts each recipe's builds from the work dir's conda_build_config.yaml: the product of the multi-valued variant keys that its build/host requirements name without a version.
    • Zipped keys (python + is_python_min) count as one axis.
    • if: conditions are evaluated for a native build, so python under build_platform != target_platform doesn't count.
    • On Conditionally build Python-dependent Lyrical libraries across Pythons 3.12-3.14 #193's lyrical recipes (linux-64), it finds 495 recipes × 3 Python versions, plus beluga × 2 (hdf5). That's the same split rattler-build reported ("Found 3 variants" ×495). It takes under a second for the 2485 recipes.
  • ci_estimate.py
    • Counts builds instead of recipes.
    • Counts the cache per variant, so a recipe with 1 of 3 variants cached still has 2 to build.
    • The summary says how many recipes are built in several variants.
  • build-ci timing
    • A recipe's variants used to share one span. Each build now gets its own span (still scaled to the wall time), and the recipe records its average per build.
    • vinca_timings multiplies that average by the recipe's builds when packing jobs.
    • The existing lyrical times (2 variants, one span) average in with the other distributions until the next update-build-timings refreshes them.
  • check_dependency_compat
    • Adds variant_values (all values per key) and zip_groups.
    • variant_pins is now built on variant_values. Its output is unchanged on every distribution and platform (checked against the old code).

Testing

  • Tests cover variant counting (including riscv64's single Python and a Windows-only Python dependency), the estimate with a partly cached recipe, vinca_timings scaling, and per-variant build-ci times.
  • pixi run test and tools/robostack.py check pass.

🤖 Generated with Claude Code

With several Python versions pinned (lyrical, #193), a recipe with Python
content makes one build per version, and the estimate counted recipes,
not builds: #193's linux-64 run had 3474 builds where the estimate said
2487 packages.

build_timings.variant_builds counts each recipe's builds from the
multi-valued variant keys its build/host requirements name without a
version (zipped keys as one axis, conditions evaluated for a native
build), from the work dir's conda_build_config.yaml. ci_estimate counts
builds, and a cached build per variant (the cache holds each variant's
package). build-ci records a recipe's time per build (each variant's
span, averaged), and vinca_timings multiplies it by the recipe's builds
for packing the jobs.

check_dependency_compat: variant_values and zip_groups; variant_pins
now uses variant_values (same output, checked on all distros/platforms).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Tobias-Fischer Tobias-Fischer added the build:none PR build: build no packages, only run the checks (tooling, CI or docs changes) label Nov 9, 2026
@Tobias-Fischer
Tobias-Fischer merged commit 5adab93 into main Nov 10, 2026
8 checks passed
@Tobias-Fischer
Tobias-Fischer deleted the ci/estimate-python-variants branch November 10, 2026 18:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

build:none PR build: build no packages, only run the checks (tooling, CI or docs changes)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants