-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Migrate development workflow to Pixi #10888
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
- Using the bare-minimum.yml requirements file to act as a starting point to build the composable environments - Add pixi.lock to gitignore (no need to commit lock files in library repos) - Update .gitattributes (automatically done by pixi) - Configure xarray as source dependency with dynamic versioning
… files Already ported to pixi
Already migrated to pixi
Update requirements files to remove deps handled by Pixi
Handled by pixi
Handled by pixi
Handled by pixi
Handled by pixi
Handled by pixi
Handled by pixi
Handled by pixi
Handled by pixi
Handled by pixi
Handled by pixi
Handled by pixi
Handled by pixi
Pixi was raising a dep warning on this naming
Handled in CI instead
e824873 to
ebdc125
Compare
| { task = "test", environment = "test-all-deps-py313" }, | ||
| ] | ||
|
|
||
| [environments] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I just realised that environment-min-all-deps.yml is also used in testing, and not just the version policy. I need to add a corresponding environment here.
| { task = "test", environment = "test-all-deps-py313" }, | ||
| ] | ||
|
|
||
| [environments] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It feels like a bit of an explosion of environments in this file, but its also what was there in the previous codebase so maybe that's just needed. Not sure how that can be cleaned up further - or maybe just leave that for a future PR
Even when only one environment is installed via the argument to setup-pixi, I think you still need to specify the environment when you want to use a non-default environment for arbitrary commands. So |
Fixes pytest call
c2bab08 to
0f3a618
Compare
Yes! The timeline as I have been imagining it for my work is:
Maybe towards the end of that process would be a good time to write something about the various options and why we have chosen to do things however we end up doing them. |
speaking just for myself — I would vote for (b). this is one of the big advantages of something like fine to push off to another change if it's additional work ofc (though is it more work? I see a decent amount of the added code is responsible for generating & caching lockfiles...) |
Yes, a significant amount of work to do it properly. Hence why I think we should wait until Lucas' work at Scipy has stabilized and it becomes clearer how to best handle this. I recommend reading the discussion at #10732 (comment) and the linked issues which go more in depth |
|
As far as I remember the one big issue with persisting the lock file is that this doesn't play well with dynamic versioning using |
|
re. dynamic versioning support in pixi prefix-dev/pixi#2923 for those interested (probably other issues there as well) |
(posting now for visibility and to request feedback/pixi debugging help)
Overview
Fixes #10732
This PR migrates the dev workflow and CI for Xarray across to Pixi, providing the following benefits:
See the original issue for more info.
Changes so far in this PR:
pixi.tomlsplit apart into features that I thought were sensible . I left outenvironment-benchmarks.yml,environment-min-all-deps.yml,binder/environmentas that has interactions with asv, the min-dep checker, and Binder - this PR is already big enough, and I think those should be explored another time.cache-pixi-lock.ymlworkflow (see below section "Considerations")98% there - for some reason the CI of Pixi is findingwhich pytestto be.pixi/envs/default/Scripts/pytestwhile localpixi run -e test-all-deps-py313 which pytestis finding.pixi/envs/test-all-deps-py313/bin/pytest(seetest-pixi-dustbranch, example action run) . Any ideas why @lucascolley ?I've tried to make the commits tidy to help with reviewing commit by commit, which might be easier. I also was quite diligent when migrating from the old env files to make sure versions were the same.
Testing instructions
Resources: Pixi Scipy 2025 talk | Docs: Manifest Reference
pixi info-> show info about the pixi environmentspixi run docpixi run testthen choose the environment you want to run the tests in (orpixi run -e environment_name test)test-all-deps-py313environment (corresponding to the old environmentci/requirements/environment.yml)pixi run pre-commitpixi run typingEnter an environment (equivalent to
conda activate):pixi shell -e env_nameExit an environment (equivalent to
conda activate):exitor Ctrl+DSee all tasks:
pixi runConsiderations
Lock files o' lock files
There was some interesting conversation in #10732 (comment) about lock files. To summarise:
We have two choices to handle the lock files, either (a) generate them in CI, or (b) commit them to the repo and periodically update them.
(a) generating in CI (done in this PR):
pixi.lockto.gitignoredate + hash(pixi.toml)pixi.lockfile for environment creationPros:
cache-pixi-lock.ymlis re-usable across different projects).Cons:
pixi.lockand what's in CI. Local developers need to periodically deletepixi.lockand regenerate it.(b) commit the lock files
(I think this is the gist of it)
bleeding-edgewhich runs every few days by taking the current lockfile, running an update, and then running tests. Any failures can be automatically reported in an issuepixi.tomlmanifest and talk with upstream to see whats upPros:
Cons:
@lucascolley knows the full extent as he's been exploring this setup at Scipy
Conclusion
Approach (a) has minimal setup/maintenance with little downside. I think that it's a good solution for smaller projects in particular (we've adopted it at Parcels - cc @maxrjones might be interesting based on your comment )
Approach (b) is more robust if having the same environment between all devs is highly valued (@shoyer mentioned during a dev meeting that this would be good for xarray), but requires more setup.
I recommend we go for (a) as is done in this PR, and consider (b) separately .
@lucascolley would it be beneficial to do a write-up of all this on
prefix.devsometime to help guide others dealing with this? I'm happy to write or collab on a blog post.Feedback wanted: To what extent do we promote Conda dev workflows
Yeah - I don't know. In the projects I'm working on I've gone full Pixi, but those are smaller projects.
I've deleted the old environment files to avoid duplication, but can re-add them to the extent which you want to support conda dev workflows.
I've held off on updating the contributing instructions for this reason.
Feedback wanted: Reporting of Python version in codecov
python-versionstrategy var andPYTHON_VERSIONenv var no longer exists as its managed by Pixi. This means that its not picked up by Codecov. Not sure how to remedy this...Nightlies
I have not considered nightlies in this PR and also haven't yet thought about how to go about that.
I think that's about it! I don't think I've forgotten anything, but it is late on a Friday so maybe - will update if that's the case :)
Let me know if you want me to drop by the dev meeting on 5 Nov - but I'm happy to keep this async otherwise.
(🎉 for my first significant contribution to Xarray!!!)