You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by po...@apache.org on 2025/05/06 09:48:57 UTC
(airflow) branch main updated: Run parallel tests for ARM platform (#50198)
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 3198aad1bfd Run parallel tests for ARM platform (#50198)
3198aad1bfd is described below
commit 3198aad1bfd7cbf8b3de56c482dc9d96e00d3a69
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Tue May 6 11:48:50 2025 +0200
Run parallel tests for ARM platform (#50198)
Since we have `ubintu22.04-arm` public runners available, we should
be able to run a set of parallel tests for ARM - this would make our
ARM images move out of experimental phase.
We are not running "all" tests - only those that make sense to run
on ARM for "production" quality.
MySQL tests have some timeouts and run longer on ARM, that's why we
do not run MySQL tests on ARM as well.
We can also get rid of the "ARM collection" test that was introduced
to test if just **collection** of tests when we remove packages that
shoud not be installed on ARM works. But if we are running actual
pytest tests on ARM, we do not need to run those tests any more.
---
.github/workflows/additional-ci-image-checks.yml | 43 +--
.github/workflows/additional-prod-image-tests.yml | 22 +-
.github/workflows/airflow-distributions-tests.yml | 12 +-
.github/workflows/basic-tests.yml | 16 +-
.github/workflows/{ci.yml => ci-amd.yml} | 125 ++++++--
.github/workflows/{ci.yml => ci-arm.yml} | 336 +++------------------
.github/workflows/ci-image-build.yml | 14 +-
.github/workflows/ci-image-checks.yml | 28 +-
.github/workflows/finalize-tests.yml | 85 +-----
.github/workflows/generate-constraints.yml | 12 +-
.github/workflows/helm-tests.yml | 14 +-
.github/workflows/integration-system-tests.yml | 18 +-
.github/workflows/k8s-tests.yml | 10 +-
.github/workflows/prod-image-build.yml | 8 +-
.github/workflows/prod-image-extra-checks.yml | 16 +-
.github/workflows/publish-docs-to-s3.yml | 6 +-
.github/workflows/push-image-cache.yml | 20 +-
.github/workflows/run-unit-tests.yml | 12 +-
.github/workflows/special-tests.yml | 85 ++----
.github/workflows/test-providers.yml | 14 +-
Dockerfile.ci | 7 -
.../doc/images/output_testing_core-tests.svg | 90 +++---
.../doc/images/output_testing_core-tests.txt | 2 +-
.../doc/images/output_testing_providers-tests.svg | 108 ++++---
.../doc/images/output_testing_providers-tests.txt | 2 +-
.../airflow_breeze/commands/testing_commands.py | 12 -
.../commands/testing_commands_config.py | 1 -
.../src/airflow_breeze/params/shell_params.py | 2 -
scripts/ci/testing/run_unit_tests.sh | 10 -
scripts/docker/entrypoint_ci.sh | 7 -
scripts/in_container/remove_arm_packages.py | 50 ---
31 files changed, 388 insertions(+), 799 deletions(-)
diff --git a/.github/workflows/additional-ci-image-checks.yml b/.github/workflows/additional-ci-image-checks.yml
index 6ef786e8a86..296e58fa23a 100644
--- a/.github/workflows/additional-ci-image-checks.yml
+++ b/.github/workflows/additional-ci-image-checks.yml
@@ -20,12 +20,12 @@ name: Additional CI image checks
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- amd-runners:
- description: "The array of labels (in json form) determining AMD public runners."
+ runners:
+ description: "The array of labels (in json form) determining runners."
required: true
type: string
- arm-runners:
- description: "The array of labels (in json form) determining ARM public runners."
+ platform:
+ description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
required: true
type: string
python-versions:
@@ -99,12 +99,11 @@ jobs:
# from forks. This is to prevent malicious PRs from creating images in the "apache/airflow" repo.
packages: write
with:
- amd-runners: ${{ inputs.amd-runners }}
- arm-runners: ${{ inputs.arm-runners }}
+ runners: ${{ inputs.runners }}
cache-type: "Early"
include-prod-images: "false"
push-latest-images: "false"
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
python-versions: ${{ inputs.python-versions }}
branch: ${{ inputs.branch }}
constraints-branch: ${{ inputs.constraints-branch }}
@@ -120,7 +119,7 @@ jobs:
check-that-image-builds-quickly:
timeout-minutes: 11
name: Check that image builds quickly
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
env:
UPGRADE_TO_NEWER_DEPENDENCIES: false
PYTHON_MAJOR_MINOR_VERSION: ${{ inputs.default-python-version }}
@@ -129,6 +128,7 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.actor }}
VERBOSE: "true"
+ PLATFORM: ${{ inputs.platform }}
if: inputs.branch == 'main'
steps:
- name: "Cleanup repo"
@@ -150,29 +150,4 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: echo "$GITHUB_TOKEN" | docker login ghcr.io -u "$actor" --password-stdin
- name: "Check that image builds quickly"
- run: breeze shell --max-time 600 --platform "linux/amd64"
-
-# This is only a check if ARM images are successfully building when committer runs PR from
-# Apache repository. This is needed in case you want to fix failing cache job in "canary" run
-# There is no point in running this one in "canary" run, because the above step is doing the
-# same build anyway.
-# build-ci-arm-images:
-# name: Build CI ARM images
-# uses: ./.github/workflows/ci-image-build.yml
-# permissions:
-# contents: read
-# packages: write
-# with:
-# amd-runners: ${{ inputs.amd-runners }}
-# arm-runners: ${{ inputs.arm-runners }}
-# platform: "linux/arm64"
-# push-image: "false"
-# upload-image-artifact: "true"
-# upload-mount-cache-artifact: ${{ inputs.canary-run }}
-# python-versions: ${{ inputs.python-versions }}
-# branch: ${{ inputs.branch }}
-# constraints-branch: ${{ inputs.constraints-branch }}
-# use-uv: ${{ inputs.use-uv }}
-# upgrade-to-newer-dependencies: ${{ inputs.upgrade-to-newer-dependencies }}
-# docker-cache: ${{ inputs.docker-cache }}
-# disable-airflow-repo-cache: ${{ inputs.disable-airflow-repo-cache }}
+ run: breeze shell --max-time 600 --platform "${PLATFORM}"
diff --git a/.github/workflows/additional-prod-image-tests.yml b/.github/workflows/additional-prod-image-tests.yml
index 3834efad76e..489b2967af3 100644
--- a/.github/workflows/additional-prod-image-tests.yml
+++ b/.github/workflows/additional-prod-image-tests.yml
@@ -20,8 +20,12 @@ name: Additional PROD image tests
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- amd-runners:
- description: "The array of labels (in json form) determining AMD public runners."
+ runners:
+ description: "The array of labels (in json form) determining runners."
+ required: true
+ type: string
+ platform:
+ description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
required: true
type: string
default-branch:
@@ -63,7 +67,8 @@ jobs:
name: PROD image extra checks (main)
uses: ./.github/workflows/prod-image-extra-checks.yml
with:
- amd-runners: ${{ inputs.amd-runners }}
+ runners: ${{ inputs.runners }}
+ platform: ${{ inputs.platform }}
python-versions: "[ '${{ inputs.default-python-version }}' ]"
default-python-version: ${{ inputs.default-python-version }}
branch: ${{ inputs.default-branch }}
@@ -78,7 +83,8 @@ jobs:
name: PROD image extra checks (release)
uses: ./.github/workflows/prod-image-extra-checks.yml
with:
- amd-runners: ${{ inputs.amd-runners }}
+ runners: ${{ inputs.runners }}
+ platform: ${{ inputs.platform }}
python-versions: "[ '${{ inputs.default-python-version }}' ]"
default-python-version: ${{ inputs.default-python-version }}
branch: ${{ inputs.default-branch }}
@@ -92,7 +98,7 @@ jobs:
test-examples-of-prod-image-building:
timeout-minutes: 60
name: "Test examples of PROD image building"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
env:
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -112,7 +118,7 @@ jobs:
- name: "Prepare breeze & PROD image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
image-type: "prod"
python: ${{ inputs.default-python-version }}
use-uv: ${{ inputs.use-uv }}
@@ -130,7 +136,7 @@ jobs:
test-docker-compose-quick-start:
timeout-minutes: 60
name: "Docker Compose quick start with PROD image verifying"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
env:
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
GITHUB_REPOSITORY: ${{ github.repository }}
@@ -149,7 +155,7 @@ jobs:
- name: "Prepare breeze & PROD image: ${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
uses: ./.github/actions/prepare_breeze_and_image
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
image-type: "prod"
python: ${{ env.PYTHON_MAJOR_MINOR_VERSION }}
use-uv: ${{ inputs.use-uv }}
diff --git a/.github/workflows/airflow-distributions-tests.yml b/.github/workflows/airflow-distributions-tests.yml
index 77b0e76462a..a7156ef98df 100644
--- a/.github/workflows/airflow-distributions-tests.yml
+++ b/.github/workflows/airflow-distributions-tests.yml
@@ -21,8 +21,12 @@ on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
# Static inputs defined to choose which distribution to test to run
- amd-runners:
- description: "The array of labels (in json form) determining public AMD runners."
+ runners:
+ description: "The array of labels (in json form) determining runners."
+ required: true
+ type: string
+ platform:
+ description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
required: true
type: string
distribution-name:
@@ -59,7 +63,7 @@ jobs:
distributions-tests:
timeout-minutes: 80
name: ${{ inputs.distribution-name }}:P${{ matrix.python-version }} tests
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
strategy:
fail-fast: false
matrix:
@@ -82,7 +86,7 @@ jobs:
- name: "Prepare breeze & CI image: ${{ matrix.python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
python: ${{ matrix.python-version }}
use-uv: ${{ inputs.use-uv }}
- name: "Cleanup dist files"
diff --git a/.github/workflows/basic-tests.yml b/.github/workflows/basic-tests.yml
index cdd619c9f4c..5d931b00186 100644
--- a/.github/workflows/basic-tests.yml
+++ b/.github/workflows/basic-tests.yml
@@ -20,8 +20,8 @@ name: Basic tests
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- amd-runners:
- description: "The array of labels (in json form) determining public runners."
+ runners:
+ description: "The array of labels (in json form) determining runners."
required: true
type: string
run-ui-tests:
@@ -66,7 +66,7 @@ jobs:
run-breeze-tests:
timeout-minutes: 10
name: Breeze unit tests
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
steps:
- name: "Cleanup repo"
shell: bash
@@ -87,7 +87,7 @@ jobs:
tests-ui:
timeout-minutes: 15
name: React UI tests
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
if: inputs.run-ui-tests == 'true'
steps:
- name: "Cleanup repo"
@@ -155,7 +155,7 @@ jobs:
install-pre-commit:
timeout-minutes: 5
name: "Install pre-commit for cache"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
env:
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
steps:
@@ -183,7 +183,7 @@ jobs:
static-checks-basic-checks-only:
timeout-minutes: 30
name: "Static checks: basic checks only"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
needs: install-pre-commit
if: inputs.basic-checks-only == 'true'
steps:
@@ -236,7 +236,7 @@ jobs:
upgrade-check:
timeout-minutes: 45
name: "Upgrade checks"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
needs: install-pre-commit
env:
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
@@ -306,7 +306,7 @@ jobs:
test-airflow-release-commands:
timeout-minutes: 80
name: "Test Airflow release commands"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
env:
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
GITHUB_REPOSITORY: ${{ github.repository }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci-amd.yml
similarity index 90%
copy from .github/workflows/ci.yml
copy to .github/workflows/ci-amd.yml
index ab0e577e944..a788319e496 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci-amd.yml
@@ -16,7 +16,7 @@
# under the License.
#
---
-name: Tests
+name: Tests AMD
on: # yamllint disable-line rule:truthy
schedule:
- cron: '28 1,7,13,19 * * *'
@@ -43,7 +43,7 @@ env:
VERBOSE: "true"
concurrency:
- group: ci-${{ github.event.pull_request.number || github.ref }}
+ group: ci-amd-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
@@ -173,7 +173,7 @@ jobs:
needs: [build-info]
uses: ./.github/workflows/basic-tests.yml
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
run-ui-tests: ${{needs.build-info.outputs.run-ui-tests}}
run-www-tests: ${{needs.build-info.outputs.run-www-tests}}
needs-api-codegen: ${{needs.build-info.outputs.needs-api-codegen}}
@@ -194,8 +194,7 @@ jobs:
# from forks. This is to prevent malicious PRs from creating images in the "apache/airflow" repo.
packages: write
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- arm-runners: ${{ needs.build-info.outputs.arm-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
platform: "linux/amd64"
push-image: "false"
upload-image-artifact: "true"
@@ -219,8 +218,8 @@ jobs:
id-token: write
if: needs.build-info.outputs.canary-run == 'true'
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- arm-runners: ${{ needs.build-info.outputs.arm-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
python-versions: ${{ needs.build-info.outputs.python-versions }}
branch: ${{ needs.build-info.outputs.default-branch }}
constraints-branch: ${{ needs.build-info.outputs.default-constraints-branch }}
@@ -241,7 +240,8 @@ jobs:
uses: ./.github/workflows/generate-constraints.yml
if: needs.build-info.outputs.ci-image-build == 'true'
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
python-versions-list-as-string: ${{ needs.build-info.outputs.python-versions-list-as-string }}
# generate no providers constraints only in canary builds - they take quite some time to generate
# they are not needed for regular builds, they are only needed to update constraints in canaries
@@ -257,7 +257,8 @@ jobs:
id-token: write
contents: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
needs-mypy: ${{ needs.build-info.outputs.needs-mypy }}
mypy-checks: ${{ needs.build-info.outputs.mypy-checks }}
python-versions-list-as-string: ${{ needs.build-info.outputs.python-versions-list-as-string }}
@@ -293,7 +294,8 @@ jobs:
needs.build-info.outputs.latest-versions-only != 'true' &&
needs.build-info.outputs.run-tests == 'true'
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
canary-run: ${{ needs.build-info.outputs.canary-run }}
default-python-version: ${{ needs.build-info.outputs.default-python-version }}
upgrade-to-newer-dependencies: ${{ needs.build-info.outputs.upgrade-to-newer-dependencies }}
@@ -315,7 +317,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
helm-test-packages: ${{ needs.build-info.outputs.helm-test-packages }}
default-python-version: ${{ needs.build-info.outputs.default-python-version }}
use-uv: ${{ needs.build-info.outputs.use-uv }}
@@ -332,7 +335,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
backend: "postgres"
test-name: "Postgres"
test-scope: "DB"
@@ -359,7 +363,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
backend: "postgres"
test-name: "Postgres"
test-scope: "DB"
@@ -386,7 +391,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
backend: "mysql"
test-name: "MySQL"
test-scope: "DB"
@@ -413,7 +419,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
backend: "mysql"
test-name: "MySQL"
test-scope: "DB"
@@ -441,7 +448,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
backend: "sqlite"
test-name: "Sqlite"
test-name-separator: ""
@@ -470,7 +478,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
backend: "sqlite"
test-name: "Sqlite"
test-name-separator: ""
@@ -500,7 +509,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
backend: "sqlite"
test-name: ""
test-name-separator: ""
@@ -528,7 +538,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
backend: "sqlite"
test-name: ""
test-name-separator: ""
@@ -562,7 +573,8 @@ jobs:
needs.build-info.outputs.full-tests-needed == 'true')
with:
default-branch: ${{ needs.build-info.outputs.default-branch }}
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
core-test-types-list-as-strings-in-json: >
${{ needs.build-info.outputs.core-test-types-list-as-strings-in-json }}
providers-test-types-list-as-strings-in-json: >
@@ -587,7 +599,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
testable-core-integrations: ${{ needs.build-info.outputs.testable-core-integrations }}
testable-providers-integrations: ${{ needs.build-info.outputs.testable-providers-integrations }}
run-system-tests: ${{ needs.build-info.outputs.run-tests }}
@@ -610,7 +623,8 @@ jobs:
if: >
needs.build-info.outputs.run-tests == 'true'
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
test-name: "LowestDeps"
force-lowest-dependencies: "true"
test-scope: "All"
@@ -638,7 +652,8 @@ jobs:
packages: read
if: needs.build-info.outputs.run-tests == 'true'
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
test-name: "LowestDeps"
force-lowest-dependencies: "true"
test-scope: "All"
@@ -667,9 +682,9 @@ jobs:
# from forks. This is to prevent malicious PRs from creating images in the "apache/airflow" repo.
packages: write
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- build-type: "Regular"
+ runners: ${{ needs.build-info.outputs.amd-runners }}
platform: "linux/amd64"
+ build-type: "Regular"
push-image: "false"
upload-image-artifact: "true"
upload-package-artifact: "true"
@@ -688,7 +703,8 @@ jobs:
needs: [build-info, build-prod-images, generate-constraints]
uses: ./.github/workflows/additional-prod-image-tests.yml
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
default-branch: ${{ needs.build-info.outputs.default-branch }}
constraints-branch: ${{ needs.build-info.outputs.default-constraints-branch }}
upgrade-to-newer-dependencies: ${{ needs.build-info.outputs.upgrade-to-newer-dependencies }}
@@ -707,8 +723,8 @@ jobs:
contents: read
packages: read
with:
+ runners: ${{ needs.build-info.outputs.amd-runners }}
platform: "linux/amd64"
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
python-versions-list-as-string: ${{ needs.build-info.outputs.python-versions-list-as-string }}
include-success-outputs: ${{ needs.build-info.outputs.include-success-outputs }}
use-uv: ${{ needs.build-info.outputs.use-uv }}
@@ -726,7 +742,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
default-python-version: ${{ needs.build-info.outputs.default-python-version }}
python-versions: ${{ needs.build-info.outputs.python-versions }}
use-uv: ${{ needs.build-info.outputs.use-uv }}
@@ -747,7 +764,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
default-python-version: ${{ needs.build-info.outputs.default-python-version }}
python-versions: ${{ needs.build-info.outputs.python-versions }}
use-uv: ${{ needs.build-info.outputs.use-uv }}
@@ -794,8 +812,8 @@ jobs:
- tests-with-lowest-direct-resolution-providers
uses: ./.github/workflows/finalize-tests.yml
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- arm-runners: ${{ needs.build-info.outputs.arm-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
+ platform: "linux/amd64"
python-versions: ${{ needs.build-info.outputs.python-versions }}
python-versions-list-as-string: ${{ needs.build-info.outputs.python-versions-list-as-string }}
branch: ${{ needs.build-info.outputs.default-branch }}
@@ -825,10 +843,51 @@ jobs:
# yamllint disable rule:line-length
payload: |
channel: "internal-airflow-ci-cd"
- text: "🚨🕒 Scheduled CI Failure Alert 🕒🚨\n\n*Details:* <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|View the failure log>"
+ text: "🚨🕒 Scheduled CI Failure Alert (AMD) 🕒🚨\n\n*Details:* <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|View the failure log>"
blocks:
- type: "section"
text:
type: "mrkdwn"
- text: "🚨🕒 Scheduled CI Failure Alert 🕒🚨\n\n*Details:* <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|View the failure log>"
+ text: "🚨🕒 Scheduled CI Failure Alert (AMD) 🕒🚨\n\n*Details:* <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|View the failure log>"
# yamllint enable rule:line-length
+
+ summarize-warnings:
+ timeout-minutes: 15
+ name: "Summarize warnings"
+ runs-on: ${{ fromJSON(needs.build-info.outputs.amd-runners) }}
+ if: needs.build-info.outputs.run-tests == 'true'
+ steps:
+ - name: "Cleanup repo"
+ shell: bash
+ run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm -rf /workspace/*"
+ - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
+ uses: actions/checkout@v4
+ with:
+ persist-credentials: false
+ - name: "Cleanup docker"
+ run: ./scripts/ci/cleanup_docker.sh
+ - name: "Free up disk space"
+ shell: bash
+ run: ./scripts/tools/free_up_disk_space.sh
+ - name: "Download all test warning artifacts from the current build"
+ uses: actions/download-artifact@v4
+ with:
+ path: ./artifacts
+ pattern: test-warnings-*
+ - name: "Setup python"
+ uses: actions/setup-python@v5
+ with:
+ python-version: ${{ inputs.default-python-version }}
+ - name: "Summarize all warnings"
+ run: |
+ ./scripts/ci/testing/summarize_captured_warnings.py ./artifacts \
+ --pattern "**/warnings-*.txt" \
+ --output ./files
+ - name: "Upload artifact for summarized warnings"
+ uses: actions/upload-artifact@v4
+ with:
+ name: test-summarized-amd-runner-warnings
+ path: ./files/warn-summary-*.txt
+ retention-days: 7
+ if-no-files-found: ignore
+ overwrite: true
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci-arm.yml
similarity index 63%
rename from .github/workflows/ci.yml
rename to .github/workflows/ci-arm.yml
index ab0e577e944..5b8cee0a432 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci-arm.yml
@@ -16,21 +16,14 @@
# under the License.
#
---
-name: Tests
+name: Tests ARM
on: # yamllint disable-line rule:truthy
schedule:
- - cron: '28 1,7,13,19 * * *'
+ - cron: '28 3,9,15,21 * * *'
push:
branches:
- v[0-9]+-[0-9]+-test
- providers-[a-z]+-?[a-z]*/v[0-9]+-[0-9]+
- pull_request:
- branches:
- - main
- - v[0-9]+-[0-9]+-test
- - v[0-9]+-[0-9]+-stable
- - providers-[a-z]+-?[a-z]*/v[0-9]+-[0-9]+
- types: [opened, reopened, synchronize, ready_for_review]
workflow_dispatch:
permissions:
# All other permissions are set to none by default
@@ -43,7 +36,7 @@ env:
VERBOSE: "true"
concurrency:
- group: ci-${{ github.event.pull_request.number || github.ref }}
+ group: ci-arm-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
@@ -173,7 +166,7 @@ jobs:
needs: [build-info]
uses: ./.github/workflows/basic-tests.yml
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.arm-runners }}
run-ui-tests: ${{needs.build-info.outputs.run-ui-tests}}
run-www-tests: ${{needs.build-info.outputs.run-www-tests}}
needs-api-codegen: ${{needs.build-info.outputs.needs-api-codegen}}
@@ -194,9 +187,8 @@ jobs:
# from forks. This is to prevent malicious PRs from creating images in the "apache/airflow" repo.
packages: write
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- arm-runners: ${{ needs.build-info.outputs.arm-runners }}
- platform: "linux/amd64"
+ runners: ${{ needs.build-info.outputs.arm-runners }}
+ platform: "linux/arm64"
push-image: "false"
upload-image-artifact: "true"
upload-mount-cache-artifact: ${{ needs.build-info.outputs.canary-run }}
@@ -219,8 +211,8 @@ jobs:
id-token: write
if: needs.build-info.outputs.canary-run == 'true'
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- arm-runners: ${{ needs.build-info.outputs.arm-runners }}
+ runners: ${{ needs.build-info.outputs.arm-runners }}
+ platform: "linux/arm64"
python-versions: ${{ needs.build-info.outputs.python-versions }}
branch: ${{ needs.build-info.outputs.default-branch }}
constraints-branch: ${{ needs.build-info.outputs.default-constraints-branch }}
@@ -241,7 +233,8 @@ jobs:
uses: ./.github/workflows/generate-constraints.yml
if: needs.build-info.outputs.ci-image-build == 'true'
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.arm-runners }}
+ platform: "linux/arm64"
python-versions-list-as-string: ${{ needs.build-info.outputs.python-versions-list-as-string }}
# generate no providers constraints only in canary builds - they take quite some time to generate
# they are not needed for regular builds, they are only needed to update constraints in canaries
@@ -249,37 +242,6 @@ jobs:
debug-resources: ${{ needs.build-info.outputs.debug-resources }}
use-uv: ${{ needs.build-info.outputs.use-uv }}
- ci-image-checks:
- name: "CI image checks"
- needs: [build-info, build-ci-images]
- uses: ./.github/workflows/ci-image-checks.yml
- permissions:
- id-token: write
- contents: read
- with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- needs-mypy: ${{ needs.build-info.outputs.needs-mypy }}
- mypy-checks: ${{ needs.build-info.outputs.mypy-checks }}
- python-versions-list-as-string: ${{ needs.build-info.outputs.python-versions-list-as-string }}
- branch: ${{ needs.build-info.outputs.default-branch }}
- canary-run: ${{ needs.build-info.outputs.canary-run }}
- default-python-version: ${{ needs.build-info.outputs.default-python-version }}
- docs-list-as-string: ${{ needs.build-info.outputs.docs-list-as-string }}
- latest-versions-only: ${{ needs.build-info.outputs.latest-versions-only }}
- basic-checks-only: ${{ needs.build-info.outputs.basic-checks-only }}
- upgrade-to-newer-dependencies: ${{ needs.build-info.outputs.upgrade-to-newer-dependencies }}
- skip-pre-commits: ${{ needs.build-info.outputs.skip-pre-commits }}
- ci-image-build: ${{ needs.build-info.outputs.ci-image-build }}
- include-success-outputs: ${{ needs.build-info.outputs.include-success-outputs }}
- debug-resources: ${{ needs.build-info.outputs.debug-resources }}
- docs-build: ${{ needs.build-info.outputs.docs-build }}
- needs-api-codegen: ${{ needs.build-info.outputs.needs-api-codegen }}
- default-postgres-version: ${{ needs.build-info.outputs.default-postgres-version }}
- run-coverage: ${{ needs.build-info.outputs.run-coverage }}
- use-uv: ${{ needs.build-info.outputs.use-uv }}
- secrets:
- DOCS_AWS_ACCESS_KEY_ID: ${{ secrets.DOCS_AWS_ACCESS_KEY_ID }}
- DOCS_AWS_SECRET_ACCESS_KEY: ${{ secrets.DOCS_AWS_SECRET_ACCESS_KEY }}
providers:
name: "provider distributions tests"
@@ -290,10 +252,10 @@ jobs:
packages: read
if: >
needs.build-info.outputs.skip-providers-tests != 'true' &&
- needs.build-info.outputs.latest-versions-only != 'true' &&
- needs.build-info.outputs.run-tests == 'true'
+ needs.build-info.outputs.latest-versions-only != 'true'
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.arm-runners }}
+ platform: "linux/arm64"
canary-run: ${{ needs.build-info.outputs.canary-run }}
default-python-version: ${{ needs.build-info.outputs.default-python-version }}
upgrade-to-newer-dependencies: ${{ needs.build-info.outputs.upgrade-to-newer-dependencies }}
@@ -315,7 +277,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.arm-runners }}
+ platform: "linux/arm64"
helm-test-packages: ${{ needs.build-info.outputs.helm-test-packages }}
default-python-version: ${{ needs.build-info.outputs.default-python-version }}
use-uv: ${{ needs.build-info.outputs.use-uv }}
@@ -332,7 +295,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.arm-runners }}
+ platform: "linux/arm64"
backend: "postgres"
test-name: "Postgres"
test-scope: "DB"
@@ -359,7 +323,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.arm-runners }}
+ platform: "linux/arm64"
backend: "postgres"
test-name: "Postgres"
test-scope: "DB"
@@ -378,61 +343,6 @@ jobs:
use-uv: ${{ needs.build-info.outputs.use-uv }}
if: needs.build-info.outputs.run-tests == 'true'
- tests-mysql-core:
- name: "MySQL tests: core"
- uses: ./.github/workflows/run-unit-tests.yml
- needs: [build-info, build-ci-images]
- permissions:
- contents: read
- packages: read
- with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- backend: "mysql"
- test-name: "MySQL"
- test-scope: "DB"
- test-group: "core"
- python-versions: ${{ needs.build-info.outputs.python-versions }}
- backend-versions: ${{ needs.build-info.outputs.mysql-versions }}
- excluded-providers-as-string: ${{ needs.build-info.outputs.excluded-providers-as-string }}
- excludes: ${{ needs.build-info.outputs.mysql-exclude }}
- test-types-as-strings-in-json: >
- ${{ needs.build-info.outputs.core-test-types-list-as-strings-in-json }}
- include-success-outputs: ${{ needs.build-info.outputs.include-success-outputs }}
- run-coverage: ${{ needs.build-info.outputs.run-coverage }}
- run-migration-tests: "true"
- debug-resources: ${{ needs.build-info.outputs.debug-resources }}
- skip-providers-tests: ${{ needs.build-info.outputs.skip-providers-tests }}
- use-uv: ${{ needs.build-info.outputs.use-uv }}
- if: needs.build-info.outputs.run-tests == 'true'
-
- tests-mysql-providers:
- name: "MySQL tests: providers"
- uses: ./.github/workflows/run-unit-tests.yml
- needs: [build-info, build-ci-images]
- permissions:
- contents: read
- packages: read
- with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- backend: "mysql"
- test-name: "MySQL"
- test-scope: "DB"
- test-group: "providers"
- python-versions: ${{ needs.build-info.outputs.python-versions }}
- backend-versions: ${{ needs.build-info.outputs.mysql-versions }}
- excluded-providers-as-string: ${{ needs.build-info.outputs.excluded-providers-as-string }}
- excludes: ${{ needs.build-info.outputs.mysql-exclude }}
- test-types-as-strings-in-json: >
- ${{ needs.build-info.outputs.providers-test-types-list-as-strings-in-json }}
- include-success-outputs: ${{ needs.build-info.outputs.include-success-outputs }}
- run-coverage: ${{ needs.build-info.outputs.run-coverage }}
- run-migration-tests: "true"
- debug-resources: ${{ needs.build-info.outputs.debug-resources }}
- skip-providers-tests: ${{ needs.build-info.outputs.skip-providers-tests }}
- use-uv: ${{ needs.build-info.outputs.use-uv }}
- if: needs.build-info.outputs.run-tests == 'true'
-
-
tests-sqlite-core:
name: "Sqlite tests: core"
uses: ./.github/workflows/run-unit-tests.yml
@@ -441,7 +351,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.arm-runners }}
+ platform: "linux/arm64"
backend: "sqlite"
test-name: "Sqlite"
test-name-separator: ""
@@ -470,7 +381,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.arm-runners }}
+ platform: "linux/arm64"
backend: "sqlite"
test-name: "Sqlite"
test-name-separator: ""
@@ -500,7 +412,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.arm-runners }}
+ platform: "linux/arm64"
backend: "sqlite"
test-name: ""
test-name-separator: ""
@@ -528,7 +441,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.arm-runners }}
+ platform: "linux/arm64"
backend: "sqlite"
test-name: ""
test-name-separator: ""
@@ -548,115 +462,6 @@ jobs:
use-uv: ${{ needs.build-info.outputs.use-uv }}
if: needs.build-info.outputs.run-tests == 'true'
- tests-special:
- name: "Special tests"
- uses: ./.github/workflows/special-tests.yml
- needs: [build-info, build-ci-images]
- permissions:
- contents: read
- packages: read
- if: >
- needs.build-info.outputs.run-tests == 'true' &&
- (needs.build-info.outputs.canary-run == 'true' ||
- needs.build-info.outputs.upgrade-to-newer-dependencies != 'false' ||
- needs.build-info.outputs.full-tests-needed == 'true')
- with:
- default-branch: ${{ needs.build-info.outputs.default-branch }}
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- core-test-types-list-as-strings-in-json: >
- ${{ needs.build-info.outputs.core-test-types-list-as-strings-in-json }}
- providers-test-types-list-as-strings-in-json: >
- ${{ needs.build-info.outputs.providers-test-types-list-as-strings-in-json }}
- run-coverage: ${{ needs.build-info.outputs.run-coverage }}
- default-python-version: ${{ needs.build-info.outputs.default-python-version }}
- python-versions: ${{ needs.build-info.outputs.python-versions }}
- default-postgres-version: ${{ needs.build-info.outputs.default-postgres-version }}
- excluded-providers-as-string: ${{ needs.build-info.outputs.excluded-providers-as-string }}
- canary-run: ${{ needs.build-info.outputs.canary-run }}
- upgrade-to-newer-dependencies: ${{ needs.build-info.outputs.upgrade-to-newer-dependencies }}
- include-success-outputs: ${{ needs.build-info.outputs.include-success-outputs }}
- skip-providers-tests: ${{ needs.build-info.outputs.skip-providers-tests }}
- debug-resources: ${{ needs.build-info.outputs.debug-resources }}
- use-uv: ${{ needs.build-info.outputs.use-uv }}
-
- tests-integration-system:
- name: Integration and System Tests
- needs: [build-info, build-ci-images]
- uses: ./.github/workflows/integration-system-tests.yml
- permissions:
- contents: read
- packages: read
- with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- testable-core-integrations: ${{ needs.build-info.outputs.testable-core-integrations }}
- testable-providers-integrations: ${{ needs.build-info.outputs.testable-providers-integrations }}
- run-system-tests: ${{ needs.build-info.outputs.run-tests }}
- default-python-version: ${{ needs.build-info.outputs.default-python-version }}
- default-postgres-version: ${{ needs.build-info.outputs.default-postgres-version }}
- default-mysql-version: ${{ needs.build-info.outputs.default-mysql-version }}
- run-coverage: ${{ needs.build-info.outputs.run-coverage }}
- debug-resources: ${{ needs.build-info.outputs.debug-resources }}
- skip-providers-tests: ${{ needs.build-info.outputs.skip-providers-tests }}
- use-uv: ${{ needs.build-info.outputs.use-uv }}
- if: needs.build-info.outputs.run-tests == 'true'
-
- tests-with-lowest-direct-resolution-core:
- name: "Low dep tests:core"
- needs: [build-info, build-ci-images]
- uses: ./.github/workflows/run-unit-tests.yml
- permissions:
- contents: read
- packages: read
- if: >
- needs.build-info.outputs.run-tests == 'true'
- with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- test-name: "LowestDeps"
- force-lowest-dependencies: "true"
- test-scope: "All"
- test-group: "core"
- backend: "sqlite"
- python-versions: ${{ needs.build-info.outputs.python-versions }}
- backend-versions: "['${{ needs.build-info.outputs.default-postgres-version }}']"
- excluded-providers-as-string: ""
- excludes: "[]"
- test-types-as-strings-in-json: >
- ${{ needs.build-info.outputs.core-test-types-list-as-strings-in-json }}
- include-success-outputs: ${{ needs.build-info.outputs.include-success-outputs }}
- run-coverage: ${{ needs.build-info.outputs.run-coverage }}
- debug-resources: ${{ needs.build-info.outputs.debug-resources }}
- monitor-delay-time-in-seconds: 120
- skip-providers-tests: ${{ needs.build-info.outputs.skip-providers-tests }}
- use-uv: ${{ needs.build-info.outputs.use-uv }}
-
- tests-with-lowest-direct-resolution-providers:
- name: "Low dep tests: providers"
- needs: [build-info, build-ci-images]
- uses: ./.github/workflows/run-unit-tests.yml
- permissions:
- contents: read
- packages: read
- if: needs.build-info.outputs.run-tests == 'true'
- with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- test-name: "LowestDeps"
- force-lowest-dependencies: "true"
- test-scope: "All"
- test-group: "providers"
- backend: "sqlite"
- python-versions: ${{ needs.build-info.outputs.python-versions }}
- backend-versions: "['${{ needs.build-info.outputs.default-postgres-version }}']"
- excluded-providers-as-string: ${{ needs.build-info.outputs.excluded-providers-as-string }}
- excludes: "[]"
- test-types-as-strings-in-json: >
- ${{ needs.build-info.outputs.individual-providers-test-types-list-as-strings-in-json }}
- include-success-outputs: ${{ needs.build-info.outputs.include-success-outputs }}
- run-coverage: ${{ needs.build-info.outputs.run-coverage }}
- debug-resources: ${{ needs.build-info.outputs.debug-resources }}
- monitor-delay-time-in-seconds: 120
- skip-providers-tests: ${{ needs.build-info.outputs.skip-providers-tests }}
- use-uv: ${{ needs.build-info.outputs.use-uv }}
-
build-prod-images:
name: Build PROD images
needs: [build-info, build-ci-images, generate-constraints]
@@ -667,9 +472,9 @@ jobs:
# from forks. This is to prevent malicious PRs from creating images in the "apache/airflow" repo.
packages: write
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.arm-runners }}
+ platform: "linux/arm64"
build-type: "Regular"
- platform: "linux/amd64"
push-image: "false"
upload-image-artifact: "true"
upload-package-artifact: "true"
@@ -683,22 +488,6 @@ jobs:
disable-airflow-repo-cache: ${{ needs.build-info.outputs.disable-airflow-repo-cache }}
prod-image-build: ${{ needs.build-info.outputs.prod-image-build }}
- additional-prod-image-tests:
- name: "Additional PROD image tests"
- needs: [build-info, build-prod-images, generate-constraints]
- uses: ./.github/workflows/additional-prod-image-tests.yml
- with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- default-branch: ${{ needs.build-info.outputs.default-branch }}
- constraints-branch: ${{ needs.build-info.outputs.default-constraints-branch }}
- upgrade-to-newer-dependencies: ${{ needs.build-info.outputs.upgrade-to-newer-dependencies }}
- docker-cache: ${{ needs.build-info.outputs.docker-cache }}
- disable-airflow-repo-cache: ${{ needs.build-info.outputs.disable-airflow-repo-cache }}
- default-python-version: ${{ needs.build-info.outputs.default-python-version }}
- canary-run: ${{ needs.build-info.outputs.canary-run }}
- use-uv: ${{ needs.build-info.outputs.use-uv }}
- if: needs.build-info.outputs.prod-image-build == 'true'
-
tests-kubernetes:
name: "Kubernetes tests"
uses: ./.github/workflows/k8s-tests.yml
@@ -707,8 +496,8 @@ jobs:
contents: read
packages: read
with:
- platform: "linux/amd64"
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
+ runners: ${{ needs.build-info.outputs.arm-runners }}
+ platform: "linux/arm64"
python-versions-list-as-string: ${{ needs.build-info.outputs.python-versions-list-as-string }}
include-success-outputs: ${{ needs.build-info.outputs.include-success-outputs }}
use-uv: ${{ needs.build-info.outputs.use-uv }}
@@ -718,48 +507,6 @@ jobs:
( needs.build-info.outputs.run-kubernetes-tests == 'true' ||
needs.build-info.outputs.needs-helm-tests == 'true')
- tests-task-sdk:
- name: "Task SDK tests"
- uses: ./.github/workflows/airflow-distributions-tests.yml
- needs: [build-info, build-ci-images]
- permissions:
- contents: read
- packages: read
- with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- default-python-version: ${{ needs.build-info.outputs.default-python-version }}
- python-versions: ${{ needs.build-info.outputs.python-versions }}
- use-uv: ${{ needs.build-info.outputs.use-uv }}
- canary-run: ${{ needs.build-info.outputs.canary-run }}
- distribution-name: "task-sdk"
- distribution-cmd-format: "prepare-task-sdk-distributions"
- test-type: "task-sdk-tests"
- if: >
- ( needs.build-info.outputs.run-task-sdk-tests == 'true' ||
- needs.build-info.outputs.run-tests == 'true' &&
- needs.build-info.outputs.only-new-ui-files != 'true')
-
- tests-airflow-ctl:
- name: "Airflow CTL tests"
- uses: ./.github/workflows/airflow-distributions-tests.yml
- needs: [build-info, build-ci-images]
- permissions:
- contents: read
- packages: read
- with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- default-python-version: ${{ needs.build-info.outputs.default-python-version }}
- python-versions: ${{ needs.build-info.outputs.python-versions }}
- use-uv: ${{ needs.build-info.outputs.use-uv }}
- canary-run: ${{ needs.build-info.outputs.canary-run }}
- distribution-name: "airflow-ctl"
- distribution-cmd-format: "prepare-airflow-ctl-distributions"
- test-type: "airflow-ctl-tests"
- if: >
- ( needs.build-info.outputs.run-airflow-ctl-tests == 'true' ||
- needs.build-info.outputs.run-tests == 'true' &&
- needs.build-info.outputs.only-new-ui-files != 'true')
-
finalize-tests:
name: Finalize tests
permissions:
@@ -769,33 +516,24 @@ jobs:
if: always() && !failure() && !cancelled()
needs:
- additional-ci-image-checks
- - additional-prod-image-tests
- basic-tests
- build-info
- - build-prod-images
- - ci-image-checks
+ - basic-tests
- generate-constraints
+ - build-prod-images
- providers
- tests-helm
- - tests-integration-system
- tests-kubernetes
- - tests-mysql-core
- - tests-mysql-providers
- tests-non-db-core
- tests-non-db-providers
- tests-postgres-core
- tests-postgres-providers
- # - tests-special
- tests-sqlite-core
- tests-sqlite-providers
- - tests-task-sdk
- - tests-airflow-ctl
- - tests-with-lowest-direct-resolution-core
- - tests-with-lowest-direct-resolution-providers
uses: ./.github/workflows/finalize-tests.yml
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- arm-runners: ${{ needs.build-info.outputs.arm-runners }}
+ runners: ${{ needs.build-info.outputs.arm-runners }}
+ platform: "linux/arm64"
python-versions: ${{ needs.build-info.outputs.python-versions }}
python-versions-list-as-string: ${{ needs.build-info.outputs.python-versions-list-as-string }}
branch: ${{ needs.build-info.outputs.default-branch }}
@@ -825,10 +563,10 @@ jobs:
# yamllint disable rule:line-length
payload: |
channel: "internal-airflow-ci-cd"
- text: "🚨🕒 Scheduled CI Failure Alert 🕒🚨\n\n*Details:* <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|View the failure log>"
+ text: "🚨🕒 Scheduled CI Failure Alert (ARM) 🕒🚨\n\n*Details:* <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|View the failure log>"
blocks:
- type: "section"
text:
type: "mrkdwn"
- text: "🚨🕒 Scheduled CI Failure Alert 🕒🚨\n\n*Details:* <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|View the failure log>"
+ text: "🚨🕒 Scheduled CI Failure Alert (ARM) 🕒🚨\n\n*Details:* <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|View the failure log>"
# yamllint enable rule:line-length
diff --git a/.github/workflows/ci-image-build.yml b/.github/workflows/ci-image-build.yml
index 9c032fbff37..d531ffebebf 100644
--- a/.github/workflows/ci-image-build.yml
+++ b/.github/workflows/ci-image-build.yml
@@ -20,12 +20,8 @@ name: Build CI images
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- amd-runners:
- description: "The array of labels (in json form) determining public AMD runners."
- required: true
- type: string
- arm-runners:
- description: "The array of labels (in json form) determining public ARM runners."
+ runners:
+ description: "The array of labels (in json form) determining runners."
required: true
type: string
target-commit-sha:
@@ -106,11 +102,7 @@ jobs:
python-version: ${{ fromJSON(inputs.python-versions) || fromJSON('[""]') }}
timeout-minutes: 110
name: "Build CI ${{ inputs.platform }} image ${{ matrix.python-version }}"
- # NOTE!!!!! This has to be put in one line for runs-on to recognize the "fromJSON" properly !!!!
- # adding space before (with >) apparently turns the `runs-on` processed line into a string "Array"
- # instead of an array of strings.
- # yamllint disable-line rule:line-length
- runs-on: ${{ (inputs.platform == 'linux/amd64') && fromJSON(inputs.amd-runners) || fromJSON(inputs.arm-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
env:
BACKEND: sqlite
PYTHON_MAJOR_MINOR_VERSION: ${{ matrix.python-version }}
diff --git a/.github/workflows/ci-image-checks.yml b/.github/workflows/ci-image-checks.yml
index 70d1e2b8470..7e5a7029117 100644
--- a/.github/workflows/ci-image-checks.yml
+++ b/.github/workflows/ci-image-checks.yml
@@ -20,8 +20,12 @@ name: CI Image Checks
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- amd-runners:
- description: "The array of labels (in json form) determining public AMD runners."
+ runners:
+ description: "The array of labels (in json form) determining runners."
+ required: true
+ type: string
+ platform:
+ description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
required: true
type: string
needs-mypy:
@@ -113,7 +117,7 @@ jobs:
install-pre-commit:
timeout-minutes: 5
name: "Install pre-commit for cache (only canary runs)"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
env:
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
if: inputs.basic-checks-only == 'false'
@@ -157,7 +161,7 @@ jobs:
static-checks:
timeout-minutes: 45
name: "Static checks"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
needs: install-pre-commit
env:
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
@@ -175,7 +179,7 @@ jobs:
- name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
python: ${{ inputs.default-python-version }}
use-uv: ${{ inputs.use-uv }}
id: breeze
@@ -197,7 +201,7 @@ jobs:
mypy:
timeout-minutes: 45
name: "MyPy checks"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
needs: install-pre-commit
if: inputs.needs-mypy == 'true'
strategy:
@@ -218,7 +222,7 @@ jobs:
- name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
python: ${{ inputs.default-python-version }}
use-uv: ${{ inputs.use-uv }}
id: breeze
@@ -241,7 +245,7 @@ jobs:
build-docs:
timeout-minutes: 150
name: "Build documentation"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
if: inputs.docs-build == 'true'
strategy:
fail-fast: false
@@ -266,7 +270,7 @@ jobs:
- name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
python: ${{ inputs.default-python-version }}
use-uv: ${{ inputs.use-uv }}
- name: "Restore docs inventory cache"
@@ -344,7 +348,7 @@ jobs:
- name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
python: ${{ inputs.default-python-version }}
use-uv: ${{ inputs.use-uv }}
- name: "Publish docs"
@@ -382,7 +386,7 @@ jobs:
test-python-api-client:
timeout-minutes: 60
name: "Test Python API client"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
if: inputs.needs-api-codegen == 'true'
env:
BACKEND: "postgres"
@@ -416,7 +420,7 @@ jobs:
- name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
python: ${{ inputs.default-python-version }}
use-uv: ${{ inputs.use-uv }}
- name: "Generate airflow python client"
diff --git a/.github/workflows/finalize-tests.yml b/.github/workflows/finalize-tests.yml
index ae1d77e0741..082744fd6fa 100644
--- a/.github/workflows/finalize-tests.yml
+++ b/.github/workflows/finalize-tests.yml
@@ -20,12 +20,12 @@ name: Finalize tests
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- amd-runners:
- description: "The array of labels (in json form) determining public AMD runners."
+ runners:
+ description: "The array of labels (in json form) determining runners."
required: true
type: string
- arm-runners:
- description: "The array of labels (in json form) determining public ARM runners."
+ platform:
+ description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
required: true
type: string
python-versions:
@@ -80,7 +80,7 @@ permissions:
contents: read
jobs:
update-constraints:
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
timeout-minutes: 80
name: "Update constraints"
permissions:
@@ -93,7 +93,7 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.actor }}
VERBOSE: "true"
- if: inputs.upgrade-to-newer-dependencies != 'false'
+ if: inputs.upgrade-to-newer-dependencies != 'false' && inputs.platform == 'linux/amd64'
steps:
- name: "Cleanup repo"
shell: bash
@@ -132,8 +132,8 @@ jobs:
run:
git push
- push-buildx-cache-to-github-registry-amd:
- name: Push Regular AMD Image Cache
+ push-buildx-cache-to-github-registry:
+ name: Push Regular Image Cache ${{ inputs.platform }}
needs: [update-constraints]
uses: ./.github/workflows/push-image-cache.yml
permissions:
@@ -142,12 +142,11 @@ jobs:
# from forks. This is to prevent malicious PRs from creating images in the "apache/airflow" repo.
packages: write
with:
- amd-runners: ${{ inputs.amd-runners }}
- arm-runners: ${{ inputs.arm-runners }}
+ runners: ${{ inputs.runners }}
+ platform: ${ { inputs.platform }}
cache-type: "Regular AMD"
include-prod-images: "true"
push-latest-images: "true"
- platform: "linux/amd64"
python-versions: ${{ inputs.python-versions }}
branch: ${{ inputs.branch }}
constraints-branch: ${{ inputs.constraints-branch }}
@@ -158,67 +157,3 @@ jobs:
if: >
inputs.canary-run == 'true' &&
(github.event_name == 'schedule' || github.event_name == 'workflow_dispatch')
-
- # push-buildx-cache-to-github-registry-arm:
- # name: Push Regular ARM Image Cache
- # needs: [update-constraints]
- # uses: ./.github/workflows/push-image-cache.yml
- # permissions:
- # contents: read
- # packages: write
- # with:
- # amd-runners: ${{ inputs.amd-runners }}
- # arm-runners: ${{ inputs.arm-runners }}
- # cache-type: "Regular ARM"
- # include-prod-images: "true"
- # push-latest-images: "true"
- # platform: "linux/arm64"
- # python-versions: ${{ inputs.python-versions }}
- # branch: ${{ inputs.branch }}
- # constraints-branch: ${{ inputs.constraints-branch }}
- # use-uv: "true"
- # include-success-outputs: ${{ inputs.include-success-outputs }}
- # docker-cache: ${{ inputs.docker-cache }}
- # if: >
- # inputs.canary-run == 'true' &&
- # (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch')
-
- summarize-warnings:
- timeout-minutes: 15
- name: "Summarize warnings"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
- steps:
- - name: "Cleanup repo"
- shell: bash
- run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm -rf /workspace/*"
- - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
- uses: actions/checkout@v4
- with:
- persist-credentials: false
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- - name: "Free up disk space"
- shell: bash
- run: ./scripts/tools/free_up_disk_space.sh
- - name: "Download all test warning artifacts from the current build"
- uses: actions/download-artifact@v4
- with:
- path: ./artifacts
- pattern: test-warnings-*
- - name: "Setup python"
- uses: actions/setup-python@v5
- with:
- python-version: ${{ inputs.default-python-version }}
- - name: "Summarize all warnings"
- run: |
- ./scripts/ci/testing/summarize_captured_warnings.py ./artifacts \
- --pattern "**/warnings-*.txt" \
- --output ./files
- - name: "Upload artifact for summarized warnings"
- uses: actions/upload-artifact@v4
- with:
- name: test-summarized-warnings
- path: ./files/warn-summary-*.txt
- retention-days: 7
- if-no-files-found: ignore
- overwrite: true
diff --git a/.github/workflows/generate-constraints.yml b/.github/workflows/generate-constraints.yml
index 91b56942454..363888ff297 100644
--- a/.github/workflows/generate-constraints.yml
+++ b/.github/workflows/generate-constraints.yml
@@ -20,8 +20,12 @@ name: Generate constraints
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- amd-runners:
- description: "The array of labels (in json form) determining public AMD runners."
+ runners:
+ description: "The array of labels (in json form) determining runners."
+ required: true
+ type: string
+ platform:
+ description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
required: true
type: string
python-versions-list-as-string:
@@ -46,7 +50,7 @@ jobs:
contents: read
timeout-minutes: 70
name: Generate constraints ${{ inputs.python-versions-list-as-string }}
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
env:
DEBUG_RESOURCES: ${{ inputs.debug-resources }}
GITHUB_REPOSITORY: ${{ github.repository }}
@@ -74,7 +78,7 @@ jobs:
- name: "Prepare all CI images: ${{ inputs.python-versions-list-as-string}}"
uses: ./.github/actions/prepare_all_ci_images
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
python-versions-list-as-string: ${{ inputs.python-versions-list-as-string }}
docker-volume-location: "" # TODO(jscheffl): Understand why it fails here and fix it
- name: "Verify all CI images ${{ inputs.python-versions-list-as-string }}"
diff --git a/.github/workflows/helm-tests.yml b/.github/workflows/helm-tests.yml
index 21c7f01a528..e00ac14506a 100644
--- a/.github/workflows/helm-tests.yml
+++ b/.github/workflows/helm-tests.yml
@@ -20,8 +20,12 @@ name: Helm tests
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- amd-runners:
- description: "The array of labels (in json form) determining public AMD runners."
+ runners:
+ description: "The array of labels (in json form) determining runners."
+ required: true
+ type: string
+ platform:
+ description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
required: true
type: string
helm-test-packages:
@@ -42,7 +46,7 @@ jobs:
tests-helm:
timeout-minutes: 80
name: "Unit tests Helm: ${{ matrix.helm-test-package }}"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
strategy:
fail-fast: false
matrix:
@@ -70,7 +74,7 @@ jobs:
- name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
python: ${{ inputs.default-python-version }}
use-uv: ${{ inputs.use-uv }}
- name: "Helm Unit Tests: ${{ matrix.helm-test-package }}"
@@ -81,7 +85,7 @@ jobs:
tests-helm-release:
timeout-minutes: 80
name: "Release Helm"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
env:
PYTHON_MAJOR_MINOR_VERSION: "${{inputs.default-python-version}}"
steps:
diff --git a/.github/workflows/integration-system-tests.yml b/.github/workflows/integration-system-tests.yml
index 9c3480432b5..bf75cc87f31 100644
--- a/.github/workflows/integration-system-tests.yml
+++ b/.github/workflows/integration-system-tests.yml
@@ -20,10 +20,14 @@ name: Integration and system tests
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- amd-runners:
+ runners:
description: "The array of labels (in json form) determining public runners."
required: true
type: string
+ platform:
+ description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
+ required: true
+ type: string
testable-core-integrations:
description: "The list of testable core integrations as JSON array."
required: true
@@ -71,7 +75,7 @@ jobs:
timeout-minutes: 30
if: inputs.testable-core-integrations != '[]'
name: "Integration core ${{ matrix.integration }}"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
strategy:
fail-fast: false
matrix:
@@ -99,7 +103,7 @@ jobs:
- name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
python: ${{ inputs.default-python-version }}
use-uv: ${{ inputs.use-uv }}
- name: "Integration: core ${{ matrix.integration }}"
@@ -120,7 +124,7 @@ jobs:
timeout-minutes: 30
if: inputs.testable-providers-integrations != '[]' && inputs.skip-providers-tests != 'true'
name: "Integration: providers ${{ matrix.integration }}"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
strategy:
fail-fast: false
matrix:
@@ -148,7 +152,7 @@ jobs:
- name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
python: ${{ inputs.default-python-version }}
use-uv: ${{ inputs.use-uv }}
- name: "Integration: providers ${{ matrix.integration }}"
@@ -168,7 +172,7 @@ jobs:
timeout-minutes: 30
if: inputs.run-system-tests == 'true'
name: "System Tests"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
env:
BACKEND: "postgres"
BACKEND_VERSION: ${{ inputs.default-postgres-version }}"
@@ -192,7 +196,7 @@ jobs:
- name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
python: ${{ inputs.default-python-version }}
use-uv: ${{ inputs.use-uv }}
- name: "System Tests"
diff --git a/.github/workflows/k8s-tests.yml b/.github/workflows/k8s-tests.yml
index 43b30e40a97..6ed0c79d187 100644
--- a/.github/workflows/k8s-tests.yml
+++ b/.github/workflows/k8s-tests.yml
@@ -20,12 +20,12 @@ name: K8s tests
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- platform:
- description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
+ runners:
+ description: "The array of labels (in json form) determining runners."
required: true
type: string
- amd-runners:
- description: "The array of labels (in json form) determining public AMD runners."
+ platform:
+ description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
required: true
type: string
python-versions-list-as-string:
@@ -54,7 +54,7 @@ jobs:
tests-kubernetes:
timeout-minutes: 60
name: "K8S System:${{ matrix.executor }}-${{ matrix.kubernetes-combo }}-${{ matrix.use-standard-naming }}"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
strategy:
matrix:
executor: [KubernetesExecutor, CeleryExecutor, LocalExecutor]
diff --git a/.github/workflows/prod-image-build.yml b/.github/workflows/prod-image-build.yml
index bf4ead70add..14d836c094f 100644
--- a/.github/workflows/prod-image-build.yml
+++ b/.github/workflows/prod-image-build.yml
@@ -20,8 +20,8 @@ name: Build PROD images
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- amd-runners:
- description: "The array of labels (in json form) determining default runner for AMD build."
+ runners:
+ description: "The array of labels (in json form) determining runners."
required: true
type: string
build-type:
@@ -114,7 +114,7 @@ jobs:
build-prod-packages:
name: "Build Airflow and provider distributions"
timeout-minutes: 10
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
if: inputs.prod-image-build == 'true'
env:
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
@@ -186,7 +186,7 @@ jobs:
python-version: ${{ fromJSON(inputs.python-versions) || fromJSON('[""]') }}
timeout-minutes: 80
name: "Build PROD ${{ inputs.build-type }} image ${{ matrix.python-version }}"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
needs:
- build-prod-packages
env:
diff --git a/.github/workflows/prod-image-extra-checks.yml b/.github/workflows/prod-image-extra-checks.yml
index 640d924d873..4f6ce6c7629 100644
--- a/.github/workflows/prod-image-extra-checks.yml
+++ b/.github/workflows/prod-image-extra-checks.yml
@@ -20,8 +20,12 @@ name: PROD images extra checks
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- amd-runners:
- description: "The array of labels (in json form) determining public AMD runners."
+ runners:
+ description: "The array of labels (in json form) determining runners."
+ required: true
+ type: string
+ platform:
+ description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
required: true
type: string
python-versions:
@@ -62,14 +66,14 @@ jobs:
myssql-client-image:
uses: ./.github/workflows/prod-image-build.yml
with:
- amd-runners: ${{ inputs.amd-runners }}
+ runners: ${{ inputs.runners }}
+ platform: ${{ inputs.platform }}
build-type: "MySQL Client"
upload-image-artifact: "false"
upload-package-artifact: "false"
install-mysql-client-type: "mysql"
python-versions: ${{ inputs.python-versions }}
default-python-version: ${{ inputs.default-python-version }}
- platform: "linux/amd64"
branch: ${{ inputs.branch }}
# Always build images during the extra checks and never push them
push-image: "false"
@@ -83,14 +87,14 @@ jobs:
pip-image:
uses: ./.github/workflows/prod-image-build.yml
with:
- amd-runners: ${{ inputs.amd-runners }}
+ runners: ${{ inputs.runners }}
+ platform: ${{ inputs.platform }}
build-type: "pip"
upload-image-artifact: "false"
upload-package-artifact: "false"
install-mysql-client-type: "mysql"
python-versions: ${{ inputs.python-versions }}
default-python-version: ${{ inputs.default-python-version }}
- platform: "linux/amd64"
branch: ${{ inputs.branch }}
# Always build images during the extra checks and never push them
push-image: "false"
diff --git a/.github/workflows/publish-docs-to-s3.yml b/.github/workflows/publish-docs-to-s3.yml
index 71cd4e2d290..23e644a286d 100644
--- a/.github/workflows/publish-docs-to-s3.yml
+++ b/.github/workflows/publish-docs-to-s3.yml
@@ -49,8 +49,7 @@ jobs:
name: "Build Info"
runs-on: ["ubuntu-24.04"]
outputs:
- amd-runners: ${{ steps.selective-checks.outputs.amd-runners }}
- arm-runners: ${{ steps.selective-checks.outputs.arm-runners }}
+ runners: ${{ steps.selective-checks.outputs.amd-runners }}
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
VERBOSE: true
@@ -109,8 +108,7 @@ jobs:
# from forks. This is to prevent malicious PRs from creating images in the "apache/airflow" repo.
packages: write
with:
- amd-runners: ${{ needs.build-info.outputs.amd-runners }}
- arm-runners: ${{ needs.build-info.outputs.arm-runners }}
+ runners: ${{ needs.build-info.outputs.amd-runners }}
platform: "linux/amd64"
push-image: "false"
upload-image-artifact: "true"
diff --git a/.github/workflows/push-image-cache.yml b/.github/workflows/push-image-cache.yml
index 2dc539956d7..d562f798c77 100644
--- a/.github/workflows/push-image-cache.yml
+++ b/.github/workflows/push-image-cache.yml
@@ -20,12 +20,8 @@ name: Push image cache
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- amd-runners:
- description: "The array of labels (in json form) determining public AMD runners."
- required: true
- type: string
- arm-runners:
- description: "The array of labels (in json form) determining public ARM runners."
+ runners:
+ description: "The array of labels (in json form) determining runners."
required: true
type: string
cache-type:
@@ -83,11 +79,7 @@ on: # yamllint disable-line rule:truthy
jobs:
push-ci-image-cache:
name: "Push CI ${{ inputs.cache-type }}:${{ matrix.python }} image cache "
- # NOTE!!!!! This has to be put in one line for runs-on to recognize the "fromJSON" properly !!!!
- # adding space before (with >) apparently turns the `runs-on` processed line into a string "Array"
- # instead of an array of strings.
- # yamllint disable-line rule:line-length
- runs-on: ${{ (inputs.platform == 'linux/amd64') && fromJSON(inputs.amd-runners) || fromJSON(inputs.arm-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
permissions:
contents: read
packages: write
@@ -158,11 +150,7 @@ jobs:
push-prod-image-cache:
name: "Push PROD ${{ inputs.cache-type }}:${{ matrix.python }} image cache"
- # NOTE!!!!! This has to be put in one line for runs-on to recognize the "fromJSON" properly !!!!
- # adding space before (with >) apparently turns the `runs-on` processed line into a string "Array"
- # instead of an array of strings.
- # yamllint disable-line rule:line-length
- runs-on: ${{ (inputs.platform == 'linux/amd64') && fromJSON(inputs.amd-runners) || fromJSON(inputs.arm-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
permissions:
contents: read
packages: write
diff --git a/.github/workflows/run-unit-tests.yml b/.github/workflows/run-unit-tests.yml
index cdfb7b58f0d..2fbdb568cdd 100644
--- a/.github/workflows/run-unit-tests.yml
+++ b/.github/workflows/run-unit-tests.yml
@@ -20,10 +20,14 @@ name: Unit tests
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- amd-runners:
+ runners:
description: "The array of labels (in json form) determining public AMD runners."
required: true
type: string
+ platform:
+ description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
+ required: true
+ type: string
test-group:
description: "Test group to run: ('core', 'providers')"
required: true
@@ -37,7 +41,7 @@ on: # yamllint disable-line rule:truthy
required: true
type: string
test-scope:
- description: "The scope of the test to run: ('DB', 'Non-DB', 'All', 'ARM collection')"
+ description: "The scope of the test to run: ('DB', 'Non-DB', 'All')"
required: true
type: string
test-name:
@@ -125,7 +129,7 @@ jobs:
${{ inputs.test-scope }}-${{ inputs.test-group }}:\
${{ inputs.test-name }}${{ inputs.test-name-separator }}${{ matrix.backend-version }}:\
${{ matrix.python-version}}:${{ matrix.test-types.description }}"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
strategy:
fail-fast: false
matrix:
@@ -168,7 +172,7 @@ jobs:
- name: "Prepare breeze & CI image: ${{ matrix.python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
python: ${{ matrix.python-version }}
use-uv: ${{ inputs.use-uv }}
- name: >
diff --git a/.github/workflows/special-tests.yml b/.github/workflows/special-tests.yml
index 7f20ce11111..a41ab1693c8 100644
--- a/.github/workflows/special-tests.yml
+++ b/.github/workflows/special-tests.yml
@@ -20,8 +20,12 @@ name: Special tests
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- amd-runners:
- description: "The array of labels (in json form) determining public AMD runners."
+ runners:
+ description: "The array of labels (in json form) determining runners."
+ required: true
+ type: string
+ platform:
+ description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
required: true
type: string
default-branch:
@@ -90,7 +94,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ inputs.amd-runners }}
+ runners: ${{ inputs.runners }}
+ platform: ${{ inputs.platform }}
downgrade-sqlalchemy: "true"
test-name: "MinSQLAlchemy-Postgres"
test-scope: "DB"
@@ -113,7 +118,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ inputs.amd-runners }}
+ runners: ${{ inputs.runners }}
+ platform: ${{ inputs.platform }}
downgrade-sqlalchemy: "true"
test-name: "MinSQLAlchemy-Postgres"
test-scope: "DB"
@@ -136,7 +142,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ inputs.amd-runners }}
+ runners: ${{ inputs.runners }}
+ platform: ${{ inputs.platform }}
upgrade-boto: "true"
test-name: "LatestBoto-Postgres"
test-scope: "All"
@@ -160,7 +167,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ inputs.amd-runners }}
+ runners: ${{ inputs.runners }}
+ platform: ${{ inputs.platform }}
upgrade-boto: "true"
test-name: "LatestBoto-Postgres"
test-scope: "All"
@@ -185,7 +193,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ inputs.amd-runners }}
+ runners: ${{ inputs.runners }}
+ platform: ${{ inputs.platform }}
downgrade-pendulum: "true"
test-name: "Pendulum2-Postgres"
test-scope: "All"
@@ -209,7 +218,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ inputs.amd-runners }}
+ runners: ${{ inputs.runners }}
+ platform: ${{ inputs.platform }}
downgrade-pendulum: "true"
test-name: "Pendulum2-Postgres"
test-scope: "All"
@@ -233,7 +243,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ inputs.amd-runners }}
+ runners: ${{ inputs.runners }}
+ platform: ${{ inputs.platform }}
test-name: "Postgres"
test-scope: "Quarantined"
test-group: "core"
@@ -256,7 +267,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ inputs.amd-runners }}
+ runners: ${{ inputs.runners }}
+ platform: ${{ inputs.platform }}
test-name: "Postgres"
test-scope: "Quarantined"
test-group: "providers"
@@ -272,56 +284,6 @@ jobs:
skip-providers-tests: ${{ inputs.skip-providers-tests }}
use-uv: ${{ inputs.use-uv }}
-
- tests-arm-collection-core:
- name: "ARM Collection test: core"
- uses: ./.github/workflows/run-unit-tests.yml
- permissions:
- contents: read
- packages: read
- with:
- amd-runners: ${{ inputs.amd-runners }}
- test-name: "Postgres"
- test-scope: "ARM collection"
- test-group: "core"
- backend: "postgres"
- python-versions: "['${{ inputs.default-python-version }}']"
- backend-versions: "['${{ inputs.default-postgres-version }}']"
- excluded-providers-as-string: ${{ inputs.excluded-providers-as-string }}
- excludes: "[]"
- test-types-as-strings-in-json: ${{ inputs.core-test-types-list-as-strings-in-json }}
- include-success-outputs: ${{ inputs.include-success-outputs }}
- run-coverage: ${{ inputs.run-coverage }}
- debug-resources: ${{ inputs.debug-resources }}
- skip-providers-tests: ${{ inputs.skip-providers-tests }}
- use-uv: ${{ inputs.use-uv }}
- if: ${{ inputs.default-branch == 'main' }}
-
- tests-arm-collection-providers:
- name: "ARM Collection test: providers"
- uses: ./.github/workflows/run-unit-tests.yml
- permissions:
- contents: read
- packages: read
- with:
- amd-runners: ${{ inputs.amd-runners }}
- test-name: "Postgres"
- test-scope: "ARM collection"
- test-group: "providers"
- backend: "postgres"
- python-versions: "['${{ inputs.default-python-version }}']"
- backend-versions: "['${{ inputs.default-postgres-version }}']"
- excluded-providers-as-string: ${{ inputs.excluded-providers-as-string }}
- excludes: "[]"
- test-types-as-strings-in-json: ${{ inputs.core-test-types-list-as-strings-in-json }}
- include-success-outputs: ${{ inputs.include-success-outputs }}
- run-coverage: ${{ inputs.run-coverage }}
- debug-resources: ${{ inputs.debug-resources }}
- skip-providers-tests: ${{ inputs.skip-providers-tests }}
- use-uv: ${{ inputs.use-uv }}
- if: ${{ inputs.default-branch == 'main' }}
-
-
tests-system-core:
name: "System test: ${{ matrix.test-group }}"
uses: ./.github/workflows/run-unit-tests.yml
@@ -329,7 +291,8 @@ jobs:
contents: read
packages: read
with:
- amd-runners: ${{ inputs.amd-runners }}
+ runners: ${{ inputs.runners }}
+ platform: ${{ inputs.platform }}
test-name: "SystemTest"
test-scope: "System"
test-group: "core"
diff --git a/.github/workflows/test-providers.yml b/.github/workflows/test-providers.yml
index 0fbeaaee052..411b18daaa7 100644
--- a/.github/workflows/test-providers.yml
+++ b/.github/workflows/test-providers.yml
@@ -20,10 +20,14 @@ name: Provider tests
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- amd-runners:
+ runners:
description: "The array of labels (in json form) determining public AMD runners."
required: true
type: string
+ platform:
+ description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
+ required: true
+ type: string
canary-run:
description: "Whether this is a canary run"
required: true
@@ -68,7 +72,7 @@ jobs:
prepare-install-verify-provider-distributions:
timeout-minutes: 80
name: "Providers ${{ matrix.package-format }} tests"
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
strategy:
fail-fast: false
matrix:
@@ -91,7 +95,7 @@ jobs:
- name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
python: ${{ inputs.default-python-version }}
use-uv: ${{ inputs.use-uv }}
- name: "Cleanup dist files"
@@ -163,7 +167,7 @@ jobs:
timeout-minutes: 80
# yamllint disable rule:line-length
name: Compat ${{ matrix.compat.airflow-version }}:P${{ matrix.compat.python-version }}:${{ matrix.compat.test-types.description }}
- runs-on: ${{ fromJSON(inputs.amd-runners) }}
+ runs-on: ${{ fromJSON(inputs.runners) }}
strategy:
fail-fast: false
matrix:
@@ -189,7 +193,7 @@ jobs:
- name: "Prepare breeze & CI image: ${{ matrix.compat.python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
with:
- platform: "linux/amd64"
+ platform: ${{ inputs.platform }}
python: ${{ matrix.compat.python-version }}
use-uv: ${{ inputs.use-uv }}
- name: "Cleanup dist files"
diff --git a/Dockerfile.ci b/Dockerfile.ci
index 86bb4738785..3f14908eb0a 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -1071,13 +1071,6 @@ function check_run_tests() {
return
fi
- if [[ ${REMOVE_ARM_PACKAGES:="false"} == "true" ]]; then
- # Test what happens if we do not have ARM packages installed.
- # This is useful to see if pytest collection works without ARM packages which is important
- # for the MacOS M1 users running tests in their ARM machines with `breeze testing *-tests` command
- python "${IN_CONTAINER_DIR}/remove_arm_packages.py"
- fi
-
if [[ ${TEST_GROUP:=""} == "system" ]]; then
exec "${IN_CONTAINER_DIR}/run_system_tests.sh" "${@}"
else
diff --git a/dev/breeze/doc/images/output_testing_core-tests.svg b/dev/breeze/doc/images/output_testing_core-tests.svg
index c148fbe9712..987c862dd1f 100644
--- a/dev/breeze/doc/images/output_testing_core-tests.svg
+++ b/dev/breeze/doc/images/output_testing_core-tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 2660.7999999999997" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 2636.3999999999996" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-testing-core-tests-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="2609.7999999999997" />
+ <rect x="0" y="0" width="1463.0" height="2585.3999999999996" />
</clipPath>
<clipPath id="breeze-testing-core-tests-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -360,12 +360,9 @@
<clipPath id="breeze-testing-core-tests-line-104">
<rect x="0" y="2539.1" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-testing-core-tests-line-105">
- <rect x="0" y="2563.5" width="1464" height="24.65"/>
- </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2658.8" rx="8"/><text class="breeze-testing-core-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing core-tests</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2634.4" rx="8"/><text class="breeze-testing-core-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing core-tests</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -441,47 +438,46 @@
</text><text class="breeze-testing-core-tests-r5" x="0" y="1557.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-63)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1557.2" textLength="170.8" clip-path="url(#breeze-testing-core-tests-line-63)">--upgrade-boto</text><text class="breeze-testing-core-tests-r1" x="341.6" y="1557.2" textLength="866.2" clip-path="url(#breeze-testing-core-tests-line-63)">Remove aiobotocore and upgrade botoco [...]
</text><text class="breeze-testing-core-tests-r5" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-64)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1581.6" textLength="268.4" clip-path="url(#breeze-testing-core-tests-line-64)">--downgrade-sqlalchemy</text><text class="breeze-testing-core-tests-r1" x="341.6" y="1581.6" textLength="610" clip-path="url(#breeze-testing-core-tests-line-64)">Downgrade SQLAlchemy to minimum  [...]
</text><text class="breeze-testing-core-tests-r5" x="0" y="1606" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-65)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1606" textLength="244" clip-path="url(#breeze-testing-core-tests-line-65)">--downgrade-pendulum</text><text class="breeze-testing-core-tests-r1" x="341.6" y="1606" textLength="585.6" clip-path="url(#breeze-testing-core-tests-line-65)">Downgrade Pendulum to minimum supported [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1630.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-66)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1630.4" textLength="256.2" clip-path="url(#breeze-testing-core-tests-line-66)">--remove-arm-packages</text><text class="breeze-testing-core-tests-r1" x="341.6" y="1630.4" textLength="817.4" clip-path="url(#breeze-testing-core-tests-line-66)">Removes arm packages from the& [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1654.8" textLength="1464" clip-path="url(#breeze-testing-core-tests-line-67)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-tests-r1" x="1464" y="1654.8" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-67)">
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1679.2" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-68)">â•─</text><text class="breeze-testing-core-tests-r5" x="24.4" y="1679.2" textLength="402.6" clip-path="url(#breeze-testing-core-tests-line-68)"> Advanced flag for tests command </text><text class="breeze-testing-core-tests-r5" x="427" y="1679.2" textLength="1012.6" clip-path="url(#breeze-testing-core-tests-line-68)">──────── [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1703.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-69)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1703.6" textLength="231.8" clip-path="url(#breeze-testing-core-tests-line-69)">--github-repository</text><text class="breeze-testing-core-tests-r7" x="366" y="1703.6" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-69)">-g</text><text class="breeze-testing-core-tests-r1" x=" [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1728" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-70)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1728" textLength="183" clip-path="url(#breeze-testing-core-tests-line-70)">--mount-sources</text><text class="breeze-testing-core-tests-r1" x="414.8" y="1728" textLength="1024.8" clip-path="url(#breeze-testing-core-tests-line-70)">Choose scope of local sources that [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1752.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-71)">│</text><text class="breeze-testing-core-tests-r1" x="414.8" y="1752.4" textLength="1024.8" clip-path="url(#breeze-testing-core-tests-line-71)">selected).                                  [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-72)">│</text><text class="breeze-testing-core-tests-r6" x="414.8" y="1776.8" textLength="1024.8" clip-path="url(#breeze-testing-core-tests-line-72)">(selected | all | skip | remove | tests | providers-and-tests)                 [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-73)">│</text><text class="breeze-testing-core-tests-r5" x="414.8" y="1801.2" textLength="1024.8" clip-path="url(#breeze-testing-core-tests-line-73)">[default: selected]                               & [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-74)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1825.6" textLength="317.2" clip-path="url(#breeze-testing-core-tests-line-74)">--skip-docker-compose-down</text><text class="breeze-testing-core-tests-r1" x="414.8" y="1825.6" textLength="549" clip-path="url(#breeze-testing-core-tests-line-74)">Skips running docker-compose dow [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-75)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1850" textLength="244" clip-path="url(#breeze-testing-core-tests-line-75)">--keep-env-variables</text><text class="breeze-testing-core-tests-r1" x="414.8" y="1850" textLength="1000.4" clip-path="url(#breeze-testing-core-tests-line-75)">Do not clear environment variables [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1874.4" textLength="1464" clip-path="url(#breeze-testing-core-tests-line-76)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-tests-r1" x="1464" y="1874.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-76)">
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1898.8" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-77)">â•─</text><text class="breeze-testing-core-tests-r5" x="24.4" y="1898.8" textLength="622.2" clip-path="url(#breeze-testing-core-tests-line-77)"> Advanced flag for installing airflow in container </text><text class="breeze-testing-core-tests-r5" x="646.6" y="1898.8" textLength="793" clip-path="url(#breeze-testing-co [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-78)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1923.2" textLength="378.2" clip-path="url(#breeze-testing-core-tests-line-78)">--airflow-constraints-reference</text><text class="breeze-testing-core-tests-r1" x="756.4" y="1923.2" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-78)">Constraint reference to u [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-79)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="1947.6" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-79)">(used in calculated constraints URL).                   </text><text class="breeze-testing-core-t [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-80)">│</text><text class="breeze-testing-core-tests-r6" x="756.4" y="1972" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-80)">(TEXT)                                    [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-81)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1996.4" textLength="341.6" clip-path="url(#breeze-testing-core-tests-line-81)">--clean-airflow-installation</text><text class="breeze-testing-core-tests-r1" x="756.4" y="1996.4" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-81)">Clean the airflow installati [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-82)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2020.8" textLength="158.6" clip-path="url(#breeze-testing-core-tests-line-82)">specified by </text><text class="breeze-testing-core-tests-r4" x="915" y="2020.8" textLength="256.2" clip-path="url(#breeze-testing-core-tests-line-82)">--use-airflow-version</text><text class="breeze-t [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-83)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2045.2" textLength="329.4" clip-path="url(#breeze-testing-core-tests-line-83)">--force-lowest-dependencies</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2045.2" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-83)">Run tests for the lowest [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-84)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2069.6" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-84)">or selected provider if `Provider[PROVIDER_ID]` is used </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2069.6" textLength="12.2" clip-path="url(#breeze-testing- [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-85)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2094" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-85)">as test type.                                & [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-86)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2118.4" textLength="414.8" clip-path="url(#breeze-testing-core-tests-line-86)">--install-airflow-with-constraints</text><text class="breeze-testing-core-tests-r1" x="439.2" y="2118.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-86)">/</text><text class="breeze-testing-co [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-87)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2142.8" textLength="195.2" clip-path="url(#breeze-testing-core-tests-line-87)">with-constraints</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2142.8" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-87)">determined from package or airflow& [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-88)">│</text><text class="breeze-testing-core-tests-r5" x="756.4" y="2167.2" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-88)">[default: no-install-airflow-with-constraints]          </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2167.2" textLength="12.2" clip-path=" [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-89)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2191.6" textLength="256.2" clip-path="url(#breeze-testing-core-tests-line-89)">--distribution-format</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2191.6" textLength="231.8" clip-path="url(#breeze-testing-core-tests-line-89)">Format of packages.</text><text class="b [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-90)">│</text><text class="breeze-testing-core-tests-r5" x="756.4" y="2216" textLength="231.8" clip-path="url(#breeze-testing-core-tests-line-90)">[default: wheel]   </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2216" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-90)">│</text><text class="breeze-testing-c [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-91)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2240.4" textLength="256.2" clip-path="url(#breeze-testing-core-tests-line-91)">--use-airflow-version</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2240.4" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-91)">Use (reinstall at entry) Airfl [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-92)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2264.8" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-92)">can also be version (to install from PyPI), `none`,     </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2264.8" textLength="12.2" c [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-93)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2289.2" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-93)">`wheel`, or `sdist` to install from `dist` folder, or   </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2289.2" textLength="12.2" clip-path=" [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-94)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2313.6" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-94)">VCS URL to install from                            & [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2338" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-95)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2338" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-95)">(https://pip.pypa.io/en/stable/topics/vcs-support/).    </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2338" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-95)"> [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-96)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2362.4" textLength="97.6" clip-path="url(#breeze-testing-core-tests-line-96)">Implies </text><text class="breeze-testing-core-tests-r4" x="854" y="2362.4" textLength="183" clip-path="url(#breeze-testing-core-tests-line-96)">--mount-sources</text><text class="breeze-testing-core-tests-r [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-97)">│</text><text class="breeze-testing-core-tests-r6" x="756.4" y="2386.8" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-97)">(none | wheel | sdist | <airflow_version>)              </text><text class="breeze-testing-core-tests-r5" [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2411.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-98)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2411.2" textLength="353.8" clip-path="url(#breeze-testing-core-tests-line-98)">--use-distributions-from-dist</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2411.2" textLength="402.6" clip-path="url(#breeze-testing-core-tests-line-98)">Install all found distribut [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2435.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-99)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2435.6" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-99)">determines type) from 'dist' folder when entering       </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2435.6" textLengt [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2460" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-100)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2460" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-100)">breeze.                                   [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2484.4" textLength="1464" clip-path="url(#breeze-testing-core-tests-line-101)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-tests-r1" x="1464" y="2484.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-101)">
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2508.8" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-102)">â•─</text><text class="breeze-testing-core-tests-r5" x="24.4" y="2508.8" textLength="195.2" clip-path="url(#breeze-testing-core-tests-line-102)"> Common options </text><text class="breeze-testing-core-tests-r5" x="219.6" y="2508.8" textLength="1220" clip-path="url(#breeze-testing-core-tests-line-102)">───────────────────────────────────── [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2533.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-103)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2533.2" textLength="109.8" clip-path="url(#breeze-testing-core-tests-line-103)">--dry-run</text><text class="breeze-testing-core-tests-r7" x="158.6" y="2533.2" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-103)">-D</text><text class="breeze-testing-core-tests-r1" x="207.4 [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2557.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-104)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2557.6" textLength="109.8" clip-path="url(#breeze-testing-core-tests-line-104)">--verbose</text><text class="breeze-testing-core-tests-r7" x="158.6" y="2557.6" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-104)">-v</text><text class="breeze-testing-core-tests-r1" x="207.4 [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2582" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-105)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2582" textLength="73.2" clip-path="url(#breeze-testing-core-tests-line-105)">--help</text><text class="breeze-testing-core-tests-r7" x="158.6" y="2582" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-105)">-h</text><text class="breeze-testing-core-tests-r1" x="207.4" y="2582" [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2606.4" textLength="1464" clip-path="url(#breeze-testing-core-tests-line-106)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-tests-r1" x="1464" y="2606.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-106)">
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1630.4" textLength="1464" clip-path="url(#breeze-testing-core-tests-line-66)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-tests-r1" x="1464" y="1630.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-66)">
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1654.8" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-67)">â•─</text><text class="breeze-testing-core-tests-r5" x="24.4" y="1654.8" textLength="402.6" clip-path="url(#breeze-testing-core-tests-line-67)"> Advanced flag for tests command </text><text class="breeze-testing-core-tests-r5" x="427" y="1654.8" textLength="1012.6" clip-path="url(#breeze-testing-core-tests-line-67)">──────── [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1679.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-68)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1679.2" textLength="231.8" clip-path="url(#breeze-testing-core-tests-line-68)">--github-repository</text><text class="breeze-testing-core-tests-r7" x="366" y="1679.2" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-68)">-g</text><text class="breeze-testing-core-tests-r1" x=" [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1703.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-69)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1703.6" textLength="183" clip-path="url(#breeze-testing-core-tests-line-69)">--mount-sources</text><text class="breeze-testing-core-tests-r1" x="414.8" y="1703.6" textLength="1024.8" clip-path="url(#breeze-testing-core-tests-line-69)">Choose scope of local sources th [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1728" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-70)">│</text><text class="breeze-testing-core-tests-r1" x="414.8" y="1728" textLength="1024.8" clip-path="url(#breeze-testing-core-tests-line-70)">selected).                                  & [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1752.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-71)">│</text><text class="breeze-testing-core-tests-r6" x="414.8" y="1752.4" textLength="1024.8" clip-path="url(#breeze-testing-core-tests-line-71)">(selected | all | skip | remove | tests | providers-and-tests)                 [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-72)">│</text><text class="breeze-testing-core-tests-r5" x="414.8" y="1776.8" textLength="1024.8" clip-path="url(#breeze-testing-core-tests-line-72)">[default: selected]                               & [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-73)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1801.2" textLength="317.2" clip-path="url(#breeze-testing-core-tests-line-73)">--skip-docker-compose-down</text><text class="breeze-testing-core-tests-r1" x="414.8" y="1801.2" textLength="549" clip-path="url(#breeze-testing-core-tests-line-73)">Skips running docker-compose dow [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-74)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1825.6" textLength="244" clip-path="url(#breeze-testing-core-tests-line-74)">--keep-env-variables</text><text class="breeze-testing-core-tests-r1" x="414.8" y="1825.6" textLength="1000.4" clip-path="url(#breeze-testing-core-tests-line-74)">Do not clear environment variabl [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1850" textLength="1464" clip-path="url(#breeze-testing-core-tests-line-75)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-tests-r1" x="1464" y="1850" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-75)">
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1874.4" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-76)">â•─</text><text class="breeze-testing-core-tests-r5" x="24.4" y="1874.4" textLength="622.2" clip-path="url(#breeze-testing-core-tests-line-76)"> Advanced flag for installing airflow in container </text><text class="breeze-testing-core-tests-r5" x="646.6" y="1874.4" textLength="793" clip-path="url(#breeze-testing-co [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-77)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1898.8" textLength="378.2" clip-path="url(#breeze-testing-core-tests-line-77)">--airflow-constraints-reference</text><text class="breeze-testing-core-tests-r1" x="756.4" y="1898.8" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-77)">Constraint reference to u [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-78)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="1923.2" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-78)">(used in calculated constraints URL).                   </text><text class="breeze-testing-core-t [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-79)">│</text><text class="breeze-testing-core-tests-r6" x="756.4" y="1947.6" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-79)">(TEXT)                                  &# [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-80)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="1972" textLength="341.6" clip-path="url(#breeze-testing-core-tests-line-80)">--clean-airflow-installation</text><text class="breeze-testing-core-tests-r1" x="756.4" y="1972" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-80)">Clean the airflow installation [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-81)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="1996.4" textLength="158.6" clip-path="url(#breeze-testing-core-tests-line-81)">specified by </text><text class="breeze-testing-core-tests-r4" x="915" y="1996.4" textLength="256.2" clip-path="url(#breeze-testing-core-tests-line-81)">--use-airflow-version</text><text class="breeze-t [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-82)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2020.8" textLength="329.4" clip-path="url(#breeze-testing-core-tests-line-82)">--force-lowest-dependencies</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2020.8" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-82)">Run tests for the lowest [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-83)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2045.2" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-83)">or selected provider if `Provider[PROVIDER_ID]` is used </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2045.2" textLength="12.2" clip-path="url(#breeze-testing- [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-84)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2069.6" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-84)">as test type.                                [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-85)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2094" textLength="414.8" clip-path="url(#breeze-testing-core-tests-line-85)">--install-airflow-with-constraints</text><text class="breeze-testing-core-tests-r1" x="439.2" y="2094" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-85)">/</text><text class="breeze-testing-core-tes [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-86)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2118.4" textLength="195.2" clip-path="url(#breeze-testing-core-tests-line-86)">with-constraints</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2118.4" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-86)">determined from package or airflow& [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-87)">│</text><text class="breeze-testing-core-tests-r5" x="756.4" y="2142.8" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-87)">[default: no-install-airflow-with-constraints]          </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2142.8" textLength="12.2" clip-path=" [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-88)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2167.2" textLength="256.2" clip-path="url(#breeze-testing-core-tests-line-88)">--distribution-format</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2167.2" textLength="231.8" clip-path="url(#breeze-testing-core-tests-line-88)">Format of packages.</text><text class="b [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-89)">│</text><text class="breeze-testing-core-tests-r5" x="756.4" y="2191.6" textLength="231.8" clip-path="url(#breeze-testing-core-tests-line-89)">[default: wheel]   </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2191.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-89)">│</text><text class="breeze-tes [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-90)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2216" textLength="256.2" clip-path="url(#breeze-testing-core-tests-line-90)">--use-airflow-version</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2216" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-90)">Use (reinstall at entry) Airflow [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-91)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2240.4" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-91)">can also be version (to install from PyPI), `none`,     </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2240.4" textLength="12.2" c [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-92)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2264.8" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-92)">`wheel`, or `sdist` to install from `dist` folder, or   </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2264.8" textLength="12.2" clip-path=" [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-93)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2289.2" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-93)">VCS URL to install from                            & [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-94)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2313.6" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-94)">(https://pip.pypa.io/en/stable/topics/vcs-support/).    </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2313.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2338" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-95)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2338" textLength="97.6" clip-path="url(#breeze-testing-core-tests-line-95)">Implies </text><text class="breeze-testing-core-tests-r4" x="854" y="2338" textLength="183" clip-path="url(#breeze-testing-core-tests-line-95)">--mount-sources</text><text class="breeze-testing-core-tests-r1" x=" [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-96)">│</text><text class="breeze-testing-core-tests-r6" x="756.4" y="2362.4" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-96)">(none | wheel | sdist | <airflow_version>)              </text><text class="breeze-testing-core-tests-r5" [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-97)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2386.8" textLength="353.8" clip-path="url(#breeze-testing-core-tests-line-97)">--use-distributions-from-dist</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2386.8" textLength="402.6" clip-path="url(#breeze-testing-core-tests-line-97)">Install all found distribut [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2411.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-98)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2411.2" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-98)">determines type) from 'dist' folder when entering       </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2411.2" textLengt [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2435.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-99)">│</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2435.6" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-99)">breeze.                                  & [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2460" textLength="1464" clip-path="url(#breeze-testing-core-tests-line-100)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-tests-r1" x="1464" y="2460" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-100)">
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2484.4" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-101)">â•─</text><text class="breeze-testing-core-tests-r5" x="24.4" y="2484.4" textLength="195.2" clip-path="url(#breeze-testing-core-tests-line-101)"> Common options </text><text class="breeze-testing-core-tests-r5" x="219.6" y="2484.4" textLength="1220" clip-path="url(#breeze-testing-core-tests-line-101)">───────────────────────────────────── [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2508.8" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-102)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2508.8" textLength="109.8" clip-path="url(#breeze-testing-core-tests-line-102)">--dry-run</text><text class="breeze-testing-core-tests-r7" x="158.6" y="2508.8" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-102)">-D</text><text class="breeze-testing-core-tests-r1" x="207.4 [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2533.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-103)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2533.2" textLength="109.8" clip-path="url(#breeze-testing-core-tests-line-103)">--verbose</text><text class="breeze-testing-core-tests-r7" x="158.6" y="2533.2" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-103)">-v</text><text class="breeze-testing-core-tests-r1" x="207.4 [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2557.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-104)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2557.6" textLength="73.2" clip-path="url(#breeze-testing-core-tests-line-104)">--help</text><text class="breeze-testing-core-tests-r7" x="158.6" y="2557.6" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-104)">-h</text><text class="breeze-testing-core-tests-r1" x="207.4" y= [...]
+</text><text class="breeze-testing-core-tests-r5" x="0" y="2582" textLength="1464" clip-path="url(#breeze-testing-core-tests-line-105)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-tests-r1" x="1464" y="2582" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-105)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_testing_core-tests.txt b/dev/breeze/doc/images/output_testing_core-tests.txt
index 487da1bfda8..3566b8e3996 100644
--- a/dev/breeze/doc/images/output_testing_core-tests.txt
+++ b/dev/breeze/doc/images/output_testing_core-tests.txt
@@ -1 +1 @@
-331eca8b67a16ab128433a30e769290b
+e17e8722da2c099cb96f37dc51c279e0
diff --git a/dev/breeze/doc/images/output_testing_providers-tests.svg b/dev/breeze/doc/images/output_testing_providers-tests.svg
index f27f952546e..b792161dabf 100644
--- a/dev/breeze/doc/images/output_testing_providers-tests.svg
+++ b/dev/breeze/doc/images/output_testing_providers-tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 2904.7999999999997" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 2880.3999999999996" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-testing-providers-tests-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="2853.7999999999997" />
+ <rect x="0" y="0" width="1463.0" height="2829.3999999999996" />
</clipPath>
<clipPath id="breeze-testing-providers-tests-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -390,12 +390,9 @@
<clipPath id="breeze-testing-providers-tests-line-114">
<rect x="0" y="2783.1" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-testing-providers-tests-line-115">
- <rect x="0" y="2807.5" width="1464" height="24.65"/>
- </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2902.8" rx="8"/><text class="breeze-testing-providers-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing providers-tests</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2878.4" rx="8"/><text class="breeze-testing-providers-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing providers-tests</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -472,56 +469,55 @@
</text><text class="breeze-testing-providers-tests-r5" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-64)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="1581.6" textLength="170.8" clip-path="url(#breeze-testing-providers-tests-line-64)">--upgrade-boto</text><text class="breeze-testing-providers-tests-r1" x="341.6" y="1581.6" textLength="866.2" clip-path="url(#breeze-testing-providers-tests-line-64)">Remove aiobotocore [...]
</text><text class="breeze-testing-providers-tests-r5" x="0" y="1606" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-65)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="1606" textLength="268.4" clip-path="url(#breeze-testing-providers-tests-line-65)">--downgrade-sqlalchemy</text><text class="breeze-testing-providers-tests-r1" x="341.6" y="1606" textLength="610" clip-path="url(#breeze-testing-providers-tests-line-65)">Downgrade SQLAlchemy&# [...]
</text><text class="breeze-testing-providers-tests-r5" x="0" y="1630.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-66)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="1630.4" textLength="244" clip-path="url(#breeze-testing-providers-tests-line-66)">--downgrade-pendulum</text><text class="breeze-testing-providers-tests-r1" x="341.6" y="1630.4" textLength="585.6" clip-path="url(#breeze-testing-providers-tests-line-66)">Downgrade Pendulum [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1654.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-67)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="1654.8" textLength="256.2" clip-path="url(#breeze-testing-providers-tests-line-67)">--remove-arm-packages</text><text class="breeze-testing-providers-tests-r1" x="341.6" y="1654.8" textLength="817.4" clip-path="url(#breeze-testing-providers-tests-line-67)">Removes arm [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1679.2" textLength="1464" clip-path="url(#breeze-testing-providers-tests-line-68)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-tests-r1" x="1464" y="1679.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-68)">
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1703.6" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-69)">â•─</text><text class="breeze-testing-providers-tests-r5" x="24.4" y="1703.6" textLength="402.6" clip-path="url(#breeze-testing-providers-tests-line-69)"> Advanced flag for tests command </text><text class="breeze-testing-providers-tests-r5" x="427" y="1703.6" textLength="1012.6" clip-path="url(#breeze-testing-prov [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1728" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-70)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="1728" textLength="231.8" clip-path="url(#breeze-testing-providers-tests-line-70)">--github-repository</text><text class="breeze-testing-providers-tests-r6" x="366" y="1728" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-70)">-g</text><text class="breeze-te [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1752.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-71)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="1752.4" textLength="183" clip-path="url(#breeze-testing-providers-tests-line-71)">--mount-sources</text><text class="breeze-testing-providers-tests-r1" x="414.8" y="1752.4" textLength="1024.8" clip-path="url(#breeze-testing-providers-tests-line-71)">Choose scope of&# [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-72)">│</text><text class="breeze-testing-providers-tests-r1" x="414.8" y="1776.8" textLength="1024.8" clip-path="url(#breeze-testing-providers-tests-line-72)">selected).                              & [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-73)">│</text><text class="breeze-testing-providers-tests-r7" x="414.8" y="1801.2" textLength="1024.8" clip-path="url(#breeze-testing-providers-tests-line-73)">(selected | all | skip | remove | tests | providers-and-tests)             & [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-74)">│</text><text class="breeze-testing-providers-tests-r5" x="414.8" y="1825.6" textLength="1024.8" clip-path="url(#breeze-testing-providers-tests-line-74)">[default: selected]                             [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-75)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="1850" textLength="317.2" clip-path="url(#breeze-testing-providers-tests-line-75)">--skip-docker-compose-down</text><text class="breeze-testing-providers-tests-r1" x="414.8" y="1850" textLength="549" clip-path="url(#breeze-testing-providers-tests-line-75)">Skips running  [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-76)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="1874.4" textLength="244" clip-path="url(#breeze-testing-providers-tests-line-76)">--keep-env-variables</text><text class="breeze-testing-providers-tests-r1" x="414.8" y="1874.4" textLength="1000.4" clip-path="url(#breeze-testing-providers-tests-line-76)">Do not clear [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1898.8" textLength="1464" clip-path="url(#breeze-testing-providers-tests-line-77)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-tests-r1" x="1464" y="1898.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-77)">
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1923.2" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-78)">â•─</text><text class="breeze-testing-providers-tests-r5" x="24.4" y="1923.2" textLength="622.2" clip-path="url(#breeze-testing-providers-tests-line-78)"> Advanced flag for installing airflow in container </text><text class="breeze-testing-providers-tests-r5" x="646.6" y="1923.2" textLength="793" clip-pat [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-79)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="1947.6" textLength="378.2" clip-path="url(#breeze-testing-providers-tests-line-79)">--airflow-constraints-reference</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="1947.6" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-79)">Constraint [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-80)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="1972" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-80)">(used in calculated constraints URL).                   </text><text class="breez [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-81)">│</text><text class="breeze-testing-providers-tests-r7" x="756.4" y="1996.4" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-81)">(TEXT)                                [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-82)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2020.8" textLength="341.6" clip-path="url(#breeze-testing-providers-tests-line-82)">--clean-airflow-installation</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2020.8" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-82)">Clean th [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-83)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2045.2" textLength="158.6" clip-path="url(#breeze-testing-providers-tests-line-83)">specified by </text><text class="breeze-testing-providers-tests-r4" x="915" y="2045.2" textLength="256.2" clip-path="url(#breeze-testing-providers-tests-line-83)">--use-airflow-versi [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-84)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2069.6" textLength="329.4" clip-path="url(#breeze-testing-providers-tests-line-84)">--force-lowest-dependencies</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2069.6" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-84)">Run tests [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-85)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2094" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-85)">or selected provider if `Provider[PROVIDER_ID]` is used </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="2094" textLength="12.2" clip-path="u [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-86)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2118.4" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-86)">as test type.                            & [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-87)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2142.8" textLength="414.8" clip-path="url(#breeze-testing-providers-tests-line-87)">--install-airflow-with-constraints</text><text class="breeze-testing-providers-tests-r1" x="439.2" y="2142.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-87)">/</text> [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-88)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2167.2" textLength="195.2" clip-path="url(#breeze-testing-providers-tests-line-88)">with-constraints</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2167.2" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-88)">determined from  [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-89)">│</text><text class="breeze-testing-providers-tests-r5" x="756.4" y="2191.6" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-89)">[default: no-install-airflow-with-constraints]          </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="2191.6" text [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-90)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2216" textLength="256.2" clip-path="url(#breeze-testing-providers-tests-line-90)">--distribution-format</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2216" textLength="231.8" clip-path="url(#breeze-testing-providers-tests-line-90)">Format of packag [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-91)">│</text><text class="breeze-testing-providers-tests-r5" x="756.4" y="2240.4" textLength="231.8" clip-path="url(#breeze-testing-providers-tests-line-91)">[default: wheel]   </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="2240.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-91)">│ [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-92)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2264.8" textLength="256.2" clip-path="url(#breeze-testing-providers-tests-line-92)">--use-airflow-version</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2264.8" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-92)">Use (reinstall& [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-93)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2289.2" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-93)">can also be version (to install from PyPI), `none`,     </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="22 [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-94)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2313.6" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-94)">`wheel`, or `sdist` to install from `dist` folder, or   </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="2313.6" text [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2338" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-95)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2338" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-95)">VCS URL to install from                          [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-96)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2362.4" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-96)">(https://pip.pypa.io/en/stable/topics/vcs-support/).    </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="2362.4" textLength="12.2" clip-path="url(#breez [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-97)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2386.8" textLength="97.6" clip-path="url(#breeze-testing-providers-tests-line-97)">Implies </text><text class="breeze-testing-providers-tests-r4" x="854" y="2386.8" textLength="183" clip-path="url(#breeze-testing-providers-tests-line-97)">--mount-sources</text><text clas [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2411.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-98)">│</text><text class="breeze-testing-providers-tests-r7" x="756.4" y="2411.2" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-98)">(none | wheel | sdist | <airflow_version>)              </text><text class="breeze-tes [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2435.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-99)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2435.6" textLength="353.8" clip-path="url(#breeze-testing-providers-tests-line-99)">--use-distributions-from-dist</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2435.6" textLength="402.6" clip-path="url(#breeze-testing-providers-tests-line-99)">Install  [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2460" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-100)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2460" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-100)">determines type) from 'dist' folder when entering       </text><text class="breeze-testing-providers-tests-r5" x="1451. [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2484.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-101)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2484.4" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-101)">breeze.                               [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2508.8" textLength="1464" clip-path="url(#breeze-testing-providers-tests-line-102)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-tests-r1" x="1464" y="2508.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-102)">
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2533.2" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-103)">â•─</text><text class="breeze-testing-providers-tests-r5" x="24.4" y="2533.2" textLength="512.4" clip-path="url(#breeze-testing-providers-tests-line-103)"> Advanced flag for provider tests command </text><text class="breeze-testing-providers-tests-r5" x="536.8" y="2533.2" textLength="902.8" clip-path="url(#br [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2557.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-104)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2557.6" textLength="244" clip-path="url(#breeze-testing-providers-tests-line-104)">--excluded-providers</text><text class="breeze-testing-providers-tests-r1" x="463.6" y="2557.6" textLength="976" clip-path="url(#breeze-testing-providers-tests-line-104)">JSON-string of [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2582" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-105)">│</text><text class="breeze-testing-providers-tests-r1" x="463.6" y="2582" textLength="976" clip-path="url(#breeze-testing-providers-tests-line-105)">({'3.12': ['provider']})                         [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2606.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-106)">│</text><text class="breeze-testing-providers-tests-r7" x="463.6" y="2606.4" textLength="976" clip-path="url(#breeze-testing-providers-tests-line-106)">(TEXT)                                [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2630.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-107)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2630.8" textLength="390.4" clip-path="url(#breeze-testing-providers-tests-line-107)">--providers-constraints-location</text><text class="breeze-testing-providers-tests-r1" x="463.6" y="2630.8" textLength="927.2" clip-path="url(#breeze-testing-providers-tests-line-107)">Locati [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2655.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-108)">│</text><text class="breeze-testing-providers-tests-r7" x="463.6" y="2655.2" textLength="927.2" clip-path="url(#breeze-testing-providers-tests-line-108)">(TEXT)                               [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2679.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-109)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2679.6" textLength="341.6" clip-path="url(#breeze-testing-providers-tests-line-109)">--providers-skip-constraints</text><text class="breeze-testing-providers-tests-r1" x="463.6" y="2679.6" textLength="597.8" clip-path="url(#breeze-testing-providers-tests-line-109)">Do no [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2704" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-110)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2704" textLength="195.2" clip-path="url(#breeze-testing-providers-tests-line-110)">--skip-providers</text><text class="breeze-testing-providers-tests-r1" x="463.6" y="2704" textLength="768.6" clip-path="url(#breeze-testing-providers-tests-line-110)">Space-separated list [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2728.4" textLength="1464" clip-path="url(#breeze-testing-providers-tests-line-111)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-tests-r1" x="1464" y="2728.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-111)">
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2752.8" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-112)">â•─</text><text class="breeze-testing-providers-tests-r5" x="24.4" y="2752.8" textLength="195.2" clip-path="url(#breeze-testing-providers-tests-line-112)"> Common options </text><text class="breeze-testing-providers-tests-r5" x="219.6" y="2752.8" textLength="1220" clip-path="url(#breeze-testing-providers-tests-line-112)">─────── [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2777.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-113)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2777.2" textLength="109.8" clip-path="url(#breeze-testing-providers-tests-line-113)">--dry-run</text><text class="breeze-testing-providers-tests-r6" x="158.6" y="2777.2" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-113)">-D</text><text class="breeze-t [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2801.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-114)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2801.6" textLength="109.8" clip-path="url(#breeze-testing-providers-tests-line-114)">--verbose</text><text class="breeze-testing-providers-tests-r6" x="158.6" y="2801.6" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-114)">-v</text><text class="breeze-t [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2826" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-115)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2826" textLength="73.2" clip-path="url(#breeze-testing-providers-tests-line-115)">--help</text><text class="breeze-testing-providers-tests-r6" x="158.6" y="2826" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-115)">-h</text><text class="breeze-testing-pro [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2850.4" textLength="1464" clip-path="url(#breeze-testing-providers-tests-line-116)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-tests-r1" x="1464" y="2850.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-116)">
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="1654.8" textLength="1464" clip-path="url(#breeze-testing-providers-tests-line-67)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-tests-r1" x="1464" y="1654.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-67)">
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="1679.2" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-68)">â•─</text><text class="breeze-testing-providers-tests-r5" x="24.4" y="1679.2" textLength="402.6" clip-path="url(#breeze-testing-providers-tests-line-68)"> Advanced flag for tests command </text><text class="breeze-testing-providers-tests-r5" x="427" y="1679.2" textLength="1012.6" clip-path="url(#breeze-testing-prov [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="1703.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-69)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="1703.6" textLength="231.8" clip-path="url(#breeze-testing-providers-tests-line-69)">--github-repository</text><text class="breeze-testing-providers-tests-r6" x="366" y="1703.6" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-69)">-g</text><text class="bre [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="1728" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-70)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="1728" textLength="183" clip-path="url(#breeze-testing-providers-tests-line-70)">--mount-sources</text><text class="breeze-testing-providers-tests-r1" x="414.8" y="1728" textLength="1024.8" clip-path="url(#breeze-testing-providers-tests-line-70)">Choose scope of lo [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="1752.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-71)">│</text><text class="breeze-testing-providers-tests-r1" x="414.8" y="1752.4" textLength="1024.8" clip-path="url(#breeze-testing-providers-tests-line-71)">selected).                              & [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-72)">│</text><text class="breeze-testing-providers-tests-r7" x="414.8" y="1776.8" textLength="1024.8" clip-path="url(#breeze-testing-providers-tests-line-72)">(selected | all | skip | remove | tests | providers-and-tests)             & [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-73)">│</text><text class="breeze-testing-providers-tests-r5" x="414.8" y="1801.2" textLength="1024.8" clip-path="url(#breeze-testing-providers-tests-line-73)">[default: selected]                             [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-74)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="1825.6" textLength="317.2" clip-path="url(#breeze-testing-providers-tests-line-74)">--skip-docker-compose-down</text><text class="breeze-testing-providers-tests-r1" x="414.8" y="1825.6" textLength="549" clip-path="url(#breeze-testing-providers-tests-line-74)">Skips runnin [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-75)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="1850" textLength="244" clip-path="url(#breeze-testing-providers-tests-line-75)">--keep-env-variables</text><text class="breeze-testing-providers-tests-r1" x="414.8" y="1850" textLength="1000.4" clip-path="url(#breeze-testing-providers-tests-line-75)">Do not clear  [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="1874.4" textLength="1464" clip-path="url(#breeze-testing-providers-tests-line-76)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-tests-r1" x="1464" y="1874.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-76)">
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="1898.8" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-77)">â•─</text><text class="breeze-testing-providers-tests-r5" x="24.4" y="1898.8" textLength="622.2" clip-path="url(#breeze-testing-providers-tests-line-77)"> Advanced flag for installing airflow in container </text><text class="breeze-testing-providers-tests-r5" x="646.6" y="1898.8" textLength="793" clip-pat [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-78)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="1923.2" textLength="378.2" clip-path="url(#breeze-testing-providers-tests-line-78)">--airflow-constraints-reference</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="1923.2" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-78)">Constraint [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-79)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="1947.6" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-79)">(used in calculated constraints URL).                   </text><text class="b [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-80)">│</text><text class="breeze-testing-providers-tests-r7" x="756.4" y="1972" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-80)">(TEXT)                                [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-81)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="1996.4" textLength="341.6" clip-path="url(#breeze-testing-providers-tests-line-81)">--clean-airflow-installation</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="1996.4" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-81)">Clean th [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-82)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2020.8" textLength="158.6" clip-path="url(#breeze-testing-providers-tests-line-82)">specified by </text><text class="breeze-testing-providers-tests-r4" x="915" y="2020.8" textLength="256.2" clip-path="url(#breeze-testing-providers-tests-line-82)">--use-airflow-versi [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-83)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2045.2" textLength="329.4" clip-path="url(#breeze-testing-providers-tests-line-83)">--force-lowest-dependencies</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2045.2" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-83)">Run tests [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-84)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2069.6" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-84)">or selected provider if `Provider[PROVIDER_ID]` is used </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="2069.6" textLength="12.2" clip-p [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-85)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2094" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-85)">as test type.                              [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-86)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2118.4" textLength="414.8" clip-path="url(#breeze-testing-providers-tests-line-86)">--install-airflow-with-constraints</text><text class="breeze-testing-providers-tests-r1" x="439.2" y="2118.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-86)">/</text> [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-87)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2142.8" textLength="195.2" clip-path="url(#breeze-testing-providers-tests-line-87)">with-constraints</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2142.8" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-87)">determined from  [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-88)">│</text><text class="breeze-testing-providers-tests-r5" x="756.4" y="2167.2" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-88)">[default: no-install-airflow-with-constraints]          </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="2167.2" text [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-89)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2191.6" textLength="256.2" clip-path="url(#breeze-testing-providers-tests-line-89)">--distribution-format</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2191.6" textLength="231.8" clip-path="url(#breeze-testing-providers-tests-line-89)">Format of  [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-90)">│</text><text class="breeze-testing-providers-tests-r5" x="756.4" y="2216" textLength="231.8" clip-path="url(#breeze-testing-providers-tests-line-90)">[default: wheel]   </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="2216" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-90)">│</text [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-91)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2240.4" textLength="256.2" clip-path="url(#breeze-testing-providers-tests-line-91)">--use-airflow-version</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2240.4" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-91)">Use (reinstall& [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-92)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2264.8" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-92)">can also be version (to install from PyPI), `none`,     </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="22 [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-93)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2289.2" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-93)">`wheel`, or `sdist` to install from `dist` folder, or   </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="2289.2" text [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-94)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2313.6" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-94)">VCS URL to install from                          [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2338" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-95)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2338" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-95)">(https://pip.pypa.io/en/stable/topics/vcs-support/).    </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="2338" textLength="12.2" clip-path="url(#breeze-test [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-96)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2362.4" textLength="97.6" clip-path="url(#breeze-testing-providers-tests-line-96)">Implies </text><text class="breeze-testing-providers-tests-r4" x="854" y="2362.4" textLength="183" clip-path="url(#breeze-testing-providers-tests-line-96)">--mount-sources</text><text clas [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-97)">│</text><text class="breeze-testing-providers-tests-r7" x="756.4" y="2386.8" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-97)">(none | wheel | sdist | <airflow_version>)              </text><text class="breeze-tes [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2411.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-98)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2411.2" textLength="353.8" clip-path="url(#breeze-testing-providers-tests-line-98)">--use-distributions-from-dist</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2411.2" textLength="402.6" clip-path="url(#breeze-testing-providers-tests-line-98)">Install  [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2435.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-99)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2435.6" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-99)">determines type) from 'dist' folder when entering       </text><text class="breeze-testing-providers-tests-r5" x="145 [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2460" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-100)">│</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2460" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-100)">breeze.                               & [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2484.4" textLength="1464" clip-path="url(#breeze-testing-providers-tests-line-101)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-tests-r1" x="1464" y="2484.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-101)">
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2508.8" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-102)">â•─</text><text class="breeze-testing-providers-tests-r5" x="24.4" y="2508.8" textLength="512.4" clip-path="url(#breeze-testing-providers-tests-line-102)"> Advanced flag for provider tests command </text><text class="breeze-testing-providers-tests-r5" x="536.8" y="2508.8" textLength="902.8" clip-path="url(#br [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2533.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-103)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2533.2" textLength="244" clip-path="url(#breeze-testing-providers-tests-line-103)">--excluded-providers</text><text class="breeze-testing-providers-tests-r1" x="463.6" y="2533.2" textLength="976" clip-path="url(#breeze-testing-providers-tests-line-103)">JSON-string of [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2557.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-104)">│</text><text class="breeze-testing-providers-tests-r1" x="463.6" y="2557.6" textLength="976" clip-path="url(#breeze-testing-providers-tests-line-104)">({'3.12': ['provider']})                         [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2582" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-105)">│</text><text class="breeze-testing-providers-tests-r7" x="463.6" y="2582" textLength="976" clip-path="url(#breeze-testing-providers-tests-line-105)">(TEXT)                                [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2606.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-106)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2606.4" textLength="390.4" clip-path="url(#breeze-testing-providers-tests-line-106)">--providers-constraints-location</text><text class="breeze-testing-providers-tests-r1" x="463.6" y="2606.4" textLength="927.2" clip-path="url(#breeze-testing-providers-tests-line-106)">Locati [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2630.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-107)">│</text><text class="breeze-testing-providers-tests-r7" x="463.6" y="2630.8" textLength="927.2" clip-path="url(#breeze-testing-providers-tests-line-107)">(TEXT)                               [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2655.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-108)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2655.2" textLength="341.6" clip-path="url(#breeze-testing-providers-tests-line-108)">--providers-skip-constraints</text><text class="breeze-testing-providers-tests-r1" x="463.6" y="2655.2" textLength="597.8" clip-path="url(#breeze-testing-providers-tests-line-108)">Do no [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2679.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-109)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2679.6" textLength="195.2" clip-path="url(#breeze-testing-providers-tests-line-109)">--skip-providers</text><text class="breeze-testing-providers-tests-r1" x="463.6" y="2679.6" textLength="768.6" clip-path="url(#breeze-testing-providers-tests-line-109)">Space-separated l [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2704" textLength="1464" clip-path="url(#breeze-testing-providers-tests-line-110)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-tests-r1" x="1464" y="2704" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-110)">
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2728.4" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-111)">â•─</text><text class="breeze-testing-providers-tests-r5" x="24.4" y="2728.4" textLength="195.2" clip-path="url(#breeze-testing-providers-tests-line-111)"> Common options </text><text class="breeze-testing-providers-tests-r5" x="219.6" y="2728.4" textLength="1220" clip-path="url(#breeze-testing-providers-tests-line-111)">─────── [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2752.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-112)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2752.8" textLength="109.8" clip-path="url(#breeze-testing-providers-tests-line-112)">--dry-run</text><text class="breeze-testing-providers-tests-r6" x="158.6" y="2752.8" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-112)">-D</text><text class="breeze-t [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2777.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-113)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2777.2" textLength="109.8" clip-path="url(#breeze-testing-providers-tests-line-113)">--verbose</text><text class="breeze-testing-providers-tests-r6" x="158.6" y="2777.2" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-113)">-v</text><text class="breeze-t [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2801.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-114)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2801.6" textLength="73.2" clip-path="url(#breeze-testing-providers-tests-line-114)">--help</text><text class="breeze-testing-providers-tests-r6" x="158.6" y="2801.6" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-114)">-h</text><text class="breeze-testi [...]
+</text><text class="breeze-testing-providers-tests-r5" x="0" y="2826" textLength="1464" clip-path="url(#breeze-testing-providers-tests-line-115)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-tests-r1" x="1464" y="2826" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-115)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_testing_providers-tests.txt b/dev/breeze/doc/images/output_testing_providers-tests.txt
index a6a3dba70f1..e3969eae7d7 100644
--- a/dev/breeze/doc/images/output_testing_providers-tests.txt
+++ b/dev/breeze/doc/images/output_testing_providers-tests.txt
@@ -1 +1 @@
-9b35c720976b2923e8d34d51919c16ea
+e38e20ca833d2fc03b5f6a8fb746f47c
diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands.py b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
index a133b7593e2..cdaaa3c11c3 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
@@ -545,12 +545,6 @@ option_use_xdist = click.option(
is_flag=True,
envvar="USE_XDIST",
)
-option_remove_arm_packages = click.option(
- "--remove-arm-packages",
- help="Removes arm packages from the image to test if ARM collection works",
- is_flag=True,
- envvar="REMOVE_ARM_PACKAGES",
-)
option_force_sa_warnings = click.option(
"--force-sa-warnings/--no-force-sa-warnings",
help="Enable `sqlalchemy.exc.MovedIn20Warning` during the tests runs.",
@@ -604,7 +598,6 @@ option_total_test_timeout = click.option(
@option_parallelism
@option_postgres_version
@option_python
-@option_remove_arm_packages
@option_run_db_tests_only
@option_run_in_parallel
@option_skip_cleanup
@@ -668,7 +661,6 @@ def core_tests(**kwargs):
@option_providers_constraints_location
@option_providers_skip_constraints
@option_python
-@option_remove_arm_packages
@option_run_db_tests_only
@option_run_in_parallel
@option_skip_cleanup
@@ -735,7 +727,6 @@ def task_sdk_tests(**kwargs):
distribution_format="wheel",
providers_constraints_location="",
providers_skip_constraints=False,
- remove_arm_packages=False,
skip_cleanup=False,
skip_providers="",
test_type=ALL_TEST_TYPE,
@@ -794,7 +785,6 @@ def airflow_ctl_tests(**kwargs):
distribution_format="wheel",
providers_constraints_location="",
providers_skip_constraints=False,
- remove_arm_packages=False,
skip_cleanup=False,
skip_providers="",
test_type=ALL_TEST_TYPE,
@@ -1295,7 +1285,6 @@ def _run_test_command(
providers_constraints_location: str,
providers_skip_constraints: bool,
python: str,
- remove_arm_packages: bool,
run_db_tests_only: bool,
run_in_parallel: bool,
skip_cleanup: bool,
@@ -1346,7 +1335,6 @@ def _run_test_command(
providers_constraints_location=providers_constraints_location,
providers_skip_constraints=providers_skip_constraints,
python=python,
- remove_arm_packages=remove_arm_packages,
run_db_tests_only=run_db_tests_only,
skip_db_tests=skip_db_tests,
test_type=test_type,
diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py b/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
index 6469e576549..77d92f0cd95 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
@@ -67,7 +67,6 @@ TEST_UPGRADING_PACKAGES: dict[str, str | list[str]] = {
"--upgrade-boto",
"--downgrade-sqlalchemy",
"--downgrade-pendulum",
- "--remove-arm-packages",
],
}
diff --git a/dev/breeze/src/airflow_breeze/params/shell_params.py b/dev/breeze/src/airflow_breeze/params/shell_params.py
index 78e22751cfb..35a7f633f19 100644
--- a/dev/breeze/src/airflow_breeze/params/shell_params.py
+++ b/dev/breeze/src/airflow_breeze/params/shell_params.py
@@ -196,7 +196,6 @@ class ShellParams:
python: str = ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS[0]
quiet: bool = False
regenerate_missing_docs: bool = False
- remove_arm_packages: bool = False
restart: bool = False
run_db_tests_only: bool = False
run_tests: bool = False
@@ -615,7 +614,6 @@ class ShellParams:
_set_var(_env, "QUIET", self.quiet)
_set_var(_env, "REDIS_HOST_PORT", None, REDIS_HOST_PORT)
_set_var(_env, "REGENERATE_MISSING_DOCS", self.regenerate_missing_docs)
- _set_var(_env, "REMOVE_ARM_PACKAGES", self.remove_arm_packages)
_set_var(_env, "RUN_TESTS", self.run_tests)
_set_var(_env, "SKIP_ENVIRONMENT_INITIALIZATION", self.skip_environment_initialization)
_set_var(_env, "SKIP_SSH_SETUP", self.skip_ssh_setup)
diff --git a/scripts/ci/testing/run_unit_tests.sh b/scripts/ci/testing/run_unit_tests.sh
index 13ebf302672..9db2b44b9b2 100755
--- a/scripts/ci/testing/run_unit_tests.sh
+++ b/scripts/ci/testing/run_unit_tests.sh
@@ -52,11 +52,6 @@ function core_tests() {
breeze testing core-tests --test-type "All-Quarantined" || true
RESULT=$?
set +x
- elif [[ "${TEST_SCOPE}" == "ARM collection" ]]; then
- set -x
- breeze testing core-tests --collect-only --remove-arm-packages --test-type "All" --no-db-reset
- RESULT=$?
- set +x
elif [[ "${TEST_SCOPE}" == "System" ]]; then
set -x
breeze testing system-tests airflow-core/tests/system/example_empty.py
@@ -100,11 +95,6 @@ function providers_tests() {
breeze testing providers-tests --test-type "All-Quarantined" || true
RESULT=$?
set +x
- elif [[ "${TEST_SCOPE}" == "ARM collection" ]]; then
- set -x
- breeze testing providers-tests --collect-only --remove-arm-packages --test-type "All" --no-db-reset
- RESULT=$?
- set +x
else
echo "Unknown test scope: ${TEST_SCOPE}"
set -e
diff --git a/scripts/docker/entrypoint_ci.sh b/scripts/docker/entrypoint_ci.sh
index e89c40d3f29..367a7825348 100755
--- a/scripts/docker/entrypoint_ci.sh
+++ b/scripts/docker/entrypoint_ci.sh
@@ -305,13 +305,6 @@ function check_run_tests() {
return
fi
- if [[ ${REMOVE_ARM_PACKAGES:="false"} == "true" ]]; then
- # Test what happens if we do not have ARM packages installed.
- # This is useful to see if pytest collection works without ARM packages which is important
- # for the MacOS M1 users running tests in their ARM machines with `breeze testing *-tests` command
- python "${IN_CONTAINER_DIR}/remove_arm_packages.py"
- fi
-
if [[ ${TEST_GROUP:=""} == "system" ]]; then
exec "${IN_CONTAINER_DIR}/run_system_tests.sh" "${@}"
else
diff --git a/scripts/in_container/remove_arm_packages.py b/scripts/in_container/remove_arm_packages.py
deleted file mode 100644
index 7b12ad5d57e..00000000000
--- a/scripts/in_container/remove_arm_packages.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env python
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-from __future__ import annotations
-
-import json
-import re
-import subprocess
-from pathlib import Path
-
-from rich.console import Console
-
-AIRFLOW_ROOT_PATH = Path(__file__).parents[2].resolve()
-console = Console(width=400, color_system="standard")
-
-
-def remove_packages_missing_on_arm():
- console.print("[bright_blue]Removing packages missing on ARM.")
- provider_dependencies = json.loads(
- (AIRFLOW_ROOT_PATH / "generated" / "provider_dependencies.json").read_text()
- )
- all_dependencies_to_remove = []
- for provider in provider_dependencies:
- for dependency in provider_dependencies[provider]["deps"]:
- if 'platform_machine != "aarch64"' in dependency:
- all_dependencies_to_remove.append(re.split(r"[~<>=;]", dependency)[0])
- console.print(
- "\n[bright_blue]Uninstalling ARM-incompatible libraries "
- + " ".join(all_dependencies_to_remove)
- + "\n"
- )
- subprocess.run(["pip", "uninstall", "-y"] + all_dependencies_to_remove)
-
-
-if __name__ == "__main__":
- remove_packages_missing_on_arm()