Installing from sources¶
Released packages¶
Releases are published to PyPI, and the wheel and sdist of each release are attached to its GitHub release.
From the repository¶
Install the current main branch, or any tag or commit, directly from GitHub:
pip install "apache-airflow-providers-pixi @ git+https://github.com/danplischke/apache-airflow-providers-pixi@main"
Building the package¶
The package is built with hatchling, and hatch-vcs
takes its version from git: a commit tagged v0.2.0 builds as 0.2.0, the Nth commit after it as
0.2.1.devN+g<commit>, and a source tree without git metadata as 0.0.0. just version prints the
version of the working tree. With uv:
git clone https://github.com/danplischke/apache-airflow-providers-pixi
cd apache-airflow-providers-pixi
uv build # writes the sdist and wheel to dist/
pip install dist/apache_airflow_providers_pixi-*.whl
The sdist keeps the version it was built with. It holds the package source, tests/ and the files the unit
tests read: provider.yaml, .github/workflows/qa.yml, docs/changelog.md and dev/dags. From an extracted
sdist, uv run --group dev pytest tests/unit runs the unit tests. tests/unit/pixi/test_sdist.py fails if a
file the tests read is left out of [tool.hatch.build.targets.sdist] in pyproject.toml.
Trying it in a local Airflow¶
The repository has a local Airflow for trying the operators, with just and pixi installed:
It loads the DAGs in dev/dags: pixi_showcase runs every operator, sensor and decorator that runs
on the worker (all but the Kubernetes ones) against the sample project in dev/project, and pixi_kubernetes_showcase runs
@task.pixi_kubernetes on the cluster in ~/.kube/config. Its state lives in .airflow/;
just airflow-reset deletes it, and just airflow <command> runs the Airflow CLI against it, for
example just airflow dags test pixi_showcase.
Building this documentation¶
uv sync --group docs
uv run zensical serve # preview on http://localhost:8000
uv run zensical build # static site in site/
Testing against other Airflow versions¶
The test job in CI installs from uv.lock, which has the newest Airflow and providers. Two more jobs check
the versions users actually install:
-
compatinstalls the latest patch of each supported Airflow minor with Airflow's constraints file, installs this provider with--no-deps, runsuv pip checkand the tests. Without pixi the integration and system tests skip, but they are still imported, so an import that this Airflow version lacks fails the leg. To run one leg locally, in a copy of the repository so the project.venvis left alone:AIRFLOW_VERSION=3.1.8 uv venv --python 3.12 uv pip install "apache-airflow==${AIRFLOW_VERSION}" apache-airflow-providers-standard \ apache-airflow-providers-cncf-kubernetes apache-airflow-providers-common-compat \ pytest pyyaml jsonschema tomlkit "packaging>=22" \ -c "https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-3.12.txt" uv pip install --no-deps -e . uv pip check .venv/bin/python -m pytest tests -
lowest-directrunsuv sync --resolution lowest-direct --group devon Python 3.10, which installs every direct dependency at the floor inpyproject.toml, and runs the unit tests. It rewritesuv.lock, so run it in a copy too.
When a new Airflow minor is released, add its latest patch to the compat matrix. When the floor
moves, set the provider floors to what that Airflow version's constraints file pins, and keep its
minor as the oldest entry in the matrix (tests/unit/pixi/test_versions.py checks this).
Releasing¶
Releases are made by pushing a tag v<version>; the tag sets the package version. .github/workflows/release.yml
then runs every QA job on the tag, checks that the tag is v plus the first entry of versions in
provider.yaml and the first ## heading in docs/changelog.md, builds the package from the full git
history, checks that the wheel and sdist have the tag's version, uploads them to PyPI and only then creates the
GitHub release with the same files. If any step fails, nothing after it runs.
- Add a
## 0.2.0section at the top ofdocs/changelog.mdand runjust bump 0.2.0, which adds0.2.0as the first entry ofversionsinprovider.yamland fails until the changelog has that section.tests/unit/pixi/test_versions.pyfails until the two agree. - Merge to
mainand wait for QA to pass. -
On the merge commit,
just release 0.2.0checks both files and thatmainis checked out and clean, then tagsv0.2.0and pushes the tag. Without just:
A version can be uploaded to PyPI only once. If the PyPI step fails because the version already exists, release the next version with a new tag; do not move the tag.