This is an automated email from the ASF dual-hosted git repository. potiuk pushed a commit to branch pypi-only-constraints-for-release in repository https://gitbox.apache.org/repos/asf/airflow.git
commit dba092820111517cfb6de56e7fe09835f658f540 Author: Jarek Potiuk <[email protected]> AuthorDate: Wed Aug 5 11:49:16 2026 +0800 Resolve release constraints against PyPI providers only A release pins the providers as published on PyPI. Building them from the sources first puts a locally built wheel where the resolution can find it, and anything answered locally is then left out of the constraints - dropping the very pin the release needed. It also makes the release depend on the provider build toolchain working, which is what broke 3.3.1rc1: flit removed --no-setup-py and package preparation failed before any resolution ran. --- .github/workflows/generate-constraints.yml | 18 +++++++++++++++++- .github/workflows/release-constraints.yml | 4 ++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/.github/workflows/generate-constraints.yml b/.github/workflows/generate-constraints.yml index 8178cde09e0..026ad45401a 100644 --- a/.github/workflows/generate-constraints.yml +++ b/.github/workflows/generate-constraints.yml @@ -53,6 +53,15 @@ on: # yamllint disable-line rule:truthy required: false default: "false" type: string + pypi-providers-only: + description: > + Resolve against providers exactly as published on PyPI (true/false). Skips building the + provider distributions from sources and the source-providers constraints with them, so + nothing local can answer for a provider. Set when the constraints being produced are the + ones a release ships - see the comments on the steps this disables. + required: false + default: "false" + type: string debug-resources: description: "Whether to run in debug mode (true/false)" required: true @@ -113,12 +122,15 @@ jobs: python: ${{ matrix.python-version }} use-uv: ${{ inputs.use-uv }} make-mnt-writeable-and-cleanup: true + # Resolves the providers from the sources in this checkout. Skipped for a release, which + # ships only the PyPI constraints and must not have a source tree answer for a provider. - name: "Source constraints" shell: bash run: > breeze release-management generate-constraints --airflow-constraints-mode constraints-source-providers --answer yes --python "${PYTHON_VERSION}" + if: inputs.pypi-providers-only != 'true' - name: "No providers constraints" shell: bash timeout-minutes: 25 @@ -127,12 +139,16 @@ jobs: --airflow-constraints-mode constraints-no-providers --answer yes --python "${PYTHON_VERSION}" if: inputs.generate-no-providers-constraints == 'true' + # Builds the providers from sources into the dist directory the PyPI resolution reads through + # `--find-links`, so a locally built wheel can answer for a provider and is then excluded from + # the constraints. That is wanted while developing a provider that is not on PyPI yet; it is the + # opposite of what a release wants, which is every provider pinned at its published version. - name: "Prepare updated provider distributions" shell: bash run: > breeze release-management prepare-provider-distributions --include-not-ready-providers --distribution-format wheel - if: inputs.generate-pypi-constraints == 'true' + if: inputs.generate-pypi-constraints == 'true' && inputs.pypi-providers-only != 'true' - name: "Prepare airflow distributions" shell: bash run: > diff --git a/.github/workflows/release-constraints.yml b/.github/workflows/release-constraints.yml index 268abf83341..afa9d0690d4 100644 --- a/.github/workflows/release-constraints.yml +++ b/.github/workflows/release-constraints.yml @@ -179,6 +179,10 @@ jobs: # Only the PyPI constraints are what a release ships; the other modes serve CI, and # regenerating them here would move them for reasons unrelated to the release. generate-no-providers-constraints: "false" + # A release pins the providers as published on PyPI, so nothing is built from the sources + # here: a locally built provider wheel would answer the resolution and then be left out of + # the constraints, which is exactly the version the release needed pinned. + pypi-providers-only: "true" allow-pre-releases: ${{ needs.build-info.outputs.allow-pre-releases }} debug-resources: "false" checkout-ref: ${{ inputs.ref }}
