From 9659090e384f9ec8f5a945f6cbff8c97d934c90c Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Wed, 29 Jul 2026 01:14:37 +0200 Subject: [PATCH 01/22] move the nightly env into its own file This avoids having to build binary dependencies on e.g. RTD in order to lock the dependencies. --- ci/nightly/pixi.toml | 146 +++++++++++++++++++++++++++++++++++++++++++ pixi.toml | 98 ++--------------------------- 2 files changed, 150 insertions(+), 94 deletions(-) create mode 100644 ci/nightly/pixi.toml diff --git a/ci/nightly/pixi.toml b/ci/nightly/pixi.toml new file mode 100644 index 00000000000..db92fc5295c --- /dev/null +++ b/ci/nightly/pixi.toml @@ -0,0 +1,146 @@ +[workspace] +preview = ["pixi-build"] +channels = ["conda-forge", "nodefaults"] +platforms = ["linux-64"] +requires-pixi = ">=0.63.2,!=0.68.0" + +[feature.test.dependencies] +pytest = "!=9.1.0" +pytest-asyncio = "*" +pytest-cov = "*" +pytest-env = "*" +pytest-mypy-plugins = ">=4.0.0" +pytest-reportlog = "*" +pytest-timeout = "*" +pytest-xdist = "*" +pytz = "*" +hypothesis = "*" +coveralls = "*" + +[feature.test.tasks] +test = { cmd = "pytest", description = "Run the test suite with pytest." } + +[feature.py314.dependencies] +python = "3.14.*" + +# TODO: Remove `target.unix` restriction once pandas nightly has win-64 wheels again. +# Without this, `pixi lock` fails because it can't solve the nightly feature for win-64, +# which breaks RTD builds (RTD has no lock file cache, unlike GitHub Actions CI). +[feature.nightly.target.unix.dependencies] +python = "*" + +[feature.nightly.pypi-options.dependency-overrides] +numpy = { version = "*", index = "https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" } +scipy = { version = "*", index = "https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" } +matplotlib = { version = "*", index = "https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" } +pandas = { version = "*", index = "https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" } +pyarrow = { version = "*", index = "https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" } + +dask = { git = "https://github.com/dask/dask" } +distributed = { git = "https://github.com/dask/distributed" } +zarr = { git = "https://github.com/zarr-developers/zarr-python" } +# numcodecs = { git = "https://github.com/zarr-developers/numcodecs" } #? compilation fails currently, see #11437 +cftime = { git = "https://github.com/Unidata/cftime" } +# packaging = { git = "https://github.com/pypa/packaging"} #? Pixi warns if this is enabled +pint = { git = "https://github.com/hgrecco/pint" } +bottleneck = { git = "https://github.com/pydata/bottleneck" } +fsspec = { git = "https://github.com/intake/filesystem_spec" } +nc-time-axis = { git = "https://github.com/SciTools/nc-time-axis" } +flox = { git = "https://github.com/xarray-contrib/flox" } +h5netcdf = { git = "https://github.com/h5netcdf/h5netcdf" } +opt_einsum = { git = "https://github.com/dgasmith/opt_einsum" } +# sparse = { git = "https://github.com/pydata/sparse"} + +[feature.nightly.target.unix.pypi-dependencies] +xarray = { path = "..", editable = true } +numpy = "*" +pandas = "*" +matplotlib = "*" +scipy = "*" +pyarrow = "*" + +dask = "*" +distributed = "*" +zarr = "*" +numcodecs = "*" +cftime = "*" +packaging = "*" +pint = "*" +bottleneck = "*" +fsspec = "*" +nc-time-axis = "*" +flox = "*" +# h5netcdf = "*" +# h5py = "*" +opt_einsum = "*" +netcdf4 = "*" +scitools-iris = "*" +pydap = "*" +cartopy = "*" +seaborn = "*" + +[feature.typing.dependencies] +mypy = "==1.19.1" +pyright = "*" +hypothesis = "*" +lxml = "*" +types-colorama = "*" +types-docutils = "*" +types-decorator = "*" +types-networkx = "*" +types-openpyxl = "*" +types-psutil = "*" +types-Pygments = "*" +types-python-dateutil = "*" +types-pytz = "*" +types-PyYAML = "*" +types-requests = "*" +types-setuptools = "*" +typing_extensions = "*" +pip = "*" + +[feature.typing.pypi-dependencies] +types-defusedxml = "*" +types-pexpect = "*" + +# Stubs sourced from PyPI rather than conda, used only by the `mypy-upstream` +# environment. That env pairs the `nightly` feature (which overrides numpy/scipy +# to PyPI nightly wheels) with type stubs; conda stubs would pull conda +# numpy/scipy that pixi cannot reconcile with those PyPI overrides, so they must +# come from PyPI here. +# +# NOTE: these stubs cap numpy below the nightly wheel (scipy-stubs via optype -> +# numpy-typing-compat needs numpy<2.5; pandas-stubs needs numpy<=2.3.5), so numpy +# in `mypy-upstream` resolves to the latest release. We accept that: dropping the +# stubs to free up numpy would leave pandas/scipy untyped and flood mypy with +# import-untyped errors. The upstream *test* job (`test-nightly`) is kept separate +# precisely so it still gets the genuine nightly numpy. +[feature.typing-stubs-nightly.pypi-dependencies] +pandas-stubs = "<=2.3.3.251219" +scipy-stubs = ">=1.17.1.2" + +[feature.typing.tasks] +mypy = { cmd = "mypy --install-types --non-interactive --cobertura-xml-report mypy_report", description = "Run mypy type checking and generate a Cobertura XML report." } + +[environments] +test-nightly = { features = [ + "py314", + "nightly", + "test", + # Deliberately no "typing": type stubs cap numpy<2.5 and would displace the + # nightly numpy wheel this env's pytest job needs. Type checking against the + # dev stack lives in the separate `mypy-upstream` environment below. +], no-default-feature = true } + +# Type-checking against the development stack (used by the `mypy-upstream-dev` CI +# job). Same as `test-nightly` plus the typing toolchain and PyPI-sourced stubs. +# numpy resolves to the latest release here (the stubs cap it below the nightly +# wheel); every other dependency still comes from the nightly wheels / git, so +# this catches typing breakage from upstream development versions. +mypy-upstream = { features = [ + "py314", + "nightly", + "test", + "typing", + "typing-stubs-nightly", +], no-default-feature = true } diff --git a/pixi.toml b/pixi.toml index 97cbcb6aed7..a0b9d851056 100644 --- a/pixi.toml +++ b/pixi.toml @@ -141,62 +141,6 @@ toolz = "1.0.*" zarr = "3.0.*" pyarrow = "*" # required by dask.dataframe -# TODO: Remove `target.unix` restriction once pandas nightly has win-64 wheels again. -# Without this, `pixi lock` fails because it can't solve the nightly feature for win-64, -# which breaks RTD builds (RTD has no lock file cache, unlike GitHub Actions CI). -[feature.nightly.target.unix.dependencies] -python = "*" - -[feature.nightly.pypi-options.dependency-overrides] -numpy = { version = "*", index = "https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" } -scipy = { version = "*", index = "https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" } -matplotlib = { version = "*", index = "https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" } -pandas = { version = "*", index = "https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" } -pyarrow = { version = "*", index = "https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" } - -dask = { git = "https://github.com/dask/dask" } -distributed = { git = "https://github.com/dask/distributed" } -zarr = { git = "https://github.com/zarr-developers/zarr-python" } -# numcodecs = { git = "https://github.com/zarr-developers/numcodecs" } #? compilation fails currently, see #11437 -cftime = { git = "https://github.com/Unidata/cftime" } -# packaging = { git = "https://github.com/pypa/packaging"} #? Pixi warns if this is enabled -pint = { git = "https://github.com/hgrecco/pint" } -bottleneck = { git = "https://github.com/pydata/bottleneck" } -fsspec = { git = "https://github.com/intake/filesystem_spec" } -nc-time-axis = { git = "https://github.com/SciTools/nc-time-axis" } -flox = { git = "https://github.com/xarray-contrib/flox" } -h5netcdf = { git = "https://github.com/h5netcdf/h5netcdf" } -opt_einsum = { git = "https://github.com/dgasmith/opt_einsum" } -# sparse = { git = "https://github.com/pydata/sparse"} - -[feature.nightly.target.unix.pypi-dependencies] -xarray = { path = ".", editable = true } - -numpy = "*" -pandas = "*" -matplotlib = "*" -scipy = "*" -pyarrow = "*" - -dask = "*" -distributed = "*" -zarr = "*" -numcodecs = "*" -cftime = "*" -packaging = "*" -pint = "*" -bottleneck = "*" -fsspec = "*" -nc-time-axis = "*" -flox = "*" -# h5netcdf = "*" -# h5py = "*" -opt_einsum = "*" -netcdf4 = "*" -scitools-iris = "*" -pydap = "*" -cartopy = "*" -seaborn = "*" [feature.test.dependencies] pytest = "!=9.1.0" @@ -283,22 +227,6 @@ types-pexpect = "*" pandas-stubs = "<=2.3.3.251219" scipy-stubs = ">=1.17.1.2" -# Stubs sourced from PyPI rather than conda, used only by the `mypy-upstream` -# environment. That env pairs the `nightly` feature (which overrides numpy/scipy -# to PyPI nightly wheels) with type stubs; conda stubs would pull conda -# numpy/scipy that pixi cannot reconcile with those PyPI overrides, so they must -# come from PyPI here. -# -# NOTE: these stubs cap numpy below the nightly wheel (scipy-stubs via optype -> -# numpy-typing-compat needs numpy<2.5; pandas-stubs needs numpy<=2.3.5), so numpy -# in `mypy-upstream` resolves to the latest release. We accept that: dropping the -# stubs to free up numpy would leave pandas/scipy untyped and flood mypy with -# import-untyped errors. The upstream *test* job (`test-nightly`) is kept separate -# precisely so it still gets the genuine nightly numpy. -[feature.typing-stubs-nightly.pypi-dependencies] -pandas-stubs = "<=2.3.3.251219" -scipy-stubs = ">=1.17.1.2" - [feature.typing.tasks] mypy = { cmd = "mypy --install-types --non-interactive --cobertura-xml-report mypy_report", description = "Run mypy type checking and generate a Cobertura XML report." } @@ -379,6 +307,9 @@ numpydoc-lint = { cmd = "python ci/numpydoc-public-api.py" } [feature.nodask.constraints] dask-core = "<0.0a0" +[feature.nightly.dependencies] +python = "*" + [environments] # Testing # test-just-xarray = { features = ["test"] } # https://github.com/pydata/xarray/pull/10888/files#r2511336147 @@ -421,28 +352,6 @@ test-py314 = { features = [ "viz", "extras", ] } -test-nightly = { features = [ - "py313", - "nightly", - "test", - # Deliberately no "typing": type stubs cap numpy<2.5 and would displace the - # nightly numpy wheel this env's pytest job needs. Type checking against the - # dev stack lives in the separate `mypy-upstream` environment below. -], no-default-feature = true } - -# Type-checking against the development stack (used by the `mypy-upstream-dev` CI -# job). Same as `test-nightly` plus the typing toolchain and PyPI-sourced stubs. -# numpy resolves to the latest release here (the stubs cap it below the nightly -# wheel); every other dependency still comes from the nightly wheels / git, so -# this catches typing breakage from upstream development versions. -mypy-upstream = { features = [ - "py313", - "nightly", - "test", - "typing", - "typing-stubs-nightly", -], no-default-feature = true } - test-py311 = { features = [ "py311", @@ -521,3 +430,4 @@ default = { features = [ policy = { features = ["policy"], no-default-feature = true } numpydoc-lint = { features = ["numpydoc-lint"] } tools = { features = ["tools"], no-default-feature = true } +test-nightly = { features = ["nightly"], no-default-feature = true } From fdf6a1a53d2639583dc406a96a2fc87b9e5f2f4e Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Wed, 29 Jul 2026 01:45:09 +0200 Subject: [PATCH 02/22] create the lockfile in a separate step --- .readthedocs.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index f2ea760edc9..fa081448061 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -14,6 +14,7 @@ build: - asdf plugin add pixi - asdf install pixi latest - asdf global pixi latest + - pixi lock --no-install post_checkout: - (git --no-pager log --pretty="tformat:%s" -1 | grep -vqF "[skip-rtd]") || exit 183 - git fetch --unshallow || true From 85a0a5e85217c2bbf32fff935afc25b7085ec081 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Wed, 29 Jul 2026 22:07:26 +0200 Subject: [PATCH 03/22] use the separate pixi file --- .github/workflows/upstream-dev-ci.yaml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index 16696af7827..bd4e835bcc7 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -89,6 +89,7 @@ jobs: env: ENV: ${{ matrix.pixi-env }} + MANIFEST_PATH: ci/nightly/pixi.toml outputs: log-file: ${{ steps.determine-log-path.outputs.log-file }} @@ -112,20 +113,21 @@ jobs: pixi-version: ${{ needs.cache-pixi-lock.outputs.pixi-version }} cache: true environments: ${{ matrix.pixi-env }} + manifest-path: ${{ env.MANIFEST_PATH }} cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} - name: Version info run: | - pixi run -e $ENV -- python xarray/util/print_versions.py + pixi run --manifest-path "$MANIFEST_PATH" -e $ENV -- python xarray/util/print_versions.py - name: Import xarray run: | - pixi run -e $ENV -- python -c 'import xarray' + pixi run -e "$MANIFEST_PATH" -e $ENV -- python -c 'import xarray' - name: Run Tests if: success() id: status env: LOG_PATH: ${{ steps.determine-log-path.outputs.log-file }} run: | - pixi run -e $ENV -- python -m pytest --timeout=60 -rf -nauto \ + pixi run --manifest-path "$MANIFEST_PATH" -e $ENV -- python -m pytest --timeout=60 -rf -nauto \ --report-log "$LOG_PATH" - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: failure() @@ -174,6 +176,7 @@ jobs: env: ENV: ${{ matrix.pixi-env }} + MANIFEST_PATH: ci/nightly/pixi.toml steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 @@ -190,6 +193,7 @@ jobs: pixi-version: ${{ needs.cache-pixi-lock.outputs.pixi-version }} cache: true environments: ${{ matrix.pixi-env }} + manifest-path: ${{ env.MANIFEST_PATH }} cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} - name: set environment variables @@ -198,10 +202,10 @@ jobs: echo "PYTHON_VERSION=$(pixi run -e $ENV -- python --version | cut -d' ' -f2 | cut -d. -f1,2)" >> $GITHUB_ENV - name: Version info run: | - pixi run -e $ENV -- python xarray/util/print_versions.py + pixi run --manifest-path "$MANIFEST_PATH" -e $ENV -- python xarray/util/print_versions.py - name: Run mypy run: | - pixi run -e $ENV -- python -m mypy --install-types --non-interactive --cobertura-xml-report mypy_report + pixi run --manifest-path "$MANIFEST_PATH" -e $ENV -- python -m mypy --install-types --non-interactive --cobertura-xml-report mypy_report - name: Upload mypy coverage to Codecov uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0 with: From 604d78eb096ebbe50e0338ba4ce846f99a2a7900 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 19:06:58 +0200 Subject: [PATCH 04/22] let `pixi` infer the actual file --- .github/workflows/upstream-dev-ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index bd4e835bcc7..1913d412e79 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -89,7 +89,7 @@ jobs: env: ENV: ${{ matrix.pixi-env }} - MANIFEST_PATH: ci/nightly/pixi.toml + MANIFEST_PATH: ci/nightly outputs: log-file: ${{ steps.determine-log-path.outputs.log-file }} @@ -176,7 +176,7 @@ jobs: env: ENV: ${{ matrix.pixi-env }} - MANIFEST_PATH: ci/nightly/pixi.toml + MANIFEST_PATH: ci/nightly steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 From 2f51f4a0ac6b59d1f59d231cc12a7de4dc8c491f Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 19:07:39 +0200 Subject: [PATCH 05/22] formatting --- .github/workflows/upstream-dev-ci.yaml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index 1913d412e79..ef21d3c4a94 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -103,7 +103,6 @@ jobs: id: determine-log-path run: | echo "log-file=output-${ENV}-log.jsonl" >> $GITHUB_OUTPUT; - cat $GITHUB_OUTPUT - name: Restore cached pixi lockfile uses: Parcels-code/pixi-lock/restore@38495788b79a5ff26009aecc15daa9a8310b8832 # v0.1.0 with: @@ -127,8 +126,11 @@ jobs: env: LOG_PATH: ${{ steps.determine-log-path.outputs.log-file }} run: | - pixi run --manifest-path "$MANIFEST_PATH" -e $ENV -- python -m pytest --timeout=60 -rf -nauto \ - --report-log "$LOG_PATH" + pixi run \ + --manifest-path "$MANIFEST_PATH" \ + -e $ENV \ + -- \ + python -m pytest --timeout=60 -rf -nauto --report-log "$LOG_PATH" - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: failure() with: From a59edca3cc6821bcef123df14c1f4a584789be59 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 19:08:51 +0200 Subject: [PATCH 06/22] typo --- .github/workflows/upstream-dev-ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index ef21d3c4a94..ad7f4363bf7 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -119,7 +119,7 @@ jobs: pixi run --manifest-path "$MANIFEST_PATH" -e $ENV -- python xarray/util/print_versions.py - name: Import xarray run: | - pixi run -e "$MANIFEST_PATH" -e $ENV -- python -c 'import xarray' + pixi run --manifest-path "$MANIFEST_PATH" -e $ENV -- python -c 'import xarray' - name: Run Tests if: success() id: status From 099b0de445022f91b9aae517165051fec752ee6c Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 19:10:14 +0200 Subject: [PATCH 07/22] demonstrate the use of the manifest path in `pixi-lock` --- .github/workflows/upstream-dev-ci.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index ad7f4363bf7..24c60df1893 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -65,8 +65,10 @@ jobs: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - - uses: Parcels-code/pixi-lock/create-and-cache@38495788b79a5ff26009aecc15daa9a8310b8832 # v0.1.0 + - uses: keewis/pixi-lock/create-and-cache@6cc8e72145323fbe6f6afc5223d69a8d4697c733 # dev id: pixi-lock + with: + manifest-path: ci/nightly - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: pixi-lock From 64ff826a4d6b58e14d06e7fec24539da96790f3f Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 19:10:41 +0200 Subject: [PATCH 08/22] [skip-rtd][test-upstream] From bdd9510647fdf6412727d452bc82673efeecfc12 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 19:59:46 +0200 Subject: [PATCH 09/22] next try --- .github/workflows/upstream-dev-ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index 24c60df1893..d1edb617aa6 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -65,7 +65,7 @@ jobs: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - - uses: keewis/pixi-lock/create-and-cache@6cc8e72145323fbe6f6afc5223d69a8d4697c733 # dev + - uses: keewis/pixi-lock/create-and-cache@8b09e68b19c793ac209fc8184838db2c78e42892 id: pixi-lock with: manifest-path: ci/nightly From 7e91ad1eee5f7adc8ef1a1c238c0c0427c29184e Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 20:01:52 +0200 Subject: [PATCH 10/22] ignore the unreleased commit hash --- .github/workflows/upstream-dev-ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index d1edb617aa6..7a8e09599a2 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -65,7 +65,7 @@ jobs: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - - uses: keewis/pixi-lock/create-and-cache@8b09e68b19c793ac209fc8184838db2c78e42892 + - uses: keewis/pixi-lock/create-and-cache@8b09e68b19c793ac209fc8184838db2c78e42892 # zizmor: ignore[stale-action-refs] id: pixi-lock with: manifest-path: ci/nightly From c38fe704d4ca9e26cab70471cae9eac60d691e31 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 20:02:10 +0200 Subject: [PATCH 11/22] [skip-rtd][test-upstream] From cb45f1af5fc5382f10f03c202b229fd00fe87b55 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 20:04:43 +0200 Subject: [PATCH 12/22] cache the nightly pixi.toml [skip-rtd] --- .github/workflows/upstream-dev-ci.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index 7a8e09599a2..b42f393afe1 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -69,6 +69,9 @@ jobs: id: pixi-lock with: manifest-path: ci/nightly + hash-files: | + ci/nightly/pixi.toml + pyproject.toml - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: pixi-lock From a5aa6cbf3b34c6e7f869254c1833b3a72638419e Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 20:06:42 +0200 Subject: [PATCH 13/22] back to explicitly specifying the path [skip-rtd][skip-ci] --- .github/workflows/upstream-dev-ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index b42f393afe1..ef54d55eb28 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -68,7 +68,7 @@ jobs: - uses: keewis/pixi-lock/create-and-cache@8b09e68b19c793ac209fc8184838db2c78e42892 # zizmor: ignore[stale-action-refs] id: pixi-lock with: - manifest-path: ci/nightly + manifest-path: ci/nightly/pixi.toml hash-files: | ci/nightly/pixi.toml pyproject.toml @@ -94,7 +94,7 @@ jobs: env: ENV: ${{ matrix.pixi-env }} - MANIFEST_PATH: ci/nightly + MANIFEST_PATH: ci/nightly/pixi.toml outputs: log-file: ${{ steps.determine-log-path.outputs.log-file }} From a77f484650b62dc921831ec25f60b128830d39e0 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 20:09:16 +0200 Subject: [PATCH 14/22] correct the path of `xarray` --- ci/nightly/pixi.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/nightly/pixi.toml b/ci/nightly/pixi.toml index db92fc5295c..0f4f640c95e 100644 --- a/ci/nightly/pixi.toml +++ b/ci/nightly/pixi.toml @@ -52,7 +52,7 @@ opt_einsum = { git = "https://github.com/dgasmith/opt_einsum" } # sparse = { git = "https://github.com/pydata/sparse"} [feature.nightly.target.unix.pypi-dependencies] -xarray = { path = "..", editable = true } +xarray = { path = "../..", editable = true } numpy = "*" pandas = "*" matplotlib = "*" From 9f07329007936f3884c80451b75ff34593f5071e Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 20:13:06 +0200 Subject: [PATCH 15/22] another new version of the action[skip-rtd][skip-ci] --- .github/workflows/upstream-dev-ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index ef54d55eb28..4d36c912490 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -65,7 +65,7 @@ jobs: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - - uses: keewis/pixi-lock/create-and-cache@8b09e68b19c793ac209fc8184838db2c78e42892 # zizmor: ignore[stale-action-refs] + - uses: keewis/pixi-lock/create-and-cache@eaf26adea784bc189af15576239f3dab19142c5f # zizmor: ignore[stale-action-refs] id: pixi-lock with: manifest-path: ci/nightly/pixi.toml From 94d8a065fa47dcb877a1cc18c6d57daebe4dd6ab Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 20:27:49 +0200 Subject: [PATCH 16/22] pass the manifest path to the restore action[skip-rtd][skip-ci] --- .github/workflows/upstream-dev-ci.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index 4d36c912490..6e853cc7d68 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -65,7 +65,7 @@ jobs: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - - uses: keewis/pixi-lock/create-and-cache@eaf26adea784bc189af15576239f3dab19142c5f # zizmor: ignore[stale-action-refs] + - uses: keewis/pixi-lock/create-and-cache@319b93a7b21fdc6ea28223bd7cf85366893b8a41 # zizmor: ignore[stale-action-refs] id: pixi-lock with: manifest-path: ci/nightly/pixi.toml @@ -109,8 +109,9 @@ jobs: run: | echo "log-file=output-${ENV}-log.jsonl" >> $GITHUB_OUTPUT; - name: Restore cached pixi lockfile - uses: Parcels-code/pixi-lock/restore@38495788b79a5ff26009aecc15daa9a8310b8832 # v0.1.0 + uses: keewis/pixi-lock/restore@319b93a7b21fdc6ea28223bd7cf85366893b8a41 # zizmor: ignore[stale-action-refs] with: + manifest-path: ${{ env.MANIFEST_PATH }} cache-key: ${{ needs.cache-pixi-lock.outputs.cache-key }} - uses: prefix-dev/setup-pixi@a09b6247153796b190642a2b53fac4241043cf6f # v0.10.0 with: From 122c64c56378c3c6eebaaaa40cd0408c73058edd Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 20:31:39 +0200 Subject: [PATCH 17/22] next version of the action[skip-ci][skip-rtd] --- .github/workflows/upstream-dev-ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index 6e853cc7d68..2ee805a2083 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -65,7 +65,7 @@ jobs: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - - uses: keewis/pixi-lock/create-and-cache@319b93a7b21fdc6ea28223bd7cf85366893b8a41 # zizmor: ignore[stale-action-refs] + - uses: keewis/pixi-lock/create-and-cache@1ae1ad7d68a96caa53f7de7763783fed7e48cd9b # zizmor: ignore[stale-action-refs] id: pixi-lock with: manifest-path: ci/nightly/pixi.toml @@ -109,7 +109,7 @@ jobs: run: | echo "log-file=output-${ENV}-log.jsonl" >> $GITHUB_OUTPUT; - name: Restore cached pixi lockfile - uses: keewis/pixi-lock/restore@319b93a7b21fdc6ea28223bd7cf85366893b8a41 # zizmor: ignore[stale-action-refs] + uses: keewis/pixi-lock/restore@1ae1ad7d68a96caa53f7de7763783fed7e48cd9b # zizmor: ignore[stale-action-refs] with: manifest-path: ${{ env.MANIFEST_PATH }} cache-key: ${{ needs.cache-pixi-lock.outputs.cache-key }} From 5ee2310fcfe0da876189301473daffc6600bb5d5 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 20:36:21 +0200 Subject: [PATCH 18/22] next attempt [skip-ci][skip-rtd] --- .github/workflows/upstream-dev-ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index 2ee805a2083..e5742c63e0c 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -65,7 +65,7 @@ jobs: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - - uses: keewis/pixi-lock/create-and-cache@1ae1ad7d68a96caa53f7de7763783fed7e48cd9b # zizmor: ignore[stale-action-refs] + - uses: keewis/pixi-lock/create-and-cache@fb8dd157072e67db9bf4fb506a1423a39deb1c7c # zizmor: ignore[stale-action-refs] id: pixi-lock with: manifest-path: ci/nightly/pixi.toml @@ -109,7 +109,7 @@ jobs: run: | echo "log-file=output-${ENV}-log.jsonl" >> $GITHUB_OUTPUT; - name: Restore cached pixi lockfile - uses: keewis/pixi-lock/restore@1ae1ad7d68a96caa53f7de7763783fed7e48cd9b # zizmor: ignore[stale-action-refs] + uses: keewis/pixi-lock/restore@fb8dd157072e67db9bf4fb506a1423a39deb1c7c # zizmor: ignore[stale-action-refs] with: manifest-path: ${{ env.MANIFEST_PATH }} cache-key: ${{ needs.cache-pixi-lock.outputs.cache-key }} From 9bcc917dbfc2d7f3fdac2253653ec2c31d8cbb7c Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 20:43:29 +0200 Subject: [PATCH 19/22] bump the issue-from-pytest-log action --- .github/workflows/upstream-dev-ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index dca49d5e0c2..dac86540c06 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -162,7 +162,7 @@ jobs: name: log file path: logs/ - name: Generate and publish the report - uses: scientific-python/issue-from-pytest-log-action@87351a8f864e969567cda22a25a2f214cbe2340f # v1.6.0 + uses: scientific-python/issue-from-pytest-log-action@054799b34bd75a5fd6c86277a4a8a575224e60c6 # v1.6.1 with: log-path: logs/${{ needs.upstream-dev.outputs.log-file }} From 9bf0d3109ff9298d7475004514da8ca71f0158f8 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Sun, 2 Aug 2026 20:46:06 +0200 Subject: [PATCH 20/22] also get the mypy ci to run [skip-ci][skip-rtd] --- .github/workflows/upstream-dev-ci.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index dac86540c06..773cc27cd9f 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -184,7 +184,7 @@ jobs: env: ENV: ${{ matrix.pixi-env }} - MANIFEST_PATH: ci/nightly + MANIFEST_PATH: ci/nightly/pixi.toml steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -193,8 +193,9 @@ jobs: persist-credentials: false - name: Restore cached pixi lockfile - uses: Parcels-code/pixi-lock/restore@38495788b79a5ff26009aecc15daa9a8310b8832 # v0.1.0 + uses: keewis/pixi-lock/restore@fb8dd157072e67db9bf4fb506a1423a39deb1c7c # zizmor: ignore[stale-action-refs] with: + manifest-path: ${{ env.MANIFEST_PATH }} cache-key: ${{ needs.cache-pixi-lock.outputs.cache-key }} - uses: prefix-dev/setup-pixi@a09b6247153796b190642a2b53fac4241043cf6f # v0.10.0 with: @@ -207,7 +208,7 @@ jobs: - name: set environment variables run: | echo "TODAY=$(date +'%Y-%m-%d')" >> $GITHUB_ENV - echo "PYTHON_VERSION=$(pixi run -e $ENV -- python --version | cut -d' ' -f2 | cut -d. -f1,2)" >> $GITHUB_ENV + echo "PYTHON_VERSION=$(pixi run --manifest-path "$MANIFEST_PATH" -e $ENV -- python --version | cut -d' ' -f2 | cut -d. -f1,2)" >> $GITHUB_ENV - name: Version info run: | pixi run --manifest-path "$MANIFEST_PATH" -e $ENV -- python xarray/util/print_versions.py From 40a119217e71341e02c3d4335d0257fc04bff938 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Tue, 4 Aug 2026 10:48:31 +0200 Subject: [PATCH 21/22] back to a official version --- .github/workflows/upstream-dev-ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index 773cc27cd9f..60d29a424b4 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -65,7 +65,7 @@ jobs: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - - uses: keewis/pixi-lock/create-and-cache@fb8dd157072e67db9bf4fb506a1423a39deb1c7c # zizmor: ignore[stale-action-refs] + - uses: Parcels-code/pixi-lock/create-and-cache@1fab4c17af8243f6ca1321bc941cf2325f46c05d # v0.1.1 id: pixi-lock with: manifest-path: ci/nightly/pixi.toml @@ -109,7 +109,7 @@ jobs: run: | echo "log-file=output-${ENV}-log.jsonl" >> $GITHUB_OUTPUT; - name: Restore cached pixi lockfile - uses: keewis/pixi-lock/restore@fb8dd157072e67db9bf4fb506a1423a39deb1c7c # zizmor: ignore[stale-action-refs] + uses: Parcels-code/pixi-lock/restore@1fab4c17af8243f6ca1321bc941cf2325f46c05d # v0.1.1 with: manifest-path: ${{ env.MANIFEST_PATH }} cache-key: ${{ needs.cache-pixi-lock.outputs.cache-key }} @@ -193,7 +193,7 @@ jobs: persist-credentials: false - name: Restore cached pixi lockfile - uses: keewis/pixi-lock/restore@fb8dd157072e67db9bf4fb506a1423a39deb1c7c # zizmor: ignore[stale-action-refs] + uses: Parcels-code/pixi-lock/restore@1fab4c17af8243f6ca1321bc941cf2325f46c05d # v0.1.1 with: manifest-path: ${{ env.MANIFEST_PATH }} cache-key: ${{ needs.cache-pixi-lock.outputs.cache-key }} From 58fc9d5b80b616483d26541aeba3d01b3e8cc0d7 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Tue, 4 Aug 2026 11:15:54 +0200 Subject: [PATCH 22/22] upload the correct lock file as an artifact [skip-ci][skip-rtd] --- .github/workflows/upstream-dev-ci.yaml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index c6850e21c1e..7936743277b 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -58,6 +58,10 @@ jobs: ) ) + env: + MANIFEST_PATH: ci/nightly/pixi.toml + LOCK_PATH: ci/nightly/pixi.lock + outputs: cache-key: ${{ steps.pixi-lock.outputs.cache-key }} pixi-version: ${{ steps.pixi-lock.outputs.pixi-version }} @@ -68,14 +72,14 @@ jobs: - uses: Parcels-code/pixi-lock/create-and-cache@1fab4c17af8243f6ca1321bc941cf2325f46c05d # v0.1.1 id: pixi-lock with: - manifest-path: ci/nightly/pixi.toml + manifest-path: ${{ env.MANIFEST_PATH }} hash-files: | - ci/nightly/pixi.toml + ${{ env.MANIFEST_PATH }} pyproject.toml - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: pixi-lock - path: pixi.lock + path: ${{ env.LOCK_PATH }} upstream-dev: name: upstream-dev