Repository navigation
Build and test conda-recipe-cf for Intel Python CI - #400
jharlow-intel wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
🔵 Needs a closer look
Full-version builds and the external Jenkins handoff remain unverified and need maintainer validation.
1 open issue
What changed in this PR
Adds GitHub Actions build and test support for mkl_fft’s conda-forge packages, preparing the repository for Intel Python CI’s future Jenkins integration.
Changes:
- Derives Linux and Windows build matrices from recipe Python variants, limiting pull requests to the two newest regular versions.
- Adds package-building and isolated testing scripts, with pytest JUnit reporting.
- Configures artifact naming, pins Miniforge, and documents the CI integration.
| File | Description |
|---|---|
conda-recipe-cf/conda_build_config.yaml |
Declares Python variants and NumPy 2. |
conda-recipe-cf/AGENTS.md |
Documents the recipe’s matrix role. |
ci/test.py |
Tests the installed package and writes JUnit results. |
ci/README.md |
Explains CI operation and local usage. |
ci/matrix.py |
Derives platform and Python build matrices. |
ci/hooks.py |
Installs artifacts into isolated test environments. |
ci/config.yml |
Defines workflow, artifact names, and test requirements. |
ci/build.py |
Builds and collects packages for a selected Python version. |
AGENTS.md |
Adds the Intel Python CI directory reference. |
.github/workflows/intel-ci.yml |
Orchestrates matrix generation, builds, and package tests. |
.github/AGENTS.md |
Documents the workflow and its matrix source. |
Review effort: Balanced
ebc1ca7 to
36f66c0
Compare
Adds what Intel Python CI (gh-ci) needs: a ci/ directory and .github/workflows/intel-ci.yml. The workflow builds conda-recipe/ with conda-build and the wheels with cibuildwheel, for every platform and Python version the recipe and pyproject.toml declare, and tests each package in a clean environment with ci/test.py. Intel's Jenkins tests them again, scans them, runs ci/benchmark.py on the newest Linux package, and publishes a release tag's tested packages as its GitHub Release. conda-recipe/ is now the only recipe, the conda-forge one that was conda-recipe-cf/; the Intel-channel recipe and conda-package.yml, which copied wheels out through WHEELS_OUTPUT_FOLDER, are removed. conda-package-cf.yml reports the same check names, so the required checks still run. conda_build_config.yaml now lists the Python versions, and numpy: '2', as conda-build otherwise defaults to 1.26. The wheels' run-time requirement on mkl comes from [tool.gh-ci] wheel-requires in pyproject.toml, which ci/build.py adds to each wheel: in [project] it would fail the recipe's pip check, as conda-forge's mkl has no pip metadata. The Agent guidance job, ci/guidance.py, fails a pull request that adds a broken link, path, script or identifier claim to an agent guidance file it changes. Claims that already fail, and untouched files, never fail it. dokimi is installed with the hashes in ci/guidance-requirements.txt.
36f66c0 to
93e4302
Compare
vchamarthi
left a comment
There was a problem hiding this comment.
Scripts look good and match the other repos, and the 22 jobs are green.
The PR description is out of date though. It says the workflow builds conda-recipe-cf (it's deleted now, and conda-recipe/ is replaced by the cf recipe), Linux and Windows only (macOS and wheels are built too), and that Jenkins isn't on for mkl_fft (it's enabled in config/gh-ci.json, dry run). The test counts in it are old as well, the head run shows 2793 and 2787.
It also doesn't say conda-package.yml is deleted. That workflow was the only one building and testing against the Intel channel (software.repos.intel.com/python/conda), which is what the shipped Intel package links against, and nothing replaces it. Rest is inline.
|
|
||
| def require_scipy_fft(): | ||
| """Skips the test unless mkl_fft has its SciPy interface.""" | ||
| if scipy_fft is None: |
There was a problem hiding this comment.
When import mkl fails, the scipy-interface tests now skip instead of failing. So a conda cell where mkl-service is required in ci/config.yml but imports badly still goes green with about 240 fewer tests. You can already see it in the 3.15 wheel cells: 2551 passed and 54 skipped, against 2793 and 2 on Linux. Could ci/test.py check that the scipy interface loaded when mkl-service is in the requirements? Same pattern in test_basic.py and test_multithreading.py.
| try: | ||
| import mkl_fft.interfaces.scipy_fft as fft | ||
| except ImportError: | ||
| pytest.skip("This test file needs mkl-service", allow_module_level=True) |
There was a problem hiding this comment.
Same as in test_interfaces.py: this skip hides a broken mkl-service import.
| import mkl_fft.interfaces.scipy_fft as fft | ||
| except ImportError: | ||
| pytest.skip("This test file needs scipy", allow_module_level=True) | ||
| pytest.skip( |
| - python | ||
| - {{ pin_compatible('mkl') }} | ||
| - numpy >=1.26.4 | ||
| - numpy |
There was a problem hiding this comment.
Run requirement goes from numpy >=1.26.4 to a bare numpy, with ignore_run_exports: numpy. conda can now pair this with a numpy 1.x older than the numpy>=1.26.4 in pyproject.toml. Could we use numpy's run_exports instead of ignoring them?
|
|
||
| test: | ||
| name: Test ${{ matrix.name }} Python ${{ matrix.python }} | ||
| needs: [matrix, build] |
There was a problem hiding this comment.
If any build leg fails, macOS included, all the test legs are skipped and the run fails. Jenkins needs a green run, so a macOS-only failure would block a tag release even though Jenkins ignores macOS. Intended? Same on test-wheel at line 175.
| # macOS runs on Intel runners, as MKL has no Apple silicon build; Jenkins ignores it. | ||
| build: | ||
| name: ${{ matrix.name }} Python ${{ matrix.python }} | ||
| needs: matrix |
There was a problem hiding this comment.
conda-package-cf.yml and this workflow now both build conda-recipe on every PR, so the runner load is doubled.
| """ | ||
| Intel Python CI (gh-ci) test for mkl_fft. | ||
|
|
||
| GitHub Actions, through ci/hooks.py, and Intel's Jenkins both run this with one |
There was a problem hiding this comment.
This only talks about a conda package, but it tests the wheels too.

Description
Adds what Intel Python CI (gh-ci) needs from mkl_fft: a
ci/directory and a new workflow,.github/workflows/intel-ci.yml. The workflow buildsconda-recipe-cffor every platform and Python version the recipe declares, and tests each package in a clean conda-forge environment withci/test.py. Intel's Jenkins then waits for that run, tests each package again on its own machines, scans it, and for a release tag publishes the packages it tested. Jenkins isn't switched on for mkl_fft yet, so until it is, this only adds a GitHub Actions workflow.ci/matrix.py,ci/build.py,ci/hooks.py: the shared gh-ci scripts, standard library only. Here they look forconda-recipe-cf/first and build Linux and Windows on GitHub-hosted runners.hooks.pyinstalls the test requirements fromci/config.yml, the way Jenkins does.ci/test.py: runspytest --pyargs mkl_fftagainst the installed package and writes a JUnit report.ci/benchmark.py: becausebenchmarks/exists, Jenkins runs it once per pull request or tag, with the newest regular Linux package, on a bare-metal benchmarking machine. It runs the asv suite against the installed package: one quick sample of each benchmark on a pull request, a full measurement on a tag. A failing benchmark fails it; nothing compares the timings with a baseline yet.ci/config.yml: the workflow, the artifact names (mkl_fft {platform} Python {python}, asconda-package-cf.ymlnames them) and the test requirements,pytest,scipy >=1.10andmkl-service, and the benchmark requirements,psutil,scipy >=1.10andmkl-service, with asv from PyPI, as conda-forge has no asv for Python 3.15 yet.conda-recipe-cf/conda_build_config.yaml: now lists the Python versions, the onesconda-package-cf.ymlbuilds today, forci/matrix.py, andnumpy: '2'. Without a NumPy variant, conda-build falls back to NumPy 1.26, which has no builds for Python 3.13 and newer.conda-package-cf.ymlpasses--pythonand--numpyitself, so it is unaffected.ci/README.mdand AGENTS.md notes.A pull request builds the oldest and the newest regular Python versions on Linux and Windows; pushes to
masterand tags build them all.Miniforge is pinned to 26.7.2-0. Miniforge 26.9.4-0, released on 22 October, makes
setup-miniconda'sconda initfail on Windows runners, and the existingconda-package*.ymlworkflows, which installlatest, hit it too on this pull request.Overlap with #398. It also sets
numpy: '2'inconda_build_config.yamland drops Python 3.10, so whichever lands second needs a small rebase, and if 3.10 goes it should leave thepython:list here too.conda-package-cf.ymlandintel-ci.ymlnow both buildconda-recipe-cf; retiring one can be a follow-up.Verification
ci/test.pyagainst each package: 2769 passed on Linux and 2763 on Windows, on both versions.ci/benchmark.pyin quick mode, against an installed mkl_fft, ran all 46 benchmarks and exited 0, with the results underGH_CI_RESULTS.pre-commit runon every changed file, all hooks passing, andzizmoronintel-ci.yml, no findings.python ci/matrix.pylists 14 builds, Linux and Windows for 3.10 to 3.15 and 3.14t; with--event pull_requestit lists 3.10 and 3.15 on both.ci/config.ymlloads with gh-ci's own parser.Not verified