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 2024/12/29 11:51:37 UTC
(airflow) 01/01: Simplify caching mechanisms for CI and PROD images
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch redesign-image-caching
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 4f266c6eceefbb7ba5b6d9c75b71b10a01fe9a94
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Fri Dec 20 14:08:35 2024 +0100
Simplify caching mechanisms for CI and PROD images
For a long time we had used a sophisticated mechanism to speed up
our CI jobs by building the images in "pull_request_target" workflow
and pushing them to GitHub registry. That however had several drawbacks:
* CI image was complex when it comes to layer setup (we had to pre-
cache installed dependencies by installing them from branch tip
* The pull_request_target is a very dangerous workflow, we had a number
of security problems with it (and it's difficult to debug)
* Caching of `pip` and `uv` was not used because it increased size of
the image significantly
This PR significantly improves the caching mechanisms for the images
building of several advacements that were not possible before:
* The upload-artifacts@v4 action and improved stash action developed
by @assignUser and published in "apache/infrastructure-actions"
allows us to store all images (8GB per run) in artifacts rather
than in registry - so we can do the image build once and share
it with all the jobs.
* The uv speed is "enough" to allow occasional installation of Airlfow
locally. This allows to utilize cache-mount and locally build uv
cache, rather than rely on "remote" cache when we are building
local images for breeze. The first time you build local breeze
image it will take 2-5 more minutes (depending on your network
speed, but because we can utilise cache mounts, every subsequent
build should be very fast - even if all dependencies change. Using
uv also allows to "always" reinstall airflow when you build the
image even if single source file changed, because with cache
it takes sub-seconds to reinstall airflow and all dependencies.
* the cache mounts are not included in the image size, and since we
can export and import images in CI in artifacts and we do not
need to rebuild them, the images shared as compressed artifacts are
relatively small (2GB) - cache of `uv` is around 4GB on top of that
so sharing image built in the "build image" job with other jobs
in the same workflow is fast.
* we are still using registry cache for the "non-python" parts of
the image - both CI and breeze image build speed benefit from using
the image cache for system dependencies, database clients etc.
Fixes: #42999
Fixes: #43268
---
.github/actions/checkout_target_commit/action.yml | 81 -------
.github/actions/prepare_all_ci_images/action.yml | 71 ++++++
.../actions/prepare_breeze_and_image/action.yml | 46 ++--
.github/actions/prepare_single_ci_image/action.yml | 47 ++++
.github/workflows/additional-ci-image-checks.yml | 9 +-
.github/workflows/additional-prod-image-tests.yml | 47 ++--
.github/workflows/basic-tests.yml | 1 -
.github/workflows/build-images.yml | 264 ---------------------
.github/workflows/ci-image-build.yml | 82 +++----
.github/workflows/ci-image-checks.yml | 40 ++--
.github/workflows/ci.yml | 164 ++-----------
.github/workflows/finalize-tests.yml | 9 -
.github/workflows/generate-constraints.yml | 25 +-
.github/workflows/helm-tests.yml | 12 +-
.github/workflows/integration-system-tests.yml | 28 +--
.github/workflows/k8s-tests.yml | 70 +++---
.github/workflows/prod-image-build.yml | 119 ++++------
.github/workflows/prod-image-extra-checks.yml | 5 -
.github/workflows/release_dockerhub_image.yml | 2 +-
.github/workflows/run-unit-tests.yml | 12 +-
.github/workflows/special-tests.yml | 10 -
.github/workflows/task-sdk-tests.yml | 12 +-
.github/workflows/test-provider-packages.yml | 23 +-
Dockerfile | 129 ++--------
Dockerfile.ci | 195 ++++-----------
dev/breeze/doc/06_managing_docker_images.rst | 64 ++++-
dev/breeze/doc/ci/02_images.md | 21 +-
dev/breeze/doc/ci/05_workflows.md | 4 +-
dev/breeze/doc/ci/08_running_ci_locally.md | 57 ++---
dev/breeze/doc/images/image_artifacts.png | Bin 0 -> 47666 bytes
dev/breeze/doc/images/output_ci-image.svg | 16 +-
dev/breeze/doc/images/output_ci-image.txt | 2 +-
dev/breeze/doc/images/output_ci-image_build.svg | 180 +++++++-------
dev/breeze/doc/images/output_ci-image_build.txt | 2 +-
dev/breeze/doc/images/output_ci-image_load.svg | 144 +++++++++++
dev/breeze/doc/images/output_ci-image_load.txt | 1 +
dev/breeze/doc/images/output_ci-image_pull.svg | 68 +++---
dev/breeze/doc/images/output_ci-image_pull.txt | 2 +-
dev/breeze/doc/images/output_ci-image_save.svg | 128 ++++++++++
dev/breeze/doc/images/output_ci-image_save.txt | 1 +
dev/breeze/doc/images/output_ci-image_verify.svg | 56 ++---
dev/breeze/doc/images/output_ci-image_verify.txt | 2 +-
.../doc/images/output_k8s_build-k8s-image.svg | 54 ++---
.../doc/images/output_k8s_build-k8s-image.txt | 2 +-
.../doc/images/output_k8s_run-complete-tests.svg | 82 +++----
.../doc/images/output_k8s_run-complete-tests.txt | 2 +-
dev/breeze/doc/images/output_prod-image.svg | 16 +-
dev/breeze/doc/images/output_prod-image.txt | 2 +-
dev/breeze/doc/images/output_prod-image_build.svg | 198 ++++++++--------
dev/breeze/doc/images/output_prod-image_build.txt | 2 +-
dev/breeze/doc/images/output_prod-image_load.svg | 132 +++++++++++
dev/breeze/doc/images/output_prod-image_load.txt | 1 +
dev/breeze/doc/images/output_prod-image_pull.svg | 68 +++---
dev/breeze/doc/images/output_prod-image_pull.txt | 2 +-
dev/breeze/doc/images/output_prod-image_save.svg | 128 ++++++++++
dev/breeze/doc/images/output_prod-image_save.txt | 1 +
dev/breeze/doc/images/output_prod-image_verify.svg | 56 ++---
dev/breeze/doc/images/output_prod-image_verify.txt | 2 +-
...put_release-management_generate-constraints.svg | 58 ++---
...put_release-management_generate-constraints.txt | 2 +-
.../output_setup_check-all-params-in-groups.svg | 74 +++---
.../output_setup_check-all-params-in-groups.txt | 2 +-
.../output_setup_regenerate-command-images.svg | 20 +-
.../output_setup_regenerate-command-images.txt | 2 +-
dev/breeze/doc/images/output_shell.svg | 204 ++++++++--------
dev/breeze/doc/images/output_shell.txt | 2 +-
dev/breeze/doc/images/output_start-airflow.svg | 130 +++++-----
dev/breeze/doc/images/output_start-airflow.txt | 2 +-
dev/breeze/doc/images/output_static-checks.svg | 36 +--
dev/breeze/doc/images/output_static-checks.txt | 2 +-
.../output_testing_core-integration-tests.svg | 42 ++--
.../output_testing_core-integration-tests.txt | 2 +-
.../doc/images/output_testing_core-tests.svg | 90 +++----
.../doc/images/output_testing_core-tests.txt | 2 +-
.../images/output_testing_docker-compose-tests.svg | 44 ++--
.../images/output_testing_docker-compose-tests.txt | 2 +-
.../doc/images/output_testing_helm-tests.svg | 34 +--
.../doc/images/output_testing_helm-tests.txt | 2 +-
.../output_testing_providers-integration-tests.svg | 42 ++--
.../output_testing_providers-integration-tests.txt | 2 +-
.../doc/images/output_testing_providers-tests.svg | 108 ++++-----
.../doc/images/output_testing_providers-tests.txt | 2 +-
.../output_testing_python-api-client-tests.svg | 86 +++----
.../output_testing_python-api-client-tests.txt | 2 +-
.../doc/images/output_testing_system-tests.svg | 42 ++--
.../doc/images/output_testing_system-tests.txt | 2 +-
.../doc/images/output_testing_task-sdk-tests.svg | 42 ++--
.../doc/images/output_testing_task-sdk-tests.txt | 2 +-
.../src/airflow_breeze/commands/ci_commands.py | 12 -
.../airflow_breeze/commands/ci_image_commands.py | 152 ++++++++----
.../commands/ci_image_commands_config.py | 30 ++-
.../commands/common_image_options.py | 36 +--
.../src/airflow_breeze/commands/common_options.py | 18 +-
.../airflow_breeze/commands/developer_commands.py | 24 +-
.../commands/developer_commands_config.py | 3 -
.../airflow_breeze/commands/kubernetes_commands.py | 44 +---
.../commands/kubernetes_commands_config.py | 2 -
.../commands/production_image_commands.py | 126 +++++++---
.../commands/production_image_commands_config.py | 29 ++-
.../commands/release_management_commands.py | 6 -
.../commands/release_management_commands_config.py | 1 -
.../airflow_breeze/commands/testing_commands.py | 29 +--
.../commands/testing_commands_config.py | 4 -
dev/breeze/src/airflow_breeze/global_constants.py | 1 -
.../src/airflow_breeze/params/build_ci_params.py | 1 -
.../src/airflow_breeze/params/build_prod_params.py | 1 -
.../airflow_breeze/params/common_build_params.py | 22 --
.../src/airflow_breeze/params/shell_params.py | 9 +-
.../airflow_breeze/utils/docker_command_utils.py | 5 +-
dev/breeze/src/airflow_breeze/utils/image.py | 55 +----
dev/breeze/src/airflow_breeze/utils/platforms.py | 4 +-
.../src/airflow_breeze/utils/selective_checks.py | 8 +-
dev/breeze/tests/test_shell_params.py | 12 -
docs/docker-stack/build-arg-ref.rst | 37 +--
docs/docker-stack/build.rst | 9 +-
.../restricted/restricted_environments.sh | 1 -
hatch_build.py | 4 -
scripts/ci/cleanup_docker.sh | 5 +-
scripts/ci/constraints/ci_commit_constraints.sh | 3 -
scripts/ci/docker-compose/base.yml | 2 +-
.../ci_start_arm_instance_and_connect_to_docker.sh | 91 -------
scripts/ci/images/ci_stop_arm_instance.sh | 30 ---
scripts/docker/common.sh | 6 +-
scripts/docker/install_airflow.sh | 16 +-
...install_airflow_dependencies_from_branch_tip.sh | 103 --------
scripts/in_container/_in_container_utils.sh | 10 +-
126 files changed, 2233 insertions(+), 2799 deletions(-)
diff --git a/.github/actions/checkout_target_commit/action.yml b/.github/actions/checkout_target_commit/action.yml
deleted file mode 100644
index e95e8b86254..00000000000
--- a/.github/actions/checkout_target_commit/action.yml
+++ /dev/null
@@ -1,81 +0,0 @@
-# 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.
-#
----
-name: 'Checkout target commit'
-description: >
- Checks out target commit with the exception of .github scripts directories that come from the target branch
-inputs:
- target-commit-sha:
- description: 'SHA of the target commit to checkout'
- required: true
- pull-request-target:
- description: 'Whether the workflow is a pull request target workflow'
- required: true
- is-committer-build:
- description: 'Whether the build is done by a committer'
- required: true
-runs:
- using: "composite"
- steps:
- - name: "Checkout target commit"
- uses: actions/checkout@v4
- with:
- ref: ${{ inputs.target-commit-sha }}
- persist-credentials: false
- ####################################################################################################
- # BE VERY CAREFUL HERE! THIS LINE AND THE END OF THE WARNING. IN PULL REQUEST TARGET WORKFLOW
- # WE CHECK OUT THE TARGET COMMIT ABOVE TO BE ABLE TO BUILD THE IMAGE FROM SOURCES FROM THE
- # INCOMING PR, RATHER THAN FROM TARGET BRANCH. THIS IS A SECURITY RISK, BECAUSE THE PR
- # CAN CONTAIN ANY CODE AND WE EXECUTE IT HERE. THEREFORE, WE NEED TO BE VERY CAREFUL WHAT WE
- # DO HERE. WE SHOULD NOT EXECUTE ANY CODE THAT COMES FROM THE PR. WE SHOULD NOT RUN ANY BREEZE
- # COMMAND NOR SCRIPTS NOR COMPOSITE ACTIONS. WE SHOULD ONLY RUN CODE THAT IS EMBEDDED DIRECTLY IN
- # THIS WORKFLOW - BECAUSE THIS IS THE ONLY CODE THAT WE CAN TRUST.
- ####################################################################################################
- - name: Checkout target branch to 'target-airflow' folder to use ci/scripts and breeze from there.
- uses: actions/checkout@v4
- with:
- path: "target-airflow"
- ref: ${{ github.base_ref }}
- persist-credentials: false
- if: inputs.pull-request-target == 'true' && inputs.is-committer-build != 'true'
- - name: >
- Replace "scripts/ci", "dev", ".github/actions" and ".github/workflows" with the target branch
- so that the those directories are not coming from the PR
- shell: bash
- run: |
- echo
- echo -e "\033[33m Replace scripts, dev, actions with target branch for non-committer builds!\033[0m"
- echo
- rm -rfv "scripts/ci"
- rm -rfv "dev"
- rm -rfv ".github/actions"
- rm -rfv ".github/workflows"
- rm -v ".dockerignore" || true
- mv -v "target-airflow/scripts/ci" "scripts"
- mv -v "target-airflow/dev" "."
- mv -v "target-airflow/.github/actions" "target-airflow/.github/workflows" ".github"
- mv -v "target-airflow/.dockerignore" ".dockerignore" || true
- if: inputs.pull-request-target == 'true' && inputs.is-committer-build != 'true'
- ####################################################################################################
- # AFTER IT'S SAFE. THE `dev`, `scripts/ci` AND `.github/actions` and `.dockerignore` ARE NOW COMING
- # FROM THE BASE_REF - WHICH IS THE TARGET BRANCH OF THE PR. WE CAN TRUST THAT THOSE SCRIPTS ARE
- # SAFE TO RUN AND CODE AVAILABLE IN THE DOCKER BUILD PHASE IS CONTROLLED BY THE `.dockerignore`.
- # ALL THE REST OF THE CODE COMES FROM THE PR, AND FOR EXAMPLE THE CODE IN THE `Dockerfile.ci` CAN
- # BE RUN SAFELY AS PART OF DOCKER BUILD. BECAUSE IT RUNS INSIDE THE DOCKER CONTAINER AND IT IS
- # ISOLATED FROM THE RUNNER.
- ####################################################################################################
diff --git a/.github/actions/prepare_all_ci_images/action.yml b/.github/actions/prepare_all_ci_images/action.yml
new file mode 100644
index 00000000000..fdbf51288d7
--- /dev/null
+++ b/.github/actions/prepare_all_ci_images/action.yml
@@ -0,0 +1,71 @@
+# 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.
+#
+---
+name: 'Prepare all CI images'
+description: 'Recreates current python CI images from artifacts for all python versions'
+inputs:
+ python-versions-list-as-string:
+ description: 'Stringified array of all Python versions to test - separated by spaces.'
+ required: true
+ platform:
+ description: 'Platform for the build - linux/amd64 or linux/arm64'
+ required: true
+outputs:
+ host-python-version:
+ description: Python version used in host
+ value: ${{ steps.breeze.outputs.host-python-version }}
+runs:
+ using: "composite"
+ steps:
+ - name: "Cleanup docker"
+ run: ./scripts/ci/cleanup_docker.sh
+ shell: bash
+ # TODO: Currently we cannot loop through the list of python versions and have dynamic list of
+ # tasks. Instead we hardcode all possible python versions and they - but
+ # this should be implemented in stash action as list of keys to download.
+ # That includes 3.8 - 3.12 as we are backporting it to v2-10-test branch
+ - name: "Restore CI docker image ${{ inputs.platform }}:3.8"
+ uses: ./.github/actions/prepare_single_ci_image
+ with:
+ platform: ${{ inputs.platform }}
+ python: "3.8"
+ python-versions-list-as-string: ${{ inputs.python-versions-list-as-string }}
+ - name: "Restore CI docker image ${{ inputs.platform }}:3.9"
+ uses: ./.github/actions/prepare_single_ci_image
+ with:
+ platform: ${{ inputs.platform }}
+ python: "3.9"
+ python-versions-list-as-string: ${{ inputs.python-versions-list-as-string }}
+ - name: "Restore CI docker image ${{ inputs.platform }}:3.10"
+ uses: ./.github/actions/prepare_single_ci_image
+ with:
+ platform: ${{ inputs.platform }}
+ python: "3.10"
+ python-versions-list-as-string: ${{ inputs.python-versions-list-as-string }}
+ - name: "Restore CI docker image ${{ inputs.platform }}:3.11"
+ uses: ./.github/actions/prepare_single_ci_image
+ with:
+ platform: ${{ inputs.platform }}
+ python: "3.11"
+ python-versions-list-as-string: ${{ inputs.python-versions-list-as-string }}
+ - name: "Restore CI docker image ${{ inputs.platform }}:3.12"
+ uses: ./.github/actions/prepare_single_ci_image
+ with:
+ platform: ${{ inputs.platform }}
+ python: "3.12"
+ python-versions-list-as-string: ${{ inputs.python-versions-list-as-string }}
diff --git a/.github/actions/prepare_breeze_and_image/action.yml b/.github/actions/prepare_breeze_and_image/action.yml
index 41aa17092d5..5c65ecbdd11 100644
--- a/.github/actions/prepare_breeze_and_image/action.yml
+++ b/.github/actions/prepare_breeze_and_image/action.yml
@@ -16,12 +16,18 @@
# under the License.
#
---
-name: 'Prepare breeze && current python image'
-description: 'Installs breeze and pulls current python image'
+name: 'Prepare breeze && current image (CI or PROD)'
+description: 'Installs breeze and recreates current python image from artifact'
inputs:
- pull-image-type:
- description: 'Which image to pull'
- default: CI
+ python:
+ description: 'Python version for image to prepare'
+ required: true
+ image-type:
+ description: 'Which image type to prepare (CI/PROD)'
+ default: "CI"
+ platform:
+ description: 'Platform for the build - linux/amd64 or linux/arm64'
+ required: true
outputs:
host-python-version:
description: Python version used in host
@@ -29,17 +35,29 @@ outputs:
runs:
using: "composite"
steps:
+ - name: "Cleanup docker"
+ run: ./scripts/ci/cleanup_docker.sh
+ shell: bash
- name: "Install Breeze"
uses: ./.github/actions/breeze
id: breeze
- - name: Login to ghcr.io
- shell: bash
- run: echo "${{ env.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- - name: Pull CI image ${{ env.PYTHON_MAJOR_MINOR_VERSION }}:${{ env.IMAGE_TAG }}
+ - name: "Restore CI docker image ${{ inputs.platform }}:${{ inputs.python }}"
+ uses: apache/infrastructure-actions/stash/restore@c94b890bbedc2fc61466d28e6bd9966bc6c6643c
+ with:
+ key: "ci-image-save-${{ inputs.platform }}-${{ inputs.python }}"
+ path: "/tmp/"
+ if: inputs.image-type == 'CI'
+ - name: "Load CI image ${{ inputs.platform }}:${{ inputs.python }}"
+ run: breeze ci-image load --platform ${{ inputs.platform }} --python ${{ inputs.python }}
shell: bash
- run: breeze ci-image pull --tag-as-latest
- if: inputs.pull-image-type == 'CI'
- - name: Pull PROD image ${{ env.PYTHON_MAJOR_MINOR_VERSION }}:${{ env.IMAGE_TAG }}
+ if: inputs.image-type == 'CI'
+ - name: "Restore PROD docker image ${{ inputs.platform }}:${{ inputs.python }}"
+ uses: apache/infrastructure-actions/stash/restore@c94b890bbedc2fc61466d28e6bd9966bc6c6643c
+ with:
+ key: "prod-image-save-${{ inputs.platform }}-${{ inputs.python }}"
+ path: "/tmp/"
+ if: inputs.image-type == 'PROD'
+ - name: "Load PROD image ${{ inputs.platform }}:${{ inputs.python }}"
+ run: breeze prod-image load --platform ${{ inputs.platform }} --python ${{ inputs.python }}
shell: bash
- run: breeze prod-image pull --tag-as-latest
- if: inputs.pull-image-type == 'PROD'
+ if: inputs.image-type == 'PROD'
diff --git a/.github/actions/prepare_single_ci_image/action.yml b/.github/actions/prepare_single_ci_image/action.yml
new file mode 100644
index 00000000000..bc122596158
--- /dev/null
+++ b/.github/actions/prepare_single_ci_image/action.yml
@@ -0,0 +1,47 @@
+# 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.
+#
+---
+name: 'Prepare single images'
+description: 'Recreates current python image from artifacts'
+inputs:
+ python:
+ description: 'Python version for image to prepare'
+ required: true
+ python-versions-list-as-string:
+ description: 'Stringified array of all Python versions to prepare - separated by spaces.'
+ required: true
+ platform:
+ description: 'Platform for the build - linux/amd64 or linux/arm64'
+ required: true
+outputs:
+ host-python-version:
+ description: Python version used in host
+ value: ${{ steps.breeze.outputs.host-python-version }}
+runs:
+ using: "composite"
+ steps:
+ - name: "Restore CI docker images ${{ inputs.platform }}:${{ inputs.python }}"
+ uses: apache/infrastructure-actions/stash/restore@c94b890bbedc2fc61466d28e6bd9966bc6c6643c
+ with:
+ key: "ci-image-save-${{ inputs.platform }}-${{ inputs.python }}"
+ path: "/tmp/"
+ if: contains(inputs.python-versions-list-as-string, inputs.python)
+ - name: "Load CI image ${{ inputs.platform }}:${{ inputs.python }}"
+ run: breeze ci-image load --platform "${{ inputs.platform }}" --python "${{ inputs.python }}"
+ shell: bash
+ if: contains(inputs.python-versions-list-as-string, inputs.python)
diff --git a/.github/workflows/additional-ci-image-checks.yml b/.github/workflows/additional-ci-image-checks.yml
index 8a3b46e70d3..40196a6e042 100644
--- a/.github/workflows/additional-ci-image-checks.yml
+++ b/.github/workflows/additional-ci-image-checks.yml
@@ -32,10 +32,6 @@ on: # yamllint disable-line rule:truthy
description: "The array of labels (in json form) determining self-hosted runners."
required: true
type: string
- image-tag:
- description: "Tag to set for the image"
- required: true
- type: string
python-versions:
description: "The list of python versions (stringified JSON array) to run the tests on."
required: true
@@ -103,8 +99,6 @@ jobs:
contents: read
# This write is only given here for `push` events from "apache/airflow" repo. It is not given for PRs
# from forks. This is to prevent malicious PRs from creating images in the "apache/airflow" repo.
- # For regular build for PRS this "build-prod-images" workflow will be skipped anyway by the
- # "in-workflow-build" condition
packages: write
secrets: inherit
with:
@@ -159,7 +153,7 @@ jobs:
# # 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 (in-workflow)
+# name: Build CI ARM images
# uses: ./.github/workflows/ci-image-build.yml
# permissions:
# contents: read
@@ -169,7 +163,6 @@ jobs:
# push-image: "false"
# runs-on-as-json-public: ${{ inputs.runs-on-as-json-public }}
# runs-on-as-json-self-hosted: ${{ inputs.runs-on-as-json-self-hosted }}
-# image-tag: ${{ inputs.image-tag }}
# python-versions: ${{ inputs.python-versions }}
# platform: "linux/arm64"
# branch: ${{ inputs.branch }}
diff --git a/.github/workflows/additional-prod-image-tests.yml b/.github/workflows/additional-prod-image-tests.yml
index 5ffd2001e0e..763cd12acea 100644
--- a/.github/workflows/additional-prod-image-tests.yml
+++ b/.github/workflows/additional-prod-image-tests.yml
@@ -32,10 +32,6 @@ on: # yamllint disable-line rule:truthy
description: "Branch used to construct constraints URL from."
required: true
type: string
- image-tag:
- description: "Tag to set for the image"
- required: true
- type: string
upgrade-to-newer-dependencies:
description: "Whether to upgrade to newer dependencies (true/false)"
required: true
@@ -70,7 +66,6 @@ jobs:
default-python-version: ${{ inputs.default-python-version }}
branch: ${{ inputs.default-branch }}
use-uv: "false"
- image-tag: ${{ inputs.image-tag }}
build-provider-packages: ${{ inputs.default-branch == 'main' }}
upgrade-to-newer-dependencies: ${{ inputs.upgrade-to-newer-dependencies }}
chicken-egg-providers: ${{ inputs.chicken-egg-providers }}
@@ -88,7 +83,6 @@ jobs:
default-python-version: ${{ inputs.default-python-version }}
branch: ${{ inputs.default-branch }}
use-uv: "false"
- image-tag: ${{ inputs.image-tag }}
build-provider-packages: ${{ inputs.default-branch == 'main' }}
upgrade-to-newer-dependencies: ${{ inputs.upgrade-to-newer-dependencies }}
chicken-egg-providers: ${{ inputs.chicken-egg-providers }}
@@ -117,36 +111,25 @@ jobs:
persist-credentials: false
- name: "Cleanup docker"
run: ./scripts/ci/cleanup_docker.sh
- - name: "Install Breeze"
- uses: ./.github/actions/breeze
- - name: Login to ghcr.io
- shell: bash
- run: echo "${{ env.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- - name: Pull PROD image ${{ inputs.default-python-version}}:${{ inputs.image-tag }}
- run: breeze prod-image pull --tag-as-latest
- env:
- PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
- IMAGE_TAG: "${{ inputs.image-tag }}"
- - name: "Setup python"
- uses: actions/setup-python@v5
+ - name: "Prepare breeze & PROD image: ${{ inputs.default-python-version }}"
+ uses: ./.github/actions/prepare_breeze_and_image
with:
- python-version: ${{ inputs.default-python-version }}
- cache: 'pip'
- cache-dependency-path: ./dev/requirements.txt
+ platform: "linux/amd64"
+ image-type: PROD
+ python: ${{ inputs.default-python-version }}
- name: "Test examples of PROD image building"
run: "
cd ./docker_tests && \
python -m pip install -r requirements.txt && \
TEST_IMAGE=\"ghcr.io/${{ github.repository }}/${{ inputs.default-branch }}\
- /prod/python${{ inputs.default-python-version }}:${{ inputs.image-tag }}\" \
+ /prod/python${{ inputs.default-python-version }}\" \
python -m pytest test_examples_of_prod_image_building.py -n auto --color=yes"
test-docker-compose-quick-start:
timeout-minutes: 60
- name: "Docker-compose quick start with PROD image verifying"
+ name: "Docker Compose quick start with PROD image verifying"
runs-on: ${{ fromJSON(inputs.runs-on-as-json-public) }}
env:
- IMAGE_TAG: "${{ inputs.image-tag }}"
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -161,14 +144,12 @@ jobs:
with:
fetch-depth: 2
persist-credentials: false
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- - name: "Install Breeze"
- uses: ./.github/actions/breeze
- - name: Login to ghcr.io
- shell: bash
- run: echo "${{ env.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- - name: "Pull image ${{ inputs.default-python-version}}:${{ inputs.image-tag }}"
- run: breeze prod-image pull --tag-as-latest
+ - name: "Prepare breeze & PROD image: ${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
+ uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: "linux/amd64"
+ image-type: PROD
+ python: ${{ env.PYTHON_MAJOR_MINOR_VERSION }}
+ id: breeze
- name: "Test docker-compose quick start"
run: breeze testing docker-compose-tests
diff --git a/.github/workflows/basic-tests.yml b/.github/workflows/basic-tests.yml
index c8ba85969f5..47f80f05b7a 100644
--- a/.github/workflows/basic-tests.yml
+++ b/.github/workflows/basic-tests.yml
@@ -288,7 +288,6 @@ jobs:
runs-on: ${{ fromJSON(inputs.runs-on-as-json-public) }}
env:
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
- IMAGE_TAG: ${{ inputs.image-tag }}
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.actor }}
diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml
deleted file mode 100644
index 9135dcb9d9e..00000000000
--- a/.github/workflows/build-images.yml
+++ /dev/null
@@ -1,264 +0,0 @@
-# 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.
-#
----
-name: Build Images
-run-name: >
- Build images for ${{ github.event.pull_request.title }} ${{ github.event.pull_request._links.html.href }}
-on: # yamllint disable-line rule:truthy
- pull_request_target:
- branches:
- - main
- - v2-10-stable
- - v2-10-test
- - providers-[a-z]+-?[a-z]*/v[0-9]+-[0-9]+
-permissions:
- # all other permissions are set to none
- contents: read
- pull-requests: read
- packages: read
-env:
- ANSWER: "yes"
- # You can override CONSTRAINTS_GITHUB_REPOSITORY by setting secret in your repo but by default the
- # Airflow one is going to be used
- CONSTRAINTS_GITHUB_REPOSITORY: >-
- ${{ secrets.CONSTRAINTS_GITHUB_REPOSITORY != '' &&
- secrets.CONSTRAINTS_GITHUB_REPOSITORY || 'apache/airflow' }}
- # This token is WRITE one - pull_request_target type of events always have the WRITE token
- DB_RESET: "true"
- GITHUB_REPOSITORY: ${{ github.repository }}
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- GITHUB_USERNAME: ${{ github.actor }}
- IMAGE_TAG: "${{ github.event.pull_request.head.sha || github.sha }}"
- INCLUDE_SUCCESS_OUTPUTS: "true"
- USE_SUDO: "true"
- VERBOSE: "true"
-
-concurrency:
- group: build-${{ github.event.pull_request.number || github.ref }}
- cancel-in-progress: true
-
-jobs:
- build-info:
- timeout-minutes: 10
- name: Build Info
- # At build-info stage we do not yet have outputs so we need to hard-code the runs-on to public runners
- runs-on: ["ubuntu-22.04"]
- env:
- TARGET_BRANCH: ${{ github.event.pull_request.base.ref }}
- outputs:
- image-tag: ${{ github.event.pull_request.head.sha || github.sha }}
- python-versions: ${{ steps.selective-checks.outputs.python-versions }}
- python-versions-list-as-string: ${{ steps.selective-checks.outputs.python-versions-list-as-string }}
- default-python-version: ${{ steps.selective-checks.outputs.default-python-version }}
- upgrade-to-newer-dependencies: ${{ steps.selective-checks.outputs.upgrade-to-newer-dependencies }}
- run-tests: ${{ steps.selective-checks.outputs.run-tests }}
- run-kubernetes-tests: ${{ steps.selective-checks.outputs.run-kubernetes-tests }}
- ci-image-build: ${{ steps.selective-checks.outputs.ci-image-build }}
- prod-image-build: ${{ steps.selective-checks.outputs.prod-image-build }}
- docker-cache: ${{ steps.selective-checks.outputs.docker-cache }}
- default-branch: ${{ steps.selective-checks.outputs.default-branch }}
- disable-airflow-repo-cache: ${{ steps.selective-checks.outputs.disable-airflow-repo-cache }}
- force-pip: ${{ steps.selective-checks.outputs.force-pip }}
- constraints-branch: ${{ steps.selective-checks.outputs.default-constraints-branch }}
- runs-on-as-json-default: ${{ steps.selective-checks.outputs.runs-on-as-json-default }}
- runs-on-as-json-public: ${{ steps.selective-checks.outputs.runs-on-as-json-public }}
- runs-on-as-json-self-hosted: ${{ steps.selective-checks.outputs.runs-on-as-json-self-hosted }}
- is-self-hosted-runner: ${{ steps.selective-checks.outputs.is-self-hosted-runner }}
- is-committer-build: ${{ steps.selective-checks.outputs.is-committer-build }}
- is-airflow-runner: ${{ steps.selective-checks.outputs.is-airflow-runner }}
- is-amd-runner: ${{ steps.selective-checks.outputs.is-amd-runner }}
- is-arm-runner: ${{ steps.selective-checks.outputs.is-arm-runner }}
- is-vm-runner: ${{ steps.selective-checks.outputs.is-vm-runner }}
- is-k8s-runner: ${{ steps.selective-checks.outputs.is-k8s-runner }}
- chicken-egg-providers: ${{ steps.selective-checks.outputs.chicken-egg-providers }}
- target-commit-sha: "${{steps.discover-pr-merge-commit.outputs.target-commit-sha ||
- github.event.pull_request.head.sha ||
- github.sha
- }}"
- if: github.repository == 'apache/airflow'
- steps:
- - name: Cleanup repo
- shell: bash
- run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm -rf /workspace/*"
- - name: Discover PR merge commit
- id: discover-pr-merge-commit
- run: |
- # Sometimes target-commit-sha cannot be
- TARGET_COMMIT_SHA="$(gh api '${{ github.event.pull_request.url }}' --jq .merge_commit_sha)"
- if [[ ${TARGET_COMMIT_SHA} == "" ]]; then
- # Sometimes retrieving the merge commit SHA from PR fails. We retry it once. Otherwise we
- # fall-back to github.event.pull_request.head.sha
- echo
- echo "Could not retrieve merge commit SHA from PR, waiting for 3 seconds and retrying."
- echo
- sleep 3
- TARGET_COMMIT_SHA="$(gh api '${{ github.event.pull_request.url }}' --jq .merge_commit_sha)"
- if [[ ${TARGET_COMMIT_SHA} == "" ]]; then
- echo
- echo "Could not retrieve merge commit SHA from PR, falling back to PR head SHA."
- echo
- TARGET_COMMIT_SHA="${{ github.event.pull_request.head.sha }}"
- fi
- fi
- echo "TARGET_COMMIT_SHA=${TARGET_COMMIT_SHA}"
- echo "TARGET_COMMIT_SHA=${TARGET_COMMIT_SHA}" >> ${GITHUB_ENV}
- echo "target-commit-sha=${TARGET_COMMIT_SHA}" >> ${GITHUB_OUTPUT}
- if: github.event_name == 'pull_request_target'
- # The labels in the event aren't updated when re-triggering the job, So lets hit the API to get
- # up-to-date values
- - name: Get latest PR labels
- id: get-latest-pr-labels
- run: |
- echo -n "pull-request-labels=" >> ${GITHUB_OUTPUT}
- gh api graphql --paginate -F node_id=${{github.event.pull_request.node_id}} -f query='
- query($node_id: ID!, $endCursor: String) {
- node(id:$node_id) {
- ... on PullRequest {
- labels(first: 100, after: $endCursor) {
- nodes { name }
- pageInfo { hasNextPage endCursor }
- }
- }
- }
- }' --jq '.data.node.labels.nodes[]' | jq --slurp -c '[.[].name]' >> ${GITHUB_OUTPUT}
- if: github.event_name == 'pull_request_target'
- - uses: actions/checkout@v4
- with:
- ref: ${{ env.TARGET_COMMIT_SHA }}
- persist-credentials: false
- fetch-depth: 2
- ####################################################################################################
- # WE ONLY DO THAT CHECKOUT ABOVE TO RETRIEVE THE TARGET COMMIT AND IT'S PARENT. DO NOT RUN ANY CODE
- # RIGHT AFTER THAT AS WE ARE GOING TO RESTORE THE TARGET BRANCH CODE IN THE NEXT STEP.
- ####################################################################################################
- - name: Checkout target branch to use ci/scripts and breeze from there.
- uses: actions/checkout@v4
- with:
- ref: ${{ github.base_ref }}
- persist-credentials: false
- ####################################################################################################
- # HERE EVERYTHING IS PERFECTLY SAFE TO RUN. AT THIS POINT WE HAVE THE TARGET BRANCH CHECKED OUT
- # AND WE CAN RUN ANY CODE FROM IT. WE CAN RUN BREEZE COMMANDS, WE CAN RUN SCRIPTS, WE CAN RUN
- # COMPOSITE ACTIONS. WE CAN RUN ANYTHING THAT IS IN THE TARGET BRANCH AND THERE IS NO RISK THAT
- # CODE WILL BE RUN FROM THE PR.
- ####################################################################################################
- - name: Cleanup docker
- run: ./scripts/ci/cleanup_docker.sh
- - name: Setup python
- uses: actions/setup-python@v5
- with:
- python-version: "3.9"
- - name: Install Breeze
- uses: ./.github/actions/breeze
- ####################################################################################################
- # WE RUN SELECTIVE CHECKS HERE USING THE TARGET COMMIT AND ITS PARENT TO BE ABLE TO COMPARE THEM
- # AND SEE WHAT HAS CHANGED IN THE PR. THE CODE IS STILL RUN FROM THE TARGET BRANCH, SO IT IS SAFE
- # TO RUN IT, WE ONLY PASS TARGET_COMMIT_SHA SO THAT SELECTIVE CHECKS CAN SEE WHAT'S COMING IN THE PR
- ####################################################################################################
- - name: Selective checks
- id: selective-checks
- env:
- PR_LABELS: "${{ steps.get-latest-pr-labels.outputs.pull-request-labels }}"
- COMMIT_REF: "${{ env.TARGET_COMMIT_SHA }}"
- VERBOSE: "false"
- AIRFLOW_SOURCES_ROOT: "${{ github.workspace }}"
- run: breeze ci selective-check 2>> ${GITHUB_OUTPUT}
- - name: env
- run: printenv
- env:
- PR_LABELS: ${{ steps.get-latest-pr-labels.outputs.pull-request-labels }}
- GITHUB_CONTEXT: ${{ toJson(github) }}
-
-
- build-ci-images:
- name: Build CI images
- permissions:
- contents: read
- packages: write
- secrets: inherit
- needs: [build-info]
- uses: ./.github/workflows/ci-image-build.yml
- # Only run this it if the PR comes from fork, otherwise build will be done "in-PR-workflow"
- if: |
- needs.build-info.outputs.ci-image-build == 'true' &&
- github.event.pull_request.head.repo.full_name != 'apache/airflow'
- with:
- runs-on-as-json-public: ${{ needs.build-info.outputs.runs-on-as-json-public }}
- runs-on-as-json-self-hosted: ${{ needs.build-info.outputs.runs-on-as-json-self-hosted }}
- do-build: ${{ needs.build-info.outputs.ci-image-build }}
- target-commit-sha: ${{ needs.build-info.outputs.target-commit-sha }}
- pull-request-target: "true"
- is-committer-build: ${{ needs.build-info.outputs.is-committer-build }}
- push-image: "true"
- use-uv: ${{ needs.build-info.outputs.force-pip == 'true' && 'false' || 'true' }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
- platform: "linux/amd64"
- python-versions: ${{ needs.build-info.outputs.python-versions }}
- branch: ${{ needs.build-info.outputs.default-branch }}
- constraints-branch: ${{ needs.build-info.outputs.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 }}
-
-
- generate-constraints:
- name: Generate constraints
- needs: [build-info, build-ci-images]
- uses: ./.github/workflows/generate-constraints.yml
- with:
- runs-on-as-json-public: ${{ needs.build-info.outputs.runs-on-as-json-public }}
- python-versions-list-as-string: ${{ needs.build-info.outputs.python-versions-list-as-string }}
- # For regular PRs we do not need "no providers" constraints - they are only needed in canary builds
- generate-no-providers-constraints: "false"
- image-tag: ${{ needs.build-info.outputs.image-tag }}
- chicken-egg-providers: ${{ needs.build-info.outputs.chicken-egg-providers }}
- debug-resources: ${{ needs.build-info.outputs.debug-resources }}
-
- build-prod-images:
- name: Build PROD images
- permissions:
- contents: read
- packages: write
- secrets: inherit
- needs: [build-info, generate-constraints]
- uses: ./.github/workflows/prod-image-build.yml
- # Only run this it if the PR comes from fork, otherwise build will be done "in-PR-workflow"
- if: |
- needs.build-info.outputs.prod-image-build == 'true' &&
- github.event.pull_request.head.repo.full_name != 'apache/airflow'
- with:
- runs-on-as-json-public: ${{ needs.build-info.outputs.runs-on-as-json-public }}
- build-type: "Regular"
- do-build: ${{ needs.build-info.outputs.ci-image-build }}
- upload-package-artifact: "true"
- target-commit-sha: ${{ needs.build-info.outputs.target-commit-sha }}
- pull-request-target: "true"
- is-committer-build: ${{ needs.build-info.outputs.is-committer-build }}
- push-image: "true"
- use-uv: ${{ needs.build-info.outputs.force-pip == 'true' && 'false' || 'true' }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
- platform: linux/amd64
- python-versions: ${{ needs.build-info.outputs.python-versions }}
- default-python-version: ${{ needs.build-info.outputs.default-python-version }}
- branch: ${{ needs.build-info.outputs.default-branch }}
- constraints-branch: ${{ needs.build-info.outputs.constraints-branch }}
- build-provider-packages: ${{ needs.build-info.outputs.default-branch == 'main' }}
- upgrade-to-newer-dependencies: ${{ needs.build-info.outputs.upgrade-to-newer-dependencies }}
- chicken-egg-providers: ${{ needs.build-info.outputs.chicken-egg-providers }}
- docker-cache: ${{ needs.build-info.outputs.docker-cache }}
- disable-airflow-repo-cache: ${{ needs.build-info.outputs.disable-airflow-repo-cache }}
diff --git a/.github/workflows/ci-image-build.yml b/.github/workflows/ci-image-build.yml
index b8e2feac175..dadefc5e0d2 100644
--- a/.github/workflows/ci-image-build.yml
+++ b/.github/workflows/ci-image-build.yml
@@ -28,13 +28,6 @@ on: # yamllint disable-line rule:truthy
description: "The array of labels (in json form) determining self-hosted runners."
required: true
type: string
- do-build:
- description: >
- Whether to actually do the build (true/false). If set to false, the build is done
- already in pull-request-target workflow, so we skip it here.
- required: false
- default: "true"
- type: string
target-commit-sha:
description: "The commit SHA to checkout for the build"
required: false
@@ -59,6 +52,11 @@ on: # yamllint disable-line rule:truthy
required: false
default: "true"
type: string
+ upload-image-artifact:
+ description: "Whether to upload docker image artifact"
+ required: false
+ default: "false"
+ type: string
debian-version:
description: "Base Debian distribution to use for the build (bookworm)"
type: string
@@ -71,10 +69,6 @@ on: # yamllint disable-line rule:truthy
description: "Whether to use uv to build the image (true/false)"
required: true
type: string
- image-tag:
- description: "Tag to set for the image"
- required: true
- type: string
python-versions:
description: "JSON-formatted array of Python versions to build images from"
required: true
@@ -104,27 +98,17 @@ jobs:
strategy:
fail-fast: true
matrix:
- # yamllint disable-line rule:line-length
- python-version: ${{ inputs.do-build == 'true' && fromJSON(inputs.python-versions) || fromJSON('[""]') }}
+ python-version: ${{ fromJSON(inputs.python-versions) || fromJSON('[""]') }}
timeout-minutes: 110
- name: "\
-${{ inputs.do-build == 'true' && 'Build' || 'Skip building' }} \
-CI ${{ inputs.platform }} image\
-${{ matrix.python-version }}${{ inputs.do-build == 'true' && ':' || '' }}\
-${{ inputs.do-build == 'true' && inputs.image-tag || '' }}"
- # The ARM images need to be built using self-hosted runners as ARM macos public runners
- # do not yet allow us to run docker effectively and fast.
- # https://github.com/actions/runner-images/issues/9254#issuecomment-1917916016
- # https://github.com/abiosoft/colima/issues/970
- # https://github.com/actions/runner/issues/1456
- # See https://github.com/apache/airflow/pull/38640
+ 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.runs-on-as-json-public) || fromJSON(inputs.runs-on-as-json-self-hosted) }}
+ runs-on: ${{ (inputs.platform == 'linuz/amd64') && fromJSON(inputs.runs-on-as-json-public) || fromJSON(inputs.runs-on-as-json-self-hosted) }}
env:
BACKEND: sqlite
+ PYTHON_MAJOR_MINOR_VERSION: ${{ matrix.python-version }}
DEFAULT_BRANCH: ${{ inputs.branch }}
DEFAULT_CONSTRAINTS_BRANCH: ${{ inputs.constraints-branch }}
VERSION_SUFFIX_FOR_PYPI: "dev0"
@@ -137,42 +121,27 @@ ${{ inputs.do-build == 'true' && inputs.image-tag || '' }}"
- name: "Cleanup repo"
shell: bash
run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm -rf /workspace/*"
- if: inputs.do-build == 'true'
- name: "Checkout target branch"
uses: actions/checkout@v4
with:
persist-credentials: false
- - name: "Checkout target commit"
- uses: ./.github/actions/checkout_target_commit
- if: inputs.do-build == 'true'
- with:
- target-commit-sha: ${{ inputs.target-commit-sha }}
- pull-request-target: ${{ inputs.pull-request-target }}
- is-committer-build: ${{ inputs.is-committer-build }}
- name: "Cleanup docker"
run: ./scripts/ci/cleanup_docker.sh
- if: inputs.do-build == 'true'
- name: "Install Breeze"
uses: ./.github/actions/breeze
- if: inputs.do-build == 'true'
- - name: "Regenerate dependencies in case they were modified manually so that we can build an image"
+ - name: "Restore CI docker image ${{ inputs.platform }}:${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
+ uses: apache/infrastructure-actions/stash/restore@c94b890bbedc2fc61466d28e6bd9966bc6c6643c
+ with:
+ key: "ci-image-save-${{ inputs.platform }}-${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
+ path: "/tmp/"
+ - name: "Load CI image ${{ inputs.platform }}:${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
+ run: breeze ci-image load --platform ${{ inputs.platform }}
shell: bash
- run: |
- pip install rich>=12.4.4 pyyaml
- python scripts/ci/pre_commit/update_providers_dependencies.py
- if: inputs.do-build == 'true' && inputs.upgrade-to-newer-dependencies != 'false'
- - name: "Start ARM instance"
- run: ./scripts/ci/images/ci_start_arm_instance_and_connect_to_docker.sh
- if: inputs.do-build == 'true' && inputs.platform == 'linux/arm64'
- - name: Login to ghcr.io
- run: echo "${{ env.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- if: inputs.do-build == 'true'
- name: >
Build ${{ inputs.push-image == 'true' && ' & push ' || '' }}
- ${{ inputs.platform }}:${{ matrix.python-version }}:${{ inputs.image-tag }}
+ ${{ inputs.platform }}:${{ env.PYTHON_MAJOR_MINOR_VERSION }} image
run: >
- breeze ci-image build --builder airflow_cache --tag-as-latest --image-tag "${{ inputs.image-tag }}"
- --python "${{ matrix.python-version }}" --platform "${{ inputs.platform }}"
+ breeze ci-image build --builder airflow_cache --platform "${{ inputs.platform }}"
env:
DOCKER_CACHE: ${{ inputs.docker-cache }}
DISABLE_AIRFLOW_REPO_CACHE: ${{ inputs.disable-airflow-repo-cache }}
@@ -189,7 +158,14 @@ ${{ inputs.do-build == 'true' && inputs.image-tag || '' }}"
GITHUB_USERNAME: ${{ github.actor }}
PUSH: ${{ inputs.push-image }}
VERBOSE: "true"
- if: inputs.do-build == 'true'
- - name: "Stop ARM instance"
- run: ./scripts/ci/images/ci_stop_arm_instance.sh
- if: always() && inputs.do-build == 'true' && inputs.platform == 'linux/arm64'
+ - name: "Export CI docker image ${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
+ run: breeze ci-image save --platform "${{ inputs.platform }}"
+ if: inputs.upload-image-artifact == 'true'
+ - name: "Stash CI docker image ${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
+ uses: apache/infrastructure-actions/stash/save@c94b890bbedc2fc61466d28e6bd9966bc6c6643c
+ with:
+ key: "ci-image-save-${{ inputs.platform }}-${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
+ path: "/tmp/ci-image-save-*-${{ env.PYTHON_MAJOR_MINOR_VERSION }}.tar"
+ if-no-files-found: 'error'
+ retention-days: 2
+ if: inputs.upload-image-artifact == 'true'
diff --git a/.github/workflows/ci-image-checks.yml b/.github/workflows/ci-image-checks.yml
index 63598755c32..8e0e5e71dd0 100644
--- a/.github/workflows/ci-image-checks.yml
+++ b/.github/workflows/ci-image-checks.yml
@@ -28,10 +28,6 @@ on: # yamllint disable-line rule:truthy
description: "The array of labels (in json form) determining the labels used for docs build."
required: true
type: string
- image-tag:
- description: "Tag to set for the image"
- required: true
- type: string
needs-mypy:
description: "Whether to run mypy checks (true/false)"
required: true
@@ -117,7 +113,6 @@ jobs:
env:
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
UPGRADE_TO_NEWER_DEPENDENCIES: "${{ inputs.upgrade-to-newer-dependencies }}"
- IMAGE_TAG: ${{ inputs.image-tag }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
if: inputs.basic-checks-only == 'false' && inputs.latest-versions-only != 'true'
steps:
@@ -134,10 +129,11 @@ jobs:
python-version: ${{ inputs.default-python-version }}
cache: 'pip'
cache-dependency-path: ./dev/breeze/pyproject.toml
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- - name: "Prepare breeze & CI image: ${{ inputs.default-python-version}}:${{ inputs.image-tag }}"
+ - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: "linux/amd64"
+ python: ${{ inputs.default-python-version }}
id: breeze
- name: "Install pre-commit"
uses: ./.github/actions/install-pre-commit
@@ -165,7 +161,6 @@ jobs:
mypy-check: ${{ fromJSON(inputs.mypy-checks) }}
env:
PYTHON_MAJOR_MINOR_VERSION: "${{inputs.default-python-version}}"
- IMAGE_TAG: "${{ inputs.image-tag }}"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- name: "Cleanup repo"
@@ -175,10 +170,11 @@ jobs:
uses: actions/checkout@v4
with:
persist-credentials: false
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}:${{ inputs.image-tag }}"
+ - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: "linux/amd64"
+ python: ${{ inputs.default-python-version }}
id: breeze
- name: "Install pre-commit"
uses: ./.github/actions/install-pre-commit
@@ -208,7 +204,6 @@ jobs:
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.actor }}
- IMAGE_TAG: "${{ inputs.image-tag }}"
INCLUDE_NOT_READY_PROVIDERS: "true"
INCLUDE_SUCCESS_OUTPUTS: "${{ inputs.include-success-outputs }}"
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
@@ -221,10 +216,11 @@ jobs:
uses: actions/checkout@v4
with:
persist-credentials: false
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}:${{ inputs.image-tag }}"
+ - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: "linux/amd64"
+ python: ${{ inputs.default-python-version }}
- uses: actions/cache@v4
id: cache-doc-inventories
with:
@@ -254,7 +250,6 @@ jobs:
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.actor }}
- IMAGE_TAG: "${{ inputs.image-tag }}"
INCLUDE_NOT_READY_PROVIDERS: "true"
INCLUDE_SUCCESS_OUTPUTS: "${{ inputs.include-success-outputs }}"
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
@@ -283,8 +278,11 @@ jobs:
run: >
git clone https://github.com/apache/airflow-site.git /mnt/airflow-site/airflow-site &&
echo "AIRFLOW_SITE_DIRECTORY=/mnt/airflow-site/airflow-site" >> "$GITHUB_ENV"
- - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}:${{ inputs.image-tag }}"
+ - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: "linux/amd64"
+ python: ${{ inputs.default-python-version }}
- name: "Publish docs"
run: >
breeze release-management publish-docs --override-versioned --run-in-parallel
@@ -331,7 +329,6 @@ jobs:
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.actor }}
- IMAGE_TAG: "${{ inputs.image-tag }}"
JOB_ID: "python-api-client-tests"
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
VERBOSE: "true"
@@ -353,8 +350,11 @@ jobs:
fetch-depth: 1
persist-credentials: false
path: ./airflow-client-python
- - name: "Prepare breeze & CI image: ${{inputs.default-python-version}}:${{inputs.image-tag}}"
+ - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: "linux/amd64"
+ python: ${{ inputs.default-python-version }}
- name: "Generate airflow python client"
run: >
breeze release-management prepare-python-client --package-format both
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 09cc3328dd8..3ee18ec1a6e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -32,7 +32,7 @@ on: # yamllint disable-line rule:truthy
- providers-[a-z]+-?[a-z]*/v[0-9]+-[0-9]+
workflow_dispatch:
permissions:
- # All other permissions are set to none
+ # All other permissions are set to none by default
contents: read
# Technically read access while waiting for images should be more than enough. However,
# there is a bug in GitHub Actions/Packages and in case private repositories are used, you get a permission
@@ -44,7 +44,6 @@ env:
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.actor }}
- IMAGE_TAG: "${{ github.event.pull_request.head.sha || github.sha }}"
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
VERBOSE: "true"
@@ -64,7 +63,6 @@ jobs:
all-python-versions-list-as-string: >-
${{ steps.selective-checks.outputs.all-python-versions-list-as-string }}
basic-checks-only: ${{ steps.selective-checks.outputs.basic-checks-only }}
- build-job-description: ${{ steps.source-run-info.outputs.build-job-description }}
canary-run: ${{ steps.source-run-info.outputs.canary-run }}
chicken-egg-providers: ${{ steps.selective-checks.outputs.chicken-egg-providers }}
ci-image-build: ${{ steps.selective-checks.outputs.ci-image-build }}
@@ -88,8 +86,6 @@ jobs:
full-tests-needed: ${{ steps.selective-checks.outputs.full-tests-needed }}
has-migrations: ${{ steps.selective-checks.outputs.has-migrations }}
helm-test-packages: ${{ steps.selective-checks.outputs.helm-test-packages }}
- image-tag: ${{ github.event.pull_request.head.sha || github.sha }}
- in-workflow-build: ${{ steps.source-run-info.outputs.in-workflow-build }}
include-success-outputs: ${{ steps.selective-checks.outputs.include-success-outputs }}
individual-providers-test-types-list-as-string: >-
${{ steps.selective-checks.outputs.individual-providers-test-types-list-as-string }}
@@ -99,6 +95,7 @@ jobs:
is-k8s-runner: ${{ steps.selective-checks.outputs.is-k8s-runner }}
is-self-hosted-runner: ${{ steps.selective-checks.outputs.is-self-hosted-runner }}
is-vm-runner: ${{ steps.selective-checks.outputs.is-vm-runner }}
+ kubernetes-combos: ${{ steps.selective-checks.outputs.kubernetes-combos }}
kubernetes-combos-list-as-string: >-
${{ steps.selective-checks.outputs.kubernetes-combos-list-as-string }}
kubernetes-versions-list-as-string: >-
@@ -197,25 +194,21 @@ jobs:
canary-run: ${{needs.build-info.outputs.canary-run}}
latest-versions-only: ${{needs.build-info.outputs.latest-versions-only}}
build-ci-images:
- name: >
- ${{ needs.build-info.outputs.in-workflow-build == 'true' && 'Build' || 'Skip building' }}
- CI images in-workflow
+ name: Build CI images
needs: [build-info]
uses: ./.github/workflows/ci-image-build.yml
permissions:
contents: read
# This write is only given here for `push` events from "apache/airflow" repo. It is not given for PRs
# from forks. This is to prevent malicious PRs from creating images in the "apache/airflow" repo.
- # For regular build for PRS this "build-prod-images" workflow will be skipped anyway by the
- # "in-workflow-build" condition
packages: write
secrets: inherit
with:
runs-on-as-json-public: ${{ needs.build-info.outputs.runs-on-as-json-public }}
runs-on-as-json-self-hosted: ${{ needs.build-info.outputs.runs-on-as-json-self-hosted }}
- do-build: ${{ needs.build-info.outputs.in-workflow-build }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
platform: "linux/amd64"
+ push-image: "false"
+ upload-image-artifact: "true"
python-versions: ${{ needs.build-info.outputs.python-versions }}
branch: ${{ needs.build-info.outputs.default-branch }}
use-uv: ${{ needs.build-info.outputs.force-pip == 'true' && 'false' || 'true' }}
@@ -224,54 +217,15 @@ jobs:
docker-cache: ${{ needs.build-info.outputs.docker-cache }}
disable-airflow-repo-cache: ${{ needs.build-info.outputs.disable-airflow-repo-cache }}
- wait-for-ci-images:
- timeout-minutes: 120
- name: "Wait for CI images"
- runs-on: ${{ fromJSON(needs.build-info.outputs.runs-on-as-json-public) }}
- needs: [build-info, build-ci-images]
- if: needs.build-info.outputs.ci-image-build == 'true'
- env:
- BACKEND: sqlite
- # Force more parallelism for pull even on public images
- PARALLELISM: 6
- INCLUDE_SUCCESS_OUTPUTS: "${{needs.build-info.outputs.include-success-outputs}}"
- steps:
- - name: "Cleanup repo"
- shell: bash
- run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm -rf /workspace/*"
- if: needs.build-info.outputs.in-workflow-build == 'false'
- - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
- uses: actions/checkout@v4
- with:
- persist-credentials: false
- if: needs.build-info.outputs.in-workflow-build == 'false'
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- if: needs.build-info.outputs.in-workflow-build == 'false'
- - name: "Install Breeze"
- uses: ./.github/actions/breeze
- if: needs.build-info.outputs.in-workflow-build == 'false'
- - name: Login to ghcr.io
- run: echo "${{ env.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- if: needs.build-info.outputs.in-workflow-build == 'false'
- - name: Wait for CI images ${{ env.PYTHON_VERSIONS }}:${{ needs.build-info.outputs.image-tag }}
- id: wait-for-images
- run: breeze ci-image pull --run-in-parallel --wait-for-image --tag-as-latest
- env:
- PYTHON_VERSIONS: ${{ needs.build-info.outputs.python-versions-list-as-string }}
- DEBUG_RESOURCES: ${{needs.build-info.outputs.debug-resources}}
- if: needs.build-info.outputs.in-workflow-build == 'false'
-
additional-ci-image-checks:
name: "Additional CI image checks"
- needs: [build-info, wait-for-ci-images]
+ needs: [build-info, build-ci-images]
uses: ./.github/workflows/additional-ci-image-checks.yml
if: needs.build-info.outputs.canary-run == 'true'
with:
runs-on-as-json-default: ${{ needs.build-info.outputs.runs-on-as-json-default }}
runs-on-as-json-public: ${{ needs.build-info.outputs.runs-on-as-json-public }}
runs-on-as-json-self-hosted: ${{ needs.build-info.outputs.runs-on-as-json-self-hosted }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
python-versions: ${{ needs.build-info.outputs.python-versions }}
branch: ${{ needs.build-info.outputs.default-branch }}
constraints-branch: ${{ needs.build-info.outputs.default-constraints-branch }}
@@ -289,7 +243,7 @@ jobs:
generate-constraints:
name: "Generate constraints"
- needs: [build-info, wait-for-ci-images]
+ needs: [build-info, build-ci-images]
uses: ./.github/workflows/generate-constraints.yml
if: >
needs.build-info.outputs.ci-image-build == 'true' &&
@@ -300,19 +254,17 @@ jobs:
# 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
generate-no-providers-constraints: ${{ needs.build-info.outputs.canary-run }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
chicken-egg-providers: ${{ needs.build-info.outputs.chicken-egg-providers }}
debug-resources: ${{ needs.build-info.outputs.debug-resources }}
ci-image-checks:
name: "CI image checks"
- needs: [build-info, wait-for-ci-images]
+ needs: [build-info, build-ci-images]
uses: ./.github/workflows/ci-image-checks.yml
secrets: inherit
with:
runs-on-as-json-default: ${{ needs.build-info.outputs.runs-on-as-json-default }}
runs-on-as-json-docs-build: ${{ needs.build-info.outputs.runs-on-as-json-docs-build }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
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 }}
@@ -336,7 +288,7 @@ jobs:
providers:
name: "Provider packages tests"
uses: ./.github/workflows/test-provider-packages.yml
- needs: [build-info, wait-for-ci-images]
+ needs: [build-info, build-ci-images]
permissions:
contents: read
packages: read
@@ -346,7 +298,6 @@ jobs:
needs.build-info.outputs.latest-versions-only != 'true'
with:
runs-on-as-json-default: ${{ needs.build-info.outputs.runs-on-as-json-default }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
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 }}
@@ -360,7 +311,7 @@ jobs:
tests-helm:
name: "Helm tests"
uses: ./.github/workflows/helm-tests.yml
- needs: [build-info, wait-for-ci-images]
+ needs: [build-info, build-ci-images]
permissions:
contents: read
packages: read
@@ -369,7 +320,6 @@ jobs:
runs-on-as-json-default: ${{ needs.build-info.outputs.runs-on-as-json-default }}
runs-on-as-json-public: ${{ needs.build-info.outputs.runs-on-as-json-public }}
helm-test-packages: ${{ needs.build-info.outputs.helm-test-packages }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
default-python-version: ${{ needs.build-info.outputs.default-python-version }}
if: >
needs.build-info.outputs.needs-helm-tests == 'true' &&
@@ -379,7 +329,7 @@ jobs:
tests-postgres:
name: "Postgres tests"
uses: ./.github/workflows/run-unit-tests.yml
- needs: [build-info, wait-for-ci-images]
+ needs: [build-info, build-ci-images]
permissions:
contents: read
packages: read
@@ -390,7 +340,6 @@ jobs:
test-name: "Postgres"
test-scope: "DB"
test-groups: ${{ needs.build-info.outputs.test-groups }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
python-versions: ${{ needs.build-info.outputs.python-versions }}
backend-versions: ${{ needs.build-info.outputs.postgres-versions }}
excluded-providers-as-string: ${{ needs.build-info.outputs.excluded-providers-as-string }}
@@ -406,7 +355,7 @@ jobs:
tests-mysql:
name: "MySQL tests"
uses: ./.github/workflows/run-unit-tests.yml
- needs: [build-info, wait-for-ci-images]
+ needs: [build-info, build-ci-images]
permissions:
contents: read
packages: read
@@ -417,7 +366,6 @@ jobs:
test-name: "MySQL"
test-scope: "DB"
test-groups: ${{ needs.build-info.outputs.test-groups }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
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 }}
@@ -433,7 +381,7 @@ jobs:
tests-sqlite:
name: "Sqlite tests"
uses: ./.github/workflows/run-unit-tests.yml
- needs: [build-info, wait-for-ci-images]
+ needs: [build-info, build-ci-images]
permissions:
contents: read
packages: read
@@ -445,7 +393,6 @@ jobs:
test-name-separator: ""
test-scope: "DB"
test-groups: ${{ needs.build-info.outputs.test-groups }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
python-versions: ${{ needs.build-info.outputs.python-versions }}
# No versions for sqlite
backend-versions: "['']"
@@ -462,7 +409,7 @@ jobs:
tests-non-db:
name: "Non-DB tests"
uses: ./.github/workflows/run-unit-tests.yml
- needs: [build-info, wait-for-ci-images]
+ needs: [build-info, build-ci-images]
permissions:
contents: read
packages: read
@@ -474,7 +421,6 @@ jobs:
test-name-separator: ""
test-scope: "Non-DB"
test-groups: ${{ needs.build-info.outputs.test-groups }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
python-versions: ${{ needs.build-info.outputs.python-versions }}
# No versions for non-db
backend-versions: "['']"
@@ -490,7 +436,7 @@ jobs:
tests-special:
name: "Special tests"
uses: ./.github/workflows/special-tests.yml
- needs: [build-info, wait-for-ci-images]
+ needs: [build-info, build-ci-images]
permissions:
contents: read
packages: read
@@ -504,7 +450,6 @@ jobs:
test-groups: ${{ needs.build-info.outputs.test-groups }}
default-branch: ${{ needs.build-info.outputs.default-branch }}
runs-on-as-json-default: ${{ needs.build-info.outputs.runs-on-as-json-default }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
core-test-types-list-as-string: ${{ needs.build-info.outputs.core-test-types-list-as-string }}
providers-test-types-list-as-string: ${{ needs.build-info.outputs.providers-test-types-list-as-string }}
run-coverage: ${{ needs.build-info.outputs.run-coverage }}
@@ -519,7 +464,7 @@ jobs:
tests-integration-system:
name: Integration and System Tests
- needs: [build-info, wait-for-ci-images]
+ needs: [build-info, build-ci-images]
uses: ./.github/workflows/integration-system-tests.yml
permissions:
contents: read
@@ -527,7 +472,6 @@ jobs:
secrets: inherit
with:
runs-on-as-json-public: ${{ needs.build-info.outputs.runs-on-as-json-public }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
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 }}
@@ -541,7 +485,7 @@ jobs:
tests-with-lowest-direct-resolution:
name: "Lowest direct dependency providers tests"
- needs: [build-info, wait-for-ci-images]
+ needs: [build-info, build-ci-images]
uses: ./.github/workflows/run-unit-tests.yml
permissions:
contents: read
@@ -556,7 +500,6 @@ jobs:
test-scope: "All"
test-groups: ${{ needs.build-info.outputs.test-groups }}
backend: "postgres"
- image-tag: ${{ needs.build-info.outputs.image-tag }}
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 }}
@@ -570,30 +513,25 @@ jobs:
monitor-delay-time-in-seconds: 120
build-prod-images:
- name: >
- ${{ needs.build-info.outputs.in-workflow-build == 'true' && 'Build' || 'Skip building' }}
- PROD images in-workflow
+ name: Build PROD images
needs: [build-info, build-ci-images, generate-constraints]
uses: ./.github/workflows/prod-image-build.yml
permissions:
contents: read
# This write is only given here for `push` events from "apache/airflow" repo. It is not given for PRs
# from forks. This is to prevent malicious PRs from creating images in the "apache/airflow" repo.
- # For regular build for PRS this "build-prod-images" workflow will be skipped anyway by the
- # "in-workflow-build" condition
packages: write
secrets: inherit
with:
runs-on-as-json-public: ${{ needs.build-info.outputs.runs-on-as-json-public }}
build-type: "Regular"
- do-build: ${{ needs.build-info.outputs.in-workflow-build }}
- upload-package-artifact: "true"
- image-tag: ${{ needs.build-info.outputs.image-tag }}
platform: "linux/amd64"
+ push-image: "false"
+ upload-image-artifact: "true"
+ upload-package-artifact: "true"
python-versions: ${{ needs.build-info.outputs.python-versions }}
default-python-version: ${{ needs.build-info.outputs.default-python-version }}
branch: ${{ needs.build-info.outputs.default-branch }}
- push-image: "true"
use-uv: ${{ needs.build-info.outputs.force-pip == 'true' && 'false' || 'true' }}
build-provider-packages: ${{ needs.build-info.outputs.default-branch == 'main' }}
upgrade-to-newer-dependencies: ${{ needs.build-info.outputs.upgrade-to-newer-dependencies }}
@@ -602,58 +540,14 @@ jobs:
docker-cache: ${{ needs.build-info.outputs.docker-cache }}
disable-airflow-repo-cache: ${{ needs.build-info.outputs.disable-airflow-repo-cache }}
- wait-for-prod-images:
- timeout-minutes: 80
- name: "Wait for PROD images"
- runs-on: ${{ fromJSON(needs.build-info.outputs.runs-on-as-json-public) }}
- needs: [build-info, wait-for-ci-images, build-prod-images]
- if: needs.build-info.outputs.prod-image-build == 'true'
- env:
- BACKEND: sqlite
- PYTHON_MAJOR_MINOR_VERSION: "${{needs.build-info.outputs.default-python-version}}"
- # Force more parallelism for pull on public images
- PARALLELISM: 6
- INCLUDE_SUCCESS_OUTPUTS: "${{needs.build-info.outputs.include-success-outputs}}"
- IMAGE_TAG: ${{ needs.build-info.outputs.image-tag }}
- steps:
- - name: "Cleanup repo"
- shell: bash
- run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm -rf /workspace/*"
- if: needs.build-info.outputs.in-workflow-build == 'false'
- - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
- uses: actions/checkout@v4
- with:
- persist-credentials: false
- if: needs.build-info.outputs.in-workflow-build == 'false'
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- if: needs.build-info.outputs.in-workflow-build == 'false'
- - name: "Install Breeze"
- uses: ./.github/actions/breeze
- if: needs.build-info.outputs.in-workflow-build == 'false'
- - name: Login to ghcr.io
- run: echo "${{ env.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- if: needs.build-info.outputs.in-workflow-build == 'false'
- - name: Wait for PROD images ${{ env.PYTHON_VERSIONS }}:${{ needs.build-info.outputs.image-tag }}
- # We wait for the images to be available either from "build-images.yml' run as pull_request_target
- # or from build-prod-images (or build-prod-images-release-branch) above.
- # We are utilising single job to wait for all images because this job merely waits
- # For the images to be available.
- run: breeze prod-image pull --wait-for-image --run-in-parallel
- env:
- PYTHON_VERSIONS: ${{ needs.build-info.outputs.python-versions-list-as-string }}
- DEBUG_RESOURCES: ${{ needs.build-info.outputs.debug-resources }}
- if: needs.build-info.outputs.in-workflow-build == 'false'
-
additional-prod-image-tests:
name: "Additional PROD image tests"
- needs: [build-info, wait-for-prod-images, generate-constraints]
+ needs: [build-info, build-prod-images, generate-constraints]
uses: ./.github/workflows/additional-prod-image-tests.yml
with:
runs-on-as-json-public: ${{ needs.build-info.outputs.runs-on-as-json-public }}
default-branch: ${{ needs.build-info.outputs.default-branch }}
constraints-branch: ${{ needs.build-info.outputs.default-constraints-branch }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
upgrade-to-newer-dependencies: ${{ needs.build-info.outputs.upgrade-to-newer-dependencies }}
chicken-egg-providers: ${{ needs.build-info.outputs.chicken-egg-providers }}
docker-cache: ${{ needs.build-info.outputs.docker-cache }}
@@ -665,20 +559,19 @@ jobs:
tests-kubernetes:
name: "Kubernetes tests"
uses: ./.github/workflows/k8s-tests.yml
- needs: [build-info, wait-for-prod-images]
+ needs: [build-info, build-prod-images]
permissions:
contents: read
packages: read
secrets: inherit
with:
+ platform: "linux/amd64"
runs-on-as-json-default: ${{ needs.build-info.outputs.runs-on-as-json-default }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
python-versions-list-as-string: ${{ needs.build-info.outputs.python-versions-list-as-string }}
- kubernetes-versions-list-as-string: ${{ needs.build-info.outputs.kubernetes-versions-list-as-string }}
- kubernetes-combos-list-as-string: ${{ needs.build-info.outputs.kubernetes-combos-list-as-string }}
include-success-outputs: ${{ needs.build-info.outputs.include-success-outputs }}
use-uv: ${{ needs.build-info.outputs.force-pip == 'true' && 'false' || 'true' }}
debug-resources: ${{ needs.build-info.outputs.debug-resources }}
+ kubernetes-combos: ${{ needs.build-info.outputs.kubernetes-combos }}
if: >
( needs.build-info.outputs.run-kubernetes-tests == 'true' ||
needs.build-info.outputs.needs-helm-tests == 'true')
@@ -686,14 +579,13 @@ jobs:
tests-task-sdk:
name: "Task SDK tests"
uses: ./.github/workflows/task-sdk-tests.yml
- needs: [build-info, wait-for-ci-images]
+ needs: [build-info, build-ci-images]
permissions:
contents: read
packages: read
secrets: inherit
with:
runs-on-as-json-default: ${{ needs.build-info.outputs.runs-on-as-json-default }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
default-python-version: ${{ needs.build-info.outputs.default-python-version }}
python-versions: ${{ needs.build-info.outputs.python-versions }}
run-task-sdk-tests: ${{ needs.build-info.outputs.run-task-sdk-tests }}
@@ -711,8 +603,6 @@ jobs:
needs:
- build-info
- generate-constraints
- - wait-for-ci-images
- - wait-for-prod-images
- ci-image-checks
- tests-sqlite
- tests-mysql
@@ -723,13 +613,11 @@ jobs:
with:
runs-on-as-json-public: ${{ needs.build-info.outputs.runs-on-as-json-public }}
runs-on-as-json-self-hosted: ${{ needs.build-info.outputs.runs-on-as-json-self-hosted }}
- image-tag: ${{ needs.build-info.outputs.image-tag }}
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 }}
constraints-branch: ${{ needs.build-info.outputs.default-constraints-branch }}
default-python-version: ${{ needs.build-info.outputs.default-python-version }}
- in-workflow-build: ${{ needs.build-info.outputs.in-workflow-build }}
upgrade-to-newer-dependencies: ${{ needs.build-info.outputs.upgrade-to-newer-dependencies }}
include-success-outputs: ${{ needs.build-info.outputs.include-success-outputs }}
docker-cache: ${{ needs.build-info.outputs.docker-cache }}
diff --git a/.github/workflows/finalize-tests.yml b/.github/workflows/finalize-tests.yml
index 6f9bc74168b..b8fd240235f 100644
--- a/.github/workflows/finalize-tests.yml
+++ b/.github/workflows/finalize-tests.yml
@@ -28,10 +28,6 @@ on: # yamllint disable-line rule:truthy
description: "The array of labels (in json form) determining self-hosted runners."
required: true
type: string
- image-tag:
- description: "Tag to set for the image"
- required: true
- type: string
python-versions:
description: "JSON-formatted array of Python versions to test"
required: true
@@ -52,10 +48,6 @@ on: # yamllint disable-line rule:truthy
description: "Which version of python should be used by default"
required: true
type: string
- in-workflow-build:
- description: "Whether the build is executed as part of the workflow (true/false)"
- required: true
- type: string
upgrade-to-newer-dependencies:
description: "Whether to upgrade to newer dependencies (true/false)"
required: true
@@ -87,7 +79,6 @@ jobs:
env:
DEBUG_RESOURCES: ${{ inputs.debug-resources}}
PYTHON_VERSIONS: ${{ inputs.python-versions-list-as-string }}
- IMAGE_TAG: ${{ inputs.image-tag }}
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.actor }}
diff --git a/.github/workflows/generate-constraints.yml b/.github/workflows/generate-constraints.yml
index d6e536dfd09..332d32e3160 100644
--- a/.github/workflows/generate-constraints.yml
+++ b/.github/workflows/generate-constraints.yml
@@ -32,10 +32,6 @@ on: # yamllint disable-line rule:truthy
description: "Whether to generate constraints without providers (true/false)"
required: true
type: string
- image-tag:
- description: "Tag to set for the image"
- required: true
- type: string
chicken-egg-providers:
description: "Space-separated list of providers that should be installed from context files"
required: true
@@ -57,7 +53,6 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.actor }}
INCLUDE_SUCCESS_OUTPUTS: "true"
- IMAGE_TAG: ${{ inputs.image-tag }}
PYTHON_VERSIONS: ${{ inputs.python-versions-list-as-string }}
VERBOSE: "true"
VERSION_SUFFIX_FOR_PYPI: "dev0"
@@ -69,21 +64,15 @@ jobs:
uses: actions/checkout@v4
with:
persist-credentials: false
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- name: "Install Breeze"
uses: ./.github/actions/breeze
- - name: Login to ghcr.io
- run: echo "${{ env.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- - name: "\
- Pull CI images \
- ${{ inputs.python-versions-list-as-string }}:\
- ${{ inputs.image-tag }}"
- run: breeze ci-image pull --run-in-parallel --tag-as-latest
- - name: "
- Verify CI images \
- ${{ inputs.python-versions-list-as-string }}:\
- ${{ inputs.image-tag }}"
+ id: breeze
+ - name: "Prepare all CI images: ${{ inputs.python-versions-list-as-string}}"
+ uses: ./.github/actions/prepare_all_ci_images
+ with:
+ platform: "linux/amd64"
+ python-versions-list-as-string: ${{ inputs.python-versions-list-as-string }}
+ - name: "Verify all CI images ${{ inputs.python-versions-list-as-string }}"
run: breeze ci-image verify --run-in-parallel
- name: "Source constraints"
shell: bash
diff --git a/.github/workflows/helm-tests.yml b/.github/workflows/helm-tests.yml
index 4c1ec1023fc..d7f3f0b4d5b 100644
--- a/.github/workflows/helm-tests.yml
+++ b/.github/workflows/helm-tests.yml
@@ -32,10 +32,6 @@ on: # yamllint disable-line rule:truthy
description: "Stringified JSON array of helm test packages to test"
required: true
type: string
- image-tag:
- description: "Tag to set for the image"
- required: true
- type: string
default-python-version:
description: "Which version of python should be used by default"
required: true
@@ -57,7 +53,6 @@ jobs:
DB_RESET: "false"
JOB_ID: "helm-tests"
USE_XDIST: "true"
- IMAGE_TAG: "${{ inputs.image-tag }}"
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.actor }}
@@ -70,10 +65,11 @@ jobs:
uses: actions/checkout@v4
with:
persist-credentials: false
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- - name: "Prepare breeze & CI image: ${{inputs.default-python-version}}:${{inputs.image-tag}}"
+ - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: "linux/amd64"
+ python: ${{ inputs.default-python-version }}
- name: "Helm Unit Tests: ${{ matrix.helm-test-package }}"
run: breeze testing helm-tests --test-type "${{ matrix.helm-test-package }}"
diff --git a/.github/workflows/integration-system-tests.yml b/.github/workflows/integration-system-tests.yml
index 7fde2ae9683..0a6fd1fb406 100644
--- a/.github/workflows/integration-system-tests.yml
+++ b/.github/workflows/integration-system-tests.yml
@@ -24,10 +24,6 @@ on: # yamllint disable-line rule:truthy
description: "The array of labels (in json form) determining public runners."
required: true
type: string
- image-tag:
- description: "Tag to set for the image"
- required: true
- type: string
testable-core-integrations:
description: "The list of testable core integrations as JSON array."
required: true
@@ -75,7 +71,6 @@ jobs:
matrix:
integration: ${{ fromJSON(inputs.testable-core-integrations) }}
env:
- IMAGE_TAG: "${{ inputs.image-tag }}"
BACKEND: "postgres"
BACKEND_VERSION: ${{ inputs.default-postgres-version }}"
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
@@ -95,10 +90,11 @@ jobs:
uses: actions/checkout@v4
with:
persist-credentials: false
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}:${{ inputs.image-tag }}"
+ - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: "linux/amd64"
+ python: ${{ inputs.default-python-version }}
- name: "Integration: core ${{ matrix.integration }}"
# yamllint disable rule:line-length
run: ./scripts/ci/testing/run_integration_tests_with_retry.sh core "${{ matrix.integration }}"
@@ -121,7 +117,6 @@ jobs:
matrix:
integration: ${{ fromJSON(inputs.testable-providers-integrations) }}
env:
- IMAGE_TAG: "${{ inputs.image-tag }}"
BACKEND: "postgres"
BACKEND_VERSION: ${{ inputs.default-postgres-version }}"
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
@@ -141,10 +136,11 @@ jobs:
uses: actions/checkout@v4
with:
persist-credentials: false
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}:${{ inputs.image-tag }}"
+ - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: "linux/amd64"
+ python: ${{ inputs.default-python-version }}
- name: "Integration: providers ${{ matrix.integration }}"
run: ./scripts/ci/testing/run_integration_tests_with_retry.sh providers "${{ matrix.integration }}"
- name: "Post Tests success"
@@ -162,7 +158,6 @@ jobs:
name: "System Tests"
runs-on: ${{ fromJSON(inputs.runs-on-as-json-public) }}
env:
- IMAGE_TAG: "${{ inputs.image-tag }}"
BACKEND: "postgres"
BACKEND_VERSION: ${{ inputs.default-postgres-version }}"
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
@@ -182,10 +177,11 @@ jobs:
uses: actions/checkout@v4
with:
persist-credentials: false
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}:${{ inputs.image-tag }}"
+ - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: "linux/amd64"
+ python: ${{ inputs.default-python-version }}
- name: "System Tests"
run: >
./scripts/ci/testing/run_system_tests.sh
diff --git a/.github/workflows/k8s-tests.yml b/.github/workflows/k8s-tests.yml
index 3b3e067038d..6d9be7a13b7 100644
--- a/.github/workflows/k8s-tests.yml
+++ b/.github/workflows/k8s-tests.yml
@@ -20,24 +20,20 @@ name: K8s tests
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
- runs-on-as-json-default:
- description: "The array of labels (in json form) determining default runner used for the build."
+ platform:
+ description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
required: true
type: string
- image-tag:
- description: "Tag to set for the image"
+ runs-on-as-json-default:
+ description: "The array of labels (in json form) determining default runner used for the build."
required: true
type: string
python-versions-list-as-string:
description: "List of Python versions to test: space separated string"
required: true
type: string
- kubernetes-versions-list-as-string:
- description: "List of Kubernetes versions to test"
- required: true
- type: string
- kubernetes-combos-list-as-string:
- description: "List of combinations of Kubernetes and Python versions to test: space separated string"
+ kubernetes-combos:
+ description: "Array of combinations of Kubernetes and Python versions to test"
required: true
type: string
include-success-outputs:
@@ -55,19 +51,17 @@ on: # yamllint disable-line rule:truthy
jobs:
tests-kubernetes:
timeout-minutes: 240
- name: "\
- K8S System:${{ matrix.executor }} - ${{ matrix.use-standard-naming }} - \
- ${{ inputs.kubernetes-versions-list-as-string }}"
+ name: "K8S System:${{ matrix.executor }}-${{ matrix.kubernetes-combo }}-${{ matrix.use-standard-naming }}"
runs-on: ${{ fromJSON(inputs.runs-on-as-json-default) }}
strategy:
matrix:
executor: [KubernetesExecutor, CeleryExecutor, LocalExecutor]
use-standard-naming: [true, false]
+ kubernetes-combo: ${{ fromJSON(inputs.kubernetes-combos) }}
fail-fast: false
env:
DEBUG_RESOURCES: ${{ inputs.debug-resources }}
INCLUDE_SUCCESS_OUTPUTS: ${{ inputs.include-success-outputs }}
- IMAGE_TAG: ${{ inputs.image-tag }}
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.actor }}
@@ -76,23 +70,21 @@ jobs:
- name: "Cleanup repo"
shell: bash
run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm -rf /workspace/*"
+ - name: "Prepare PYTHON_MAJOR_MINOR_VERSION and KUBERNETES_VERSION"
+ id: prepare-versions
+ run: |
+ echo "PYTHON_MAJOR_MINOR_VERSION=${{ matrix.kubernetes-combo }}" | sed 's/-.*//' >> $GITHUB_ENV
+ echo "KUBERNETES_VERSION=${{ matrix.kubernetes-combo }}" | sed 's/=[^-]*-/=/' >> $GITHUB_ENV
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@v4
with:
persist-credentials: false
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- - name: "Install Breeze"
- uses: ./.github/actions/breeze
- id: breeze
- - name: Login to ghcr.io
- run: echo "${{ env.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- - name: Pull PROD images ${{ inputs.python-versions-list-as-string }}:${{ inputs.image-tag }}
- run: breeze prod-image pull --run-in-parallel --tag-as-latest
- env:
- PYTHON_VERSIONS: ${{ inputs.python-versions-list-as-string }}
- # Force more parallelism for pull even on public images
- PARALLELISM: 6
+ - name: "Prepare breeze & PROD image: ${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
+ uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: ${{ inputs.platform }}
+ image-type: 'PROD'
+ python: ${{ env.PYTHON_MAJOR_MINOR_VERSION }}
- name: "Cache bin folder with tools for kubernetes testing"
uses: actions/cache@v4
with:
@@ -103,26 +95,34 @@ jobs:
- name: "Switch breeze to use uv"
run: breeze setup config --use-uv
if: inputs.use-uv == 'true'
- - name: Run complete K8S tests ${{ inputs.kubernetes-combos-list-as-string }}
- run: breeze k8s run-complete-tests --run-in-parallel --upgrade --no-copy-local-sources
+ - name: "\
+ Run complete K8S tests ${{ matrix.executor }}-${{ env.PYTHON_MAJOR_MINOR_VERSION }}-\
+ ${{env.KUBERNETES_VERSION}}-${{ matrix.use-standard-naming }}"
+ run: breeze k8s run-complete-tests --upgrade --no-copy-local-sources
env:
- PYTHON_VERSIONS: ${{ inputs.python-versions-list-as-string }}
- KUBERNETES_VERSIONS: ${{ inputs.kubernetes-versions-list-as-string }}
EXECUTOR: ${{ matrix.executor }}
USE_STANDARD_NAMING: ${{ matrix.use-standard-naming }}
VERBOSE: "false"
- - name: Upload KinD logs on failure ${{ inputs.kubernetes-combos-list-as-string }}
+ - name: "\
+ Upload KinD logs on failure ${{ matrix.executor }}-${{ matrix.kubernetes-combo }}-\
+ ${{ matrix.use-standard-naming }}"
uses: actions/upload-artifact@v4
if: failure() || cancelled()
with:
- name: kind-logs-${{ matrix.executor }}-${{ matrix.use-standard-naming }}
+ name: "\
+ kind-logs-${{ matrix.kubernetes-combo }}-${{ matrix.executor }}-\
+ ${{ matrix.use-standard-naming }}"
path: /tmp/kind_logs_*
retention-days: 7
- - name: Upload test resource logs on failure ${{ inputs.kubernetes-combos-list-as-string }}
+ - name: "\
+ Upload test resource logs on failure ${{ matrix.executor }}-${{ matrix.kubernetes-combo }}-\
+ ${{ matrix.use-standard-naming }}"
uses: actions/upload-artifact@v4
if: failure() || cancelled()
with:
- name: k8s-test-resources-${{ matrix.executor }}-${{ matrix.use-standard-naming }}
+ name: "\
+ k8s-test-resources-${{ matrix.kubernetes-combo }}-${{ matrix.executor }}-\
+ ${{ matrix.use-standard-naming }}"
path: /tmp/k8s_test_resources_*
retention-days: 7
- name: "Delete clusters just in case they are left"
diff --git a/.github/workflows/prod-image-build.yml b/.github/workflows/prod-image-build.yml
index df4f24981ff..e0a27709df7 100644
--- a/.github/workflows/prod-image-build.yml
+++ b/.github/workflows/prod-image-build.yml
@@ -30,13 +30,6 @@ on: # yamllint disable-line rule:truthy
variations.
required: true
type: string
- do-build:
- description: >
- Whether to actually do the build (true/false). If set to false, the build is done
- already in pull-request-target workflow, so we skip it here.
- required: false
- default: "true"
- type: string
upload-package-artifact:
description: >
Whether to upload package artifacts (true/false). If false, the job will rely on artifacts prepared
@@ -62,6 +55,11 @@ on: # yamllint disable-line rule:truthy
description: "Whether to push image to the registry (true/false)"
required: true
type: string
+ upload-image-artifact:
+ description: "Whether to upload docker image artifact"
+ required: false
+ default: "false"
+ type: string
debian-version:
description: "Base Debian distribution to use for the build (bookworm)"
type: string
@@ -74,10 +72,6 @@ on: # yamllint disable-line rule:truthy
description: "Whether to use uv to build the image (true/false)"
required: true
type: string
- image-tag:
- description: "Tag to set for the image"
- required: true
- type: string
python-versions:
description: "JSON-formatted array of Python versions to build images from"
required: true
@@ -121,7 +115,7 @@ on: # yamllint disable-line rule:truthy
jobs:
build-prod-packages:
- name: "${{ inputs.do-build == 'true' && 'Build' || 'Skip building' }} Airflow and provider packages"
+ name: "Build Airflow and provider packages"
timeout-minutes: 10
runs-on: ${{ fromJSON(inputs.runs-on-as-json-public) }}
env:
@@ -131,32 +125,25 @@ jobs:
- name: "Cleanup repo"
shell: bash
run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm -rf /workspace/*"
- if: inputs.do-build == 'true' && inputs.upload-package-artifact == 'true'
+ if: inputs.upload-package-artifact == 'true'
- name: "Checkout target branch"
uses: actions/checkout@v4
with:
persist-credentials: false
- - name: "Checkout target commit"
- uses: ./.github/actions/checkout_target_commit
- with:
- target-commit-sha: ${{ inputs.target-commit-sha }}
- pull-request-target: ${{ inputs.pull-request-target }}
- is-committer-build: ${{ inputs.is-committer-build }}
- if: inputs.do-build == 'true' && inputs.upload-package-artifact == 'true'
- name: "Cleanup docker"
run: ./scripts/ci/cleanup_docker.sh
- if: inputs.do-build == 'true' && inputs.upload-package-artifact == 'true'
+ if: inputs.upload-package-artifact == 'true'
- uses: actions/setup-python@v5
with:
python-version: "${{ inputs.default-python-version }}"
- if: inputs.do-build == 'true' && inputs.upload-package-artifact == 'true'
+ if: inputs.upload-package-artifact == 'true'
- name: "Cleanup dist and context file"
shell: bash
run: rm -fv ./dist/* ./docker-context-files/*
- if: inputs.do-build == 'true' && inputs.upload-package-artifact == 'true'
+ if: inputs.upload-package-artifact == 'true'
- name: "Install Breeze"
uses: ./.github/actions/breeze
- if: inputs.do-build == 'true' && inputs.upload-package-artifact == 'true'
+ if: inputs.upload-package-artifact == 'true'
- name: "Prepare providers packages"
shell: bash
run: >
@@ -164,7 +151,6 @@ jobs:
--package-list-file ./prod_image_installed_providers.txt
--package-format wheel
if: >
- inputs.do-build == 'true' &&
inputs.upload-package-artifact == 'true' &&
inputs.build-provider-packages == 'true'
- name: "Prepare chicken-eggs provider packages"
@@ -173,19 +159,18 @@ jobs:
breeze release-management prepare-provider-packages
--package-format wheel ${{ inputs.chicken-egg-providers }}
if: >
- inputs.do-build == 'true' &&
inputs.upload-package-artifact == 'true' &&
inputs.chicken-egg-providers != ''
- name: "Prepare airflow package"
shell: bash
run: >
breeze release-management prepare-airflow-package --package-format wheel
- if: inputs.do-build == 'true' && inputs.upload-package-artifact == 'true'
+ if: inputs.upload-package-artifact == 'true'
- name: "Prepare task-sdk package"
shell: bash
run: >
breeze release-management prepare-task-sdk-package --package-format wheel
- if: inputs.do-build == 'true' && inputs.upload-package-artifact == 'true'
+ if: inputs.upload-package-artifact == 'true'
- name: "Upload prepared packages as artifacts"
uses: actions/upload-artifact@v4
with:
@@ -193,25 +178,21 @@ jobs:
path: ./dist
retention-days: 7
if-no-files-found: error
- if: inputs.do-build == 'true' && inputs.upload-package-artifact == 'true'
+ if: inputs.upload-package-artifact == 'true'
build-prod-images:
strategy:
fail-fast: false
matrix:
- # yamllint disable-line rule:line-length
- python-version: ${{ inputs.do-build == 'true' && fromJSON(inputs.python-versions) || fromJSON('[""]') }}
+ python-version: ${{ fromJSON(inputs.python-versions) || fromJSON('[""]') }}
timeout-minutes: 80
- name: "\
-${{ inputs.do-build == 'true' && 'Build' || 'Skip building' }} \
-PROD ${{ inputs.build-type }} image\
-${{ matrix.python-version }}${{ inputs.do-build == 'true' && ':' || '' }}\
-${{ inputs.do-build == 'true' && inputs.image-tag || '' }}"
+ name: "Build PROD ${{ inputs.build-type }} image ${{ matrix.python-version }}"
runs-on: ${{ fromJSON(inputs.runs-on-as-json-public) }}
needs:
- build-prod-packages
env:
BACKEND: sqlite
+ PYTHON_MAJOR_MINOR_VERSION: "${{ matrix.python-version }}"
DEFAULT_BRANCH: ${{ inputs.branch }}
DEFAULT_CONSTRAINTS_BRANCH: ${{ inputs.constraints-branch }}
VERSION_SUFFIX_FOR_PYPI: ${{ inputs.branch == 'main' && 'dev0' || '' }}
@@ -231,57 +212,42 @@ ${{ inputs.do-build == 'true' && inputs.image-tag || '' }}"
- name: "Cleanup repo"
shell: bash
run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm -rf /workspace/*"
- if: inputs.do-build == 'true'
- name: "Checkout target branch"
uses: actions/checkout@v4
with:
persist-credentials: false
- - name: "Checkout target commit"
- uses: ./.github/actions/checkout_target_commit
- with:
- target-commit-sha: ${{ inputs.target-commit-sha }}
- pull-request-target: ${{ inputs.pull-request-target }}
- is-committer-build: ${{ inputs.is-committer-build }}
- if: inputs.do-build == 'true'
- name: "Cleanup docker"
run: ./scripts/ci/cleanup_docker.sh
- if: inputs.do-build == 'true'
- name: "Install Breeze"
uses: ./.github/actions/breeze
- if: inputs.do-build == 'true'
- - name: "Regenerate dependencies in case they was modified manually so that we can build an image"
- shell: bash
- run: |
- pip install rich>=12.4.4 pyyaml
- python scripts/ci/pre_commit/update_providers_dependencies.py
- if: inputs.do-build == 'true' && inputs.upgrade-to-newer-dependencies != 'false'
- name: "Cleanup dist and context file"
shell: bash
run: rm -fv ./dist/* ./docker-context-files/*
- if: inputs.do-build == 'true'
+ - name: "Restore PROD docker image ${{ inputs.platform }}:${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
+ uses: apache/infrastructure-actions/stash/restore@c94b890bbedc2fc61466d28e6bd9966bc6c6643c
+ with:
+ key: "prod-image-save-${{ inputs.platform }}-${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
+ path: "/tmp/"
+ - name: "Load PROD image ${{ inputs.platform }}:${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
+ run: breeze prod-image load --platform ${{ inputs.platform }}
+ shell: bash
- name: "Download packages prepared as artifacts"
uses: actions/download-artifact@v4
with:
name: prod-packages
path: ./docker-context-files
- if: inputs.do-build == 'true'
- name: "Download constraints"
uses: actions/download-artifact@v4
with:
name: constraints
path: ./docker-context-files
- if: inputs.do-build == 'true'
- - name: Login to ghcr.io
- shell: bash
- run: echo "${{ env.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- if: inputs.do-build == 'true'
- - name: "Build PROD images w/ source providers ${{ matrix.python-version }}:${{ inputs.image-tag }}"
+ - name: "Build PROD images w/ source providers ${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
shell: bash
run: >
- breeze prod-image build --tag-as-latest --image-tag "${{ inputs.image-tag }}"
+ breeze prod-image build
--commit-sha "${{ github.sha }}"
--install-packages-from-context --airflow-constraints-mode constraints-source-providers
- --use-constraints-for-context-packages --python "${{ matrix.python-version }}"
+ --use-constraints-for-context-packages
env:
PUSH: ${{ inputs.push-image }}
DOCKER_CACHE: ${{ inputs.docker-cache }}
@@ -290,14 +256,14 @@ ${{ inputs.do-build == 'true' && inputs.image-tag || '' }}"
INSTALL_MYSQL_CLIENT_TYPE: ${{ inputs.install-mysql-client-type }}
UPGRADE_TO_NEWER_DEPENDENCIES: ${{ inputs.upgrade-to-newer-dependencies }}
INCLUDE_NOT_READY_PROVIDERS: "true"
- if: inputs.do-build == 'true' && inputs.build-provider-packages == 'true'
- - name: "Build PROD images with PyPi providers ${{ matrix.python-version }}:${{ inputs.image-tag }}"
+ if: inputs.build-provider-packages == 'true'
+ - name: "Build PROD images with PyPi providers ${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
shell: bash
run: >
- breeze prod-image build --builder airflow_cache --tag-as-latest
- --image-tag "${{ inputs.image-tag }}" --commit-sha "${{ github.sha }}"
+ breeze prod-image build --builder airflow_cache
+ --commit-sha "${{ github.sha }}"
--install-packages-from-context --airflow-constraints-mode constraints
- --use-constraints-for-context-packages --python "${{ matrix.python-version }}"
+ --use-constraints-for-context-packages
env:
PUSH: ${{ inputs.push-image }}
DOCKER_CACHE: ${{ inputs.docker-cache }}
@@ -306,9 +272,18 @@ ${{ inputs.do-build == 'true' && inputs.image-tag || '' }}"
INSTALL_MYSQL_CLIENT_TYPE: ${{ inputs.install-mysql-client-type }}
UPGRADE_TO_NEWER_DEPENDENCIES: ${{ inputs.upgrade-to-newer-dependencies }}
INCLUDE_NOT_READY_PROVIDERS: "true"
- if: inputs.do-build == 'true' && inputs.build-provider-packages != 'true'
- - name: Verify PROD image ${{ matrix.python-version }}:${{ inputs.image-tag }}
+ if: inputs.build-provider-packages != 'true'
+ - name: Verify PROD image ${{ env.PYTHON_MAJOR_MINOR_VERSION }}
+ run: breeze prod-image verify
+ - name: "Export PROD docker image ${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
run: >
- breeze prod-image verify --image-tag "${{ inputs.image-tag }}"
- --python "${{ matrix.python-version }}"
- if: inputs.do-build == 'true'
+ breeze prod-image save --platform "${{ inputs.platform }}"
+ if: inputs.upload-image-artifact == 'true'
+ - name: "Stash PROD docker image ${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
+ uses: apache/infrastructure-actions/stash/save@c94b890bbedc2fc61466d28e6bd9966bc6c6643c
+ with:
+ key: "prod-image-save-${{ inputs.platform }}-${{ env.PYTHON_MAJOR_MINOR_VERSION }}"
+ path: "/tmp/prod-image-save-*-${{ env.PYTHON_MAJOR_MINOR_VERSION }}.tar"
+ if-no-files-found: 'error'
+ retention-days: 2
+ if: inputs.upload-image-artifact == 'true'
diff --git a/.github/workflows/prod-image-extra-checks.yml b/.github/workflows/prod-image-extra-checks.yml
index bb63faef7b2..33ebc4700da 100644
--- a/.github/workflows/prod-image-extra-checks.yml
+++ b/.github/workflows/prod-image-extra-checks.yml
@@ -40,9 +40,6 @@ on: # yamllint disable-line rule:truthy
description: "Whether to use uv to build the image (true/false)"
required: true
type: string
- image-tag:
- required: true
- type: string
build-provider-packages:
description: "Whether to build provider packages (true/false). If false providers are from PyPI"
required: true
@@ -74,7 +71,6 @@ jobs:
runs-on-as-json-public: ${{ inputs.runs-on-as-json-public }}
build-type: "MySQL Client"
upload-package-artifact: "false"
- image-tag: mysql-${{ inputs.image-tag }}
install-mysql-client-type: "mysql"
python-versions: ${{ inputs.python-versions }}
default-python-version: ${{ inputs.default-python-version }}
@@ -98,7 +94,6 @@ jobs:
runs-on-as-json-public: ${{ inputs.runs-on-as-json-public }}
build-type: "pip"
upload-package-artifact: "false"
- image-tag: mysql-${{ inputs.image-tag }}
install-mysql-client-type: "mysql"
python-versions: ${{ inputs.python-versions }}
default-python-version: ${{ inputs.default-python-version }}
diff --git a/.github/workflows/release_dockerhub_image.yml b/.github/workflows/release_dockerhub_image.yml
index 5ce1585131f..46705c6a106 100644
--- a/.github/workflows/release_dockerhub_image.yml
+++ b/.github/workflows/release_dockerhub_image.yml
@@ -47,7 +47,7 @@ jobs:
defaultPythonVersion: ${{ steps.selective-checks.outputs.default-python-version }}
chicken-egg-providers: ${{ steps.selective-checks.outputs.chicken-egg-providers }}
skipLatest: ${{ github.event.inputs.skipLatest == '' && ' ' || '--skip-latest' }}
- limitPlatform: ${{ github.repository == 'apache/airflow' && ' ' || '--limit-platform linux/amd64' }}
+ limitPlatform: ${{ github.repository == 'apache/airflow' && ' ' || '--limit-platform amd64' }}
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
VERBOSE: true
diff --git a/.github/workflows/run-unit-tests.yml b/.github/workflows/run-unit-tests.yml
index 6b491f6bff4..3a9440e528e 100644
--- a/.github/workflows/run-unit-tests.yml
+++ b/.github/workflows/run-unit-tests.yml
@@ -45,10 +45,6 @@ on: # yamllint disable-line rule:truthy
required: false
default: ":"
type: string
- image-tag:
- description: "Tag to set for the image"
- required: true
- type: string
python-versions:
description: "The list of python versions (stringified JSON array) to run the tests on."
required: true
@@ -144,7 +140,6 @@ jobs:
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.actor }}
- IMAGE_TAG: "${{ inputs.image-tag }}"
INCLUDE_SUCCESS_OUTPUTS: ${{ inputs.include-success-outputs }}
# yamllint disable rule:line-length
JOB_ID: "${{ matrix.test-group }}-${{ inputs.test-scope }}-${{ inputs.test-name }}-${{inputs.backend}}-${{ matrix.backend-version }}-${{ matrix.python-version }}"
@@ -163,10 +158,11 @@ jobs:
uses: actions/checkout@v4
with:
persist-credentials: false
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- - name: "Prepare breeze & CI image: ${{matrix.python-version}}:${{ inputs.image-tag }}"
+ - name: "Prepare breeze & CI image: ${{ matrix.python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: "linux/amd64"
+ python: ${{ matrix.python-version }}
- name: >
Migration Tests: ${{ matrix.python-version }}:${{ env.PARALLEL_TEST_TYPES }}
uses: ./.github/actions/migration_tests
diff --git a/.github/workflows/special-tests.yml b/.github/workflows/special-tests.yml
index decc7271b72..d416d55575f 100644
--- a/.github/workflows/special-tests.yml
+++ b/.github/workflows/special-tests.yml
@@ -32,10 +32,6 @@ on: # yamllint disable-line rule:truthy
description: "The json representing list of test test groups to run"
required: true
type: string
- image-tag:
- description: "Tag to set for the image"
- required: true
- type: string
core-test-types-list-as-string:
description: "The list of core test types to run separated by spaces"
required: true
@@ -96,7 +92,6 @@ jobs:
test-scope: "DB"
test-groups: ${{ inputs.test-groups }}
backend: "postgres"
- image-tag: ${{ inputs.image-tag }}
python-versions: "['${{ inputs.default-python-version }}']"
backend-versions: "['${{ inputs.default-postgres-version }}']"
excluded-providers-as-string: ${{ inputs.excluded-providers-as-string }}
@@ -120,7 +115,6 @@ jobs:
test-scope: "All"
test-groups: ${{ inputs.test-groups }}
backend: "postgres"
- image-tag: ${{ inputs.image-tag }}
python-versions: "['${{ inputs.default-python-version }}']"
backend-versions: "['${{ inputs.default-postgres-version }}']"
excluded-providers-as-string: ${{ inputs.excluded-providers-as-string }}
@@ -145,7 +139,6 @@ jobs:
test-scope: "All"
test-groups: ${{ inputs.test-groups }}
backend: "postgres"
- image-tag: ${{ inputs.image-tag }}
python-versions: "['${{ inputs.default-python-version }}']"
backend-versions: "['${{ inputs.default-postgres-version }}']"
excluded-providers-as-string: ${{ inputs.excluded-providers-as-string }}
@@ -169,7 +162,6 @@ jobs:
test-scope: "Quarantined"
test-groups: ${{ inputs.test-groups }}
backend: "postgres"
- image-tag: ${{ inputs.image-tag }}
python-versions: "['${{ inputs.default-python-version }}']"
backend-versions: "['${{ inputs.default-postgres-version }}']"
excluded-providers-as-string: ${{ inputs.excluded-providers-as-string }}
@@ -193,7 +185,6 @@ jobs:
test-scope: "ARM collection"
test-groups: ${{ inputs.test-groups }}
backend: "postgres"
- image-tag: ${{ inputs.image-tag }}
python-versions: "['${{ inputs.default-python-version }}']"
backend-versions: "['${{ inputs.default-postgres-version }}']"
excluded-providers-as-string: ${{ inputs.excluded-providers-as-string }}
@@ -218,7 +209,6 @@ jobs:
test-scope: "System"
test-groups: ${{ inputs.test-groups }}
backend: "postgres"
- image-tag: ${{ inputs.image-tag }}
python-versions: "['${{ inputs.default-python-version }}']"
backend-versions: "['${{ inputs.default-postgres-version }}']"
excluded-providers-as-string: ${{ inputs.excluded-providers-as-string }}
diff --git a/.github/workflows/task-sdk-tests.yml b/.github/workflows/task-sdk-tests.yml
index acc9872e6ed..756a66e5464 100644
--- a/.github/workflows/task-sdk-tests.yml
+++ b/.github/workflows/task-sdk-tests.yml
@@ -24,10 +24,6 @@ on: # yamllint disable-line rule:truthy
description: "The array of labels (in json form) determining default runner used for the build."
required: true
type: string
- image-tag:
- description: "Tag to set for the image"
- required: true
- type: string
default-python-version:
description: "Which version of python should be used by default"
required: true
@@ -53,7 +49,6 @@ jobs:
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.actor }}
- IMAGE_TAG: "${{ inputs.image-tag }}"
INCLUDE_NOT_READY_PROVIDERS: "true"
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
VERBOSE: "true"
@@ -66,10 +61,11 @@ jobs:
uses: actions/checkout@v4
with:
persist-credentials: false
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- - name: "Prepare breeze & CI image: ${{ matrix.python-version }}:${{ inputs.image-tag }}"
+ - name: "Prepare breeze & CI image: ${{ matrix.python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: "linux/amd64"
+ python: ${{ matrix.python-version }}
- name: "Cleanup dist files"
run: rm -fv ./dist/*
- name: "Prepare Task SDK packages: wheel"
diff --git a/.github/workflows/test-provider-packages.yml b/.github/workflows/test-provider-packages.yml
index 08715af6b58..d9716c164f3 100644
--- a/.github/workflows/test-provider-packages.yml
+++ b/.github/workflows/test-provider-packages.yml
@@ -24,10 +24,6 @@ on: # yamllint disable-line rule:truthy
description: "The array of labels (in json form) determining default runner used for the build."
required: true
type: string
- image-tag:
- description: "Tag to set for the image"
- required: true
- type: string
canary-run:
description: "Whether this is a canary run"
required: true
@@ -75,7 +71,6 @@ jobs:
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.actor }}
- IMAGE_TAG: "${{ inputs.image-tag }}"
INCLUDE_NOT_READY_PROVIDERS: "true"
PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
VERBOSE: "true"
@@ -87,11 +82,11 @@ jobs:
uses: actions/checkout@v4
with:
persist-credentials: false
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- - name: >
- Prepare breeze & CI image: ${{ inputs.default-python-version }}:${{ inputs.image-tag }}
+ - name: "Prepare breeze & CI image: ${{ inputs.default-python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: "linux/amd64"
+ python: ${{ inputs.default-python-version }}
- name: "Cleanup dist files"
run: rm -fv ./dist/*
- name: "Prepare provider documentation"
@@ -161,9 +156,8 @@ jobs:
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_USERNAME: ${{ github.actor }}
- IMAGE_TAG: "${{ inputs.image-tag }}"
INCLUDE_NOT_READY_PROVIDERS: "true"
- PYTHON_MAJOR_MINOR_VERSION: "${{ inputs.default-python-version }}"
+ PYTHON_MAJOR_MINOR_VERSION: "${{ matrix.python-version }}"
VERSION_SUFFIX_FOR_PYPI: "dev0"
VERBOSE: "true"
CLEAN_AIRFLOW_INSTALLATION: "${{ inputs.canary-run }}"
@@ -176,10 +170,11 @@ jobs:
uses: actions/checkout@v4
with:
persist-credentials: false
- - name: "Cleanup docker"
- run: ./scripts/ci/cleanup_docker.sh
- - name: "Prepare breeze & CI image: ${{ matrix.python-version }}:${{ inputs.image-tag }}"
+ - name: "Prepare breeze & CI image: ${{ matrix.python-version }}"
uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: "linux/amd64"
+ python: ${{ matrix.python-version }}
- name: "Cleanup dist files"
run: rm -fv ./dist/*
- name: "Prepare provider packages: wheel"
diff --git a/Dockerfile b/Dockerfile
index fe49db18647..f32fbef633b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -422,85 +422,6 @@ common::show_packaging_tool_version_and_location
common::install_packaging_tools
EOF
-# The content below is automatically copied from scripts/docker/install_airflow_dependencies_from_branch_tip.sh
-COPY <<"EOF" /install_airflow_dependencies_from_branch_tip.sh
-#!/usr/bin/env bash
-
-. "$( dirname "${BASH_SOURCE[0]}" )/common.sh"
-
-: "${AIRFLOW_REPO:?Should be set}"
-: "${AIRFLOW_BRANCH:?Should be set}"
-: "${INSTALL_MYSQL_CLIENT:?Should be true or false}"
-: "${INSTALL_POSTGRES_CLIENT:?Should be true or false}"
-
-function install_airflow_dependencies_from_branch_tip() {
- echo
- echo "${COLOR_BLUE}Installing airflow from ${AIRFLOW_BRANCH}. It is used to cache dependencies${COLOR_RESET}"
- echo
- if [[ ${INSTALL_MYSQL_CLIENT} != "true" ]]; then
- AIRFLOW_EXTRAS=${AIRFLOW_EXTRAS/mysql,}
- fi
- if [[ ${INSTALL_POSTGRES_CLIENT} != "true" ]]; then
- AIRFLOW_EXTRAS=${AIRFLOW_EXTRAS/postgres,}
- fi
- local TEMP_AIRFLOW_DIR
- TEMP_AIRFLOW_DIR=$(mktemp -d)
- # Install latest set of dependencies - without constraints. This is to download a "base" set of
- # dependencies that we can cache and reuse when installing airflow using constraints and latest
- # pyproject.toml in the next step (when we install regular airflow).
- set -x
- curl -fsSL "https://github.com/${AIRFLOW_REPO}/archive/${AIRFLOW_BRANCH}.tar.gz" | \
- tar xz -C "${TEMP_AIRFLOW_DIR}" --strip 1
- # Make sure editable dependencies are calculated when devel-ci dependencies are installed
- ${PACKAGING_TOOL_CMD} install ${EXTRA_INSTALL_FLAGS} ${ADDITIONAL_PIP_INSTALL_FLAGS} \
- --editable "${TEMP_AIRFLOW_DIR}[${AIRFLOW_EXTRAS}]"
- set +x
- common::install_packaging_tools
- set -x
- echo "${COLOR_BLUE}Uninstalling providers. Dependencies remain${COLOR_RESET}"
- # Uninstall airflow and providers to keep only the dependencies. In the future when
- # planned https://github.com/pypa/pip/issues/11440 is implemented in pip we might be able to use this
- # flag and skip the remove step.
- pip freeze | grep apache-airflow-providers | xargs ${PACKAGING_TOOL_CMD} uninstall ${EXTRA_UNINSTALL_FLAGS} || true
- set +x
- echo
- echo "${COLOR_BLUE}Uninstalling just airflow. Dependencies remain. Now target airflow can be reinstalled using mostly cached dependencies${COLOR_RESET}"
- echo
- set +x
- ${PACKAGING_TOOL_CMD} uninstall ${EXTRA_UNINSTALL_FLAGS} apache-airflow
- rm -rf "${TEMP_AIRFLOW_DIR}"
- set -x
- # If you want to make sure dependency is removed from cache in your PR when you removed it from
- # pyproject.toml - please add your dependency here as a list of strings
- # for example:
- # DEPENDENCIES_TO_REMOVE=("package_a" "package_b")
- # Once your PR is merged, you should make a follow-up PR to remove it from this list
- # and increase the AIRFLOW_CI_BUILD_EPOCH in Dockerfile.ci to make sure your cache is rebuilt.
- local DEPENDENCIES_TO_REMOVE
- # IMPORTANT!! Make sure to increase AIRFLOW_CI_BUILD_EPOCH in Dockerfile.ci when you remove a dependency from that list
- DEPENDENCIES_TO_REMOVE=()
- if [[ "${DEPENDENCIES_TO_REMOVE[*]}" != "" ]]; then
- echo
- echo "${COLOR_BLUE}Uninstalling just removed dependencies (temporary until cache refreshes)${COLOR_RESET}"
- echo "${COLOR_BLUE}Dependencies to uninstall: ${DEPENDENCIES_TO_REMOVE[*]}${COLOR_RESET}"
- echo
- set +x
- ${PACKAGING_TOOL_CMD} uninstall "${DEPENDENCIES_TO_REMOVE[@]}" || true
- set -x
- # make sure that the dependency is not needed by something else
- pip check
- fi
-}
-
-common::get_colors
-common::get_packaging_tool
-common::get_airflow_version_specification
-common::get_constraints_location
-common::show_packaging_tool_version_and_location
-
-install_airflow_dependencies_from_branch_tip
-EOF
-
# The content below is automatically copied from scripts/docker/common.sh
COPY <<"EOF" /common.sh
#!/usr/bin/env bash
@@ -524,8 +445,6 @@ function common::get_packaging_tool() {
## IMPORTANT: IF YOU MODIFY THIS FUNCTION YOU SHOULD ALSO MODIFY CORRESPONDING FUNCTION IN
## `scripts/in_container/_in_container_utils.sh`
- local PYTHON_BIN
- PYTHON_BIN=$(which python)
if [[ ${AIRFLOW_USE_UV} == "true" ]]; then
echo
echo "${COLOR_BLUE}Using 'uv' to install Airflow${COLOR_RESET}"
@@ -533,8 +452,8 @@ function common::get_packaging_tool() {
export PACKAGING_TOOL="uv"
export PACKAGING_TOOL_CMD="uv pip"
if [[ -z ${VIRTUAL_ENV=} ]]; then
- export EXTRA_INSTALL_FLAGS="--python ${PYTHON_BIN}"
- export EXTRA_UNINSTALL_FLAGS="--python ${PYTHON_BIN}"
+ export EXTRA_INSTALL_FLAGS="--system"
+ export EXTRA_UNINSTALL_FLAGS="--system"
else
export EXTRA_INSTALL_FLAGS=""
export EXTRA_UNINSTALL_FLAGS=""
@@ -900,18 +819,12 @@ function install_airflow() {
# Determine the installation_command_flags based on AIRFLOW_INSTALLATION_METHOD method
local installation_command_flags
if [[ ${AIRFLOW_INSTALLATION_METHOD} == "." ]]; then
- # We need _a_ file in there otherwise the editable install doesn't include anything in the .pth file
- mkdir -p ./providers/src/airflow/providers/
- touch ./providers/src/airflow/providers/__init__.py
-
- # Similarly we need _a_ file for task_sdk too
- mkdir -p ./task_sdk/src/airflow/sdk/
- echo '__version__ = "0.0.0dev0"' > ./task_sdk/src/airflow/sdk/__init__.py
-
- trap 'rm -f ./providers/src/airflow/providers/__init__.py ./task_sdk/src/airflow/__init__.py 2>/dev/null' EXIT
-
# When installing from sources - we always use `--editable` mode
- installation_command_flags="--editable .[${AIRFLOW_EXTRAS}]${AIRFLOW_VERSION_SPECIFICATION} --editable ./providers --editable ./task_sdk"
+ installation_command_flags="--editable .[${AIRFLOW_EXTRAS}]${AIRFLOW_VERSION_SPECIFICATION} --editable ./task_sdk"
+ while IFS= read -r -d '' pyproject_toml_file; do
+ project_folder=$(dirname ${pyproject_toml_file})
+ installation_command_flags="${installation_command_flags} --editable ${project_folder}"
+ done < <(find "providers" -name "pyproject.toml" -print0)
elif [[ ${AIRFLOW_INSTALLATION_METHOD} == "apache-airflow" ]]; then
installation_command_flags="apache-airflow[${AIRFLOW_EXTRAS}]${AIRFLOW_VERSION_SPECIFICATION}"
elif [[ ${AIRFLOW_INSTALLATION_METHOD} == apache-airflow\ @\ * ]]; then
@@ -1407,7 +1320,8 @@ ARG PYTHON_BASE_IMAGE
ENV PYTHON_BASE_IMAGE=${PYTHON_BASE_IMAGE} \
DEBIAN_FRONTEND=noninteractive LANGUAGE=C.UTF-8 LANG=C.UTF-8 LC_ALL=C.UTF-8 \
LC_CTYPE=C.UTF-8 LC_MESSAGES=C.UTF-8 \
- PIP_CACHE_DIR=/tmp/.cache/pip
+ PIP_CACHE_DIR=/tmp/.cache/pip \
+ UV_CACHE_DIR=/tmp/.cache/uv
ARG DEV_APT_DEPS=""
ARG ADDITIONAL_DEV_APT_DEPS=""
@@ -1473,9 +1387,6 @@ ARG DEFAULT_CONSTRAINTS_BRANCH="constraints-main"
# By default PIP has progress bar but you can disable it.
ARG PIP_PROGRESS_BAR
-# By default we do not use pre-cached packages, but in CI/Breeze environment we override this to speed up
-# builds in case pyproject.toml changed. This is pure optimisation of CI/Breeze builds.
-ARG AIRFLOW_PRE_CACHED_PIP_PACKAGES="false"
# This is airflow version that is put in the label of the image build
ARG AIRFLOW_VERSION
# By default latest released version of airflow is installed (when empty) but this value can be overridden
@@ -1513,7 +1424,6 @@ ENV AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} \
AIRFLOW_UV_VERSION=${AIRFLOW_UV_VERSION} \
UV_HTTP_TIMEOUT=${UV_HTTP_TIMEOUT} \
AIRFLOW_USE_UV=${AIRFLOW_USE_UV} \
- AIRFLOW_PRE_CACHED_PIP_PACKAGES=${AIRFLOW_PRE_CACHED_PIP_PACKAGES} \
AIRFLOW_VERSION=${AIRFLOW_VERSION} \
AIRFLOW_INSTALLATION_METHOD=${AIRFLOW_INSTALLATION_METHOD} \
AIRFLOW_VERSION_SPECIFICATION=${AIRFLOW_VERSION_SPECIFICATION} \
@@ -1538,8 +1448,7 @@ ENV AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} \
# Copy all scripts required for installation - changing any of those should lead to
# rebuilding from here
-COPY --from=scripts common.sh install_packaging_tools.sh \
- install_airflow_dependencies_from_branch_tip.sh create_prod_venv.sh /scripts/docker/
+COPY --from=scripts common.sh install_packaging_tools.sh create_prod_venv.sh /scripts/docker/
# We can set this value to true in case we want to install .whl/.tar.gz packages placed in the
# docker-context-files folder. This can be done for both additional packages you want to install
@@ -1569,13 +1478,7 @@ ENV AIRFLOW_CI_BUILD_EPOCH=${AIRFLOW_CI_BUILD_EPOCH}
# By default PIP installs everything to ~/.local and it's also treated as VIRTUALENV
ENV VIRTUAL_ENV="${AIRFLOW_USER_HOME_DIR}/.local"
-RUN bash /scripts/docker/install_packaging_tools.sh; \
- bash /scripts/docker/create_prod_venv.sh; \
- if [[ ${AIRFLOW_PRE_CACHED_PIP_PACKAGES} == "true" && \
- ${INSTALL_PACKAGES_FROM_CONTEXT} == "false" && \
- ${UPGRADE_INVALIDATION_STRING} == "" ]]; then \
- bash /scripts/docker/install_airflow_dependencies_from_branch_tip.sh; \
- fi
+RUN bash /scripts/docker/install_packaging_tools.sh; bash /scripts/docker/create_prod_venv.sh
COPY --chown=airflow:0 ${AIRFLOW_SOURCES_FROM} ${AIRFLOW_SOURCES_TO}
@@ -1599,10 +1502,10 @@ COPY --from=scripts install_from_docker_context_files.sh install_airflow.sh \
# an incorrect architecture.
ARG TARGETARCH
# Value to be able to easily change cache id and therefore use a bare new cache
-ARG PIP_CACHE_EPOCH="9"
+ARG DEPENDENCY_CACHE_EPOCH="9"
# hadolint ignore=SC2086, SC2010, DL3042
-RUN --mount=type=cache,id=$PYTHON_BASE_IMAGE-$AIRFLOW_PIP_VERSION-$TARGETARCH-$PIP_CACHE_EPOCH,target=/tmp/.cache/pip,uid=${AIRFLOW_UID} \
+RUN --mount=type=cache,id=prod-$TARGETARCH-$DEPENDENCY_CACHE_EPOCH,target=/tmp/.cache/,uid=${AIRFLOW_UID} \
if [[ ${INSTALL_PACKAGES_FROM_CONTEXT} == "true" ]]; then \
bash /scripts/docker/install_from_docker_context_files.sh; \
fi; \
@@ -1622,7 +1525,7 @@ RUN --mount=type=cache,id=$PYTHON_BASE_IMAGE-$AIRFLOW_PIP_VERSION-$TARGETARCH-$P
# during the build additionally to whatever has been installed so far. It is recommended that
# the requirements.txt contains only dependencies with == version specification
# hadolint ignore=DL3042
-RUN --mount=type=cache,id=additional-requirements-$PYTHON_BASE_IMAGE-$AIRFLOW_PIP_VERSION-$TARGETARCH-$PIP_CACHE_EPOCH,target=/tmp/.cache/pip,uid=${AIRFLOW_UID} \
+RUN --mount=type=cache,id=prod-$TARGETARCH-$DEPENDENCY_CACHE_EPOCH,target=/tmp/.cache/,uid=${AIRFLOW_UID} \
if [[ -f /docker-context-files/requirements.txt ]]; then \
pip install -r /docker-context-files/requirements.txt; \
fi
@@ -1650,7 +1553,9 @@ ARG PYTHON_BASE_IMAGE
ENV PYTHON_BASE_IMAGE=${PYTHON_BASE_IMAGE} \
# Make sure noninteractive debian install is used and language variables set
DEBIAN_FRONTEND=noninteractive LANGUAGE=C.UTF-8 LANG=C.UTF-8 LC_ALL=C.UTF-8 \
- LC_CTYPE=C.UTF-8 LC_MESSAGES=C.UTF-8 LD_LIBRARY_PATH=/usr/local/lib
+ LC_CTYPE=C.UTF-8 LC_MESSAGES=C.UTF-8 LD_LIBRARY_PATH=/usr/local/lib \
+ PIP_CACHE_DIR=/tmp/.cache/pip \
+ UV_CACHE_DIR=/tmp/.cache/uv
ARG RUNTIME_APT_DEPS=""
ARG ADDITIONAL_RUNTIME_APT_DEPS=""
diff --git a/Dockerfile.ci b/Dockerfile.ci
index 7c0b529d471..74d8eb59435 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -363,85 +363,6 @@ common::show_packaging_tool_version_and_location
common::install_packaging_tools
EOF
-# The content below is automatically copied from scripts/docker/install_airflow_dependencies_from_branch_tip.sh
-COPY <<"EOF" /install_airflow_dependencies_from_branch_tip.sh
-#!/usr/bin/env bash
-
-. "$( dirname "${BASH_SOURCE[0]}" )/common.sh"
-
-: "${AIRFLOW_REPO:?Should be set}"
-: "${AIRFLOW_BRANCH:?Should be set}"
-: "${INSTALL_MYSQL_CLIENT:?Should be true or false}"
-: "${INSTALL_POSTGRES_CLIENT:?Should be true or false}"
-
-function install_airflow_dependencies_from_branch_tip() {
- echo
- echo "${COLOR_BLUE}Installing airflow from ${AIRFLOW_BRANCH}. It is used to cache dependencies${COLOR_RESET}"
- echo
- if [[ ${INSTALL_MYSQL_CLIENT} != "true" ]]; then
- AIRFLOW_EXTRAS=${AIRFLOW_EXTRAS/mysql,}
- fi
- if [[ ${INSTALL_POSTGRES_CLIENT} != "true" ]]; then
- AIRFLOW_EXTRAS=${AIRFLOW_EXTRAS/postgres,}
- fi
- local TEMP_AIRFLOW_DIR
- TEMP_AIRFLOW_DIR=$(mktemp -d)
- # Install latest set of dependencies - without constraints. This is to download a "base" set of
- # dependencies that we can cache and reuse when installing airflow using constraints and latest
- # pyproject.toml in the next step (when we install regular airflow).
- set -x
- curl -fsSL "https://github.com/${AIRFLOW_REPO}/archive/${AIRFLOW_BRANCH}.tar.gz" | \
- tar xz -C "${TEMP_AIRFLOW_DIR}" --strip 1
- # Make sure editable dependencies are calculated when devel-ci dependencies are installed
- ${PACKAGING_TOOL_CMD} install ${EXTRA_INSTALL_FLAGS} ${ADDITIONAL_PIP_INSTALL_FLAGS} \
- --editable "${TEMP_AIRFLOW_DIR}[${AIRFLOW_EXTRAS}]"
- set +x
- common::install_packaging_tools
- set -x
- echo "${COLOR_BLUE}Uninstalling providers. Dependencies remain${COLOR_RESET}"
- # Uninstall airflow and providers to keep only the dependencies. In the future when
- # planned https://github.com/pypa/pip/issues/11440 is implemented in pip we might be able to use this
- # flag and skip the remove step.
- pip freeze | grep apache-airflow-providers | xargs ${PACKAGING_TOOL_CMD} uninstall ${EXTRA_UNINSTALL_FLAGS} || true
- set +x
- echo
- echo "${COLOR_BLUE}Uninstalling just airflow. Dependencies remain. Now target airflow can be reinstalled using mostly cached dependencies${COLOR_RESET}"
- echo
- set +x
- ${PACKAGING_TOOL_CMD} uninstall ${EXTRA_UNINSTALL_FLAGS} apache-airflow
- rm -rf "${TEMP_AIRFLOW_DIR}"
- set -x
- # If you want to make sure dependency is removed from cache in your PR when you removed it from
- # pyproject.toml - please add your dependency here as a list of strings
- # for example:
- # DEPENDENCIES_TO_REMOVE=("package_a" "package_b")
- # Once your PR is merged, you should make a follow-up PR to remove it from this list
- # and increase the AIRFLOW_CI_BUILD_EPOCH in Dockerfile.ci to make sure your cache is rebuilt.
- local DEPENDENCIES_TO_REMOVE
- # IMPORTANT!! Make sure to increase AIRFLOW_CI_BUILD_EPOCH in Dockerfile.ci when you remove a dependency from that list
- DEPENDENCIES_TO_REMOVE=()
- if [[ "${DEPENDENCIES_TO_REMOVE[*]}" != "" ]]; then
- echo
- echo "${COLOR_BLUE}Uninstalling just removed dependencies (temporary until cache refreshes)${COLOR_RESET}"
- echo "${COLOR_BLUE}Dependencies to uninstall: ${DEPENDENCIES_TO_REMOVE[*]}${COLOR_RESET}"
- echo
- set +x
- ${PACKAGING_TOOL_CMD} uninstall "${DEPENDENCIES_TO_REMOVE[@]}" || true
- set -x
- # make sure that the dependency is not needed by something else
- pip check
- fi
-}
-
-common::get_colors
-common::get_packaging_tool
-common::get_airflow_version_specification
-common::get_constraints_location
-common::show_packaging_tool_version_and_location
-
-install_airflow_dependencies_from_branch_tip
-EOF
-
# The content below is automatically copied from scripts/docker/common.sh
COPY <<"EOF" /common.sh
#!/usr/bin/env bash
@@ -465,8 +386,6 @@ function common::get_packaging_tool() {
## IMPORTANT: IF YOU MODIFY THIS FUNCTION YOU SHOULD ALSO MODIFY CORRESPONDING FUNCTION IN
## `scripts/in_container/_in_container_utils.sh`
- local PYTHON_BIN
- PYTHON_BIN=$(which python)
if [[ ${AIRFLOW_USE_UV} == "true" ]]; then
echo
echo "${COLOR_BLUE}Using 'uv' to install Airflow${COLOR_RESET}"
@@ -474,8 +393,8 @@ function common::get_packaging_tool() {
export PACKAGING_TOOL="uv"
export PACKAGING_TOOL_CMD="uv pip"
if [[ -z ${VIRTUAL_ENV=} ]]; then
- export EXTRA_INSTALL_FLAGS="--python ${PYTHON_BIN}"
- export EXTRA_UNINSTALL_FLAGS="--python ${PYTHON_BIN}"
+ export EXTRA_INSTALL_FLAGS="--system"
+ export EXTRA_UNINSTALL_FLAGS="--system"
else
export EXTRA_INSTALL_FLAGS=""
export EXTRA_UNINSTALL_FLAGS=""
@@ -670,18 +589,12 @@ function install_airflow() {
# Determine the installation_command_flags based on AIRFLOW_INSTALLATION_METHOD method
local installation_command_flags
if [[ ${AIRFLOW_INSTALLATION_METHOD} == "." ]]; then
- # We need _a_ file in there otherwise the editable install doesn't include anything in the .pth file
- mkdir -p ./providers/src/airflow/providers/
- touch ./providers/src/airflow/providers/__init__.py
-
- # Similarly we need _a_ file for task_sdk too
- mkdir -p ./task_sdk/src/airflow/sdk/
- echo '__version__ = "0.0.0dev0"' > ./task_sdk/src/airflow/sdk/__init__.py
-
- trap 'rm -f ./providers/src/airflow/providers/__init__.py ./task_sdk/src/airflow/__init__.py 2>/dev/null' EXIT
-
# When installing from sources - we always use `--editable` mode
- installation_command_flags="--editable .[${AIRFLOW_EXTRAS}]${AIRFLOW_VERSION_SPECIFICATION} --editable ./providers --editable ./task_sdk"
+ installation_command_flags="--editable .[${AIRFLOW_EXTRAS}]${AIRFLOW_VERSION_SPECIFICATION} --editable ./task_sdk"
+ while IFS= read -r -d '' pyproject_toml_file; do
+ project_folder=$(dirname ${pyproject_toml_file})
+ installation_command_flags="${installation_command_flags} --editable ${project_folder}"
+ done < <(find "providers" -name "pyproject.toml" -print0)
elif [[ ${AIRFLOW_INSTALLATION_METHOD} == "apache-airflow" ]]; then
installation_command_flags="apache-airflow[${AIRFLOW_EXTRAS}]${AIRFLOW_VERSION_SPECIFICATION}"
elif [[ ${AIRFLOW_INSTALLATION_METHOD} == apache-airflow\ @\ * ]]; then
@@ -1202,7 +1115,10 @@ ENV PYTHON_BASE_IMAGE=${PYTHON_BASE_IMAGE} \
DEPENDENCIES_EPOCH_NUMBER=${DEPENDENCIES_EPOCH_NUMBER} \
INSTALL_MYSQL_CLIENT="true" \
INSTALL_MSSQL_CLIENT="true" \
- INSTALL_POSTGRES_CLIENT="true"
+ INSTALL_POSTGRES_CLIENT="true" \
+ PIP_CACHE_DIR=/root/.cache/pip \
+ UV_CACHE_DIR=/root/.cache/uv
+
RUN echo "Base image version: ${PYTHON_BASE_IMAGE}"
@@ -1282,12 +1198,7 @@ ARG DEFAULT_CONSTRAINTS_BRANCH="constraints-main"
# By changing the epoch we can force reinstalling Airflow and pip all dependencies
# It can also be overwritten manually by setting the AIRFLOW_CI_BUILD_EPOCH environment variable.
ARG AIRFLOW_CI_BUILD_EPOCH="10"
-ARG AIRFLOW_PRE_CACHED_PIP_PACKAGES="true"
# Setup PIP
-# By default PIP install run without cache to make image smaller
-ARG PIP_NO_CACHE_DIR="true"
-# By default UV install run without cache to make image smaller
-ARG UV_NO_CACHE="true"
ARG UV_HTTP_TIMEOUT="300"
# By default PIP has progress bar but you can disable it.
ARG PIP_PROGRESS_BAR="on"
@@ -1315,7 +1226,6 @@ ENV AIRFLOW_REPO=${AIRFLOW_REPO}\
AIRFLOW_CONSTRAINTS_LOCATION=${AIRFLOW_CONSTRAINTS_LOCATION} \
DEFAULT_CONSTRAINTS_BRANCH=${DEFAULT_CONSTRAINTS_BRANCH} \
AIRFLOW_CI_BUILD_EPOCH=${AIRFLOW_CI_BUILD_EPOCH} \
- AIRFLOW_PRE_CACHED_PIP_PACKAGES=${AIRFLOW_PRE_CACHED_PIP_PACKAGES} \
AIRFLOW_VERSION=${AIRFLOW_VERSION} \
AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} \
AIRFLOW_UV_VERSION=${AIRFLOW_UV_VERSION} \
@@ -1327,9 +1237,7 @@ ENV AIRFLOW_REPO=${AIRFLOW_REPO}\
INSTALL_POSTGRES_CLIENT="true" \
AIRFLOW_INSTALLATION_METHOD="." \
AIRFLOW_VERSION_SPECIFICATION="" \
- PIP_NO_CACHE_DIR=${PIP_NO_CACHE_DIR} \
PIP_PROGRESS_BAR=${PIP_PROGRESS_BAR} \
- UV_NO_CACHE=${UV_NO_CACHE} \
ADDITIONAL_PIP_INSTALL_FLAGS=${ADDITIONAL_PIP_INSTALL_FLAGS} \
CASS_DRIVER_BUILD_CONCURRENCY=${CASS_DRIVER_BUILD_CONCURRENCY} \
CASS_DRIVER_NO_CYTHON=${CASS_DRIVER_NO_CYTHON}
@@ -1338,25 +1246,10 @@ RUN echo "Airflow version: ${AIRFLOW_VERSION}"
# Copy all scripts required for installation - changing any of those should lead to
# rebuilding from here
-COPY --from=scripts install_packaging_tools.sh install_airflow_dependencies_from_branch_tip.sh \
- common.sh /scripts/docker/
+COPY --from=scripts common.sh install_packaging_tools.sh install_additional_dependencies.sh /scripts/docker/
# We are first creating a venv where all python packages and .so binaries needed by those are
# installed.
-# In case of CI builds we want to pre-install main version of airflow dependencies so that
-# We do not have to always reinstall it from the scratch.
-# And is automatically reinstalled from the scratch every time patch release of python gets released
-# The Airflow and providers are uninstalled, only dependencies remain.
-# the cache is only used when "upgrade to newer dependencies" is not set to automatically
-# account for removed dependencies (we do not install them in the first place)
-#
-# We are installing from branch tip without fixing UV or PIP version - in order to avoid rebuilding the
-# base cache layer every time the UV or PIP version changes.
-RUN bash /scripts/docker/install_packaging_tools.sh; \
- if [[ ${AIRFLOW_PRE_CACHED_PIP_PACKAGES} == "true" ]]; then \
- bash /scripts/docker/install_airflow_dependencies_from_branch_tip.sh; \
- fi
-
# Here we fix the versions so all subsequent commands will use the versions
# from the sources
@@ -1372,31 +1265,33 @@ ARG AIRFLOW_PRE_COMMIT_UV_VERSION="4.1.4"
ENV AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} \
AIRFLOW_UV_VERSION=${AIRFLOW_UV_VERSION} \
+ # This is needed since we are using cache mounted from the host
+ UV_LINK_MODE=copy \
AIRFLOW_PRE_COMMIT_VERSION=${AIRFLOW_PRE_COMMIT_VERSION}
# The PATH is needed for PIPX to find the tools installed
ENV PATH="/root/.local/bin:${PATH}"
+# Useful for creating a cache id based on the underlying architecture, preventing the use of cached python packages from
+# an incorrect architecture.
+ARG TARGETARCH
+# Value to be able to easily change cache id and therefore use a bare new cache
+ARG DEPENDENCY_CACHE_EPOCH="0"
+
# Install useful command line tools in their own virtualenv so that they do not clash with
# dependencies installed in Airflow also reinstall PIP and UV to make sure they are installed
# in the version specified above
-RUN bash /scripts/docker/install_packaging_tools.sh
-
-# Airflow sources change frequently but dependency configuration won't change that often
-# We copy pyproject.toml and other files needed to perform setup of dependencies
-# So in case pyproject.toml changes we can install latest dependencies required.
-COPY pyproject.toml ${AIRFLOW_SOURCES}/pyproject.toml
-COPY providers/pyproject.toml ${AIRFLOW_SOURCES}/providers/pyproject.toml
-COPY task_sdk/pyproject.toml ${AIRFLOW_SOURCES}/task_sdk/pyproject.toml
-COPY task_sdk/README.md ${AIRFLOW_SOURCES}/task_sdk/README.md
-COPY airflow/__init__.py ${AIRFLOW_SOURCES}/airflow/
-COPY tests_common/ ${AIRFLOW_SOURCES}/tests_common/
-COPY generated/* ${AIRFLOW_SOURCES}/generated/
-COPY constraints/* ${AIRFLOW_SOURCES}/constraints/
-COPY LICENSE ${AIRFLOW_SOURCES}/LICENSE
-COPY hatch_build.py ${AIRFLOW_SOURCES}/
+RUN --mount=type=cache,id=ci-$TARGETARCH-$DEPENDENCY_CACHE_EPOCH,target=/root/.cache/ \
+ bash /scripts/docker/install_packaging_tools.sh
+
COPY --from=scripts install_airflow.sh /scripts/docker/
+# We can copy everything here. The Context is filtered by dockerignore. This makes sure we are not
+# copying over stuff that is accidentally generated or that we do not need (such as egg-info)
+# if you want to add something that is missing and you expect to see it in the image you can
+# add it with ! in .dockerignore next to the airflow, test etc. directories there
+COPY . ${AIRFLOW_SOURCES}/
+
# Those are additional constraints that are needed for some extras but we do not want to
# force them on the main Airflow package. Currently we need no extra limits as PIP 23.1+ has much better
# dependency resolution and we do not need to limit the versions of the dependencies
@@ -1415,36 +1310,30 @@ ENV EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=${EAGER_UPGRADE_ADDITIONAL_REQUIREMENT
# Usually we will install versions based on the dependencies in pyproject.toml and upgraded only if needed.
# But in cron job we will install latest versions matching pyproject.toml to see if there is no breaking change
# and push the constraints if everything is successful
-RUN bash /scripts/docker/install_airflow.sh
-
-COPY --from=scripts entrypoint_ci.sh /entrypoint
-COPY --from=scripts entrypoint_exec.sh /entrypoint-exec
-RUN chmod a+x /entrypoint /entrypoint-exec
+RUN --mount=type=cache,id=ci-$TARGETARCH-$DEPENDENCY_CACHE_EPOCH,target=/root/.cache/ bash /scripts/docker/install_airflow.sh
COPY --from=scripts install_packaging_tools.sh install_additional_dependencies.sh /scripts/docker/
-# Additional python deps to install
ARG ADDITIONAL_PYTHON_DEPS=""
-RUN bash /scripts/docker/install_packaging_tools.sh; \
+ENV ADDITIONAL_PYTHON_DEPS=${ADDITIONAL_PYTHON_DEPS}
+
+RUN --mount=type=cache,id=ci-$TARGETARCH-$DEPENDENCY_CACHE_EPOCH,target=/root/.cache/ \
+ bash /scripts/docker/install_packaging_tools.sh; \
if [[ -n "${ADDITIONAL_PYTHON_DEPS}" ]]; then \
bash /scripts/docker/install_additional_dependencies.sh; \
fi
-# Install autocomplete for airflow
-RUN if command -v airflow; then \
- register-python-argcomplete airflow >> ~/.bashrc ; \
- fi
-
-# Install autocomplete for Kubectl
-RUN echo "source /etc/bash_completion" >> ~/.bashrc
+COPY --from=scripts entrypoint_ci.sh /entrypoint
+COPY --from=scripts entrypoint_exec.sh /entrypoint-exec
+RUN chmod a+x /entrypoint /entrypoint-exec
-# We can copy everything here. The Context is filtered by dockerignore. This makes sure we are not
-# copying over stuff that is accidentally generated or that we do not need (such as egg-info)
-# if you want to add something that is missing and you expect to see it in the image you can
-# add it with ! in .dockerignore next to the airflow, test etc. directories there
-COPY . ${AIRFLOW_SOURCES}/
+# Install autocomplete for airflow and kubectl
+RUN if command -v airflow; then \
+ register-python-argcomplete airflow >> ~/.bashrc ; \
+ fi; \
+ echo "source /etc/bash_completion" >> ~/.bashrc
WORKDIR ${AIRFLOW_SOURCES}
diff --git a/dev/breeze/doc/06_managing_docker_images.rst b/dev/breeze/doc/06_managing_docker_images.rst
index bb4c4f9e06f..84e4e77a010 100644
--- a/dev/breeze/doc/06_managing_docker_images.rst
+++ b/dev/breeze/doc/06_managing_docker_images.rst
@@ -76,7 +76,7 @@ These are all available flags of ``pull`` command:
Verifying CI image
..................
-Finally, you can verify CI image by running tests - either with the pulled/built images or
+You can verify CI image by running tests - either with the pulled/built images or
with an arbitrary image.
These are all available flags of ``verify`` command:
@@ -86,6 +86,41 @@ These are all available flags of ``verify`` command:
:width: 100%
:alt: Breeze ci-image verify
+Loading and saving CI image
+...........................
+
+You can load and save PROD image - for example to transfer it to another machine or to load an image
+that has been built in our CI.
+
+These are all available flags of ``save`` command:
+
+.. image:: ./images/output_ci-image_save.svg
+ :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/images/output_ci-image_save.svg
+ :width: 100%
+ :alt: Breeze ci-image save
+
+These are all available flags of ``load`` command:
+
+.. image:: ./images/output_ci-image_load.svg
+ :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/images/output_ci-image_load.svg
+ :width: 100%
+ :alt: Breeze ci-image load
+
+Images for every build from our CI are uploaded as artifacts to the
+GitHub Action run (in summary) and can be downloaded from there for 2 days in order to reproduce the complete
+environment used during the tests and loaded to the local Docker registry (note that you have
+to use the same platform as the CI run).
+
+You will find the artifacts for each image in the summary of the CI run. The artifacts are named
+``ci-image-docker-export-<platform>-<python_version>-<PR>_merge``. Those are compressed zip files that
+contain the ".tar" image that should be used with ``--image-file`` flag of the load method. Make sure to
+use the same ``--python`` version as the image was built with.
+
+.. image:: ./images/image_artifacts.png
+ :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/images/output_ci-image_load.svg
+ :width: 100%
+ :alt: Breeze image artifacts
+
PROD Image tasks
----------------
@@ -170,7 +205,7 @@ These are all available flags of ``pull-prod-image`` command:
Verifying PROD image
....................
-Finally, you can verify PROD image by running tests - either with the pulled/built images or
+You can verify PROD image by running tests - either with the pulled/built images or
with an arbitrary image.
These are all available flags of ``verify-prod-image`` command:
@@ -180,6 +215,31 @@ These are all available flags of ``verify-prod-image`` command:
:width: 100%
:alt: Breeze prod-image verify
+Loading and saving PROD image
+.............................
+
+You can load and save PROD image - for example to transfer it to another machine or to load an image
+that has been built in our CI.
+
+These are all available flags of ``save`` command:
+
+.. image:: ./images/output_prod-image_save.svg
+ :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/images/output_prod-image_save.svg
+ :width: 100%
+ :alt: Breeze prod-image save
+
+These are all available flags of ``load`` command:
+
+.. image:: ./images/output-prod-image_load.svg
+ :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/images/output_prod-image_load.svg
+ :width: 100%
+ :alt: Breeze prod-image load
+
+Similarly as in case of CI images, Images for every build from our CI are uploaded as artifacts to the
+GitHub Action run (in summary) and can be downloaded from there for 2 days in order to reproduce the complete
+environment used during the tests and loaded to the local Docker registry (note that you have
+to use the same platform as the CI run).
+
------
Next step: Follow the `Breeze maintenance tasks <07_breeze_maintenance_tasks.rst>`_ to learn about tasks that
diff --git a/dev/breeze/doc/ci/02_images.md b/dev/breeze/doc/ci/02_images.md
index eb3af6ae6ce..263b37d62b8 100644
--- a/dev/breeze/doc/ci/02_images.md
+++ b/dev/breeze/doc/ci/02_images.md
@@ -329,22 +329,14 @@ new version of base Python is released. However, occasionally, you might
need to rebuild images locally and push them directly to the registries
to refresh them.
-Every developer can also pull and run images being result of a specific
+Every contributor can also pull and run images being result of a specific
CI run in GitHub Actions. This is a powerful tool that allows to
reproduce CI failures locally, enter the images and fix them much
-faster. It is enough to pass `--image-tag` and the registry and Breeze
-will download and execute commands using the same image that was used
-during the CI tests.
+faster. It is enough to download and uncompress the artifact that stores the
+image and run ``breeze ci-image load -i <path-to-image.tar>`` to load the
+image and mark the image as refreshed in the local cache.
-For example this command will run the same Python 3.9 image as was used
-in build identified with 9a621eaa394c0a0a336f8e1b31b35eff4e4ee86e commit
-SHA with enabled rabbitmq integration.
-
-``` bash
-breeze --image-tag 9a621eaa394c0a0a336f8e1b31b35eff4e4ee86e --python 3.9 --integration rabbitmq
-```
-
-You can see more details and examples in[Breeze](../README.rst)
+You can see more details and examples in[Breeze](../06_managing_docker_images.rst)
# Customizing the CI image
@@ -427,8 +419,6 @@ can be used for CI images:
| `PYTHON_MAJOR_MINOR_VERSION` | `3.9` | major/minor version of Python (should match base image) |
| `DEPENDENCIES_EPOCH_NUMBER` | `2` | increasing this number will reinstall all apt dependencies |
| `ADDITIONAL_PIP_INSTALL_FLAGS` | | additional `pip` flags passed to the installation commands (except when reinstalling `pip` itself) |
-| `PIP_NO_CACHE_DIR` | `true` | if true, then no pip cache will be stored |
-| `UV_NO_CACHE` | `true` | if true, then no uv cache will be stored |
| `HOME` | `/root` | Home directory of the root user (CI image has root user as default) |
| `AIRFLOW_HOME` | `/root/airflow` | Airflow's HOME (that's where logs and sqlite databases are stored) |
| `AIRFLOW_SOURCES` | `/opt/airflow` | Mounted sources of Airflow |
@@ -439,7 +429,6 @@ can be used for CI images:
| `AIRFLOW_CONSTRAINTS_REFERENCE` | | reference (branch or tag) from GitHub repository from which constraints are used. By default it is set to `constraints-main` but can be `constraints-2-X`. |
| `AIRFLOW_EXTRAS` | `all` | extras to install |
| `UPGRADE_INVALIDATION_STRING` | | If set to any random value the dependencies are upgraded to newer versions. In CI it is set to build id. |
-| `AIRFLOW_PRE_CACHED_PIP_PACKAGES` | `true` | Allows to pre-cache airflow PIP packages from the GitHub of Apache Airflow This allows to optimize iterations for Image builds and speeds up CI jobs. |
| `ADDITIONAL_AIRFLOW_EXTRAS` | | additional extras to install |
| `ADDITIONAL_PYTHON_DEPS` | | additional Python dependencies to install |
| `DEV_APT_COMMAND` | | Dev apt command executed before dev deps are installed in the first part of image |
diff --git a/dev/breeze/doc/ci/05_workflows.md b/dev/breeze/doc/ci/05_workflows.md
index 130774a730c..63c94871c5d 100644
--- a/dev/breeze/doc/ci/05_workflows.md
+++ b/dev/breeze/doc/ci/05_workflows.md
@@ -206,9 +206,9 @@ code.
| Build info | Prints detailed information about the build | Yes | Yes | Yes | Yes |
| Push early cache & images | Pushes early cache/images to GitHub Registry | | Yes | | |
| Check that image builds quickly | Checks that image builds quickly | | Yes | | Yes |
-| Build CI images | Builds images in-workflow (not in the build images) | | Yes | Yes (1) | Yes (4) |
+| Build CI images | Builds images | | Yes | Yes (1) | Yes (4) |
| Generate constraints/CI verify | Generate constraints for the build and verify CI image | Yes (2) | Yes (2) | Yes (2) | Yes (2) |
-| Build PROD images | Builds images in-workflow (not in the build images) | | Yes | Yes (1) | Yes (4) |
+| Build PROD images | Builds images | | Yes | Yes (1) | Yes (4) |
| Run breeze tests | Run unit tests for Breeze | Yes | Yes | Yes | Yes |
| Test OpenAPI client gen | Tests if OpenAPIClient continues to generate | Yes | Yes | Yes | Yes |
| React WWW tests | React UI tests for new Airflow UI | Yes | Yes | Yes | Yes |
diff --git a/dev/breeze/doc/ci/08_running_ci_locally.md b/dev/breeze/doc/ci/08_running_ci_locally.md
index 4fd0a7c9937..7300c8fde0b 100644
--- a/dev/breeze/doc/ci/08_running_ci_locally.md
+++ b/dev/breeze/doc/ci/08_running_ci_locally.md
@@ -36,17 +36,13 @@ checks in CI and locally, but another part is the CI environment which
is replicated locally with Breeze.
You can read more about Breeze in
-[README.rst](../README.rst) but in essence it is a script
-that allows you to re-create CI environment in your local development
-instance and interact with it. In its basic form, when you do
-development you can run all the same tests that will be run in CI - but
+[README.rst](../README.rst) but in essence it is a python wrapper around
+docker commands that allows you (among others) to re-create CI environment
+in your local development instance and interact with it.
+In its basic form, when you do development you can run all the same
+tests that will be run in CI - but
locally, before you submit them as PR. Another use case where Breeze is
-useful is when tests fail on CI. You can take the full `COMMIT_SHA` of
-the failed build pass it as `--image-tag` parameter of Breeze and it
-will download the very same version of image that was used in CI and run
-it locally. This way, you can very easily reproduce any failed test that
-happens in CI - even if you do not check out the sources connected with
-the run.
+useful is when tests fail on CI.
All our CI jobs are executed via `breeze` commands. You can replicate
exactly what our CI is doing by running the sequence of corresponding
@@ -62,39 +58,16 @@ exactly what our CI is doing by running the sequence of corresponding
In the output of the CI jobs, you will find both - the flags passed and
environment variables set.
+Every contributor can also pull and run images being result of a specific
+CI run in GitHub Actions. This is a powerful tool that allows to
+reproduce CI failures locally, enter the images and fix them much
+faster. It is enough to download and uncompress the artifact that stores the
+image and run ``breeze ci-image load -i <path-to-image.tar> --python python``
+to load the image and mark the image as refreshed in the local cache.
+
You can read more about it in [Breeze](../README.rst) and
[Testing](../../../../contributing-docs/09_testing.rst)
-Since we store images from every CI run, you should be able easily
-reproduce any of the CI tests problems locally. You can do it by pulling
-and using the right image and running it with the right docker command,
-For example knowing that the CI job was for commit
-`cd27124534b46c9688a1d89e75fcd137ab5137e3`:
-
-``` bash
-docker pull ghcr.io/apache/airflow/main/ci/python3.9:cd27124534b46c9688a1d89e75fcd137ab5137e3
-
-docker run -it ghcr.io/apache/airflow/main/ci/python3.9:cd27124534b46c9688a1d89e75fcd137ab5137e3
-```
-
-But you usually need to pass more variables and complex setup if you
-want to connect to a database or enable some integrations. Therefore it
-is easiest to use [Breeze](../README.rst) for that. For
-example if you need to reproduce a MySQL environment in python 3.9
-environment you can run:
-
-``` bash
-breeze --image-tag cd27124534b46c9688a1d89e75fcd137ab5137e3 --python 3.9 --backend mysql
-```
-
-You will be dropped into a shell with the exact version that was used
-during the CI run and you will be able to run pytest tests manually,
-easily reproducing the environment that was used in CI. Note that in
-this case, you do not need to checkout the sources that were used for
-that run - they are already part of the image - but remember that any
-changes you make in those sources are lost when you leave the image as
-the sources are not mapped from your host machine.
-
Depending whether the scripts are run locally via
[Breeze](../README.rst) or whether they are run in
`Build Images` or `Tests` workflows they can take different values.
@@ -127,9 +100,9 @@ passed to `breeze shell` command.
# Upgrade to newer dependencies
-By default we are using a tested set of dependency constraints stored in separated "orphan" branches of the airflow repository
+By default, we are using a tested set of dependency constraints stored in separated "orphan" branches of the airflow repository
("constraints-main, "constraints-2-0") but when this flag is set to anything but false (for example random value),
-they are not used used and "eager" upgrade strategy is used when installing dependencies. We set it to true in case of direct
+they are not used and "eager" upgrade strategy is used when installing dependencies. We set it to true in case of direct
pushes (merges) to main and scheduled builds so that the constraints are tested. In those builds, in case we determine
that the tests pass we automatically push latest set of "tested" constraints to the repository. Setting the value to random
value is best way to assure that constraints are upgraded even if there is no change to pyproject.toml
diff --git a/dev/breeze/doc/images/image_artifacts.png b/dev/breeze/doc/images/image_artifacts.png
new file mode 100644
index 00000000000..485a6a2c9cf
Binary files /dev/null and b/dev/breeze/doc/images/image_artifacts.png differ
diff --git a/dev/breeze/doc/images/output_ci-image.svg b/dev/breeze/doc/images/output_ci-image.svg
index 8d7c7893f55..6fc5b425c5c 100644
--- a/dev/breeze/doc/images/output_ci-image.svg
+++ b/dev/breeze/doc/images/output_ci-image.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 367.2" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 416.0" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -42,7 +42,7 @@
<defs>
<clipPath id="breeze-ci-image-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="316.2" />
+ <rect x="0" y="0" width="1463.0" height="365.0" />
</clipPath>
<clipPath id="breeze-ci-image-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -80,9 +80,15 @@
<clipPath id="breeze-ci-image-line-11">
<rect x="0" y="269.9" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-ci-image-line-12">
+ <rect x="0" y="294.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-line-13">
+ <rect x="0" y="318.7" 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="365.2" rx="8"/><text class="breeze-ci-image-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: ci-image</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="414" rx="8"/><text class="breeze-ci-image-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: ci-image</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -104,7 +110,9 @@
</text><text class="breeze-ci-image-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-ci-image-line-9)">│</text><text class="breeze-ci-image-r4" x="24.4" y="239.6" textLength="97.6" clip-path="url(#breeze-ci-image-line-9)">build   </text><text class="breeze-ci-image-r1" x="146.4" y="239.6" textLength="1293.2" clip-path="url(#breeze-ci-image-line-9)">Build CI image. Include building multiple images for all python  [...]
</text><text class="breeze-ci-image-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-ci-image-line-10)">│</text><text class="breeze-ci-image-r4" x="24.4" y="264" textLength="97.6" clip-path="url(#breeze-ci-image-line-10)">pull    </text><text class="breeze-ci-image-r1" x="146.4" y="264" textLength="1293.2" clip-path="url(#breeze-ci-image-line-10)">Pull and optionally verify CI images - possibly in parallel fo [...]
</text><text class="breeze-ci-image-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-ci-image-line-11)">│</text><text class="breeze-ci-image-r4" x="24.4" y="288.4" textLength="97.6" clip-path="url(#breeze-ci-image-line-11)">verify  </text><text class="breeze-ci-image-r1" x="146.4" y="288.4" textLength="1293.2" clip-path="url(#breeze-ci-image-line-11)">Verify CI image.                [...]
-</text><text class="breeze-ci-image-r5" x="0" y="312.8" textLength="1464" clip-path="url(#breeze-ci-image-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-ci-image-line-12)">
+</text><text class="breeze-ci-image-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-ci-image-line-12)">│</text><text class="breeze-ci-image-r4" x="24.4" y="312.8" textLength="97.6" clip-path="url(#breeze-ci-image-line-12)">save    </text><text class="breeze-ci-image-r1" x="146.4" y="312.8" textLength="1293.2" clip-path="url(#breeze-ci-image-line-12)">Save CI image to a file.          [...]
+</text><text class="breeze-ci-image-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-ci-image-line-13)">│</text><text class="breeze-ci-image-r4" x="24.4" y="337.2" textLength="97.6" clip-path="url(#breeze-ci-image-line-13)">load    </text><text class="breeze-ci-image-r1" x="146.4" y="337.2" textLength="1293.2" clip-path="url(#breeze-ci-image-line-13)">Load CI image from a file.         & [...]
+</text><text class="breeze-ci-image-r5" x="0" y="361.6" textLength="1464" clip-path="url(#breeze-ci-image-line-14)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-ci-image-line-14)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_ci-image.txt b/dev/breeze/doc/images/output_ci-image.txt
index 291f992d9aa..0c2b23fa055 100644
--- a/dev/breeze/doc/images/output_ci-image.txt
+++ b/dev/breeze/doc/images/output_ci-image.txt
@@ -1 +1 @@
-eb0a44354e231d527eb61abbfa6a410c
+2039b80b810ff0ad9e9f505548254f82
diff --git a/dev/breeze/doc/images/output_ci-image_build.svg b/dev/breeze/doc/images/output_ci-image_build.svg
index 62339f70539..08a8cd34c41 100644
--- a/dev/breeze/doc/images/output_ci-image_build.svg
+++ b/dev/breeze/doc/images/output_ci-image_build.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 2441.2" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 2368.0" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-ci-image-build-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="2390.2" />
+ <rect x="0" y="0" width="1463.0" height="2317.0" />
</clipPath>
<clipPath id="breeze-ci-image-build-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -327,18 +327,9 @@
<clipPath id="breeze-ci-image-build-line-93">
<rect x="0" y="2270.7" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-ci-image-build-line-94">
- <rect x="0" y="2295.1" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-ci-image-build-line-95">
- <rect x="0" y="2319.5" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-ci-image-build-line-96">
- <rect x="0" y="2343.9" 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="2439.2" rx="8"/><text class="breeze-ci-image-build-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: ci-image build</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2366" rx="8"/><text class="breeze-ci-image-build-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: ci-image build</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -362,90 +353,87 @@
</text><text class="breeze-ci-image-build-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-11)">│</text><text class="breeze-ci-image-build-r1" x="634.4" y="288.4" textLength="805.2" clip-path="url(#breeze-ci-image-build-line-11)">regular build fails. It is set to False by default on CI and True </text><text class="breeze-ci-image-build-r5" x="1451.8" y="288.4" textLength="12.2" clip-path [...]
</text><text class="breeze-ci-image-build-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-12)">│</text><text class="breeze-ci-image-build-r1" x="634.4" y="312.8" textLength="805.2" clip-path="url(#breeze-ci-image-build-line-12)">by default locally.                                  [...]
</text><text class="breeze-ci-image-build-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-13)">│</text><text class="breeze-ci-image-build-r5" x="634.4" y="337.2" textLength="805.2" clip-path="url(#breeze-ci-image-build-line-13)">[default: upgrade-on-failure]                                 [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-14)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="361.6" textLength="134.2" clip-path="url(#breeze-ci-image-build-line-14)">--image-tag</text><text class="breeze-ci-image-build-r1" x="634.4" y="361.6" textLength="390.4" clip-path="url(#breeze-ci-image-build-line-14)">Tag the image after building it.</text><text class="breeze-ci- [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-15)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="386" textLength="183" clip-path="url(#breeze-ci-image-build-line-15)">--tag-as-latest</text><text class="breeze-ci-image-build-r1" x="634.4" y="386" textLength="805.2" clip-path="url(#breeze-ci-image-build-line-15)">Tags the image as latest and update checksum of [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-16)">│</text><text class="breeze-ci-image-build-r1" x="634.4" y="410.4" textLength="610" clip-path="url(#breeze-ci-image-build-line-16)">pulling. Useful when you build or pull image with </text><text class="breeze-ci-image-build-r4" x="1244.4" y="410.4" textLength="134.2" clip-path="url(#breeze-ci-image-build-line-16)">--i [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-17)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="434.8" textLength="170.8" clip-path="url(#breeze-ci-image-build-line-17)">--docker-cache</text><text class="breeze-ci-image-build-r6" x="585.6" y="434.8" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-17)">-c</text><text class="breeze-ci-image-build-r1" x="634.4" y="434.8" textLength="549" [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-18)">│</text><text class="breeze-ci-image-build-r7" x="634.4" y="459.2" textLength="549" clip-path="url(#breeze-ci-image-build-line-18)">(registry | local | disabled)                </text><text class="breeze-ci-image-build-r5" x="1451.8" y="459.2" textLength="12.2" cl [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-19)">│</text><text class="breeze-ci-image-build-r5" x="634.4" y="483.6" textLength="549" clip-path="url(#breeze-ci-image-build-line-19)">[default: registry]                          </text><text class="breeze-ci-image-build-r5" x="145 [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-20)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="508" textLength="305" clip-path="url(#breeze-ci-image-build-line-20)">--version-suffix-for-pypi</text><text class="breeze-ci-image-build-r1" x="634.4" y="508" textLength="768.6" clip-path="url(#breeze-ci-image-build-line-20)">Version suffix used for PyPI packages (alpha,  [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-21)">│</text><text class="breeze-ci-image-build-r7" x="634.4" y="532.4" textLength="768.6" clip-path="url(#breeze-ci-image-build-line-21)">(TEXT)                                     &# [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-22)">│</text><text class="breeze-ci-image-build-r5" x="634.4" y="556.8" textLength="768.6" clip-path="url(#breeze-ci-image-build-line-22)">[default: dev0]                                    [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-23)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="581.2" textLength="195.2" clip-path="url(#breeze-ci-image-build-line-23)">--build-progress</text><text class="breeze-ci-image-build-r1" x="634.4" y="581.2" textLength="183" clip-path="url(#breeze-ci-image-build-line-23)">Build progress.</text><text class="breeze-ci-image-build-r7" x="829.6" y="581.2 [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-24)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="605.6" textLength="158.6" clip-path="url(#breeze-ci-image-build-line-24)">--docker-host</text><text class="breeze-ci-image-build-r1" x="634.4" y="605.6" textLength="805.2" clip-path="url(#breeze-ci-image-build-line-24)">Optional - docker host to use when running do [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-25)">│</text><text class="breeze-ci-image-build-r1" x="634.4" y="630" textLength="122" clip-path="url(#breeze-ci-image-build-line-25)">set, the `</text><text class="breeze-ci-image-build-r4" x="756.4" y="630" textLength="109.8" clip-path="url(#breeze-ci-image-build-line-25)">--builder</text><text class="breeze-ci-image-build-r1" x="866.2" y="630" textLength=" [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-26)">│</text><text class="breeze-ci-image-build-r7" x="634.4" y="654.4" textLength="805.2" clip-path="url(#breeze-ci-image-build-line-26)">(TEXT)                                     &# [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="678.8" textLength="1464" clip-path="url(#breeze-ci-image-build-line-27)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-27)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="703.2" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-28)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="703.2" textLength="353.8" clip-path="url(#breeze-ci-image-build-line-28)"> Building images in parallel </text><text class="breeze-ci-image-build-r5" x="378.2" y="703.2" textLength="1061.4" clip-path="url(#breeze-ci-image-build-line-28)">────────────────────────────────────────── [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-29)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="727.6" textLength="207.4" clip-path="url(#breeze-ci-image-build-line-29)">--debug-resources</text><text class="breeze-ci-image-build-r1" x="378.2" y="727.6" textLength="768.6" clip-path="url(#breeze-ci-image-build-line-29)">Whether to show resource information while running& [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-30)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="752" textLength="305" clip-path="url(#breeze-ci-image-build-line-30)">--include-success-outputs</text><text class="breeze-ci-image-build-r1" x="378.2" y="752" textLength="927.2" clip-path="url(#breeze-ci-image-build-line-30)">Whether to include outputs of successful parallel&# [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-31)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="776.4" textLength="158.6" clip-path="url(#breeze-ci-image-build-line-31)">--parallelism</text><text class="breeze-ci-image-build-r1" x="378.2" y="776.4" textLength="915" clip-path="url(#breeze-ci-image-build-line-31)">Maximum number of processes to use while running [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-32)">│</text><text class="breeze-ci-image-build-r7" x="378.2" y="800.8" textLength="915" clip-path="url(#breeze-ci-image-build-line-32)">(INTEGER RANGE)                                   &# [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-33)">│</text><text class="breeze-ci-image-build-r5" x="378.2" y="825.2" textLength="915" clip-path="url(#breeze-ci-image-build-line-33)">[default: 4; 1<=x<=8]                                 [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-34)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="849.6" textLength="207.4" clip-path="url(#breeze-ci-image-build-line-34)">--python-versions</text><text class="breeze-ci-image-build-r1" x="378.2" y="849.6" textLength="951.6" clip-path="url(#breeze-ci-image-build-line-34)">Space separated list of python versions used f [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-35)">│</text><text class="breeze-ci-image-build-r5" x="378.2" y="874" textLength="951.6" clip-path="url(#breeze-ci-image-build-line-35)">[default: 3.9 3.10 3.11 3.12]                                [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-36)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="898.4" textLength="207.4" clip-path="url(#breeze-ci-image-build-line-36)">--run-in-parallel</text><text class="breeze-ci-image-build-r1" x="378.2" y="898.4" textLength="854" clip-path="url(#breeze-ci-image-build-line-36)">Run the operation in parallel on all or sel [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-37)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="922.8" textLength="170.8" clip-path="url(#breeze-ci-image-build-line-37)">--skip-cleanup</text><text class="breeze-ci-image-build-r1" x="378.2" y="922.8" textLength="732" clip-path="url(#breeze-ci-image-build-line-37)">Skip cleanup of temporary files created during para [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="947.2" textLength="1464" clip-path="url(#breeze-ci-image-build-line-38)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="947.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-38)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="971.6" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-39)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="971.6" textLength="512.4" clip-path="url(#breeze-ci-image-build-line-39)"> Advanced build options (for power users) </text><text class="breeze-ci-image-build-r5" x="536.8" y="971.6" textLength="902.8" clip-path="url(#breeze-ci-image-build-line-39)">──────────────────── [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-40)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="996" textLength="366" clip-path="url(#breeze-ci-image-build-line-40)">--additional-pip-install-flags</text><text class="breeze-ci-image-build-r1" x="439.2" y="996" textLength="1000.4" clip-path="url(#breeze-ci-image-build-line-40)">Additional flags added to `pip install` comma [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-41)">│</text><text class="breeze-ci-image-build-r1" x="439.2" y="1020.4" textLength="1000.4" clip-path="url(#breeze-ci-image-build-line-41)">itself).                                     [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-42)">│</text><text class="breeze-ci-image-build-r7" x="439.2" y="1044.8" textLength="1000.4" clip-path="url(#breeze-ci-image-build-line-42)">(TEXT)                                      [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-43)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1069.2" textLength="146.4" clip-path="url(#breeze-ci-image-build-line-43)">--commit-sha</text><text class="breeze-ci-image-build-r1" x="439.2" y="1069.2" textLength="536.8" clip-path="url(#breeze-ci-image-build-line-43)">Commit SHA that is used to build the images [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-44)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1093.6" textLength="195.2" clip-path="url(#breeze-ci-image-build-line-44)">--debian-version</text><text class="breeze-ci-image-build-r1" x="439.2" y="1093.6" textLength="793" clip-path="url(#breeze-ci-image-build-line-44)">Debian version used in Airflow image as base&# [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-45)">│</text><text class="breeze-ci-image-build-r5" x="439.2" y="1118" textLength="793" clip-path="url(#breeze-ci-image-build-line-45)">[default: bookworm]                                    [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-46)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1142.4" textLength="341.6" clip-path="url(#breeze-ci-image-build-line-46)">--disable-airflow-repo-cache</text><text class="breeze-ci-image-build-r1" x="439.2" y="1142.4" textLength="658.8" clip-path="url(#breeze-ci-image-build-line-46)">Disable cache from Airflow repository duri [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-47)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1166.8" textLength="329.4" clip-path="url(#breeze-ci-image-build-line-47)">--install-mysql-client-type</text><text class="breeze-ci-image-build-r1" x="439.2" y="1166.8" textLength="475.8" clip-path="url(#breeze-ci-image-build-line-47)">Which client to choose when installing.</te [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-48)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1191.2" textLength="170.8" clip-path="url(#breeze-ci-image-build-line-48)">--python-image</text><text class="breeze-ci-image-build-r1" x="439.2" y="1191.2" textLength="1000.4" clip-path="url(#breeze-ci-image-build-line-48)">If specified this is the base python image [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-49)">│</text><text class="breeze-ci-image-build-r1" x="439.2" y="1215.6" textLength="1000.4" clip-path="url(#breeze-ci-image-build-line-49)">something like: python:VERSION-slim-bookworm.                             [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-50)">│</text><text class="breeze-ci-image-build-r7" x="439.2" y="1240" textLength="1000.4" clip-path="url(#breeze-ci-image-build-line-50)">(TEXT)                                      [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-51)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1264.4" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-51)">--use-uv</text><text class="breeze-ci-image-build-r1" x="122" y="1264.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-51)">/</text><text class="breeze-ci-image-build-r4" x="134.2" y="1264.4" textLength="134.2" clip [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-52)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1288.8" textLength="207.4" clip-path="url(#breeze-ci-image-build-line-52)">--uv-http-timeout</text><text class="breeze-ci-image-build-r1" x="439.2" y="1288.8" textLength="829.6" clip-path="url(#breeze-ci-image-build-line-52)">Timeout for requests that UV makes (only us [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-53)">│</text><text class="breeze-ci-image-build-r7" x="439.2" y="1313.2" textLength="829.6" clip-path="url(#breeze-ci-image-build-line-53)">(INTEGER RANGE)                                   [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-54)">│</text><text class="breeze-ci-image-build-r5" x="439.2" y="1337.6" textLength="829.6" clip-path="url(#breeze-ci-image-build-line-54)">[default: 300; x>=1]                                 [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1362" textLength="1464" clip-path="url(#breeze-ci-image-build-line-55)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="1362" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-55)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="1386.4" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-56)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="1386.4" textLength="597.8" clip-path="url(#breeze-ci-image-build-line-56)"> Selecting constraint location (for power users) </text><text class="breeze-ci-image-build-r5" x="622.2" y="1386.4" textLength="817.4" clip-path="url(#breeze-ci-image-build-line-56)">────────── [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1410.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-57)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1410.8" textLength="366" clip-path="url(#breeze-ci-image-build-line-57)">--airflow-constraints-location</text><text class="breeze-ci-image-build-r1" x="451.4" y="1410.8" textLength="902.8" clip-path="url(#breeze-ci-image-build-line-57)">Location of airflow constraints to use [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1435.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-58)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1435.2" textLength="317.2" clip-path="url(#breeze-ci-image-build-line-58)">--airflow-constraints-mode</text><text class="breeze-ci-image-build-r1" x="451.4" y="1435.2" textLength="866.2" clip-path="url(#breeze-ci-image-build-line-58)">Mode of constraints for Airflow for CI& [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-59)">│</text><text class="breeze-ci-image-build-r7" x="451.4" y="1459.6" textLength="866.2" clip-path="url(#breeze-ci-image-build-line-59)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-ci-image-build-r5" x="1451.8" y="1459.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-59)">│</ [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-60)">│</text><text class="breeze-ci-image-build-r5" x="451.4" y="1484" textLength="866.2" clip-path="url(#breeze-ci-image-build-line-60)">[default: constraints-source-providers]                               &# [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-61)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1508.4" textLength="378.2" clip-path="url(#breeze-ci-image-build-line-61)">--airflow-constraints-reference</text><text class="breeze-ci-image-build-r1" x="451.4" y="1508.4" textLength="634.4" clip-path="url(#breeze-ci-image-build-line-61)">Constraint reference to use when buildi [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1532.8" textLength="1464" clip-path="url(#breeze-ci-image-build-line-62)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="1532.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-62)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="1557.2" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-63)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="1557.2" textLength="634.4" clip-path="url(#breeze-ci-image-build-line-63)"> Choosing dependencies and extras (for power users) </text><text class="breeze-ci-image-build-r5" x="658.8" y="1557.2" textLength="780.8" clip-path="url(#breeze-ci-image-build-line-63)">── [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-64)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1581.6" textLength="329.4" clip-path="url(#breeze-ci-image-build-line-64)">--additional-airflow-extras</text><text class="breeze-ci-image-build-r1" x="414.8" y="1581.6" textLength="768.6" clip-path="url(#breeze-ci-image-build-line-64)">Additional extra package while installing A [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1606" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-65)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1606" textLength="292.8" clip-path="url(#breeze-ci-image-build-line-65)">--additional-python-deps</text><text class="breeze-ci-image-build-r1" x="414.8" y="1606" textLength="768.6" clip-path="url(#breeze-ci-image-build-line-65)">Additional python dependencies to use when buil [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1630.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-66)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1630.4" textLength="170.8" clip-path="url(#breeze-ci-image-build-line-66)">--dev-apt-deps</text><text class="breeze-ci-image-build-r1" x="414.8" y="1630.4" textLength="646.6" clip-path="url(#breeze-ci-image-build-line-66)">Apt dev dependencies to use when building the& [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1654.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-67)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1654.8" textLength="305" clip-path="url(#breeze-ci-image-build-line-67)">--additional-dev-apt-deps</text><text class="breeze-ci-image-build-r1" x="414.8" y="1654.8" textLength="780.8" clip-path="url(#breeze-ci-image-build-line-67)">Additional apt dev dependencies to use whe [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1679.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-68)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1679.2" textLength="207.4" clip-path="url(#breeze-ci-image-build-line-68)">--dev-apt-command</text><text class="breeze-ci-image-build-r1" x="414.8" y="1679.2" textLength="622.2" clip-path="url(#breeze-ci-image-build-line-68)">Command executed before dev apt deps are in [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1703.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-69)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1703.6" textLength="341.6" clip-path="url(#breeze-ci-image-build-line-69)">--additional-dev-apt-command</text><text class="breeze-ci-image-build-r1" x="414.8" y="1703.6" textLength="756.4" clip-path="url(#breeze-ci-image-build-line-69)">Additional command executed before dev apt [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1728" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-70)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1728" textLength="292.8" clip-path="url(#breeze-ci-image-build-line-70)">--additional-dev-apt-env</text><text class="breeze-ci-image-build-r1" x="414.8" y="1728" textLength="805.2" clip-path="url(#breeze-ci-image-build-line-70)">Additional environment variables set when adding [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1752.4" textLength="1464" clip-path="url(#breeze-ci-image-build-line-71)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="1752.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-71)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="1776.8" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-72)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="1776.8" textLength="268.4" clip-path="url(#breeze-ci-image-build-line-72)"> Backtracking options </text><text class="breeze-ci-image-build-r5" x="292.8" y="1776.8" textLength="1146.8" clip-path="url(#breeze-ci-image-build-line-72)">──────────────────────────────────────────────────────── [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-73)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1801.2" textLength="280.6" clip-path="url(#breeze-ci-image-build-line-73)">--build-timeout-minutes</text><text class="breeze-ci-image-build-r1" x="549" y="1801.2" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-73)">Optional timeout for the build in minutes.&# [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-74)">│</text><text class="breeze-ci-image-build-r1" x="549" y="1825.6" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-74)">backtracking problems.                                   [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-75)">│</text><text class="breeze-ci-image-build-r7" x="549" y="1850" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-75)">(INTEGER)                                      [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-76)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1874.4" textLength="475.8" clip-path="url(#breeze-ci-image-build-line-76)">--eager-upgrade-additional-requirements</text><text class="breeze-ci-image-build-r1" x="549" y="1874.4" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-76)">Optional additional requirements to up [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-77)">│</text><text class="breeze-ci-image-build-r1" x="549" y="1898.8" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-77)">(see `breeze ci find-backtracking-candidates`).                          </text><text [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-78)">│</text><text class="breeze-ci-image-build-r7" x="549" y="1923.2" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-78)">(TEXT)                                     &# [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1947.6" textLength="1464" clip-path="url(#breeze-ci-image-build-line-79)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="1947.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-79)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="1972" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-80)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="1972" textLength="622.2" clip-path="url(#breeze-ci-image-build-line-80)"> Preparing cache and push (for maintainers and CI) </text><text class="breeze-ci-image-build-r5" x="646.6" y="1972" textLength="793" clip-path="url(#breeze-ci-image-build-line-80)">────── [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-81)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1996.4" textLength="109.8" clip-path="url(#breeze-ci-image-build-line-81)">--builder</text><text class="breeze-ci-image-build-r1" x="341.6" y="1996.4" textLength="756.4" clip-path="url(#breeze-ci-image-build-line-81)">Buildx builder used to perform `docker buildx build [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-82)">│</text><text class="breeze-ci-image-build-r5" x="341.6" y="2020.8" textLength="756.4" clip-path="url(#breeze-ci-image-build-line-82)">[default: autodetect]                                  [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-83)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2045.2" textLength="122" clip-path="url(#breeze-ci-image-build-line-83)">--platform</text><text class="breeze-ci-image-build-r1" x="341.6" y="2045.2" textLength="329.4" clip-path="url(#breeze-ci-image-build-line-83)">Platform for Airflow image.</text><text class="breeze-ci-image-build-r7" [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-84)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2069.6" textLength="73.2" clip-path="url(#breeze-ci-image-build-line-84)">--push</text><text class="breeze-ci-image-build-r1" x="341.6" y="2069.6" textLength="353.8" clip-path="url(#breeze-ci-image-build-line-84)">Push image after building it.</text><text class="breeze-ci-image-build [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-85)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2094" textLength="268.4" clip-path="url(#breeze-ci-image-build-line-85)">--prepare-buildx-cache</text><text class="breeze-ci-image-build-r1" x="341.6" y="2094" textLength="1098" clip-path="url(#breeze-ci-image-build-line-85)">Prepares build cache (this is done as separat [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-86)">│</text><text class="breeze-ci-image-build-r1" x="341.6" y="2118.4" textLength="1098" clip-path="url(#breeze-ci-image-build-line-86)">image).                                      [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2142.8" textLength="1464" clip-path="url(#breeze-ci-image-build-line-87)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="2142.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-87)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="2167.2" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-88)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="2167.2" textLength="280.6" clip-path="url(#breeze-ci-image-build-line-88)"> Github authentication </text><text class="breeze-ci-image-build-r5" x="305" y="2167.2" textLength="1134.6" clip-path="url(#breeze-ci-image-build-line-88)">───────────────────────────────────────────────────────── [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-89)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2191.6" textLength="231.8" clip-path="url(#breeze-ci-image-build-line-89)">--github-repository</text><text class="breeze-ci-image-build-r6" x="280.6" y="2191.6" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-89)">-g</text><text class="breeze-ci-image-build-r1" x="329.4" y="2191.6" textLeng [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-90)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2216" textLength="170.8" clip-path="url(#breeze-ci-image-build-line-90)">--github-token</text><text class="breeze-ci-image-build-r1" x="329.4" y="2216" textLength="500.2" clip-path="url(#breeze-ci-image-build-line-90)">The token used to authenticate to GitHub.</text><text cla [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2240.4" textLength="1464" clip-path="url(#breeze-ci-image-build-line-91)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="2240.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-91)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="2264.8" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-92)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="2264.8" textLength="195.2" clip-path="url(#breeze-ci-image-build-line-92)"> Common options </text><text class="breeze-ci-image-build-r5" x="219.6" y="2264.8" textLength="1220" clip-path="url(#breeze-ci-image-build-line-92)">──────────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-93)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2289.2" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-93)">--answer</text><text class="breeze-ci-image-build-r6" x="158.6" y="2289.2" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-93)">-a</text><text class="breeze-ci-image-build-r1" x="207.4" y="2289.2" textLength="317.2" c [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-94)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2313.6" textLength="109.8" clip-path="url(#breeze-ci-image-build-line-94)">--dry-run</text><text class="breeze-ci-image-build-r6" x="158.6" y="2313.6" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-94)">-D</text><text class="breeze-ci-image-build-r1" x="207.4" y="2313.6" textLength="719.8" [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2338" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-95)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2338" textLength="109.8" clip-path="url(#breeze-ci-image-build-line-95)">--verbose</text><text class="breeze-ci-image-build-r6" x="158.6" y="2338" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-95)">-v</text><text class="breeze-ci-image-build-r1" x="207.4" y="2338" textLength="585.6" clip-pa [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-96)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2362.4" textLength="73.2" clip-path="url(#breeze-ci-image-build-line-96)">--help</text><text class="breeze-ci-image-build-r6" x="158.6" y="2362.4" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-96)">-h</text><text class="breeze-ci-image-build-r1" x="207.4" y="2362.4" textLength="329.4" cli [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2386.8" textLength="1464" clip-path="url(#breeze-ci-image-build-line-97)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="2386.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-97)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-14)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="361.6" textLength="170.8" clip-path="url(#breeze-ci-image-build-line-14)">--docker-cache</text><text class="breeze-ci-image-build-r6" x="585.6" y="361.6" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-14)">-c</text><text class="breeze-ci-image-build-r1" x="634.4" y="361.6" textLength="549" [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-15)">│</text><text class="breeze-ci-image-build-r7" x="634.4" y="386" textLength="549" clip-path="url(#breeze-ci-image-build-line-15)">(registry | local | disabled)                </text><text class="breeze-ci-image-build-r5" x="1451.8" y="386" textLength="12.2" clip-pat [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-16)">│</text><text class="breeze-ci-image-build-r5" x="634.4" y="410.4" textLength="549" clip-path="url(#breeze-ci-image-build-line-16)">[default: registry]                          </text><text class="breeze-ci-image-build-r5" x="145 [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-17)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="434.8" textLength="305" clip-path="url(#breeze-ci-image-build-line-17)">--version-suffix-for-pypi</text><text class="breeze-ci-image-build-r1" x="634.4" y="434.8" textLength="768.6" clip-path="url(#breeze-ci-image-build-line-17)">Version suffix used for PyPI packages (alpha, [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-18)">│</text><text class="breeze-ci-image-build-r7" x="634.4" y="459.2" textLength="768.6" clip-path="url(#breeze-ci-image-build-line-18)">(TEXT)                                     &# [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-19)">│</text><text class="breeze-ci-image-build-r5" x="634.4" y="483.6" textLength="768.6" clip-path="url(#breeze-ci-image-build-line-19)">[default: dev0]                                    [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-20)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="508" textLength="195.2" clip-path="url(#breeze-ci-image-build-line-20)">--build-progress</text><text class="breeze-ci-image-build-r1" x="634.4" y="508" textLength="183" clip-path="url(#breeze-ci-image-build-line-20)">Build progress.</text><text class="breeze-ci-image-build-r7" x="829.6" y="508" textLe [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-21)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="532.4" textLength="158.6" clip-path="url(#breeze-ci-image-build-line-21)">--docker-host</text><text class="breeze-ci-image-build-r1" x="634.4" y="532.4" textLength="805.2" clip-path="url(#breeze-ci-image-build-line-21)">Optional - docker host to use when running do [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-22)">│</text><text class="breeze-ci-image-build-r1" x="634.4" y="556.8" textLength="122" clip-path="url(#breeze-ci-image-build-line-22)">set, the `</text><text class="breeze-ci-image-build-r4" x="756.4" y="556.8" textLength="109.8" clip-path="url(#breeze-ci-image-build-line-22)">--builder</text><text class="breeze-ci-image-build-r1" x="866.2" y="556.8" text [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-23)">│</text><text class="breeze-ci-image-build-r7" x="634.4" y="581.2" textLength="805.2" clip-path="url(#breeze-ci-image-build-line-23)">(TEXT)                                     &# [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="605.6" textLength="1464" clip-path="url(#breeze-ci-image-build-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-24)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="630" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-25)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="630" textLength="353.8" clip-path="url(#breeze-ci-image-build-line-25)"> Building images in parallel </text><text class="breeze-ci-image-build-r5" x="378.2" y="630" textLength="1061.4" clip-path="url(#breeze-ci-image-build-line-25)">──────────────────────────────────────────────── [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-26)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="654.4" textLength="207.4" clip-path="url(#breeze-ci-image-build-line-26)">--debug-resources</text><text class="breeze-ci-image-build-r1" x="378.2" y="654.4" textLength="768.6" clip-path="url(#breeze-ci-image-build-line-26)">Whether to show resource information while running& [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-27)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="678.8" textLength="305" clip-path="url(#breeze-ci-image-build-line-27)">--include-success-outputs</text><text class="breeze-ci-image-build-r1" x="378.2" y="678.8" textLength="927.2" clip-path="url(#breeze-ci-image-build-line-27)">Whether to include outputs of successful para [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-28)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="703.2" textLength="158.6" clip-path="url(#breeze-ci-image-build-line-28)">--parallelism</text><text class="breeze-ci-image-build-r1" x="378.2" y="703.2" textLength="915" clip-path="url(#breeze-ci-image-build-line-28)">Maximum number of processes to use while running [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-29)">│</text><text class="breeze-ci-image-build-r7" x="378.2" y="727.6" textLength="915" clip-path="url(#breeze-ci-image-build-line-29)">(INTEGER RANGE)                                   &# [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-30)">│</text><text class="breeze-ci-image-build-r5" x="378.2" y="752" textLength="915" clip-path="url(#breeze-ci-image-build-line-30)">[default: 4; 1<=x<=8]                                 & [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-31)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="776.4" textLength="207.4" clip-path="url(#breeze-ci-image-build-line-31)">--python-versions</text><text class="breeze-ci-image-build-r1" x="378.2" y="776.4" textLength="951.6" clip-path="url(#breeze-ci-image-build-line-31)">Space separated list of python versions used f [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-32)">│</text><text class="breeze-ci-image-build-r5" x="378.2" y="800.8" textLength="951.6" clip-path="url(#breeze-ci-image-build-line-32)">[default: 3.9 3.10 3.11 3.12]                              & [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-33)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="825.2" textLength="207.4" clip-path="url(#breeze-ci-image-build-line-33)">--run-in-parallel</text><text class="breeze-ci-image-build-r1" x="378.2" y="825.2" textLength="854" clip-path="url(#breeze-ci-image-build-line-33)">Run the operation in parallel on all or sel [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-34)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="849.6" textLength="170.8" clip-path="url(#breeze-ci-image-build-line-34)">--skip-cleanup</text><text class="breeze-ci-image-build-r1" x="378.2" y="849.6" textLength="732" clip-path="url(#breeze-ci-image-build-line-34)">Skip cleanup of temporary files created during para [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="874" textLength="1464" clip-path="url(#breeze-ci-image-build-line-35)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-35)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="898.4" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-36)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="898.4" textLength="512.4" clip-path="url(#breeze-ci-image-build-line-36)"> Advanced build options (for power users) </text><text class="breeze-ci-image-build-r5" x="536.8" y="898.4" textLength="902.8" clip-path="url(#breeze-ci-image-build-line-36)">──────────────────── [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-37)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="922.8" textLength="366" clip-path="url(#breeze-ci-image-build-line-37)">--additional-pip-install-flags</text><text class="breeze-ci-image-build-r1" x="439.2" y="922.8" textLength="1000.4" clip-path="url(#breeze-ci-image-build-line-37)">Additional flags added to `pip install`  [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-38)">│</text><text class="breeze-ci-image-build-r1" x="439.2" y="947.2" textLength="1000.4" clip-path="url(#breeze-ci-image-build-line-38)">itself).                                      [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-39)">│</text><text class="breeze-ci-image-build-r7" x="439.2" y="971.6" textLength="1000.4" clip-path="url(#breeze-ci-image-build-line-39)">(TEXT)                                     & [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-40)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="996" textLength="146.4" clip-path="url(#breeze-ci-image-build-line-40)">--commit-sha</text><text class="breeze-ci-image-build-r1" x="439.2" y="996" textLength="536.8" clip-path="url(#breeze-ci-image-build-line-40)">Commit SHA that is used to build the images.</text>< [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-41)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1020.4" textLength="195.2" clip-path="url(#breeze-ci-image-build-line-41)">--debian-version</text><text class="breeze-ci-image-build-r1" x="439.2" y="1020.4" textLength="793" clip-path="url(#breeze-ci-image-build-line-41)">Debian version used in Airflow image as base&# [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-42)">│</text><text class="breeze-ci-image-build-r5" x="439.2" y="1044.8" textLength="793" clip-path="url(#breeze-ci-image-build-line-42)">[default: bookworm]                                  &# [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-43)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1069.2" textLength="341.6" clip-path="url(#breeze-ci-image-build-line-43)">--disable-airflow-repo-cache</text><text class="breeze-ci-image-build-r1" x="439.2" y="1069.2" textLength="658.8" clip-path="url(#breeze-ci-image-build-line-43)">Disable cache from Airflow repository duri [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-44)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1093.6" textLength="329.4" clip-path="url(#breeze-ci-image-build-line-44)">--install-mysql-client-type</text><text class="breeze-ci-image-build-r1" x="439.2" y="1093.6" textLength="475.8" clip-path="url(#breeze-ci-image-build-line-44)">Which client to choose when installing.</te [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-45)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1118" textLength="170.8" clip-path="url(#breeze-ci-image-build-line-45)">--python-image</text><text class="breeze-ci-image-build-r1" x="439.2" y="1118" textLength="1000.4" clip-path="url(#breeze-ci-image-build-line-45)">If specified this is the base python image use [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-46)">│</text><text class="breeze-ci-image-build-r1" x="439.2" y="1142.4" textLength="1000.4" clip-path="url(#breeze-ci-image-build-line-46)">something like: python:VERSION-slim-bookworm.                             [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-47)">│</text><text class="breeze-ci-image-build-r7" x="439.2" y="1166.8" textLength="1000.4" clip-path="url(#breeze-ci-image-build-line-47)">(TEXT)                                      [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-48)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1191.2" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-48)">--use-uv</text><text class="breeze-ci-image-build-r1" x="122" y="1191.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-48)">/</text><text class="breeze-ci-image-build-r4" x="134.2" y="1191.2" textLength="134.2" clip [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-49)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1215.6" textLength="207.4" clip-path="url(#breeze-ci-image-build-line-49)">--uv-http-timeout</text><text class="breeze-ci-image-build-r1" x="439.2" y="1215.6" textLength="829.6" clip-path="url(#breeze-ci-image-build-line-49)">Timeout for requests that UV makes (only us [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-50)">│</text><text class="breeze-ci-image-build-r7" x="439.2" y="1240" textLength="829.6" clip-path="url(#breeze-ci-image-build-line-50)">(INTEGER RANGE)                                   &# [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-51)">│</text><text class="breeze-ci-image-build-r5" x="439.2" y="1264.4" textLength="829.6" clip-path="url(#breeze-ci-image-build-line-51)">[default: 300; x>=1]                                 [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1288.8" textLength="1464" clip-path="url(#breeze-ci-image-build-line-52)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="1288.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-52)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="1313.2" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-53)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="1313.2" textLength="597.8" clip-path="url(#breeze-ci-image-build-line-53)"> Selecting constraint location (for power users) </text><text class="breeze-ci-image-build-r5" x="622.2" y="1313.2" textLength="817.4" clip-path="url(#breeze-ci-image-build-line-53)">────────── [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-54)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1337.6" textLength="366" clip-path="url(#breeze-ci-image-build-line-54)">--airflow-constraints-location</text><text class="breeze-ci-image-build-r1" x="451.4" y="1337.6" textLength="902.8" clip-path="url(#breeze-ci-image-build-line-54)">Location of airflow constraints to use [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-55)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1362" textLength="317.2" clip-path="url(#breeze-ci-image-build-line-55)">--airflow-constraints-mode</text><text class="breeze-ci-image-build-r1" x="451.4" y="1362" textLength="866.2" clip-path="url(#breeze-ci-image-build-line-55)">Mode of constraints for Airflow for CI i [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-56)">│</text><text class="breeze-ci-image-build-r7" x="451.4" y="1386.4" textLength="866.2" clip-path="url(#breeze-ci-image-build-line-56)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-ci-image-build-r5" x="1451.8" y="1386.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-56)">│</ [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1410.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-57)">│</text><text class="breeze-ci-image-build-r5" x="451.4" y="1410.8" textLength="866.2" clip-path="url(#breeze-ci-image-build-line-57)">[default: constraints-source-providers]                               [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1435.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-58)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1435.2" textLength="378.2" clip-path="url(#breeze-ci-image-build-line-58)">--airflow-constraints-reference</text><text class="breeze-ci-image-build-r1" x="451.4" y="1435.2" textLength="634.4" clip-path="url(#breeze-ci-image-build-line-58)">Constraint reference to use when buildi [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1459.6" textLength="1464" clip-path="url(#breeze-ci-image-build-line-59)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="1459.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-59)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="1484" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-60)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="1484" textLength="634.4" clip-path="url(#breeze-ci-image-build-line-60)"> Choosing dependencies and extras (for power users) </text><text class="breeze-ci-image-build-r5" x="658.8" y="1484" textLength="780.8" clip-path="url(#breeze-ci-image-build-line-60)">──────── [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-61)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1508.4" textLength="329.4" clip-path="url(#breeze-ci-image-build-line-61)">--additional-airflow-extras</text><text class="breeze-ci-image-build-r1" x="414.8" y="1508.4" textLength="768.6" clip-path="url(#breeze-ci-image-build-line-61)">Additional extra package while installing A [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1532.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-62)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1532.8" textLength="292.8" clip-path="url(#breeze-ci-image-build-line-62)">--additional-python-deps</text><text class="breeze-ci-image-build-r1" x="414.8" y="1532.8" textLength="768.6" clip-path="url(#breeze-ci-image-build-line-62)">Additional python dependencies to use when [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1557.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-63)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1557.2" textLength="170.8" clip-path="url(#breeze-ci-image-build-line-63)">--dev-apt-deps</text><text class="breeze-ci-image-build-r1" x="414.8" y="1557.2" textLength="646.6" clip-path="url(#breeze-ci-image-build-line-63)">Apt dev dependencies to use when building the& [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-64)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1581.6" textLength="305" clip-path="url(#breeze-ci-image-build-line-64)">--additional-dev-apt-deps</text><text class="breeze-ci-image-build-r1" x="414.8" y="1581.6" textLength="780.8" clip-path="url(#breeze-ci-image-build-line-64)">Additional apt dev dependencies to use whe [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1606" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-65)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1606" textLength="207.4" clip-path="url(#breeze-ci-image-build-line-65)">--dev-apt-command</text><text class="breeze-ci-image-build-r1" x="414.8" y="1606" textLength="622.2" clip-path="url(#breeze-ci-image-build-line-65)">Command executed before dev apt deps are installe [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1630.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-66)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1630.4" textLength="341.6" clip-path="url(#breeze-ci-image-build-line-66)">--additional-dev-apt-command</text><text class="breeze-ci-image-build-r1" x="414.8" y="1630.4" textLength="756.4" clip-path="url(#breeze-ci-image-build-line-66)">Additional command executed before dev apt [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1654.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-67)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1654.8" textLength="292.8" clip-path="url(#breeze-ci-image-build-line-67)">--additional-dev-apt-env</text><text class="breeze-ci-image-build-r1" x="414.8" y="1654.8" textLength="805.2" clip-path="url(#breeze-ci-image-build-line-67)">Additional environment variables set when addi [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1679.2" textLength="1464" clip-path="url(#breeze-ci-image-build-line-68)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="1679.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-68)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="1703.6" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-69)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="1703.6" textLength="268.4" clip-path="url(#breeze-ci-image-build-line-69)"> Backtracking options </text><text class="breeze-ci-image-build-r5" x="292.8" y="1703.6" textLength="1146.8" clip-path="url(#breeze-ci-image-build-line-69)">──────────────────────────────────────────────────────── [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1728" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-70)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1728" textLength="280.6" clip-path="url(#breeze-ci-image-build-line-70)">--build-timeout-minutes</text><text class="breeze-ci-image-build-r1" x="549" y="1728" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-70)">Optional timeout for the build in minutes. Us [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1752.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-71)">│</text><text class="breeze-ci-image-build-r1" x="549" y="1752.4" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-71)">backtracking problems.                                   [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-72)">│</text><text class="breeze-ci-image-build-r7" x="549" y="1776.8" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-72)">(INTEGER)                                      [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-73)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1801.2" textLength="475.8" clip-path="url(#breeze-ci-image-build-line-73)">--eager-upgrade-additional-requirements</text><text class="breeze-ci-image-build-r1" x="549" y="1801.2" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-73)">Optional additional requirements to up [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-74)">│</text><text class="breeze-ci-image-build-r1" x="549" y="1825.6" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-74)">(see `breeze ci find-backtracking-candidates`).                          </text><text [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-75)">│</text><text class="breeze-ci-image-build-r7" x="549" y="1850" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-75)">(TEXT)                                       [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1874.4" textLength="1464" clip-path="url(#breeze-ci-image-build-line-76)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="1874.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-76)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="1898.8" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-77)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="1898.8" textLength="622.2" clip-path="url(#breeze-ci-image-build-line-77)"> Preparing cache and push (for maintainers and CI) </text><text class="breeze-ci-image-build-r5" x="646.6" y="1898.8" textLength="793" clip-path="url(#breeze-ci-image-build-line-77)"> [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-78)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1923.2" textLength="109.8" clip-path="url(#breeze-ci-image-build-line-78)">--builder</text><text class="breeze-ci-image-build-r1" x="341.6" y="1923.2" textLength="756.4" clip-path="url(#breeze-ci-image-build-line-78)">Buildx builder used to perform `docker buildx build [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-79)">│</text><text class="breeze-ci-image-build-r5" x="341.6" y="1947.6" textLength="756.4" clip-path="url(#breeze-ci-image-build-line-79)">[default: autodetect]                                  [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-80)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1972" textLength="122" clip-path="url(#breeze-ci-image-build-line-80)">--platform</text><text class="breeze-ci-image-build-r1" x="341.6" y="1972" textLength="329.4" clip-path="url(#breeze-ci-image-build-line-80)">Platform for Airflow image.</text><text class="breeze-ci-image-build-r7" x="68 [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-81)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1996.4" textLength="73.2" clip-path="url(#breeze-ci-image-build-line-81)">--push</text><text class="breeze-ci-image-build-r1" x="341.6" y="1996.4" textLength="353.8" clip-path="url(#breeze-ci-image-build-line-81)">Push image after building it.</text><text class="breeze-ci-image-build [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-82)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2020.8" textLength="268.4" clip-path="url(#breeze-ci-image-build-line-82)">--prepare-buildx-cache</text><text class="breeze-ci-image-build-r1" x="341.6" y="2020.8" textLength="1098" clip-path="url(#breeze-ci-image-build-line-82)">Prepares build cache (this is done as s [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-83)">│</text><text class="breeze-ci-image-build-r1" x="341.6" y="2045.2" textLength="1098" clip-path="url(#breeze-ci-image-build-line-83)">image).                                      [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2069.6" textLength="1464" clip-path="url(#breeze-ci-image-build-line-84)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="2069.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-84)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="2094" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-85)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="2094" textLength="280.6" clip-path="url(#breeze-ci-image-build-line-85)"> Github authentication </text><text class="breeze-ci-image-build-r5" x="305" y="2094" textLength="1134.6" clip-path="url(#breeze-ci-image-build-line-85)">─────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-86)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2118.4" textLength="231.8" clip-path="url(#breeze-ci-image-build-line-86)">--github-repository</text><text class="breeze-ci-image-build-r6" x="280.6" y="2118.4" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-86)">-g</text><text class="breeze-ci-image-build-r1" x="329.4" y="2118.4" textLeng [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-87)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2142.8" textLength="170.8" clip-path="url(#breeze-ci-image-build-line-87)">--github-token</text><text class="breeze-ci-image-build-r1" x="329.4" y="2142.8" textLength="500.2" clip-path="url(#breeze-ci-image-build-line-87)">The token used to authenticate to GitHub.</text><te [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2167.2" textLength="1464" clip-path="url(#breeze-ci-image-build-line-88)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="2167.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-88)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="2191.6" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-89)">â•─</text><text class="breeze-ci-image-build-r5" x="24.4" y="2191.6" textLength="195.2" clip-path="url(#breeze-ci-image-build-line-89)"> Common options </text><text class="breeze-ci-image-build-r5" x="219.6" y="2191.6" textLength="1220" clip-path="url(#breeze-ci-image-build-line-89)">──────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-90)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2216" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-90)">--answer</text><text class="breeze-ci-image-build-r6" x="158.6" y="2216" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-90)">-a</text><text class="breeze-ci-image-build-r1" x="207.4" y="2216" textLength="317.2" clip-path [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-91)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2240.4" textLength="109.8" clip-path="url(#breeze-ci-image-build-line-91)">--dry-run</text><text class="breeze-ci-image-build-r6" x="158.6" y="2240.4" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-91)">-D</text><text class="breeze-ci-image-build-r1" x="207.4" y="2240.4" textLength="719.8" [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-92)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2264.8" textLength="109.8" clip-path="url(#breeze-ci-image-build-line-92)">--verbose</text><text class="breeze-ci-image-build-r6" x="158.6" y="2264.8" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-92)">-v</text><text class="breeze-ci-image-build-r1" x="207.4" y="2264.8" textLength="585.6" [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-93)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="2289.2" textLength="73.2" clip-path="url(#breeze-ci-image-build-line-93)">--help</text><text class="breeze-ci-image-build-r6" x="158.6" y="2289.2" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-93)">-h</text><text class="breeze-ci-image-build-r1" x="207.4" y="2289.2" textLength="329.4" cli [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2313.6" textLength="1464" clip-path="url(#breeze-ci-image-build-line-94)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r1" x="1464" y="2313.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-94)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_ci-image_build.txt b/dev/breeze/doc/images/output_ci-image_build.txt
index 1e8db97e1c1..cbce7980554 100644
--- a/dev/breeze/doc/images/output_ci-image_build.txt
+++ b/dev/breeze/doc/images/output_ci-image_build.txt
@@ -1 +1 @@
-60e01048b3af164825f8ec4070543e89
+01a10df4bebe9c35b046b242e9e6afa5
diff --git a/dev/breeze/doc/images/output_ci-image_load.svg b/dev/breeze/doc/images/output_ci-image_load.svg
new file mode 100644
index 00000000000..f7338ca40ee
--- /dev/null
+++ b/dev/breeze/doc/images/output_ci-image_load.svg
@@ -0,0 +1,144 @@
+<svg class="rich-terminal" viewBox="0 0 1482 562.4" xmlns="http://www.w3.org/2000/svg">
+ <!-- Generated with Rich https://www.textualize.io -->
+ <style>
+
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Regular"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
+ font-style: normal;
+ font-weight: 400;
+ }
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Bold"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
+ font-style: bold;
+ font-weight: 700;
+ }
+
+ .breeze-ci-image-load-matrix {
+ font-family: Fira Code, monospace;
+ font-size: 20px;
+ line-height: 24.4px;
+ font-variant-east-asian: full-width;
+ }
+
+ .breeze-ci-image-load-title {
+ font-size: 18px;
+ font-weight: bold;
+ font-family: arial;
+ }
+
+ .breeze-ci-image-load-r1 { fill: #c5c8c6 }
+.breeze-ci-image-load-r2 { fill: #d0b344 }
+.breeze-ci-image-load-r3 { fill: #c5c8c6;font-weight: bold }
+.breeze-ci-image-load-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-ci-image-load-r5 { fill: #868887 }
+.breeze-ci-image-load-r6 { fill: #98a84b;font-weight: bold }
+.breeze-ci-image-load-r7 { fill: #8d7b39 }
+ </style>
+
+ <defs>
+ <clipPath id="breeze-ci-image-load-clip-terminal">
+ <rect x="0" y="0" width="1463.0" height="511.4" />
+ </clipPath>
+ <clipPath id="breeze-ci-image-load-line-0">
+ <rect x="0" y="1.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-1">
+ <rect x="0" y="25.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-2">
+ <rect x="0" y="50.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-3">
+ <rect x="0" y="74.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-4">
+ <rect x="0" y="99.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-5">
+ <rect x="0" y="123.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-6">
+ <rect x="0" y="147.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-7">
+ <rect x="0" y="172.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-8">
+ <rect x="0" y="196.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-9">
+ <rect x="0" y="221.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-10">
+ <rect x="0" y="245.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-11">
+ <rect x="0" y="269.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-12">
+ <rect x="0" y="294.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-13">
+ <rect x="0" y="318.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-14">
+ <rect x="0" y="343.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-15">
+ <rect x="0" y="367.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-16">
+ <rect x="0" y="391.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-17">
+ <rect x="0" y="416.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-18">
+ <rect x="0" y="440.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-load-line-19">
+ <rect x="0" y="465.1" 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="560.4" rx="8"/><text class="breeze-ci-image-load-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: ci-image load</text>
+ <g transform="translate(26,22)">
+ <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
+ <circle cx="22" cy="0" r="7" fill="#febc2e"/>
+ <circle cx="44" cy="0" r="7" fill="#28c840"/>
+ </g>
+
+ <g transform="translate(9, 41)" clip-path="url(#breeze-ci-image-load-clip-terminal)">
+
+ <g class="breeze-ci-image-load-matrix">
+ <text class="breeze-ci-image-load-r1" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-0)">
+</text><text class="breeze-ci-image-load-r2" x="12.2" y="44.4" textLength="73.2" clip-path="url(#breeze-ci-image-load-line-1)">Usage:</text><text class="breeze-ci-image-load-r3" x="97.6" y="44.4" textLength="244" clip-path="url(#breeze-ci-image-load-line-1)">breeze ci-image load</text><text class="breeze-ci-image-load-r1" x="353.8" y="44.4" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-1)">[</text><text class="breeze-ci-image-load-r4" x="366" y="44.4" textLength=" [...]
+</text><text class="breeze-ci-image-load-r1" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-2)">
+</text><text class="breeze-ci-image-load-r1" x="12.2" y="93.2" textLength="317.2" clip-path="url(#breeze-ci-image-load-line-3)">Load CI image from a file.</text><text class="breeze-ci-image-load-r1" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-3)">
+</text><text class="breeze-ci-image-load-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-4)">
+</text><text class="breeze-ci-image-load-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-ci-image-load-line-5)">â•─</text><text class="breeze-ci-image-load-r5" x="24.4" y="142" textLength="219.6" clip-path="url(#breeze-ci-image-load-line-5)"> Load image flags </text><text class="breeze-ci-image-load-r5" x="244" y="142" textLength="1195.6" clip-path="url(#breeze-ci-image-load-line-5)">─────────────────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-ci-image-load-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-6)">│</text><text class="breeze-ci-image-load-r4" x="24.4" y="166.4" textLength="97.6" clip-path="url(#breeze-ci-image-load-line-6)">--python</text><text class="breeze-ci-image-load-r6" x="366" y="166.4" textLength="24.4" clip-path="url(#breeze-ci-image-load-line-6)">-p</text><text class="breeze-ci-image-load-r1" x="414.8" y="166.4" textLength="732" clip-path="url(#bre [...]
+</text><text class="breeze-ci-image-load-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-7)">│</text><text class="breeze-ci-image-load-r7" x="414.8" y="190.8" textLength="732" clip-path="url(#breeze-ci-image-load-line-7)">(>3.9< | 3.10 | 3.11 | 3.12)                              [...]
+</text><text class="breeze-ci-image-load-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-8)">│</text><text class="breeze-ci-image-load-r5" x="414.8" y="215.2" textLength="732" clip-path="url(#breeze-ci-image-load-line-8)">[default: 3.9]                                     [...]
+</text><text class="breeze-ci-image-load-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-9)">│</text><text class="breeze-ci-image-load-r4" x="24.4" y="239.6" textLength="122" clip-path="url(#breeze-ci-image-load-line-9)">--platform</text><text class="breeze-ci-image-load-r1" x="414.8" y="239.6" textLength="329.4" clip-path="url(#breeze-ci-image-load-line-9)">Platform for Airflow image.</text><text class="breeze-ci-image-load-r7" x="756.4" y= [...]
+</text><text class="breeze-ci-image-load-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-10)">│</text><text class="breeze-ci-image-load-r4" x="24.4" y="264" textLength="146.4" clip-path="url(#breeze-ci-image-load-line-10)">--image-file</text><text class="breeze-ci-image-load-r1" x="414.8" y="264" textLength="1024.8" clip-path="url(#breeze-ci-image-load-line-10)">Optional file name to load the image from - name [...]
+</text><text class="breeze-ci-image-load-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-11)">│</text><text class="breeze-ci-image-load-r1" x="414.8" y="288.4" textLength="1024.8" clip-path="url(#breeze-ci-image-load-line-11)">convention:`ci-image-save-{escaped_platform}-*-{python_version}.tar`.               </text><text class="breeze-ci-image-load-r5" x="1451.8" y="288.4" textLeng [...]
+</text><text class="breeze-ci-image-load-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-12)">│</text><text class="breeze-ci-image-load-r7" x="414.8" y="312.8" textLength="1024.8" clip-path="url(#breeze-ci-image-load-line-12)">(FILE)                                       [...]
+</text><text class="breeze-ci-image-load-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-13)">│</text><text class="breeze-ci-image-load-r4" x="24.4" y="337.2" textLength="231.8" clip-path="url(#breeze-ci-image-load-line-13)">--github-repository</text><text class="breeze-ci-image-load-r6" x="366" y="337.2" textLength="24.4" clip-path="url(#breeze-ci-image-load-line-13)">-g</text><text class="breeze-ci-image-load-r1" x="414.8" y="337.2" textLength="585.6" cl [...]
+</text><text class="breeze-ci-image-load-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-14)">│</text><text class="breeze-ci-image-load-r4" x="24.4" y="361.6" textLength="317.2" clip-path="url(#breeze-ci-image-load-line-14)">--skip-image-file-deletion</text><text class="breeze-ci-image-load-r1" x="414.8" y="361.6" textLength="414.8" clip-path="url(#breeze-ci-image-load-line-14)">Skip image deletion after loading.</text><text class="bree [...]
+</text><text class="breeze-ci-image-load-r5" x="0" y="386" textLength="1464" clip-path="url(#breeze-ci-image-load-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-load-r1" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-15)">
+</text><text class="breeze-ci-image-load-r5" x="0" y="410.4" textLength="24.4" clip-path="url(#breeze-ci-image-load-line-16)">â•─</text><text class="breeze-ci-image-load-r5" x="24.4" y="410.4" textLength="195.2" clip-path="url(#breeze-ci-image-load-line-16)"> Common options </text><text class="breeze-ci-image-load-r5" x="219.6" y="410.4" textLength="1220" clip-path="url(#breeze-ci-image-load-line-16)">───────────────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-ci-image-load-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-17)">│</text><text class="breeze-ci-image-load-r4" x="24.4" y="434.8" textLength="109.8" clip-path="url(#breeze-ci-image-load-line-17)">--verbose</text><text class="breeze-ci-image-load-r6" x="158.6" y="434.8" textLength="24.4" clip-path="url(#breeze-ci-image-load-line-17)">-v</text><text class="breeze-ci-image-load-r1" x="207.4" y="434.8" textLength="585.6" clip-path= [...]
+</text><text class="breeze-ci-image-load-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-18)">│</text><text class="breeze-ci-image-load-r4" x="24.4" y="459.2" textLength="109.8" clip-path="url(#breeze-ci-image-load-line-18)">--dry-run</text><text class="breeze-ci-image-load-r6" x="158.6" y="459.2" textLength="24.4" clip-path="url(#breeze-ci-image-load-line-18)">-D</text><text class="breeze-ci-image-load-r1" x="207.4" y="459.2" textLength="719.8" clip-path= [...]
+</text><text class="breeze-ci-image-load-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-19)">│</text><text class="breeze-ci-image-load-r4" x="24.4" y="483.6" textLength="73.2" clip-path="url(#breeze-ci-image-load-line-19)">--help</text><text class="breeze-ci-image-load-r6" x="158.6" y="483.6" textLength="24.4" clip-path="url(#breeze-ci-image-load-line-19)">-h</text><text class="breeze-ci-image-load-r1" x="207.4" y="483.6" textLength="329.4" clip-path="url [...]
+</text><text class="breeze-ci-image-load-r5" x="0" y="508" textLength="1464" clip-path="url(#breeze-ci-image-load-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-load-r1" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-ci-image-load-line-20)">
+</text>
+ </g>
+ </g>
+</svg>
diff --git a/dev/breeze/doc/images/output_ci-image_load.txt b/dev/breeze/doc/images/output_ci-image_load.txt
new file mode 100644
index 00000000000..02d24c4b6fe
--- /dev/null
+++ b/dev/breeze/doc/images/output_ci-image_load.txt
@@ -0,0 +1 @@
+7872a5c2fc3666d543aec5d4feaa5cc4
diff --git a/dev/breeze/doc/images/output_ci-image_pull.svg b/dev/breeze/doc/images/output_ci-image_pull.svg
index a784b4c9a23..a48fa5e8404 100644
--- a/dev/breeze/doc/images/output_ci-image_pull.svg
+++ b/dev/breeze/doc/images/output_ci-image_pull.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 879.5999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 806.4" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-ci-image-pull-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="828.5999999999999" />
+ <rect x="0" y="0" width="1463.0" height="755.4" />
</clipPath>
<clipPath id="breeze-ci-image-pull-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -135,18 +135,9 @@
<clipPath id="breeze-ci-image-pull-line-29">
<rect x="0" y="709.1" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-ci-image-pull-line-30">
- <rect x="0" y="733.5" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-ci-image-pull-line-31">
- <rect x="0" y="757.9" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-ci-image-pull-line-32">
- <rect x="0" y="782.3" 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="877.6" rx="8"/><text class="breeze-ci-image-pull-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: ci-image pull</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="804.4" rx="8"/><text class="breeze-ci-image-pull-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: ci-image pull</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -162,34 +153,31 @@
</text><text class="breeze-ci-image-pull-r1" x="12.2" y="93.2" textLength="1024.8" clip-path="url(#breeze-ci-image-pull-line-3)">Pull and optionally verify CI images - possibly in parallel for all Python versions.</text><text class="breeze-ci-image-pull-r1" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-3)">
</text><text class="breeze-ci-image-pull-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-4)">
</text><text class="breeze-ci-image-pull-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-5)">â•─</text><text class="breeze-ci-image-pull-r5" x="24.4" y="142" textLength="219.6" clip-path="url(#breeze-ci-image-pull-line-5)"> Pull image flags </text><text class="breeze-ci-image-pull-r5" x="244" y="142" textLength="1195.6" clip-path="url(#breeze-ci-image-pull-line-5)">─────────────────────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-6)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="166.4" textLength="134.2" clip-path="url(#breeze-ci-image-pull-line-6)">--image-tag</text><text class="breeze-ci-image-pull-r6" x="244" y="166.4" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-6)">-t</text><text class="breeze-ci-image-pull-r1" x="292.8" y="166.4" textLength="597.8" clip-path="ur [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-7)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="190.8" textLength="97.6" clip-path="url(#breeze-ci-image-pull-line-7)">--python</text><text class="breeze-ci-image-pull-r6" x="244" y="190.8" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-7)">-p</text><text class="breeze-ci-image-pull-r1" x="292.8" y="190.8" textLength="732" clip-path="url(#bre [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-8)">│</text><text class="breeze-ci-image-pull-r5" x="292.8" y="215.2" textLength="732" clip-path="url(#breeze-ci-image-pull-line-8)">[default: 3.9]                                     [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-9)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="239.6" textLength="97.6" clip-path="url(#breeze-ci-image-pull-line-9)">--verify</text><text class="breeze-ci-image-pull-r1" x="292.8" y="239.6" textLength="158.6" clip-path="url(#breeze-ci-image-pull-line-9)">Verify image.</text><text class="breeze-ci-image-pull-r5" x="1451.8" y="239.6" textLength="12.2 [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-10)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="264" textLength="195.2" clip-path="url(#breeze-ci-image-pull-line-10)">--wait-for-image</text><text class="breeze-ci-image-pull-r1" x="292.8" y="264" textLength="366" clip-path="url(#breeze-ci-image-pull-line-10)">Wait until image is available.</text><text class="breeze-ci-image-pull-r5" x [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-11)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="288.4" textLength="183" clip-path="url(#breeze-ci-image-pull-line-11)">--tag-as-latest</text><text class="breeze-ci-image-pull-r1" x="292.8" y="288.4" textLength="1146.8" clip-path="url(#breeze-ci-image-pull-line-11)">Tags the image as latest and update checksum of [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-12)">│</text><text class="breeze-ci-image-pull-r1" x="292.8" y="312.8" textLength="231.8" clip-path="url(#breeze-ci-image-pull-line-12)">or pull image with </text><text class="breeze-ci-image-pull-r4" x="524.6" y="312.8" textLength="134.2" clip-path="url(#breeze-ci-image-pull-line-12)">--image-tag</text><text class="breeze-ci-image-pull-r1" x="658.8 [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="337.2" textLength="1464" clip-path="url(#breeze-ci-image-pull-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-pull-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-13)">
-</text><text class="breeze-ci-image-pull-r5" x="0" y="361.6" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-14)">â•─</text><text class="breeze-ci-image-pull-r5" x="24.4" y="361.6" textLength="219.6" clip-path="url(#breeze-ci-image-pull-line-14)"> Parallel running </text><text class="breeze-ci-image-pull-r5" x="244" y="361.6" textLength="1195.6" clip-path="url(#breeze-ci-image-pull-line-14)">─────────────────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-15)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="386" textLength="207.4" clip-path="url(#breeze-ci-image-pull-line-15)">--run-in-parallel</text><text class="breeze-ci-image-pull-r1" x="378.2" y="386" textLength="854" clip-path="url(#breeze-ci-image-pull-line-15)">Run the operation in parallel on all or selected s [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-16)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="410.4" textLength="158.6" clip-path="url(#breeze-ci-image-pull-line-16)">--parallelism</text><text class="breeze-ci-image-pull-r1" x="378.2" y="410.4" textLength="915" clip-path="url(#breeze-ci-image-pull-line-16)">Maximum number of processes to use while running the& [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-17)">│</text><text class="breeze-ci-image-pull-r7" x="378.2" y="434.8" textLength="915" clip-path="url(#breeze-ci-image-pull-line-17)">(INTEGER RANGE)                                     [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-18)">│</text><text class="breeze-ci-image-pull-r5" x="378.2" y="459.2" textLength="915" clip-path="url(#breeze-ci-image-pull-line-18)">[default: 4; 1<=x<=8]                                 & [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-19)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="483.6" textLength="207.4" clip-path="url(#breeze-ci-image-pull-line-19)">--python-versions</text><text class="breeze-ci-image-pull-r1" x="378.2" y="483.6" textLength="951.6" clip-path="url(#breeze-ci-image-pull-line-19)">Space separated list of python versions used for [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-20)">│</text><text class="breeze-ci-image-pull-r5" x="378.2" y="508" textLength="951.6" clip-path="url(#breeze-ci-image-pull-line-20)">[default: 3.9 3.10 3.11 3.12]                                [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-21)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="532.4" textLength="170.8" clip-path="url(#breeze-ci-image-pull-line-21)">--skip-cleanup</text><text class="breeze-ci-image-pull-r1" x="378.2" y="532.4" textLength="732" clip-path="url(#breeze-ci-image-pull-line-21)">Skip cleanup of temporary files created during parallel&# [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-22)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="556.8" textLength="207.4" clip-path="url(#breeze-ci-image-pull-line-22)">--debug-resources</text><text class="breeze-ci-image-pull-r1" x="378.2" y="556.8" textLength="768.6" clip-path="url(#breeze-ci-image-pull-line-22)">Whether to show resource information while running i [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-23)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="581.2" textLength="305" clip-path="url(#breeze-ci-image-pull-line-23)">--include-success-outputs</text><text class="breeze-ci-image-pull-r1" x="378.2" y="581.2" textLength="927.2" clip-path="url(#breeze-ci-image-pull-line-23)">Whether to include outputs of successful parallel&# [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="605.6" textLength="1464" clip-path="url(#breeze-ci-image-pull-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-pull-r1" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-24)">
-</text><text class="breeze-ci-image-pull-r5" x="0" y="630" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-25)">â•─</text><text class="breeze-ci-image-pull-r5" x="24.4" y="630" textLength="280.6" clip-path="url(#breeze-ci-image-pull-line-25)"> Github authentication </text><text class="breeze-ci-image-pull-r5" x="305" y="630" textLength="1134.6" clip-path="url(#breeze-ci-image-pull-line-25)">──────────────────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-26)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="654.4" textLength="231.8" clip-path="url(#breeze-ci-image-pull-line-26)">--github-repository</text><text class="breeze-ci-image-pull-r6" x="280.6" y="654.4" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-26)">-g</text><text class="breeze-ci-image-pull-r1" x="329.4" y="654.4" textLength="585.6" [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-27)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="678.8" textLength="170.8" clip-path="url(#breeze-ci-image-pull-line-27)">--github-token</text><text class="breeze-ci-image-pull-r1" x="329.4" y="678.8" textLength="500.2" clip-path="url(#breeze-ci-image-pull-line-27)">The token used to authenticate to GitHub.</text><text class= [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="703.2" textLength="1464" clip-path="url(#breeze-ci-image-pull-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-pull-r1" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-28)">
-</text><text class="breeze-ci-image-pull-r5" x="0" y="727.6" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-29)">â•─</text><text class="breeze-ci-image-pull-r5" x="24.4" y="727.6" textLength="195.2" clip-path="url(#breeze-ci-image-pull-line-29)"> Common options </text><text class="breeze-ci-image-pull-r5" x="219.6" y="727.6" textLength="1220" clip-path="url(#breeze-ci-image-pull-line-29)">───────────────────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-30)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="752" textLength="109.8" clip-path="url(#breeze-ci-image-pull-line-30)">--verbose</text><text class="breeze-ci-image-pull-r6" x="158.6" y="752" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-30)">-v</text><text class="breeze-ci-image-pull-r1" x="207.4" y="752" textLength="585.6" clip-path="url(#br [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-31)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="776.4" textLength="109.8" clip-path="url(#breeze-ci-image-pull-line-31)">--dry-run</text><text class="breeze-ci-image-pull-r6" x="158.6" y="776.4" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-31)">-D</text><text class="breeze-ci-image-pull-r1" x="207.4" y="776.4" textLength="719.8" clip-path= [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-32)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="800.8" textLength="73.2" clip-path="url(#breeze-ci-image-pull-line-32)">--help</text><text class="breeze-ci-image-pull-r6" x="158.6" y="800.8" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-32)">-h</text><text class="breeze-ci-image-pull-r1" x="207.4" y="800.8" textLength="329.4" clip-path="url [...]
-</text><text class="breeze-ci-image-pull-r5" x="0" y="825.2" textLength="1464" clip-path="url(#breeze-ci-image-pull-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-pull-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-33)">
+</text><text class="breeze-ci-image-pull-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-6)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="166.4" textLength="97.6" clip-path="url(#breeze-ci-image-pull-line-6)">--python</text><text class="breeze-ci-image-pull-r6" x="244" y="166.4" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-6)">-p</text><text class="breeze-ci-image-pull-r1" x="292.8" y="166.4" textLength="732" clip-path="url(#bre [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-7)">│</text><text class="breeze-ci-image-pull-r5" x="292.8" y="190.8" textLength="732" clip-path="url(#breeze-ci-image-pull-line-7)">[default: 3.9]                                     [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-8)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="215.2" textLength="97.6" clip-path="url(#breeze-ci-image-pull-line-8)">--verify</text><text class="breeze-ci-image-pull-r1" x="292.8" y="215.2" textLength="158.6" clip-path="url(#breeze-ci-image-pull-line-8)">Verify image.</text><text class="breeze-ci-image-pull-r5" x="1451.8" y="215.2" textLength="12.2 [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-9)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="239.6" textLength="195.2" clip-path="url(#breeze-ci-image-pull-line-9)">--wait-for-image</text><text class="breeze-ci-image-pull-r1" x="292.8" y="239.6" textLength="366" clip-path="url(#breeze-ci-image-pull-line-9)">Wait until image is available.</text><text class="breeze-ci-image-pull-r5 [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="264" textLength="1464" clip-path="url(#breeze-ci-image-pull-line-10)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-pull-r1" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-10)">
+</text><text class="breeze-ci-image-pull-r5" x="0" y="288.4" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-11)">â•─</text><text class="breeze-ci-image-pull-r5" x="24.4" y="288.4" textLength="219.6" clip-path="url(#breeze-ci-image-pull-line-11)"> Parallel running </text><text class="breeze-ci-image-pull-r5" x="244" y="288.4" textLength="1195.6" clip-path="url(#breeze-ci-image-pull-line-11)">─────────────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-12)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="312.8" textLength="207.4" clip-path="url(#breeze-ci-image-pull-line-12)">--run-in-parallel</text><text class="breeze-ci-image-pull-r1" x="378.2" y="312.8" textLength="854" clip-path="url(#breeze-ci-image-pull-line-12)">Run the operation in parallel on all or selected& [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-13)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="337.2" textLength="158.6" clip-path="url(#breeze-ci-image-pull-line-13)">--parallelism</text><text class="breeze-ci-image-pull-r1" x="378.2" y="337.2" textLength="915" clip-path="url(#breeze-ci-image-pull-line-13)">Maximum number of processes to use while running the& [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-14)">│</text><text class="breeze-ci-image-pull-r7" x="378.2" y="361.6" textLength="915" clip-path="url(#breeze-ci-image-pull-line-14)">(INTEGER RANGE)                                     [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-15)">│</text><text class="breeze-ci-image-pull-r5" x="378.2" y="386" textLength="915" clip-path="url(#breeze-ci-image-pull-line-15)">[default: 4; 1<=x<=8]                                   [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-16)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="410.4" textLength="207.4" clip-path="url(#breeze-ci-image-pull-line-16)">--python-versions</text><text class="breeze-ci-image-pull-r1" x="378.2" y="410.4" textLength="951.6" clip-path="url(#breeze-ci-image-pull-line-16)">Space separated list of python versions used for [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-17)">│</text><text class="breeze-ci-image-pull-r5" x="378.2" y="434.8" textLength="951.6" clip-path="url(#breeze-ci-image-pull-line-17)">[default: 3.9 3.10 3.11 3.12]                                [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-18)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="459.2" textLength="170.8" clip-path="url(#breeze-ci-image-pull-line-18)">--skip-cleanup</text><text class="breeze-ci-image-pull-r1" x="378.2" y="459.2" textLength="732" clip-path="url(#breeze-ci-image-pull-line-18)">Skip cleanup of temporary files created during parallel&# [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-19)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="483.6" textLength="207.4" clip-path="url(#breeze-ci-image-pull-line-19)">--debug-resources</text><text class="breeze-ci-image-pull-r1" x="378.2" y="483.6" textLength="768.6" clip-path="url(#breeze-ci-image-pull-line-19)">Whether to show resource information while running i [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-20)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="508" textLength="305" clip-path="url(#breeze-ci-image-pull-line-20)">--include-success-outputs</text><text class="breeze-ci-image-pull-r1" x="378.2" y="508" textLength="927.2" clip-path="url(#breeze-ci-image-pull-line-20)">Whether to include outputs of successful parallel ru [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="532.4" textLength="1464" clip-path="url(#breeze-ci-image-pull-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-pull-r1" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-21)">
+</text><text class="breeze-ci-image-pull-r5" x="0" y="556.8" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-22)">â•─</text><text class="breeze-ci-image-pull-r5" x="24.4" y="556.8" textLength="280.6" clip-path="url(#breeze-ci-image-pull-line-22)"> Github authentication </text><text class="breeze-ci-image-pull-r5" x="305" y="556.8" textLength="1134.6" clip-path="url(#breeze-ci-image-pull-line-22)">────────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-23)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="581.2" textLength="231.8" clip-path="url(#breeze-ci-image-pull-line-23)">--github-repository</text><text class="breeze-ci-image-pull-r6" x="280.6" y="581.2" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-23)">-g</text><text class="breeze-ci-image-pull-r1" x="329.4" y="581.2" textLength="585.6" [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-24)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="605.6" textLength="170.8" clip-path="url(#breeze-ci-image-pull-line-24)">--github-token</text><text class="breeze-ci-image-pull-r1" x="329.4" y="605.6" textLength="500.2" clip-path="url(#breeze-ci-image-pull-line-24)">The token used to authenticate to GitHub.</text><text class= [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="630" textLength="1464" clip-path="url(#breeze-ci-image-pull-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-pull-r1" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-25)">
+</text><text class="breeze-ci-image-pull-r5" x="0" y="654.4" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-26)">â•─</text><text class="breeze-ci-image-pull-r5" x="24.4" y="654.4" textLength="195.2" clip-path="url(#breeze-ci-image-pull-line-26)"> Common options </text><text class="breeze-ci-image-pull-r5" x="219.6" y="654.4" textLength="1220" clip-path="url(#breeze-ci-image-pull-line-26)">───────────────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-27)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="678.8" textLength="109.8" clip-path="url(#breeze-ci-image-pull-line-27)">--verbose</text><text class="breeze-ci-image-pull-r6" x="158.6" y="678.8" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-27)">-v</text><text class="breeze-ci-image-pull-r1" x="207.4" y="678.8" textLength="585.6" clip-path= [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-28)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="703.2" textLength="109.8" clip-path="url(#breeze-ci-image-pull-line-28)">--dry-run</text><text class="breeze-ci-image-pull-r6" x="158.6" y="703.2" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-28)">-D</text><text class="breeze-ci-image-pull-r1" x="207.4" y="703.2" textLength="719.8" clip-path= [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-29)">│</text><text class="breeze-ci-image-pull-r4" x="24.4" y="727.6" textLength="73.2" clip-path="url(#breeze-ci-image-pull-line-29)">--help</text><text class="breeze-ci-image-pull-r6" x="158.6" y="727.6" textLength="24.4" clip-path="url(#breeze-ci-image-pull-line-29)">-h</text><text class="breeze-ci-image-pull-r1" x="207.4" y="727.6" textLength="329.4" clip-path="url [...]
+</text><text class="breeze-ci-image-pull-r5" x="0" y="752" textLength="1464" clip-path="url(#breeze-ci-image-pull-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-pull-r1" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-ci-image-pull-line-30)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_ci-image_pull.txt b/dev/breeze/doc/images/output_ci-image_pull.txt
index 1e72758575b..ae612af5c80 100644
--- a/dev/breeze/doc/images/output_ci-image_pull.txt
+++ b/dev/breeze/doc/images/output_ci-image_pull.txt
@@ -1 +1 @@
-a2b4311906864d2e22049bf37c1b6b64
+f032645c0767cde43842824f768940bd
diff --git a/dev/breeze/doc/images/output_ci-image_save.svg b/dev/breeze/doc/images/output_ci-image_save.svg
new file mode 100644
index 00000000000..393399e7a26
--- /dev/null
+++ b/dev/breeze/doc/images/output_ci-image_save.svg
@@ -0,0 +1,128 @@
+<svg class="rich-terminal" viewBox="0 0 1482 464.79999999999995" xmlns="http://www.w3.org/2000/svg">
+ <!-- Generated with Rich https://www.textualize.io -->
+ <style>
+
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Regular"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
+ font-style: normal;
+ font-weight: 400;
+ }
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Bold"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
+ font-style: bold;
+ font-weight: 700;
+ }
+
+ .breeze-ci-image-save-matrix {
+ font-family: Fira Code, monospace;
+ font-size: 20px;
+ line-height: 24.4px;
+ font-variant-east-asian: full-width;
+ }
+
+ .breeze-ci-image-save-title {
+ font-size: 18px;
+ font-weight: bold;
+ font-family: arial;
+ }
+
+ .breeze-ci-image-save-r1 { fill: #c5c8c6 }
+.breeze-ci-image-save-r2 { fill: #d0b344 }
+.breeze-ci-image-save-r3 { fill: #c5c8c6;font-weight: bold }
+.breeze-ci-image-save-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-ci-image-save-r5 { fill: #868887 }
+.breeze-ci-image-save-r6 { fill: #98a84b;font-weight: bold }
+.breeze-ci-image-save-r7 { fill: #8d7b39 }
+ </style>
+
+ <defs>
+ <clipPath id="breeze-ci-image-save-clip-terminal">
+ <rect x="0" y="0" width="1463.0" height="413.79999999999995" />
+ </clipPath>
+ <clipPath id="breeze-ci-image-save-line-0">
+ <rect x="0" y="1.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-save-line-1">
+ <rect x="0" y="25.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-save-line-2">
+ <rect x="0" y="50.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-save-line-3">
+ <rect x="0" y="74.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-save-line-4">
+ <rect x="0" y="99.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-save-line-5">
+ <rect x="0" y="123.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-save-line-6">
+ <rect x="0" y="147.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-save-line-7">
+ <rect x="0" y="172.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-save-line-8">
+ <rect x="0" y="196.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-save-line-9">
+ <rect x="0" y="221.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-save-line-10">
+ <rect x="0" y="245.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-save-line-11">
+ <rect x="0" y="269.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-save-line-12">
+ <rect x="0" y="294.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-save-line-13">
+ <rect x="0" y="318.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-save-line-14">
+ <rect x="0" y="343.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-save-line-15">
+ <rect x="0" y="367.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="462.8" rx="8"/><text class="breeze-ci-image-save-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: ci-image save</text>
+ <g transform="translate(26,22)">
+ <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
+ <circle cx="22" cy="0" r="7" fill="#febc2e"/>
+ <circle cx="44" cy="0" r="7" fill="#28c840"/>
+ </g>
+
+ <g transform="translate(9, 41)" clip-path="url(#breeze-ci-image-save-clip-terminal)">
+
+ <g class="breeze-ci-image-save-matrix">
+ <text class="breeze-ci-image-save-r1" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-ci-image-save-line-0)">
+</text><text class="breeze-ci-image-save-r2" x="12.2" y="44.4" textLength="73.2" clip-path="url(#breeze-ci-image-save-line-1)">Usage:</text><text class="breeze-ci-image-save-r3" x="97.6" y="44.4" textLength="244" clip-path="url(#breeze-ci-image-save-line-1)">breeze ci-image save</text><text class="breeze-ci-image-save-r1" x="353.8" y="44.4" textLength="12.2" clip-path="url(#breeze-ci-image-save-line-1)">[</text><text class="breeze-ci-image-save-r4" x="366" y="44.4" textLength=" [...]
+</text><text class="breeze-ci-image-save-r1" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-ci-image-save-line-2)">
+</text><text class="breeze-ci-image-save-r1" x="12.2" y="93.2" textLength="292.8" clip-path="url(#breeze-ci-image-save-line-3)">Save CI image to a file.</text><text class="breeze-ci-image-save-r1" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-ci-image-save-line-3)">
+</text><text class="breeze-ci-image-save-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-ci-image-save-line-4)">
+</text><text class="breeze-ci-image-save-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-ci-image-save-line-5)">â•─</text><text class="breeze-ci-image-save-r5" x="24.4" y="142" textLength="219.6" clip-path="url(#breeze-ci-image-save-line-5)"> Save image flags </text><text class="breeze-ci-image-save-r5" x="244" y="142" textLength="1195.6" clip-path="url(#breeze-ci-image-save-line-5)">─────────────────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-ci-image-save-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-ci-image-save-line-6)">│</text><text class="breeze-ci-image-save-r4" x="24.4" y="166.4" textLength="97.6" clip-path="url(#breeze-ci-image-save-line-6)">--python</text><text class="breeze-ci-image-save-r6" x="280.6" y="166.4" textLength="24.4" clip-path="url(#breeze-ci-image-save-line-6)">-p</text><text class="breeze-ci-image-save-r1" x="329.4" y="166.4" textLength="732" clip-path="url(#b [...]
+</text><text class="breeze-ci-image-save-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-ci-image-save-line-7)">│</text><text class="breeze-ci-image-save-r5" x="329.4" y="190.8" textLength="732" clip-path="url(#breeze-ci-image-save-line-7)">[default: 3.9]                                     [...]
+</text><text class="breeze-ci-image-save-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-ci-image-save-line-8)">│</text><text class="breeze-ci-image-save-r4" x="24.4" y="215.2" textLength="122" clip-path="url(#breeze-ci-image-save-line-8)">--platform</text><text class="breeze-ci-image-save-r1" x="329.4" y="215.2" textLength="329.4" clip-path="url(#breeze-ci-image-save-line-8)">Platform for Airflow image.</text><text class="breeze-ci-image-save-r7" x="671" y="2 [...]
+</text><text class="breeze-ci-image-save-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-ci-image-save-line-9)">│</text><text class="breeze-ci-image-save-r4" x="24.4" y="239.6" textLength="231.8" clip-path="url(#breeze-ci-image-save-line-9)">--github-repository</text><text class="breeze-ci-image-save-r6" x="280.6" y="239.6" textLength="24.4" clip-path="url(#breeze-ci-image-save-line-9)">-g</text><text class="breeze-ci-image-save-r1" x="329.4" y="239.6" textLength="585.6" cli [...]
+</text><text class="breeze-ci-image-save-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-ci-image-save-line-10)">│</text><text class="breeze-ci-image-save-r4" x="24.4" y="264" textLength="146.4" clip-path="url(#breeze-ci-image-save-line-10)">--image-file</text><text class="breeze-ci-image-save-r1" x="329.4" y="264" textLength="427" clip-path="url(#breeze-ci-image-save-line-10)">Optional file to save the image to.</text><text class="breeze-ci-image [...]
+</text><text class="breeze-ci-image-save-r5" x="0" y="288.4" textLength="1464" clip-path="url(#breeze-ci-image-save-line-11)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-save-r1" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-ci-image-save-line-11)">
+</text><text class="breeze-ci-image-save-r5" x="0" y="312.8" textLength="24.4" clip-path="url(#breeze-ci-image-save-line-12)">â•─</text><text class="breeze-ci-image-save-r5" x="24.4" y="312.8" textLength="195.2" clip-path="url(#breeze-ci-image-save-line-12)"> Common options </text><text class="breeze-ci-image-save-r5" x="219.6" y="312.8" textLength="1220" clip-path="url(#breeze-ci-image-save-line-12)">───────────────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-ci-image-save-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-ci-image-save-line-13)">│</text><text class="breeze-ci-image-save-r4" x="24.4" y="337.2" textLength="109.8" clip-path="url(#breeze-ci-image-save-line-13)">--verbose</text><text class="breeze-ci-image-save-r6" x="158.6" y="337.2" textLength="24.4" clip-path="url(#breeze-ci-image-save-line-13)">-v</text><text class="breeze-ci-image-save-r1" x="207.4" y="337.2" textLength="585.6" clip-path= [...]
+</text><text class="breeze-ci-image-save-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-ci-image-save-line-14)">│</text><text class="breeze-ci-image-save-r4" x="24.4" y="361.6" textLength="109.8" clip-path="url(#breeze-ci-image-save-line-14)">--dry-run</text><text class="breeze-ci-image-save-r6" x="158.6" y="361.6" textLength="24.4" clip-path="url(#breeze-ci-image-save-line-14)">-D</text><text class="breeze-ci-image-save-r1" x="207.4" y="361.6" textLength="719.8" clip-path= [...]
+</text><text class="breeze-ci-image-save-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-ci-image-save-line-15)">│</text><text class="breeze-ci-image-save-r4" x="24.4" y="386" textLength="73.2" clip-path="url(#breeze-ci-image-save-line-15)">--help</text><text class="breeze-ci-image-save-r6" x="158.6" y="386" textLength="24.4" clip-path="url(#breeze-ci-image-save-line-15)">-h</text><text class="breeze-ci-image-save-r1" x="207.4" y="386" textLength="329.4" clip-path="url(#breeze [...]
+</text><text class="breeze-ci-image-save-r5" x="0" y="410.4" textLength="1464" clip-path="url(#breeze-ci-image-save-line-16)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-save-r1" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-ci-image-save-line-16)">
+</text>
+ </g>
+ </g>
+</svg>
diff --git a/dev/breeze/doc/images/output_ci-image_save.txt b/dev/breeze/doc/images/output_ci-image_save.txt
new file mode 100644
index 00000000000..08b54f9dbf6
--- /dev/null
+++ b/dev/breeze/doc/images/output_ci-image_save.txt
@@ -0,0 +1 @@
+5e39794e1b52acdd4d3aa27df9a2adc3
diff --git a/dev/breeze/doc/images/output_ci-image_verify.svg b/dev/breeze/doc/images/output_ci-image_verify.svg
index 23acf815112..4571b6e0943 100644
--- a/dev/breeze/doc/images/output_ci-image_verify.svg
+++ b/dev/breeze/doc/images/output_ci-image_verify.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 830.8" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 806.4" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-ci-image-verify-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="779.8" />
+ <rect x="0" y="0" width="1463.0" height="755.4" />
</clipPath>
<clipPath id="breeze-ci-image-verify-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -135,12 +135,9 @@
<clipPath id="breeze-ci-image-verify-line-29">
<rect x="0" y="709.1" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-ci-image-verify-line-30">
- <rect x="0" y="733.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="828.8" rx="8"/><text class="breeze-ci-image-verify-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: ci-image verify</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="804.4" rx="8"/><text class="breeze-ci-image-verify-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: ci-image verify</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -156,32 +153,31 @@
</text><text class="breeze-ci-image-verify-r1" x="12.2" y="93.2" textLength="195.2" clip-path="url(#breeze-ci-image-verify-line-3)">Verify CI image.</text><text class="breeze-ci-image-verify-r1" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-3)">
</text><text class="breeze-ci-image-verify-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-4)">
</text><text class="breeze-ci-image-verify-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-5)">â•─</text><text class="breeze-ci-image-verify-r5" x="24.4" y="142" textLength="244" clip-path="url(#breeze-ci-image-verify-line-5)"> Verify image flags </text><text class="breeze-ci-image-verify-r5" x="268.4" y="142" textLength="1171.2" clip-path="url(#breeze-ci-image-verify-line-5)">───────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-6)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="166.4" textLength="146.4" clip-path="url(#breeze-ci-image-verify-line-6)">--image-name</text><text class="breeze-ci-image-verify-r6" x="195.2" y="166.4" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-6)">-n</text><text class="breeze-ci-image-verify-r1" x="244" y="166.4" textLength="475.8 [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-6)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="166.4" textLength="146.4" clip-path="url(#breeze-ci-image-verify-line-6)">--image-name</text><text class="breeze-ci-image-verify-r6" x="195.2" y="166.4" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-6)">-n</text><text class="breeze-ci-image-verify-r1" x="244" y="166.4" textLength="475.8 [...]
</text><text class="breeze-ci-image-verify-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-7)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="190.8" textLength="97.6" clip-path="url(#breeze-ci-image-verify-line-7)">--python</text><text class="breeze-ci-image-verify-r6" x="195.2" y="190.8" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-7)">-p</text><text class="breeze-ci-image-verify-r1" x="244" y="190.8" textLength="732" clip- [...]
</text><text class="breeze-ci-image-verify-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-8)">│</text><text class="breeze-ci-image-verify-r5" x="244" y="215.2" textLength="732" clip-path="url(#breeze-ci-image-verify-line-8)">[default: 3.9]                                    [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-9)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="239.6" textLength="134.2" clip-path="url(#breeze-ci-image-verify-line-9)">--image-tag</text><text class="breeze-ci-image-verify-r6" x="195.2" y="239.6" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-9)">-t</text><text class="breeze-ci-image-verify-r1" x="244" y="239.6" textLength="427" c [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-10)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="264" textLength="73.2" clip-path="url(#breeze-ci-image-verify-line-10)">--pull</text><text class="breeze-ci-image-verify-r1" x="244" y="264" textLength="646.6" clip-path="url(#breeze-ci-image-verify-line-10)">Pull image is missing before attempting to verify it.</ [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="288.4" textLength="1464" clip-path="url(#breeze-ci-image-verify-line-11)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-verify-r1" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-11)">
-</text><text class="breeze-ci-image-verify-r5" x="0" y="312.8" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-12)">â•─</text><text class="breeze-ci-image-verify-r5" x="24.4" y="312.8" textLength="219.6" clip-path="url(#breeze-ci-image-verify-line-12)"> Parallel running </text><text class="breeze-ci-image-verify-r5" x="244" y="312.8" textLength="1195.6" clip-path="url(#breeze-ci-image-verify-line-12)">─────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-13)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="337.2" textLength="207.4" clip-path="url(#breeze-ci-image-verify-line-13)">--run-in-parallel</text><text class="breeze-ci-image-verify-r1" x="378.2" y="337.2" textLength="854" clip-path="url(#breeze-ci-image-verify-line-13)">Run the operation in parallel on all or [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-14)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="361.6" textLength="158.6" clip-path="url(#breeze-ci-image-verify-line-14)">--parallelism</text><text class="breeze-ci-image-verify-r1" x="378.2" y="361.6" textLength="915" clip-path="url(#breeze-ci-image-verify-line-14)">Maximum number of processes to use while runni [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-15)">│</text><text class="breeze-ci-image-verify-r7" x="378.2" y="386" textLength="915" clip-path="url(#breeze-ci-image-verify-line-15)">(INTEGER RANGE)                                   &# [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-16)">│</text><text class="breeze-ci-image-verify-r5" x="378.2" y="410.4" textLength="915" clip-path="url(#breeze-ci-image-verify-line-16)">[default: 4; 1<=x<=8]                                 [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-17)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="434.8" textLength="207.4" clip-path="url(#breeze-ci-image-verify-line-17)">--python-versions</text><text class="breeze-ci-image-verify-r1" x="378.2" y="434.8" textLength="951.6" clip-path="url(#breeze-ci-image-verify-line-17)">Space separated list of python versions used& [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-18)">│</text><text class="breeze-ci-image-verify-r5" x="378.2" y="459.2" textLength="951.6" clip-path="url(#breeze-ci-image-verify-line-18)">[default: 3.9 3.10 3.11 3.12]                              [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-19)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="483.6" textLength="170.8" clip-path="url(#breeze-ci-image-verify-line-19)">--skip-cleanup</text><text class="breeze-ci-image-verify-r1" x="378.2" y="483.6" textLength="732" clip-path="url(#breeze-ci-image-verify-line-19)">Skip cleanup of temporary files created during [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-20)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="508" textLength="207.4" clip-path="url(#breeze-ci-image-verify-line-20)">--debug-resources</text><text class="breeze-ci-image-verify-r1" x="378.2" y="508" textLength="768.6" clip-path="url(#breeze-ci-image-verify-line-20)">Whether to show resource information while running& [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-21)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="532.4" textLength="305" clip-path="url(#breeze-ci-image-verify-line-21)">--include-success-outputs</text><text class="breeze-ci-image-verify-r1" x="378.2" y="532.4" textLength="927.2" clip-path="url(#breeze-ci-image-verify-line-21)">Whether to include outputs of successful [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="556.8" textLength="1464" clip-path="url(#breeze-ci-image-verify-line-22)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-verify-r1" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-22)">
-</text><text class="breeze-ci-image-verify-r5" x="0" y="581.2" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-23)">â•─</text><text class="breeze-ci-image-verify-r5" x="24.4" y="581.2" textLength="280.6" clip-path="url(#breeze-ci-image-verify-line-23)"> Github authentication </text><text class="breeze-ci-image-verify-r5" x="305" y="581.2" textLength="1134.6" clip-path="url(#breeze-ci-image-verify-line-23)">────────────────────────────────────────────────────── [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-24)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="605.6" textLength="231.8" clip-path="url(#breeze-ci-image-verify-line-24)">--github-repository</text><text class="breeze-ci-image-verify-r6" x="280.6" y="605.6" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-24)">-g</text><text class="breeze-ci-image-verify-r1" x="329.4" y="605.6" textL [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-25)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="630" textLength="170.8" clip-path="url(#breeze-ci-image-verify-line-25)">--github-token</text><text class="breeze-ci-image-verify-r1" x="329.4" y="630" textLength="500.2" clip-path="url(#breeze-ci-image-verify-line-25)">The token used to authenticate to GitHub.</text><text [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="654.4" textLength="1464" clip-path="url(#breeze-ci-image-verify-line-26)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-verify-r1" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-26)">
-</text><text class="breeze-ci-image-verify-r5" x="0" y="678.8" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-27)">â•─</text><text class="breeze-ci-image-verify-r5" x="24.4" y="678.8" textLength="195.2" clip-path="url(#breeze-ci-image-verify-line-27)"> Common options </text><text class="breeze-ci-image-verify-r5" x="219.6" y="678.8" textLength="1220" clip-path="url(#breeze-ci-image-verify-line-27)">───────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-28)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="703.2" textLength="109.8" clip-path="url(#breeze-ci-image-verify-line-28)">--verbose</text><text class="breeze-ci-image-verify-r6" x="158.6" y="703.2" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-28)">-v</text><text class="breeze-ci-image-verify-r1" x="207.4" y="703.2" textLength="585 [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-29)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="727.6" textLength="109.8" clip-path="url(#breeze-ci-image-verify-line-29)">--dry-run</text><text class="breeze-ci-image-verify-r6" x="158.6" y="727.6" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-29)">-D</text><text class="breeze-ci-image-verify-r1" x="207.4" y="727.6" textLength="719 [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-30)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="752" textLength="73.2" clip-path="url(#breeze-ci-image-verify-line-30)">--help</text><text class="breeze-ci-image-verify-r6" x="158.6" y="752" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-30)">-h</text><text class="breeze-ci-image-verify-r1" x="207.4" y="752" textLength="329.4" clip-pat [...]
-</text><text class="breeze-ci-image-verify-r5" x="0" y="776.4" textLength="1464" clip-path="url(#breeze-ci-image-verify-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-verify-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-31)">
+</text><text class="breeze-ci-image-verify-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-9)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="239.6" textLength="73.2" clip-path="url(#breeze-ci-image-verify-line-9)">--pull</text><text class="breeze-ci-image-verify-r1" x="244" y="239.6" textLength="646.6" clip-path="url(#breeze-ci-image-verify-line-9)">Pull image is missing before attempting to verify it [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="264" textLength="1464" clip-path="url(#breeze-ci-image-verify-line-10)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-verify-r1" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-10)">
+</text><text class="breeze-ci-image-verify-r5" x="0" y="288.4" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-11)">â•─</text><text class="breeze-ci-image-verify-r5" x="24.4" y="288.4" textLength="219.6" clip-path="url(#breeze-ci-image-verify-line-11)"> Parallel running </text><text class="breeze-ci-image-verify-r5" x="244" y="288.4" textLength="1195.6" clip-path="url(#breeze-ci-image-verify-line-11)">─────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-12)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="312.8" textLength="207.4" clip-path="url(#breeze-ci-image-verify-line-12)">--run-in-parallel</text><text class="breeze-ci-image-verify-r1" x="378.2" y="312.8" textLength="854" clip-path="url(#breeze-ci-image-verify-line-12)">Run the operation in parallel on all or [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-13)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="337.2" textLength="158.6" clip-path="url(#breeze-ci-image-verify-line-13)">--parallelism</text><text class="breeze-ci-image-verify-r1" x="378.2" y="337.2" textLength="915" clip-path="url(#breeze-ci-image-verify-line-13)">Maximum number of processes to use while runni [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-14)">│</text><text class="breeze-ci-image-verify-r7" x="378.2" y="361.6" textLength="915" clip-path="url(#breeze-ci-image-verify-line-14)">(INTEGER RANGE)                                   [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-15)">│</text><text class="breeze-ci-image-verify-r5" x="378.2" y="386" textLength="915" clip-path="url(#breeze-ci-image-verify-line-15)">[default: 4; 1<=x<=8]                                 [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-16)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="410.4" textLength="207.4" clip-path="url(#breeze-ci-image-verify-line-16)">--python-versions</text><text class="breeze-ci-image-verify-r1" x="378.2" y="410.4" textLength="951.6" clip-path="url(#breeze-ci-image-verify-line-16)">Space separated list of python versions used& [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-17)">│</text><text class="breeze-ci-image-verify-r5" x="378.2" y="434.8" textLength="951.6" clip-path="url(#breeze-ci-image-verify-line-17)">[default: 3.9 3.10 3.11 3.12]                              [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-18)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="459.2" textLength="170.8" clip-path="url(#breeze-ci-image-verify-line-18)">--skip-cleanup</text><text class="breeze-ci-image-verify-r1" x="378.2" y="459.2" textLength="732" clip-path="url(#breeze-ci-image-verify-line-18)">Skip cleanup of temporary files created during [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-19)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="483.6" textLength="207.4" clip-path="url(#breeze-ci-image-verify-line-19)">--debug-resources</text><text class="breeze-ci-image-verify-r1" x="378.2" y="483.6" textLength="768.6" clip-path="url(#breeze-ci-image-verify-line-19)">Whether to show resource information while ru [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-20)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="508" textLength="305" clip-path="url(#breeze-ci-image-verify-line-20)">--include-success-outputs</text><text class="breeze-ci-image-verify-r1" x="378.2" y="508" textLength="927.2" clip-path="url(#breeze-ci-image-verify-line-20)">Whether to include outputs of successful para [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="532.4" textLength="1464" clip-path="url(#breeze-ci-image-verify-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-verify-r1" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-21)">
+</text><text class="breeze-ci-image-verify-r5" x="0" y="556.8" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-22)">â•─</text><text class="breeze-ci-image-verify-r5" x="24.4" y="556.8" textLength="280.6" clip-path="url(#breeze-ci-image-verify-line-22)"> Github authentication </text><text class="breeze-ci-image-verify-r5" x="305" y="556.8" textLength="1134.6" clip-path="url(#breeze-ci-image-verify-line-22)">────────────────────────────────────────────────────── [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-23)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="581.2" textLength="231.8" clip-path="url(#breeze-ci-image-verify-line-23)">--github-repository</text><text class="breeze-ci-image-verify-r6" x="280.6" y="581.2" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-23)">-g</text><text class="breeze-ci-image-verify-r1" x="329.4" y="581.2" textL [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-24)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="605.6" textLength="170.8" clip-path="url(#breeze-ci-image-verify-line-24)">--github-token</text><text class="breeze-ci-image-verify-r1" x="329.4" y="605.6" textLength="500.2" clip-path="url(#breeze-ci-image-verify-line-24)">The token used to authenticate to GitHub.</text> [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="630" textLength="1464" clip-path="url(#breeze-ci-image-verify-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-verify-r1" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-25)">
+</text><text class="breeze-ci-image-verify-r5" x="0" y="654.4" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-26)">â•─</text><text class="breeze-ci-image-verify-r5" x="24.4" y="654.4" textLength="195.2" clip-path="url(#breeze-ci-image-verify-line-26)"> Common options </text><text class="breeze-ci-image-verify-r5" x="219.6" y="654.4" textLength="1220" clip-path="url(#breeze-ci-image-verify-line-26)">───────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-27)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="678.8" textLength="109.8" clip-path="url(#breeze-ci-image-verify-line-27)">--verbose</text><text class="breeze-ci-image-verify-r6" x="158.6" y="678.8" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-27)">-v</text><text class="breeze-ci-image-verify-r1" x="207.4" y="678.8" textLength="585 [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-28)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="703.2" textLength="109.8" clip-path="url(#breeze-ci-image-verify-line-28)">--dry-run</text><text class="breeze-ci-image-verify-r6" x="158.6" y="703.2" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-28)">-D</text><text class="breeze-ci-image-verify-r1" x="207.4" y="703.2" textLength="719 [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-29)">│</text><text class="breeze-ci-image-verify-r4" x="24.4" y="727.6" textLength="73.2" clip-path="url(#breeze-ci-image-verify-line-29)">--help</text><text class="breeze-ci-image-verify-r6" x="158.6" y="727.6" textLength="24.4" clip-path="url(#breeze-ci-image-verify-line-29)">-h</text><text class="breeze-ci-image-verify-r1" x="207.4" y="727.6" textLength="329.4" [...]
+</text><text class="breeze-ci-image-verify-r5" x="0" y="752" textLength="1464" clip-path="url(#breeze-ci-image-verify-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-verify-r1" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-ci-image-verify-line-30)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_ci-image_verify.txt b/dev/breeze/doc/images/output_ci-image_verify.txt
index 329f90d2114..4995ff17e0a 100644
--- a/dev/breeze/doc/images/output_ci-image_verify.txt
+++ b/dev/breeze/doc/images/output_ci-image_verify.txt
@@ -1 +1 @@
-d4747f6b4f6d78a8eeced35475ed91f0
+db98ae072f7b4c2d68c4bfece372fc48
diff --git a/dev/breeze/doc/images/output_k8s_build-k8s-image.svg b/dev/breeze/doc/images/output_k8s_build-k8s-image.svg
index eff84069b0f..755e7ecf01b 100644
--- a/dev/breeze/doc/images/output_k8s_build-k8s-image.svg
+++ b/dev/breeze/doc/images/output_k8s_build-k8s-image.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 830.8" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 806.4" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-k8s-build-k8s-image-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="779.8" />
+ <rect x="0" y="0" width="1463.0" height="755.4" />
</clipPath>
<clipPath id="breeze-k8s-build-k8s-image-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -135,12 +135,9 @@
<clipPath id="breeze-k8s-build-k8s-image-line-29">
<rect x="0" y="709.1" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-k8s-build-k8s-image-line-30">
- <rect x="0" y="733.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="828.8" rx="8"/><text class="breeze-k8s-build-k8s-image-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: k8s build-k8s-image</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="804.4" rx="8"/><text class="breeze-k8s-build-k8s-image-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: k8s build-k8s-image</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -159,29 +156,28 @@
</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-6)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="166.4" textLength="97.6" clip-path="url(#breeze-k8s-build-k8s-image-line-6)">--python</text><text class="breeze-k8s-build-k8s-image-r6" x="585.6" y="166.4" textLength="24.4" clip-path="url(#breeze-k8s-build-k8s-image-line-6)">-p</text><text class="breeze-k8s-build-k8s-image-r1" x="634.4" y= [...]
</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-7)">│</text><text class="breeze-k8s-build-k8s-image-r7" x="634.4" y="190.8" textLength="732" clip-path="url(#breeze-k8s-build-k8s-image-line-7)">(>3.9< | 3.10 | 3.11 | 3.12)                          [...]
</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-8)">│</text><text class="breeze-k8s-build-k8s-image-r5" x="634.4" y="215.2" textLength="732" clip-path="url(#breeze-k8s-build-k8s-image-line-8)">[default: 3.9]                                 [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-9)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="239.6" textLength="134.2" clip-path="url(#breeze-k8s-build-k8s-image-line-9)">--image-tag</text><text class="breeze-k8s-build-k8s-image-r6" x="585.6" y="239.6" textLength="24.4" clip-path="url(#breeze-k8s-build-k8s-image-line-9)">-t</text><text class="breeze-k8s-build-k8s-image-r1" x="634.4 [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-10)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="264" textLength="244" clip-path="url(#breeze-k8s-build-k8s-image-line-10)">--rebuild-base-image</text><text class="breeze-k8s-build-k8s-image-r1" x="634.4" y="264" textLength="658.8" clip-path="url(#breeze-k8s-build-k8s-image-line-10)">Rebuilds base Airflow image before&# [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-11)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="288.4" textLength="244" clip-path="url(#breeze-k8s-build-k8s-image-line-11)">--copy-local-sources</text><text class="breeze-k8s-build-k8s-image-r1" x="268.4" y="288.4" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-11)">/</text><text class="breeze-k8s-build-k8s-image-r4" [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-12)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="312.8" textLength="97.6" clip-path="url(#breeze-k8s-build-k8s-image-line-12)">--use-uv</text><text class="breeze-k8s-build-k8s-image-r1" x="122" y="312.8" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-12)">/</text><text class="breeze-k8s-build-k8s-image-r4" x="134.2" y= [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-13)">│</text><text class="breeze-k8s-build-k8s-image-r5" x="634.4" y="337.2" textLength="719.8" clip-path="url(#breeze-k8s-build-k8s-image-line-13)">[default: use-uv]                               &# [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="361.6" textLength="1464" clip-path="url(#breeze-k8s-build-k8s-image-line-14)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-build-k8s-image-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-14)">
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="386" textLength="24.4" clip-path="url(#breeze-k8s-build-k8s-image-line-15)">â•─</text><text class="breeze-k8s-build-k8s-image-r5" x="24.4" y="386" textLength="219.6" clip-path="url(#breeze-k8s-build-k8s-image-line-15)"> Parallel options </text><text class="breeze-k8s-build-k8s-image-r5" x="244" y="386" textLength="1195.6" clip-path="url(#breeze-k8s-build-k8s-image-line-15)">───────────────────────────────────────── [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-16)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="410.4" textLength="207.4" clip-path="url(#breeze-k8s-build-k8s-image-line-16)">--run-in-parallel</text><text class="breeze-k8s-build-k8s-image-r1" x="378.2" y="410.4" textLength="854" clip-path="url(#breeze-k8s-build-k8s-image-line-16)">Run the operation in parallel [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-17)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="434.8" textLength="158.6" clip-path="url(#breeze-k8s-build-k8s-image-line-17)">--parallelism</text><text class="breeze-k8s-build-k8s-image-r1" x="378.2" y="434.8" textLength="915" clip-path="url(#breeze-k8s-build-k8s-image-line-17)">Maximum number of processes to u [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-18)">│</text><text class="breeze-k8s-build-k8s-image-r7" x="378.2" y="459.2" textLength="915" clip-path="url(#breeze-k8s-build-k8s-image-line-18)">(INTEGER RANGE)                                 [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-19)">│</text><text class="breeze-k8s-build-k8s-image-r5" x="378.2" y="483.6" textLength="915" clip-path="url(#breeze-k8s-build-k8s-image-line-19)">[default: 4; 1<=x<=8]                             & [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-20)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="508" textLength="207.4" clip-path="url(#breeze-k8s-build-k8s-image-line-20)">--python-versions</text><text class="breeze-k8s-build-k8s-image-r1" x="378.2" y="508" textLength="951.6" clip-path="url(#breeze-k8s-build-k8s-image-line-20)">Space separated list of python v [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-21)">│</text><text class="breeze-k8s-build-k8s-image-r5" x="378.2" y="532.4" textLength="951.6" clip-path="url(#breeze-k8s-build-k8s-image-line-21)">[default: 3.9 3.10 3.11 3.12]                            [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-22)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="556.8" textLength="170.8" clip-path="url(#breeze-k8s-build-k8s-image-line-22)">--skip-cleanup</text><text class="breeze-k8s-build-k8s-image-r1" x="378.2" y="556.8" textLength="732" clip-path="url(#breeze-k8s-build-k8s-image-line-22)">Skip cleanup of temporary files  [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-23)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="581.2" textLength="207.4" clip-path="url(#breeze-k8s-build-k8s-image-line-23)">--debug-resources</text><text class="breeze-k8s-build-k8s-image-r1" x="378.2" y="581.2" textLength="768.6" clip-path="url(#breeze-k8s-build-k8s-image-line-23)">Whether to show resource inform [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-24)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="605.6" textLength="305" clip-path="url(#breeze-k8s-build-k8s-image-line-24)">--include-success-outputs</text><text class="breeze-k8s-build-k8s-image-r1" x="378.2" y="605.6" textLength="927.2" clip-path="url(#breeze-k8s-build-k8s-image-line-24)">Whether to include outputs [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="630" textLength="1464" clip-path="url(#breeze-k8s-build-k8s-image-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-build-k8s-image-r1" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-25)">
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="654.4" textLength="24.4" clip-path="url(#breeze-k8s-build-k8s-image-line-26)">â•─</text><text class="breeze-k8s-build-k8s-image-r5" x="24.4" y="654.4" textLength="195.2" clip-path="url(#breeze-k8s-build-k8s-image-line-26)"> Common options </text><text class="breeze-k8s-build-k8s-image-r5" x="219.6" y="654.4" textLength="1220" clip-path="url(#breeze-k8s-build-k8s-image-line-26)">───────────────────────────────────── [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-27)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="678.8" textLength="97.6" clip-path="url(#breeze-k8s-build-k8s-image-line-27)">--answer</text><text class="breeze-k8s-build-k8s-image-r6" x="158.6" y="678.8" textLength="24.4" clip-path="url(#breeze-k8s-build-k8s-image-line-27)">-a</text><text class="breeze-k8s-build-k8s-image-r1" x="207.4" [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-28)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="703.2" textLength="109.8" clip-path="url(#breeze-k8s-build-k8s-image-line-28)">--dry-run</text><text class="breeze-k8s-build-k8s-image-r6" x="158.6" y="703.2" textLength="24.4" clip-path="url(#breeze-k8s-build-k8s-image-line-28)">-D</text><text class="breeze-k8s-build-k8s-image-r1" x="207. [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-29)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="727.6" textLength="109.8" clip-path="url(#breeze-k8s-build-k8s-image-line-29)">--verbose</text><text class="breeze-k8s-build-k8s-image-r6" x="158.6" y="727.6" textLength="24.4" clip-path="url(#breeze-k8s-build-k8s-image-line-29)">-v</text><text class="breeze-k8s-build-k8s-image-r1" x="207. [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-30)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="752" textLength="73.2" clip-path="url(#breeze-k8s-build-k8s-image-line-30)">--help</text><text class="breeze-k8s-build-k8s-image-r6" x="158.6" y="752" textLength="24.4" clip-path="url(#breeze-k8s-build-k8s-image-line-30)">-h</text><text class="breeze-k8s-build-k8s-image-r1" x="207.4" y="752" [...]
-</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="776.4" textLength="1464" clip-path="url(#breeze-k8s-build-k8s-image-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-build-k8s-image-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-31)">
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-9)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="239.6" textLength="244" clip-path="url(#breeze-k8s-build-k8s-image-line-9)">--rebuild-base-image</text><text class="breeze-k8s-build-k8s-image-r1" x="634.4" y="239.6" textLength="658.8" clip-path="url(#breeze-k8s-build-k8s-image-line-9)">Rebuilds base Airflow image befor [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-10)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="264" textLength="244" clip-path="url(#breeze-k8s-build-k8s-image-line-10)">--copy-local-sources</text><text class="breeze-k8s-build-k8s-image-r1" x="268.4" y="264" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-10)">/</text><text class="breeze-k8s-build-k8s-image-r4" x="28 [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-11)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="288.4" textLength="97.6" clip-path="url(#breeze-k8s-build-k8s-image-line-11)">--use-uv</text><text class="breeze-k8s-build-k8s-image-r1" x="122" y="288.4" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-11)">/</text><text class="breeze-k8s-build-k8s-image-r4" x="134.2" y= [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-12)">│</text><text class="breeze-k8s-build-k8s-image-r5" x="634.4" y="312.8" textLength="719.8" clip-path="url(#breeze-k8s-build-k8s-image-line-12)">[default: use-uv]                               &# [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="337.2" textLength="1464" clip-path="url(#breeze-k8s-build-k8s-image-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-build-k8s-image-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-13)">
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="361.6" textLength="24.4" clip-path="url(#breeze-k8s-build-k8s-image-line-14)">â•─</text><text class="breeze-k8s-build-k8s-image-r5" x="24.4" y="361.6" textLength="219.6" clip-path="url(#breeze-k8s-build-k8s-image-line-14)"> Parallel options </text><text class="breeze-k8s-build-k8s-image-r5" x="244" y="361.6" textLength="1195.6" clip-path="url(#breeze-k8s-build-k8s-image-line-14)">─────────────────────────────────── [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-15)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="386" textLength="207.4" clip-path="url(#breeze-k8s-build-k8s-image-line-15)">--run-in-parallel</text><text class="breeze-k8s-build-k8s-image-r1" x="378.2" y="386" textLength="854" clip-path="url(#breeze-k8s-build-k8s-image-line-15)">Run the operation in parallel on&# [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-16)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="410.4" textLength="158.6" clip-path="url(#breeze-k8s-build-k8s-image-line-16)">--parallelism</text><text class="breeze-k8s-build-k8s-image-r1" x="378.2" y="410.4" textLength="915" clip-path="url(#breeze-k8s-build-k8s-image-line-16)">Maximum number of processes to u [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-17)">│</text><text class="breeze-k8s-build-k8s-image-r7" x="378.2" y="434.8" textLength="915" clip-path="url(#breeze-k8s-build-k8s-image-line-17)">(INTEGER RANGE)                                 [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-18)">│</text><text class="breeze-k8s-build-k8s-image-r5" x="378.2" y="459.2" textLength="915" clip-path="url(#breeze-k8s-build-k8s-image-line-18)">[default: 4; 1<=x<=8]                             & [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-19)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="483.6" textLength="207.4" clip-path="url(#breeze-k8s-build-k8s-image-line-19)">--python-versions</text><text class="breeze-k8s-build-k8s-image-r1" x="378.2" y="483.6" textLength="951.6" clip-path="url(#breeze-k8s-build-k8s-image-line-19)">Space separated list of python& [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-20)">│</text><text class="breeze-k8s-build-k8s-image-r5" x="378.2" y="508" textLength="951.6" clip-path="url(#breeze-k8s-build-k8s-image-line-20)">[default: 3.9 3.10 3.11 3.12]                            [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-21)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="532.4" textLength="170.8" clip-path="url(#breeze-k8s-build-k8s-image-line-21)">--skip-cleanup</text><text class="breeze-k8s-build-k8s-image-r1" x="378.2" y="532.4" textLength="732" clip-path="url(#breeze-k8s-build-k8s-image-line-21)">Skip cleanup of temporary files  [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-22)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="556.8" textLength="207.4" clip-path="url(#breeze-k8s-build-k8s-image-line-22)">--debug-resources</text><text class="breeze-k8s-build-k8s-image-r1" x="378.2" y="556.8" textLength="768.6" clip-path="url(#breeze-k8s-build-k8s-image-line-22)">Whether to show resource inform [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-23)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="581.2" textLength="305" clip-path="url(#breeze-k8s-build-k8s-image-line-23)">--include-success-outputs</text><text class="breeze-k8s-build-k8s-image-r1" x="378.2" y="581.2" textLength="927.2" clip-path="url(#breeze-k8s-build-k8s-image-line-23)">Whether to include outputs [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="605.6" textLength="1464" clip-path="url(#breeze-k8s-build-k8s-image-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-build-k8s-image-r1" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-24)">
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="630" textLength="24.4" clip-path="url(#breeze-k8s-build-k8s-image-line-25)">â•─</text><text class="breeze-k8s-build-k8s-image-r5" x="24.4" y="630" textLength="195.2" clip-path="url(#breeze-k8s-build-k8s-image-line-25)"> Common options </text><text class="breeze-k8s-build-k8s-image-r5" x="219.6" y="630" textLength="1220" clip-path="url(#breeze-k8s-build-k8s-image-line-25)">─────────────────────────────────────────── [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-26)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="654.4" textLength="97.6" clip-path="url(#breeze-k8s-build-k8s-image-line-26)">--answer</text><text class="breeze-k8s-build-k8s-image-r6" x="158.6" y="654.4" textLength="24.4" clip-path="url(#breeze-k8s-build-k8s-image-line-26)">-a</text><text class="breeze-k8s-build-k8s-image-r1" x="207.4" [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-27)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="678.8" textLength="109.8" clip-path="url(#breeze-k8s-build-k8s-image-line-27)">--dry-run</text><text class="breeze-k8s-build-k8s-image-r6" x="158.6" y="678.8" textLength="24.4" clip-path="url(#breeze-k8s-build-k8s-image-line-27)">-D</text><text class="breeze-k8s-build-k8s-image-r1" x="207. [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-28)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="703.2" textLength="109.8" clip-path="url(#breeze-k8s-build-k8s-image-line-28)">--verbose</text><text class="breeze-k8s-build-k8s-image-r6" x="158.6" y="703.2" textLength="24.4" clip-path="url(#breeze-k8s-build-k8s-image-line-28)">-v</text><text class="breeze-k8s-build-k8s-image-r1" x="207. [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-29)">│</text><text class="breeze-k8s-build-k8s-image-r4" x="24.4" y="727.6" textLength="73.2" clip-path="url(#breeze-k8s-build-k8s-image-line-29)">--help</text><text class="breeze-k8s-build-k8s-image-r6" x="158.6" y="727.6" textLength="24.4" clip-path="url(#breeze-k8s-build-k8s-image-line-29)">-h</text><text class="breeze-k8s-build-k8s-image-r1" x="207.4" y [...]
+</text><text class="breeze-k8s-build-k8s-image-r5" x="0" y="752" textLength="1464" clip-path="url(#breeze-k8s-build-k8s-image-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-build-k8s-image-r1" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-k8s-build-k8s-image-line-30)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_k8s_build-k8s-image.txt b/dev/breeze/doc/images/output_k8s_build-k8s-image.txt
index e27fa3aee05..6e321580484 100644
--- a/dev/breeze/doc/images/output_k8s_build-k8s-image.txt
+++ b/dev/breeze/doc/images/output_k8s_build-k8s-image.txt
@@ -1 +1 @@
-23407b52a0d231586a557bfb3a62cf56
+a1918a2c0506e38e0a8894f548b5a56f
diff --git a/dev/breeze/doc/images/output_k8s_run-complete-tests.svg b/dev/breeze/doc/images/output_k8s_run-complete-tests.svg
index bb6796ec879..e72006486b0 100644
--- a/dev/breeze/doc/images/output_k8s_run-complete-tests.svg
+++ b/dev/breeze/doc/images/output_k8s_run-complete-tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1318.8" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1294.3999999999999" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-k8s-run-complete-tests-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="1267.8" />
+ <rect x="0" y="0" width="1463.0" height="1243.3999999999999" />
</clipPath>
<clipPath id="breeze-k8s-run-complete-tests-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -195,12 +195,9 @@
<clipPath id="breeze-k8s-run-complete-tests-line-49">
<rect x="0" y="1197.1" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-k8s-run-complete-tests-line-50">
- <rect x="0" y="1221.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="1316.8" rx="8"/><text class="breeze-k8s-run-complete-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: k8s run-complete-tests</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1292.4" rx="8"/><text class="breeze-k8s-run-complete-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: k8s run-complete-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"/>
@@ -225,43 +222,42 @@
</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-12)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="312.8" textLength="256.2" clip-path="url(#breeze-k8s-run-complete-tests-line-12)">--use-standard-naming</text><text class="breeze-k8s-run-complete-tests-r1" x="341.6" y="312.8" textLength="244" clip-path="url(#breeze-k8s-run-complete-tests-line-12)">Use standard naming.< [...]
</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="337.2" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-13)">
</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="361.6" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-14)">â•─</text><text class="breeze-k8s-run-complete-tests-r5" x="24.4" y="361.6" textLength="231.8" clip-path="url(#breeze-k8s-run-complete-tests-line-14)"> Build image flags </text><text class="breeze-k8s-run-complete-tests-r5" x="256.2" y="361.6" textLength="1183.4" clip-path="url(#breeze-k8s-run-complete-tests-line-14)">───────── [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-15)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="386" textLength="134.2" clip-path="url(#breeze-k8s-run-complete-tests-line-15)">--image-tag</text><text class="breeze-k8s-run-complete-tests-r7" x="585.6" y="386" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-15)">-t</text><text class="breeze-k8s-run-complete- [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-16)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="410.4" textLength="244" clip-path="url(#breeze-k8s-run-complete-tests-line-16)">--rebuild-base-image</text><text class="breeze-k8s-run-complete-tests-r1" x="634.4" y="410.4" textLength="658.8" clip-path="url(#breeze-k8s-run-complete-tests-line-16)">Rebuilds base Airflow& [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-17)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="434.8" textLength="244" clip-path="url(#breeze-k8s-run-complete-tests-line-17)">--copy-local-sources</text><text class="breeze-k8s-run-complete-tests-r1" x="268.4" y="434.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-17)">/</text><text class="breeze-k8s-r [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-18)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="459.2" textLength="97.6" clip-path="url(#breeze-k8s-run-complete-tests-line-18)">--use-uv</text><text class="breeze-k8s-run-complete-tests-r1" x="122" y="459.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-18)">/</text><text class="breeze-k8s-run-complete-t [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-19)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="634.4" y="483.6" textLength="719.8" clip-path="url(#breeze-k8s-run-complete-tests-line-19)">[default: use-uv]                             &# [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="508" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-20)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="532.4" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">â•─</text><text class="breeze-k8s-run-complete-tests-r5" x="24.4" y="532.4" textLength="207.4" clip-path="url(#breeze-k8s-run-complete-tests-line-21)"> K8S tests flags </text><text class="breeze-k8s-run-complete-tests-r5" x="231.8" y="532.4" textLength="1207.8" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">─────────── [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-22)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="556.8" textLength="97.6" clip-path="url(#breeze-k8s-run-complete-tests-line-22)">--python</text><text class="breeze-k8s-run-complete-tests-r7" x="292.8" y="556.8" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-22)">-p</text><text class="breeze-k8s-run-complet [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="341.6" y="581.2" textLength="732" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">[default: 3.9]                              & [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-24)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="605.6" textLength="244" clip-path="url(#breeze-k8s-run-complete-tests-line-24)">--kubernetes-version</text><text class="breeze-k8s-run-complete-tests-r1" x="341.6" y="605.6" textLength="658.8" clip-path="url(#breeze-k8s-run-complete-tests-line-24)">Kubernetes version use [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">│</text><text class="breeze-k8s-run-complete-tests-r6" x="341.6" y="630" textLength="658.8" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">(>v1.28.15< | v1.29.12 | v1.30.8 | v1.31.4 | v1.32.0) </text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="630" textLength="12.2" clip-p [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-26)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="341.6" y="654.4" textLength="658.8" clip-path="url(#breeze-k8s-run-complete-tests-line-26)">[default: v1.28.15]                              [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-27)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="678.8" textLength="122" clip-path="url(#breeze-k8s-run-complete-tests-line-27)">--executor</text><text class="breeze-k8s-run-complete-tests-r1" x="341.6" y="678.8" textLength="1098" clip-path="url(#breeze-k8s-run-complete-tests-line-27)">Executor to use for a&# [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-28)">│</text><text class="breeze-k8s-run-complete-tests-r6" x="341.6" y="703.2" textLength="1098" clip-path="url(#breeze-k8s-run-complete-tests-line-28)">(>LocalExecutor< | KubernetesExecutor | CeleryExecutor | CeleryKubernetesExecutor |       </text><text class="breeze-k8s-ru [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-29)">│</text><text class="breeze-k8s-run-complete-tests-r6" x="341.6" y="727.6" textLength="1098" clip-path="url(#breeze-k8s-run-complete-tests-line-29)">EdgeExecutor | SequentialExecutor)                           [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-30)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="341.6" y="752" textLength="1098" clip-path="url(#breeze-k8s-run-complete-tests-line-30)">[default: LocalExecutor]                              [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-31)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="776.4" textLength="219.6" clip-path="url(#breeze-k8s-run-complete-tests-line-31)">--force-venv-setup</text><text class="breeze-k8s-run-complete-tests-r1" x="341.6" y="776.4" textLength="427" clip-path="url(#breeze-k8s-run-complete-tests-line-31)">Force recreation of  [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="800.8" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-32)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="825.2" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">â•─</text><text class="breeze-k8s-run-complete-tests-r5" x="24.4" y="825.2" textLength="219.6" clip-path="url(#breeze-k8s-run-complete-tests-line-33)"> Parallel options </text><text class="breeze-k8s-run-complete-tests-r5" x="244" y="825.2" textLength="1195.6" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">───────────────── [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="849.6" textLength="207.4" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">--run-in-parallel</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="849.6" textLength="854" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">Run the operation in [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="874" textLength="158.6" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">--parallelism</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="874" textLength="1061.4" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">Maximum number of processes [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-36)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="898.4" textLength="1061.4" clip-path="url(#breeze-k8s-run-complete-tests-line-36)">operations.                                [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-37)">│</text><text class="breeze-k8s-run-complete-tests-r6" x="378.2" y="922.8" textLength="1061.4" clip-path="url(#breeze-k8s-run-complete-tests-line-37)">(INTEGER RANGE)                              [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-38)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="378.2" y="947.2" textLength="1061.4" clip-path="url(#breeze-k8s-run-complete-tests-line-38)">[default: 2; 1<=x<=4]                           [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="971.6" textLength="207.4" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">--python-versions</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="971.6" textLength="951.6" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">Space separated list [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-40)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="378.2" y="996" textLength="951.6" clip-path="url(#breeze-k8s-run-complete-tests-line-40)">[default: 3.9 3.10 3.11 3.12]                          [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-41)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1020.4" textLength="256.2" clip-path="url(#breeze-k8s-run-complete-tests-line-41)">--kubernetes-versions</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="1020.4" textLength="756.4" clip-path="url(#breeze-k8s-run-complete-tests-line-41)">Kubernetes versions&# [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="378.2" y="1044.8" textLength="756.4" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">[default: v1.28.15 v1.29.12 v1.30.8 v1.31.4 v1.32.0]          </text><text class="breeze-k8s-run-complete-tests-r5" x="14 [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1069.2" textLength="170.8" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">--skip-cleanup</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="1069.2" textLength="732" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">Skip cleanup of temp [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-44)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1093.6" textLength="207.4" clip-path="url(#breeze-k8s-run-complete-tests-line-44)">--debug-resources</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="1093.6" textLength="768.6" clip-path="url(#breeze-k8s-run-complete-tests-line-44)">Whether to show  [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-45)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1118" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-45)">--include-success-outputs</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="1118" textLength="927.2" clip-path="url(#breeze-k8s-run-complete-tests-line-45)">Whether to include&# [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1142.4" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-46)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1142.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-46)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1166.8" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-47)">â•─</text><text class="breeze-k8s-run-complete-tests-r5" x="24.4" y="1166.8" textLength="195.2" clip-path="url(#breeze-k8s-run-complete-tests-line-47)"> Common options </text><text class="breeze-k8s-run-complete-tests-r5" x="219.6" y="1166.8" textLength="1220" clip-path="url(#breeze-k8s-run-complete-tests-line-47)">──────────────── [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-48)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1191.2" textLength="109.8" clip-path="url(#breeze-k8s-run-complete-tests-line-48)">--dry-run</text><text class="breeze-k8s-run-complete-tests-r7" x="158.6" y="1191.2" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-48)">-D</text><text class="breeze-k8s-run-co [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-49)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1215.6" textLength="109.8" clip-path="url(#breeze-k8s-run-complete-tests-line-49)">--verbose</text><text class="breeze-k8s-run-complete-tests-r7" x="158.6" y="1215.6" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-49)">-v</text><text class="breeze-k8s-run-co [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-50)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1240" textLength="73.2" clip-path="url(#breeze-k8s-run-complete-tests-line-50)">--help</text><text class="breeze-k8s-run-complete-tests-r7" x="158.6" y="1240" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-50)">-h</text><text class="breeze-k8s-run-complete-tes [...]
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1264.4" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-51)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1264.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-51)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-15)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="386" textLength="244" clip-path="url(#breeze-k8s-run-complete-tests-line-15)">--rebuild-base-image</text><text class="breeze-k8s-run-complete-tests-r1" x="610" y="386" textLength="658.8" clip-path="url(#breeze-k8s-run-complete-tests-line-15)">Rebuilds base Airflow ima [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-16)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="410.4" textLength="244" clip-path="url(#breeze-k8s-run-complete-tests-line-16)">--copy-local-sources</text><text class="breeze-k8s-run-complete-tests-r1" x="268.4" y="410.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-16)">/</text><text class="breeze-k8s-r [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-17)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="434.8" textLength="97.6" clip-path="url(#breeze-k8s-run-complete-tests-line-17)">--use-uv</text><text class="breeze-k8s-run-complete-tests-r1" x="122" y="434.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-17)">/</text><text class="breeze-k8s-run-complete-t [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-18)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="610" y="459.2" textLength="719.8" clip-path="url(#breeze-k8s-run-complete-tests-line-18)">[default: use-uv]                              [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="483.6" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-19)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-19)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="508" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-20)">â•─</text><text class="breeze-k8s-run-complete-tests-r5" x="24.4" y="508" textLength="207.4" clip-path="url(#breeze-k8s-run-complete-tests-line-20)"> K8S tests flags </text><text class="breeze-k8s-run-complete-tests-r5" x="231.8" y="508" textLength="1207.8" clip-path="url(#breeze-k8s-run-complete-tests-line-20)">───────────────── [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="532.4" textLength="97.6" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">--python</text><text class="breeze-k8s-run-complete-tests-r7" x="292.8" y="532.4" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">-p</text><text class="breeze-k8s-run-complet [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-22)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="341.6" y="556.8" textLength="732" clip-path="url(#breeze-k8s-run-complete-tests-line-22)">[default: 3.9]                              & [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="581.2" textLength="244" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">--kubernetes-version</text><text class="breeze-k8s-run-complete-tests-r1" x="341.6" y="581.2" textLength="658.8" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">Kubernetes version use [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-24)">│</text><text class="breeze-k8s-run-complete-tests-r6" x="341.6" y="605.6" textLength="658.8" clip-path="url(#breeze-k8s-run-complete-tests-line-24)">(>v1.28.15< | v1.29.12 | v1.30.8 | v1.31.4 | v1.32.0) </text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="605.6" textLength="12.2" [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="341.6" y="630" textLength="658.8" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">[default: v1.28.15]                              [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-26)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="654.4" textLength="122" clip-path="url(#breeze-k8s-run-complete-tests-line-26)">--executor</text><text class="breeze-k8s-run-complete-tests-r1" x="341.6" y="654.4" textLength="1098" clip-path="url(#breeze-k8s-run-complete-tests-line-26)">Executor to use for a&# [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-27)">│</text><text class="breeze-k8s-run-complete-tests-r6" x="341.6" y="678.8" textLength="1098" clip-path="url(#breeze-k8s-run-complete-tests-line-27)">(>LocalExecutor< | KubernetesExecutor | CeleryExecutor | CeleryKubernetesExecutor |       </text><text class="breeze-k8s-ru [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-28)">│</text><text class="breeze-k8s-run-complete-tests-r6" x="341.6" y="703.2" textLength="1098" clip-path="url(#breeze-k8s-run-complete-tests-line-28)">EdgeExecutor | SequentialExecutor)                           [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-29)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="341.6" y="727.6" textLength="1098" clip-path="url(#breeze-k8s-run-complete-tests-line-29)">[default: LocalExecutor]                            &# [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-30)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="752" textLength="219.6" clip-path="url(#breeze-k8s-run-complete-tests-line-30)">--force-venv-setup</text><text class="breeze-k8s-run-complete-tests-r1" x="341.6" y="752" textLength="427" clip-path="url(#breeze-k8s-run-complete-tests-line-30)">Force recreation of the&# [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="776.4" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-31)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="800.8" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-32)">â•─</text><text class="breeze-k8s-run-complete-tests-r5" x="24.4" y="800.8" textLength="219.6" clip-path="url(#breeze-k8s-run-complete-tests-line-32)"> Parallel options </text><text class="breeze-k8s-run-complete-tests-r5" x="244" y="800.8" textLength="1195.6" clip-path="url(#breeze-k8s-run-complete-tests-line-32)">───────────────── [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="825.2" textLength="207.4" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">--run-in-parallel</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="825.2" textLength="854" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">Run the operation in [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="849.6" textLength="158.6" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">--parallelism</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="849.6" textLength="1061.4" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">Maximum number of pro [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="874" textLength="1061.4" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">operations.                                [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-36)">│</text><text class="breeze-k8s-run-complete-tests-r6" x="378.2" y="898.4" textLength="1061.4" clip-path="url(#breeze-k8s-run-complete-tests-line-36)">(INTEGER RANGE)                              [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-37)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="378.2" y="922.8" textLength="1061.4" clip-path="url(#breeze-k8s-run-complete-tests-line-37)">[default: 2; 1<=x<=4]                           [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-38)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="947.2" textLength="207.4" clip-path="url(#breeze-k8s-run-complete-tests-line-38)">--python-versions</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="947.2" textLength="951.6" clip-path="url(#breeze-k8s-run-complete-tests-line-38)">Space separated list [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="378.2" y="971.6" textLength="951.6" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">[default: 3.9 3.10 3.11 3.12]                          [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-40)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="996" textLength="256.2" clip-path="url(#breeze-k8s-run-complete-tests-line-40)">--kubernetes-versions</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="996" textLength="756.4" clip-path="url(#breeze-k8s-run-complete-tests-line-40)">Kubernetes versions used& [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-41)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="378.2" y="1020.4" textLength="756.4" clip-path="url(#breeze-k8s-run-complete-tests-line-41)">[default: v1.28.15 v1.29.12 v1.30.8 v1.31.4 v1.32.0]          </text><text class="breeze-k8s-run-complete-tests-r5" x="14 [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1044.8" textLength="170.8" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">--skip-cleanup</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="1044.8" textLength="732" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">Skip cleanup of temp [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1069.2" textLength="207.4" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">--debug-resources</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="1069.2" textLength="768.6" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">Whether to show  [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-44)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1093.6" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-44)">--include-success-outputs</text><text class="breeze-k8s-run-complete-tests-r1" x="378.2" y="1093.6" textLength="927.2" clip-path="url(#breeze-k8s-run-complete-tests-line-44)">Whether to inc [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1118" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-45)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1118" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-45)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1142.4" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-46)">â•─</text><text class="breeze-k8s-run-complete-tests-r5" x="24.4" y="1142.4" textLength="195.2" clip-path="url(#breeze-k8s-run-complete-tests-line-46)"> Common options </text><text class="breeze-k8s-run-complete-tests-r5" x="219.6" y="1142.4" textLength="1220" clip-path="url(#breeze-k8s-run-complete-tests-line-46)">──────────────── [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-47)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1166.8" textLength="109.8" clip-path="url(#breeze-k8s-run-complete-tests-line-47)">--dry-run</text><text class="breeze-k8s-run-complete-tests-r7" x="158.6" y="1166.8" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-47)">-D</text><text class="breeze-k8s-run-co [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-48)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1191.2" textLength="109.8" clip-path="url(#breeze-k8s-run-complete-tests-line-48)">--verbose</text><text class="breeze-k8s-run-complete-tests-r7" x="158.6" y="1191.2" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-48)">-v</text><text class="breeze-k8s-run-co [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-49)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1215.6" textLength="73.2" clip-path="url(#breeze-k8s-run-complete-tests-line-49)">--help</text><text class="breeze-k8s-run-complete-tests-r7" x="158.6" y="1215.6" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-49)">-h</text><text class="breeze-k8s-run-comple [...]
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1240" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-50)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1240" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-50)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_k8s_run-complete-tests.txt b/dev/breeze/doc/images/output_k8s_run-complete-tests.txt
index a0c89af1762..5bbd968891a 100644
--- a/dev/breeze/doc/images/output_k8s_run-complete-tests.txt
+++ b/dev/breeze/doc/images/output_k8s_run-complete-tests.txt
@@ -1 +1 @@
-402147cc2133589e44caf57e6b229679
+1855cee910a2f7039dae5d4af44399a6
diff --git a/dev/breeze/doc/images/output_prod-image.svg b/dev/breeze/doc/images/output_prod-image.svg
index ef8e95626d1..66c17e5cc08 100644
--- a/dev/breeze/doc/images/output_prod-image.svg
+++ b/dev/breeze/doc/images/output_prod-image.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 367.2" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 416.0" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -42,7 +42,7 @@
<defs>
<clipPath id="breeze-prod-image-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="316.2" />
+ <rect x="0" y="0" width="1463.0" height="365.0" />
</clipPath>
<clipPath id="breeze-prod-image-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -80,9 +80,15 @@
<clipPath id="breeze-prod-image-line-11">
<rect x="0" y="269.9" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-prod-image-line-12">
+ <rect x="0" y="294.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-line-13">
+ <rect x="0" y="318.7" 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="365.2" rx="8"/><text class="breeze-prod-image-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: prod-image</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="414" rx="8"/><text class="breeze-prod-image-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: prod-image</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -104,7 +110,9 @@
</text><text class="breeze-prod-image-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-prod-image-line-9)">│</text><text class="breeze-prod-image-r4" x="24.4" y="239.6" textLength="85.4" clip-path="url(#breeze-prod-image-line-9)">build  </text><text class="breeze-prod-image-r1" x="134.2" y="239.6" textLength="1305.4" clip-path="url(#breeze-prod-image-line-9)">Build Production image. Include building multiple images for all [...]
</text><text class="breeze-prod-image-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-prod-image-line-10)">│</text><text class="breeze-prod-image-r4" x="24.4" y="264" textLength="85.4" clip-path="url(#breeze-prod-image-line-10)">pull   </text><text class="breeze-prod-image-r1" x="134.2" y="264" textLength="1305.4" clip-path="url(#breeze-prod-image-line-10)">Pull and optionally verify Production images - possibly in pa [...]
</text><text class="breeze-prod-image-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-prod-image-line-11)">│</text><text class="breeze-prod-image-r4" x="24.4" y="288.4" textLength="85.4" clip-path="url(#breeze-prod-image-line-11)">verify </text><text class="breeze-prod-image-r1" x="134.2" y="288.4" textLength="1305.4" clip-path="url(#breeze-prod-image-line-11)">Verify Production image.             [...]
-</text><text class="breeze-prod-image-r5" x="0" y="312.8" textLength="1464" clip-path="url(#breeze-prod-image-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-prod-image-line-12)">
+</text><text class="breeze-prod-image-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-prod-image-line-12)">│</text><text class="breeze-prod-image-r4" x="24.4" y="312.8" textLength="85.4" clip-path="url(#breeze-prod-image-line-12)">save   </text><text class="breeze-prod-image-r1" x="134.2" y="312.8" textLength="1305.4" clip-path="url(#breeze-prod-image-line-12)">Save PROD image to a file.        & [...]
+</text><text class="breeze-prod-image-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-prod-image-line-13)">│</text><text class="breeze-prod-image-r4" x="24.4" y="337.2" textLength="85.4" clip-path="url(#breeze-prod-image-line-13)">load   </text><text class="breeze-prod-image-r1" x="134.2" y="337.2" textLength="1305.4" clip-path="url(#breeze-prod-image-line-13)">Load PROD image from a file.         [...]
+</text><text class="breeze-prod-image-r5" x="0" y="361.6" textLength="1464" clip-path="url(#breeze-prod-image-line-14)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-prod-image-line-14)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_prod-image.txt b/dev/breeze/doc/images/output_prod-image.txt
index c767ee09d4f..b76a184df42 100644
--- a/dev/breeze/doc/images/output_prod-image.txt
+++ b/dev/breeze/doc/images/output_prod-image.txt
@@ -1 +1 @@
-d91bcc76b14f186e749efe2c6aaa8682
+fcd6fa2cb877b834cf2017757dc6ef8b
diff --git a/dev/breeze/doc/images/output_prod-image_build.svg b/dev/breeze/doc/images/output_prod-image_build.svg
index 5684063c953..f074b122bbe 100644
--- a/dev/breeze/doc/images/output_prod-image_build.svg
+++ b/dev/breeze/doc/images/output_prod-image_build.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 2612.0" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 2538.7999999999997" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-prod-image-build-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="2561.0" />
+ <rect x="0" y="0" width="1463.0" height="2487.7999999999997" />
</clipPath>
<clipPath id="breeze-prod-image-build-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -348,18 +348,9 @@
<clipPath id="breeze-prod-image-build-line-100">
<rect x="0" y="2441.5" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-prod-image-build-line-101">
- <rect x="0" y="2465.9" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-prod-image-build-line-102">
- <rect x="0" y="2490.3" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-prod-image-build-line-103">
- <rect x="0" y="2514.7" 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="2610" rx="8"/><text class="breeze-prod-image-build-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: prod-image build</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2536.8" rx="8"/><text class="breeze-prod-image-build-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: prod-image build</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -381,99 +372,96 @@
</text><text class="breeze-prod-image-build-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-9)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="239.6" textLength="158.6" clip-path="url(#breeze-prod-image-build-line-9)">--docker-host</text><text class="breeze-prod-image-build-r1" x="402.6" y="239.6" textLength="915" clip-path="url(#breeze-prod-image-build-line-9)">Optional - docker host to use when running& [...]
</text><text class="breeze-prod-image-build-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-10)">│</text><text class="breeze-prod-image-build-r1" x="402.6" y="264" textLength="1037" clip-path="url(#breeze-prod-image-build-line-10)">option is ignored when building images.                           & [...]
</text><text class="breeze-prod-image-build-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-11)">│</text><text class="breeze-prod-image-build-r6" x="402.6" y="288.4" textLength="1037" clip-path="url(#breeze-prod-image-build-line-11)">(TEXT)                                    & [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-12)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="312.8" textLength="134.2" clip-path="url(#breeze-prod-image-build-line-12)">--image-tag</text><text class="breeze-prod-image-build-r1" x="402.6" y="312.8" textLength="390.4" clip-path="url(#breeze-prod-image-build-line-12)">Tag the image after building it.</text><text class [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-13)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="337.2" textLength="305" clip-path="url(#breeze-prod-image-build-line-13)">--install-airflow-version</text><text class="breeze-prod-image-build-r7" x="353.8" y="337.2" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-13)">-V</text><text class="breeze-prod-image-build-r1" x="402.6" y="3 [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-14)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="361.6" textLength="97.6" clip-path="url(#breeze-prod-image-build-line-14)">--python</text><text class="breeze-prod-image-build-r7" x="353.8" y="361.6" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-14)">-p</text><text class="breeze-prod-image-build-r1" x="402.6" y="361.6" textLength [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-15)">│</text><text class="breeze-prod-image-build-r6" x="402.6" y="386" textLength="732" clip-path="url(#breeze-prod-image-build-line-15)">(>3.9< | 3.10 | 3.11 | 3.12)                           &# [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-16)">│</text><text class="breeze-prod-image-build-r5" x="402.6" y="410.4" textLength="732" clip-path="url(#breeze-prod-image-build-line-16)">[default: 3.9]                                  & [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-17)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="434.8" textLength="183" clip-path="url(#breeze-prod-image-build-line-17)">--tag-as-latest</text><text class="breeze-prod-image-build-r1" x="402.6" y="434.8" textLength="1037" clip-path="url(#breeze-prod-image-build-line-17)">Tags the image as latest and update che [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-18)">│</text><text class="breeze-prod-image-build-r1" x="402.6" y="459.2" textLength="353.8" clip-path="url(#breeze-prod-image-build-line-18)">you build or pull image with </text><text class="breeze-prod-image-build-r4" x="756.4" y="459.2" textLength="134.2" clip-path="url(#breeze-prod-image-build-line-18)">--image-tag</text><text cl [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-19)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="483.6" textLength="305" clip-path="url(#breeze-prod-image-build-line-19)">--version-suffix-for-pypi</text><text class="breeze-prod-image-build-r1" x="402.6" y="483.6" textLength="768.6" clip-path="url(#breeze-prod-image-build-line-19)">Version suffix used for PyPI packages& [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="508" textLength="1464" clip-path="url(#breeze-prod-image-build-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-20)">
-</text><text class="breeze-prod-image-build-r5" x="0" y="532.4" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-21)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="532.4" textLength="353.8" clip-path="url(#breeze-prod-image-build-line-21)"> Building images in parallel </text><text class="breeze-prod-image-build-r5" x="378.2" y="532.4" textLength="1061.4" clip-path="url(#breeze-prod-image-build-line-21)">────────────────────────────── [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-22)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="556.8" textLength="207.4" clip-path="url(#breeze-prod-image-build-line-22)">--run-in-parallel</text><text class="breeze-prod-image-build-r1" x="378.2" y="556.8" textLength="854" clip-path="url(#breeze-prod-image-build-line-22)">Run the operation in parallel on all  [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-23)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="581.2" textLength="158.6" clip-path="url(#breeze-prod-image-build-line-23)">--parallelism</text><text class="breeze-prod-image-build-r1" x="378.2" y="581.2" textLength="915" clip-path="url(#breeze-prod-image-build-line-23)">Maximum number of processes to use while  [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-24)">│</text><text class="breeze-prod-image-build-r6" x="378.2" y="605.6" textLength="915" clip-path="url(#breeze-prod-image-build-line-24)">(INTEGER RANGE)                                   [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-25)">│</text><text class="breeze-prod-image-build-r5" x="378.2" y="630" textLength="915" clip-path="url(#breeze-prod-image-build-line-25)">[default: 4; 1<=x<=8]                                 [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-26)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="654.4" textLength="207.4" clip-path="url(#breeze-prod-image-build-line-26)">--python-versions</text><text class="breeze-prod-image-build-r1" x="378.2" y="654.4" textLength="951.6" clip-path="url(#breeze-prod-image-build-line-26)">Space separated list of python versions  [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-27)">│</text><text class="breeze-prod-image-build-r5" x="378.2" y="678.8" textLength="951.6" clip-path="url(#breeze-prod-image-build-line-27)">[default: 3.9 3.10 3.11 3.12]                              [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-28)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="703.2" textLength="170.8" clip-path="url(#breeze-prod-image-build-line-28)">--skip-cleanup</text><text class="breeze-prod-image-build-r1" x="378.2" y="703.2" textLength="732" clip-path="url(#breeze-prod-image-build-line-28)">Skip cleanup of temporary files created duri [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-29)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="727.6" textLength="207.4" clip-path="url(#breeze-prod-image-build-line-29)">--debug-resources</text><text class="breeze-prod-image-build-r1" x="378.2" y="727.6" textLength="768.6" clip-path="url(#breeze-prod-image-build-line-29)">Whether to show resource information while&# [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-30)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="752" textLength="305" clip-path="url(#breeze-prod-image-build-line-30)">--include-success-outputs</text><text class="breeze-prod-image-build-r1" x="378.2" y="752" textLength="927.2" clip-path="url(#breeze-prod-image-build-line-30)">Whether to include outputs of successful [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="776.4" textLength="1464" clip-path="url(#breeze-prod-image-build-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-31)">
-</text><text class="breeze-prod-image-build-r5" x="0" y="800.8" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-32)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="800.8" textLength="512.4" clip-path="url(#breeze-prod-image-build-line-32)"> Advanced build options (for power users) </text><text class="breeze-prod-image-build-r5" x="536.8" y="800.8" textLength="902.8" clip-path="url(#breeze-prod-image-build-line-32)">──────── [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-33)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="825.2" textLength="366" clip-path="url(#breeze-prod-image-build-line-33)">--additional-pip-install-flags</text><text class="breeze-prod-image-build-r1" x="439.2" y="825.2" textLength="1000.4" clip-path="url(#breeze-prod-image-build-line-33)">Additional flags added to `pip i [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-34)">│</text><text class="breeze-prod-image-build-r1" x="439.2" y="849.6" textLength="1000.4" clip-path="url(#breeze-prod-image-build-line-34)">itself).                                    [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-35)">│</text><text class="breeze-prod-image-build-r6" x="439.2" y="874" textLength="1000.4" clip-path="url(#breeze-prod-image-build-line-35)">(TEXT)                                     [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-36)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="898.4" textLength="146.4" clip-path="url(#breeze-prod-image-build-line-36)">--commit-sha</text><text class="breeze-prod-image-build-r1" x="439.2" y="898.4" textLength="536.8" clip-path="url(#breeze-prod-image-build-line-36)">Commit SHA that is used to build the [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-37)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="922.8" textLength="195.2" clip-path="url(#breeze-prod-image-build-line-37)">--debian-version</text><text class="breeze-prod-image-build-r1" x="439.2" y="922.8" textLength="793" clip-path="url(#breeze-prod-image-build-line-37)">Debian version used in Airflow image as [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-38)">│</text><text class="breeze-prod-image-build-r5" x="439.2" y="947.2" textLength="793" clip-path="url(#breeze-prod-image-build-line-38)">[default: bookworm]                                 &# [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-39)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="971.6" textLength="170.8" clip-path="url(#breeze-prod-image-build-line-39)">--python-image</text><text class="breeze-prod-image-build-r1" x="439.2" y="971.6" textLength="1000.4" clip-path="url(#breeze-prod-image-build-line-39)">If specified this is the base python  [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-40)">│</text><text class="breeze-prod-image-build-r1" x="439.2" y="996" textLength="1000.4" clip-path="url(#breeze-prod-image-build-line-40)">something like: python:VERSION-slim-bookworm.                            &# [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-41)">│</text><text class="breeze-prod-image-build-r6" x="439.2" y="1020.4" textLength="1000.4" clip-path="url(#breeze-prod-image-build-line-41)">(TEXT)                                    [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-42)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1044.8" textLength="97.6" clip-path="url(#breeze-prod-image-build-line-42)">--use-uv</text><text class="breeze-prod-image-build-r1" x="122" y="1044.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-42)">/</text><text class="breeze-prod-image-build-r4" x="134.2" y="1044.8" textLengt [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-43)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1069.2" textLength="207.4" clip-path="url(#breeze-prod-image-build-line-43)">--uv-http-timeout</text><text class="breeze-prod-image-build-r1" x="439.2" y="1069.2" textLength="829.6" clip-path="url(#breeze-prod-image-build-line-43)">Timeout for requests that UV makes ( [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-44)">│</text><text class="breeze-prod-image-build-r6" x="439.2" y="1093.6" textLength="829.6" clip-path="url(#breeze-prod-image-build-line-44)">(INTEGER RANGE)                                 &# [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-45)">│</text><text class="breeze-prod-image-build-r5" x="439.2" y="1118" textLength="829.6" clip-path="url(#breeze-prod-image-build-line-45)">[default: 300; x>=1]                                 [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1142.4" textLength="1464" clip-path="url(#breeze-prod-image-build-line-46)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="1142.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-46)">
-</text><text class="breeze-prod-image-build-r5" x="0" y="1166.8" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-47)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="1166.8" textLength="597.8" clip-path="url(#breeze-prod-image-build-line-47)"> Selecting constraint location (for power users) </text><text class="breeze-prod-image-build-r5" x="622.2" y="1166.8" textLength="817.4" clip-path="url(#breeze-prod-image-build-line-47) [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-48)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1191.2" textLength="366" clip-path="url(#breeze-prod-image-build-line-48)">--airflow-constraints-location</text><text class="breeze-prod-image-build-r1" x="451.4" y="1191.2" textLength="902.8" clip-path="url(#breeze-prod-image-build-line-48)">Location of airflow constraints to& [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-49)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1215.6" textLength="317.2" clip-path="url(#breeze-prod-image-build-line-49)">--airflow-constraints-mode</text><text class="breeze-prod-image-build-r1" x="451.4" y="1215.6" textLength="866.2" clip-path="url(#breeze-prod-image-build-line-49)">Mode of constraints for Airflow  [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-50)">│</text><text class="breeze-prod-image-build-r6" x="451.4" y="1240" textLength="866.2" clip-path="url(#breeze-prod-image-build-line-50)">(constraints | constraints-no-providers | constraints-source-providers)</text><text class="breeze-prod-image-build-r5" x="1451.8" y="1240" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-50 [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-51)">│</text><text class="breeze-prod-image-build-r5" x="451.4" y="1264.4" textLength="866.2" clip-path="url(#breeze-prod-image-build-line-51)">[default: constraints]                                & [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-52)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1288.8" textLength="378.2" clip-path="url(#breeze-prod-image-build-line-52)">--airflow-constraints-reference</text><text class="breeze-prod-image-build-r1" x="451.4" y="1288.8" textLength="634.4" clip-path="url(#breeze-prod-image-build-line-52)">Constraint reference to use when [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1313.2" textLength="1464" clip-path="url(#breeze-prod-image-build-line-53)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="1313.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-53)">
-</text><text class="breeze-prod-image-build-r5" x="0" y="1337.6" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-54)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="1337.6" textLength="634.4" clip-path="url(#breeze-prod-image-build-line-54)"> Choosing dependencies and extras (for power users) </text><text class="breeze-prod-image-build-r5" x="658.8" y="1337.6" textLength="780.8" clip-path="url(#breeze-prod-image-build- [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-55)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1362" textLength="195.2" clip-path="url(#breeze-prod-image-build-line-55)">--airflow-extras</text><text class="breeze-prod-image-build-r1" x="463.6" y="1362" textLength="976" clip-path="url(#breeze-prod-image-build-line-55)">Extras to install by default.    &# [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-56)">│</text><text class="breeze-prod-image-build-r6" x="463.6" y="1386.4" textLength="976" clip-path="url(#breeze-prod-image-build-line-56)">(TEXT)                                     [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1410.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-57)">│</text><text class="breeze-prod-image-build-r5" x="463.6" y="1410.8" textLength="976" clip-path="url(#breeze-prod-image-build-line-57)">[default:                                    [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1435.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-58)">│</text><text class="breeze-prod-image-build-r5" x="463.6" y="1435.2" textLength="976" clip-path="url(#breeze-prod-image-build-line-58)">aiobotocore,amazon,async,celery,cncf-kubernetes,common-io,docker,elasticsearch,…</text><text class="breeze-prod-image-build-r5" x="1451.8" y="1435.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-58)">│</t [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-59)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1459.6" textLength="329.4" clip-path="url(#breeze-prod-image-build-line-59)">--additional-airflow-extras</text><text class="breeze-prod-image-build-r1" x="463.6" y="1459.6" textLength="768.6" clip-path="url(#breeze-prod-image-build-line-59)">Additional extra package while insta [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-60)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1484" textLength="292.8" clip-path="url(#breeze-prod-image-build-line-60)">--additional-python-deps</text><text class="breeze-prod-image-build-r1" x="463.6" y="1484" textLength="768.6" clip-path="url(#breeze-prod-image-build-line-60)">Additional python dependencies to use wh [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-61)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1508.4" textLength="170.8" clip-path="url(#breeze-prod-image-build-line-61)">--dev-apt-deps</text><text class="breeze-prod-image-build-r1" x="463.6" y="1508.4" textLength="646.6" clip-path="url(#breeze-prod-image-build-line-61)">Apt dev dependencies to use when buildi [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1532.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-62)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1532.8" textLength="305" clip-path="url(#breeze-prod-image-build-line-62)">--additional-dev-apt-deps</text><text class="breeze-prod-image-build-r1" x="463.6" y="1532.8" textLength="780.8" clip-path="url(#breeze-prod-image-build-line-62)">Additional apt dev dependencies to  [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1557.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-63)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1557.2" textLength="207.4" clip-path="url(#breeze-prod-image-build-line-63)">--dev-apt-command</text><text class="breeze-prod-image-build-r1" x="463.6" y="1557.2" textLength="622.2" clip-path="url(#breeze-prod-image-build-line-63)">Command executed before dev apt deps  [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-64)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1581.6" textLength="341.6" clip-path="url(#breeze-prod-image-build-line-64)">--additional-dev-apt-command</text><text class="breeze-prod-image-build-r1" x="463.6" y="1581.6" textLength="756.4" clip-path="url(#breeze-prod-image-build-line-64)">Additional command executed before  [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1606" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-65)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1606" textLength="292.8" clip-path="url(#breeze-prod-image-build-line-65)">--additional-dev-apt-env</text><text class="breeze-prod-image-build-r1" x="463.6" y="1606" textLength="805.2" clip-path="url(#breeze-prod-image-build-line-65)">Additional environment variables set when [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1630.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-66)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1630.4" textLength="219.6" clip-path="url(#breeze-prod-image-build-line-66)">--runtime-apt-deps</text><text class="breeze-prod-image-build-r1" x="463.6" y="1630.4" textLength="695.4" clip-path="url(#breeze-prod-image-build-line-66)">Apt runtime dependencies to use when [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1654.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-67)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1654.8" textLength="353.8" clip-path="url(#breeze-prod-image-build-line-67)">--additional-runtime-apt-deps</text><text class="breeze-prod-image-build-r1" x="463.6" y="1654.8" textLength="829.6" clip-path="url(#breeze-prod-image-build-line-67)">Additional apt runtime dependencies [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1679.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-68)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1679.2" textLength="256.2" clip-path="url(#breeze-prod-image-build-line-68)">--runtime-apt-command</text><text class="breeze-prod-image-build-r1" x="463.6" y="1679.2" textLength="671" clip-path="url(#breeze-prod-image-build-line-68)">Command executed before runtime apt dep [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1703.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-69)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1703.6" textLength="390.4" clip-path="url(#breeze-prod-image-build-line-69)">--additional-runtime-apt-command</text><text class="breeze-prod-image-build-r1" x="463.6" y="1703.6" textLength="805.2" clip-path="url(#breeze-prod-image-build-line-69)">Additional command executed before&# [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1728" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-70)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1728" textLength="341.6" clip-path="url(#breeze-prod-image-build-line-70)">--additional-runtime-apt-env</text><text class="breeze-prod-image-build-r1" x="463.6" y="1728" textLength="854" clip-path="url(#breeze-prod-image-build-line-70)">Additional environment variables set when&# [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1752.4" textLength="1464" clip-path="url(#breeze-prod-image-build-line-71)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="1752.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-71)">
-</text><text class="breeze-prod-image-build-r5" x="0" y="1776.8" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-72)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="1776.8" textLength="817.4" clip-path="url(#breeze-prod-image-build-line-72)"> Advanced customization options (for specific customization needs) </text><text class="breeze-prod-image-build-r5" x="841.8" y="1776.8" textLength="597.8" clip-path="url(#breeze-pr [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-73)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1801.2" textLength="256.2" clip-path="url(#breeze-prod-image-build-line-73)">--installation-method</text><text class="breeze-prod-image-build-r1" x="536.8" y="1801.2" textLength="463.6" clip-path="url(#breeze-prod-image-build-line-73)">Install Airflow from: sources or PyPI [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-74)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1825.6" textLength="329.4" clip-path="url(#breeze-prod-image-build-line-74)">--install-airflow-reference</text><text class="breeze-prod-image-build-r1" x="536.8" y="1825.6" textLength="524.6" clip-path="url(#breeze-prod-image-build-line-74)">Install Airflow using GitHub tag [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-75)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1850" textLength="378.2" clip-path="url(#breeze-prod-image-build-line-75)">--install-packages-from-context</text><text class="breeze-prod-image-build-r1" x="536.8" y="1850" textLength="902.8" clip-path="url(#breeze-prod-image-build-line-75)">Install wheels from local docker-conte [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-76)">│</text><text class="breeze-prod-image-build-r1" x="536.8" y="1874.4" textLength="97.6" clip-path="url(#breeze-prod-image-build-line-76)">Implies </text><text class="breeze-prod-image-build-r4" x="634.4" y="1874.4" textLength="341.6" clip-path="url(#breeze-prod-image-build-line-76)">--disable-airflow-repo-cache</text><text class="breeze-prod-image-buil [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-77)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1898.8" textLength="329.4" clip-path="url(#breeze-prod-image-build-line-77)">--install-mysql-client-type</text><text class="breeze-prod-image-build-r1" x="536.8" y="1898.8" textLength="475.8" clip-path="url(#breeze-prod-image-build-line-77)">Which client to choose when ins [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-78)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1923.2" textLength="207.4" clip-path="url(#breeze-prod-image-build-line-78)">--cleanup-context</text><text class="breeze-prod-image-build-r1" x="536.8" y="1923.2" textLength="902.8" clip-path="url(#breeze-prod-image-build-line-78)">Clean up docker context files before  [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-79)">│</text><text class="breeze-prod-image-build-r1" x="536.8" y="1947.6" textLength="170.8" clip-path="url(#breeze-prod-image-build-line-79)">together with </text><text class="breeze-prod-image-build-r4" x="707.6" y="1947.6" textLength="378.2" clip-path="url(#breeze-prod-image-build-line-79)">--install-packages-from-context</text><text class="breeze- [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-80)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1972" textLength="463.6" clip-path="url(#breeze-prod-image-build-line-80)">--use-constraints-for-context-packages</text><text class="breeze-prod-image-build-r1" x="536.8" y="1972" textLength="902.8" clip-path="url(#breeze-prod-image-build-line-80)">Uses constraints for context pa [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-81)">│</text><text class="breeze-prod-image-build-r1" x="536.8" y="1996.4" textLength="902.8" clip-path="url(#breeze-prod-image-build-line-81)">constraints store in docker-context-files or from github.                 </text><text class="breeze-prod [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-82)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2020.8" textLength="341.6" clip-path="url(#breeze-prod-image-build-line-82)">--disable-airflow-repo-cache</text><text class="breeze-prod-image-build-r1" x="536.8" y="2020.8" textLength="658.8" clip-path="url(#breeze-prod-image-build-line-82)">Disable cache from Airflow reposito [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-83)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2045.2" textLength="427" clip-path="url(#breeze-prod-image-build-line-83)">--disable-mysql-client-installation</text><text class="breeze-prod-image-build-r1" x="536.8" y="2045.2" textLength="341.6" clip-path="url(#breeze-prod-image-build-line-83)">Do not install MySQL client.</ [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-84)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2069.6" textLength="427" clip-path="url(#breeze-prod-image-build-line-84)">--disable-mssql-client-installation</text><text class="breeze-prod-image-build-r1" x="536.8" y="2069.6" textLength="341.6" clip-path="url(#breeze-prod-image-build-line-84)">Do not install MsSQl client.</ [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-85)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2094" textLength="463.6" clip-path="url(#breeze-prod-image-build-line-85)">--disable-postgres-client-installation</text><text class="breeze-prod-image-build-r1" x="536.8" y="2094" textLength="378.2" clip-path="url(#breeze-prod-image-build-line-85)">Do not install Postgres client. [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2118.4" textLength="1464" clip-path="url(#breeze-prod-image-build-line-86)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="2118.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-86)">
-</text><text class="breeze-prod-image-build-r5" x="0" y="2142.8" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-87)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="2142.8" textLength="622.2" clip-path="url(#breeze-prod-image-build-line-87)"> Preparing cache and push (for maintainers and CI) </text><text class="breeze-prod-image-build-r5" x="646.6" y="2142.8" textLength="793" clip-path="url(#breeze-prod-image-buil [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-88)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2167.2" textLength="109.8" clip-path="url(#breeze-prod-image-build-line-88)">--builder</text><text class="breeze-prod-image-build-r1" x="341.6" y="2167.2" textLength="756.4" clip-path="url(#breeze-prod-image-build-line-88)">Buildx builder used to perform `docker build [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-89)">│</text><text class="breeze-prod-image-build-r5" x="341.6" y="2191.6" textLength="756.4" clip-path="url(#breeze-prod-image-build-line-89)">[default: autodetect]                                &# [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-90)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2216" textLength="122" clip-path="url(#breeze-prod-image-build-line-90)">--platform</text><text class="breeze-prod-image-build-r1" x="341.6" y="2216" textLength="329.4" clip-path="url(#breeze-prod-image-build-line-90)">Platform for Airflow image.</text><text class="breeze-prod-image-b [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-91)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2240.4" textLength="73.2" clip-path="url(#breeze-prod-image-build-line-91)">--push</text><text class="breeze-prod-image-build-r1" x="341.6" y="2240.4" textLength="353.8" clip-path="url(#breeze-prod-image-build-line-91)">Push image after building it.</text><text class="breeze-pr [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-92)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2264.8" textLength="268.4" clip-path="url(#breeze-prod-image-build-line-92)">--prepare-buildx-cache</text><text class="breeze-prod-image-build-r1" x="341.6" y="2264.8" textLength="1098" clip-path="url(#breeze-prod-image-build-line-92)">Prepares build cache (this is done [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-93)">│</text><text class="breeze-prod-image-build-r1" x="341.6" y="2289.2" textLength="1098" clip-path="url(#breeze-prod-image-build-line-93)">image).                                    [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2313.6" textLength="1464" clip-path="url(#breeze-prod-image-build-line-94)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="2313.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-94)">
-</text><text class="breeze-prod-image-build-r5" x="0" y="2338" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-95)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="2338" textLength="280.6" clip-path="url(#breeze-prod-image-build-line-95)"> Github authentication </text><text class="breeze-prod-image-build-r5" x="305" y="2338" textLength="1134.6" clip-path="url(#breeze-prod-image-build-line-95)">─────────────────────────────────────────────────── [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-96)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2362.4" textLength="231.8" clip-path="url(#breeze-prod-image-build-line-96)">--github-repository</text><text class="breeze-prod-image-build-r7" x="280.6" y="2362.4" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-96)">-g</text><text class="breeze-prod-image-build-r1" x="329.4" y="23 [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-97)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2386.8" textLength="170.8" clip-path="url(#breeze-prod-image-build-line-97)">--github-token</text><text class="breeze-prod-image-build-r1" x="329.4" y="2386.8" textLength="500.2" clip-path="url(#breeze-prod-image-build-line-97)">The token used to authenticate to GitHu [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2411.2" textLength="1464" clip-path="url(#breeze-prod-image-build-line-98)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="2411.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-98)">
-</text><text class="breeze-prod-image-build-r5" x="0" y="2435.6" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-99)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="2435.6" textLength="195.2" clip-path="url(#breeze-prod-image-build-line-99)"> Common options </text><text class="breeze-prod-image-build-r5" x="219.6" y="2435.6" textLength="1220" clip-path="url(#breeze-prod-image-build-line-99)">──────────────────────────────────────────────────── [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2460" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-100)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2460" textLength="97.6" clip-path="url(#breeze-prod-image-build-line-100)">--answer</text><text class="breeze-prod-image-build-r7" x="158.6" y="2460" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-100)">-a</text><text class="breeze-prod-image-build-r1" x="207.4" y="2460" textLength= [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2484.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-101)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2484.4" textLength="109.8" clip-path="url(#breeze-prod-image-build-line-101)">--dry-run</text><text class="breeze-prod-image-build-r7" x="158.6" y="2484.4" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-101)">-D</text><text class="breeze-prod-image-build-r1" x="207.4" y="2484.4" t [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2508.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-102)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2508.8" textLength="109.8" clip-path="url(#breeze-prod-image-build-line-102)">--verbose</text><text class="breeze-prod-image-build-r7" x="158.6" y="2508.8" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-102)">-v</text><text class="breeze-prod-image-build-r1" x="207.4" y="2508.8" t [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2533.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-103)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2533.2" textLength="73.2" clip-path="url(#breeze-prod-image-build-line-103)">--help</text><text class="breeze-prod-image-build-r7" x="158.6" y="2533.2" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-103)">-h</text><text class="breeze-prod-image-build-r1" x="207.4" y="2533.2" textL [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2557.6" textLength="1464" clip-path="url(#breeze-prod-image-build-line-104)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="2557.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-104)">
+</text><text class="breeze-prod-image-build-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-12)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="312.8" textLength="305" clip-path="url(#breeze-prod-image-build-line-12)">--install-airflow-version</text><text class="breeze-prod-image-build-r7" x="353.8" y="312.8" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-12)">-V</text><text class="breeze-prod-image-build-r1" x="402.6" y="3 [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-13)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="337.2" textLength="97.6" clip-path="url(#breeze-prod-image-build-line-13)">--python</text><text class="breeze-prod-image-build-r7" x="353.8" y="337.2" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-13)">-p</text><text class="breeze-prod-image-build-r1" x="402.6" y="337.2" textLength [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-14)">│</text><text class="breeze-prod-image-build-r6" x="402.6" y="361.6" textLength="732" clip-path="url(#breeze-prod-image-build-line-14)">(>3.9< | 3.10 | 3.11 | 3.12)                           [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-15)">│</text><text class="breeze-prod-image-build-r5" x="402.6" y="386" textLength="732" clip-path="url(#breeze-prod-image-build-line-15)">[default: 3.9]                                    [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-16)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="410.4" textLength="305" clip-path="url(#breeze-prod-image-build-line-16)">--version-suffix-for-pypi</text><text class="breeze-prod-image-build-r1" x="402.6" y="410.4" textLength="768.6" clip-path="url(#breeze-prod-image-build-line-16)">Version suffix used for PyPI packages& [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="434.8" textLength="1464" clip-path="url(#breeze-prod-image-build-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-17)">
+</text><text class="breeze-prod-image-build-r5" x="0" y="459.2" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-18)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="459.2" textLength="353.8" clip-path="url(#breeze-prod-image-build-line-18)"> Building images in parallel </text><text class="breeze-prod-image-build-r5" x="378.2" y="459.2" textLength="1061.4" clip-path="url(#breeze-prod-image-build-line-18)">────────────────────────────── [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-19)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="483.6" textLength="207.4" clip-path="url(#breeze-prod-image-build-line-19)">--run-in-parallel</text><text class="breeze-prod-image-build-r1" x="378.2" y="483.6" textLength="854" clip-path="url(#breeze-prod-image-build-line-19)">Run the operation in parallel on all  [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-20)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="508" textLength="158.6" clip-path="url(#breeze-prod-image-build-line-20)">--parallelism</text><text class="breeze-prod-image-build-r1" x="378.2" y="508" textLength="915" clip-path="url(#breeze-prod-image-build-line-20)">Maximum number of processes to use while runni [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-21)">│</text><text class="breeze-prod-image-build-r6" x="378.2" y="532.4" textLength="915" clip-path="url(#breeze-prod-image-build-line-21)">(INTEGER RANGE)                                   [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-22)">│</text><text class="breeze-prod-image-build-r5" x="378.2" y="556.8" textLength="915" clip-path="url(#breeze-prod-image-build-line-22)">[default: 4; 1<=x<=8]                               & [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-23)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="581.2" textLength="207.4" clip-path="url(#breeze-prod-image-build-line-23)">--python-versions</text><text class="breeze-prod-image-build-r1" x="378.2" y="581.2" textLength="951.6" clip-path="url(#breeze-prod-image-build-line-23)">Space separated list of python versions  [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-24)">│</text><text class="breeze-prod-image-build-r5" x="378.2" y="605.6" textLength="951.6" clip-path="url(#breeze-prod-image-build-line-24)">[default: 3.9 3.10 3.11 3.12]                              [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-25)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="630" textLength="170.8" clip-path="url(#breeze-prod-image-build-line-25)">--skip-cleanup</text><text class="breeze-prod-image-build-r1" x="378.2" y="630" textLength="732" clip-path="url(#breeze-prod-image-build-line-25)">Skip cleanup of temporary files created during [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-26)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="654.4" textLength="207.4" clip-path="url(#breeze-prod-image-build-line-26)">--debug-resources</text><text class="breeze-prod-image-build-r1" x="378.2" y="654.4" textLength="768.6" clip-path="url(#breeze-prod-image-build-line-26)">Whether to show resource information while&# [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-27)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="678.8" textLength="305" clip-path="url(#breeze-prod-image-build-line-27)">--include-success-outputs</text><text class="breeze-prod-image-build-r1" x="378.2" y="678.8" textLength="927.2" clip-path="url(#breeze-prod-image-build-line-27)">Whether to include outputs of successf [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="703.2" textLength="1464" clip-path="url(#breeze-prod-image-build-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-28)">
+</text><text class="breeze-prod-image-build-r5" x="0" y="727.6" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-29)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="727.6" textLength="512.4" clip-path="url(#breeze-prod-image-build-line-29)"> Advanced build options (for power users) </text><text class="breeze-prod-image-build-r5" x="536.8" y="727.6" textLength="902.8" clip-path="url(#breeze-prod-image-build-line-29)">──────── [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-30)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="752" textLength="366" clip-path="url(#breeze-prod-image-build-line-30)">--additional-pip-install-flags</text><text class="breeze-prod-image-build-r1" x="439.2" y="752" textLength="1000.4" clip-path="url(#breeze-prod-image-build-line-30)">Additional flags added to `pip install [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-31)">│</text><text class="breeze-prod-image-build-r1" x="439.2" y="776.4" textLength="1000.4" clip-path="url(#breeze-prod-image-build-line-31)">itself).                                    [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-32)">│</text><text class="breeze-prod-image-build-r6" x="439.2" y="800.8" textLength="1000.4" clip-path="url(#breeze-prod-image-build-line-32)">(TEXT)                                     [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-33)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="825.2" textLength="146.4" clip-path="url(#breeze-prod-image-build-line-33)">--commit-sha</text><text class="breeze-prod-image-build-r1" x="439.2" y="825.2" textLength="536.8" clip-path="url(#breeze-prod-image-build-line-33)">Commit SHA that is used to build the [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-34)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="849.6" textLength="195.2" clip-path="url(#breeze-prod-image-build-line-34)">--debian-version</text><text class="breeze-prod-image-build-r1" x="439.2" y="849.6" textLength="793" clip-path="url(#breeze-prod-image-build-line-34)">Debian version used in Airflow image as [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-35)">│</text><text class="breeze-prod-image-build-r5" x="439.2" y="874" textLength="793" clip-path="url(#breeze-prod-image-build-line-35)">[default: bookworm]                                   [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-36)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="898.4" textLength="170.8" clip-path="url(#breeze-prod-image-build-line-36)">--python-image</text><text class="breeze-prod-image-build-r1" x="439.2" y="898.4" textLength="1000.4" clip-path="url(#breeze-prod-image-build-line-36)">If specified this is the base python  [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-37)">│</text><text class="breeze-prod-image-build-r1" x="439.2" y="922.8" textLength="1000.4" clip-path="url(#breeze-prod-image-build-line-37)">something like: python:VERSION-slim-bookworm.                            [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-38)">│</text><text class="breeze-prod-image-build-r6" x="439.2" y="947.2" textLength="1000.4" clip-path="url(#breeze-prod-image-build-line-38)">(TEXT)                                     [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-39)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="971.6" textLength="97.6" clip-path="url(#breeze-prod-image-build-line-39)">--use-uv</text><text class="breeze-prod-image-build-r1" x="122" y="971.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-39)">/</text><text class="breeze-prod-image-build-r4" x="134.2" y="971.6" textLength="1 [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-40)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="996" textLength="207.4" clip-path="url(#breeze-prod-image-build-line-40)">--uv-http-timeout</text><text class="breeze-prod-image-build-r1" x="439.2" y="996" textLength="829.6" clip-path="url(#breeze-prod-image-build-line-40)">Timeout for requests that UV makes (only  [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-41)">│</text><text class="breeze-prod-image-build-r6" x="439.2" y="1020.4" textLength="829.6" clip-path="url(#breeze-prod-image-build-line-41)">(INTEGER RANGE)                                 &# [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-42)">│</text><text class="breeze-prod-image-build-r5" x="439.2" y="1044.8" textLength="829.6" clip-path="url(#breeze-prod-image-build-line-42)">[default: 300; x>=1]                               & [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1069.2" textLength="1464" clip-path="url(#breeze-prod-image-build-line-43)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="1069.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-43)">
+</text><text class="breeze-prod-image-build-r5" x="0" y="1093.6" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-44)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="1093.6" textLength="597.8" clip-path="url(#breeze-prod-image-build-line-44)"> Selecting constraint location (for power users) </text><text class="breeze-prod-image-build-r5" x="622.2" y="1093.6" textLength="817.4" clip-path="url(#breeze-prod-image-build-line-44) [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-45)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1118" textLength="366" clip-path="url(#breeze-prod-image-build-line-45)">--airflow-constraints-location</text><text class="breeze-prod-image-build-r1" x="451.4" y="1118" textLength="902.8" clip-path="url(#breeze-prod-image-build-line-45)">Location of airflow constraints to u [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-46)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1142.4" textLength="317.2" clip-path="url(#breeze-prod-image-build-line-46)">--airflow-constraints-mode</text><text class="breeze-prod-image-build-r1" x="451.4" y="1142.4" textLength="866.2" clip-path="url(#breeze-prod-image-build-line-46)">Mode of constraints for Airflow  [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-47)">│</text><text class="breeze-prod-image-build-r6" x="451.4" y="1166.8" textLength="866.2" clip-path="url(#breeze-prod-image-build-line-47)">(constraints | constraints-no-providers | constraints-source-providers)</text><text class="breeze-prod-image-build-r5" x="1451.8" y="1166.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-l [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-48)">│</text><text class="breeze-prod-image-build-r5" x="451.4" y="1191.2" textLength="866.2" clip-path="url(#breeze-prod-image-build-line-48)">[default: constraints]                                & [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-49)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1215.6" textLength="378.2" clip-path="url(#breeze-prod-image-build-line-49)">--airflow-constraints-reference</text><text class="breeze-prod-image-build-r1" x="451.4" y="1215.6" textLength="634.4" clip-path="url(#breeze-prod-image-build-line-49)">Constraint reference to use when [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1240" textLength="1464" clip-path="url(#breeze-prod-image-build-line-50)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="1240" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-50)">
+</text><text class="breeze-prod-image-build-r5" x="0" y="1264.4" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-51)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="1264.4" textLength="634.4" clip-path="url(#breeze-prod-image-build-line-51)"> Choosing dependencies and extras (for power users) </text><text class="breeze-prod-image-build-r5" x="658.8" y="1264.4" textLength="780.8" clip-path="url(#breeze-prod-image-build- [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-52)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1288.8" textLength="195.2" clip-path="url(#breeze-prod-image-build-line-52)">--airflow-extras</text><text class="breeze-prod-image-build-r1" x="463.6" y="1288.8" textLength="976" clip-path="url(#breeze-prod-image-build-line-52)">Extras to install by default.   &# [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-53)">│</text><text class="breeze-prod-image-build-r6" x="463.6" y="1313.2" textLength="976" clip-path="url(#breeze-prod-image-build-line-53)">(TEXT)                                     [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-54)">│</text><text class="breeze-prod-image-build-r5" x="463.6" y="1337.6" textLength="976" clip-path="url(#breeze-prod-image-build-line-54)">[default:                                    [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-55)">│</text><text class="breeze-prod-image-build-r5" x="463.6" y="1362" textLength="976" clip-path="url(#breeze-prod-image-build-line-55)">aiobotocore,amazon,async,celery,cncf-kubernetes,common-io,docker,elasticsearch,…</text><text class="breeze-prod-image-build-r5" x="1451.8" y="1362" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-55)">│</text><t [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-56)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1386.4" textLength="329.4" clip-path="url(#breeze-prod-image-build-line-56)">--additional-airflow-extras</text><text class="breeze-prod-image-build-r1" x="463.6" y="1386.4" textLength="768.6" clip-path="url(#breeze-prod-image-build-line-56)">Additional extra package while insta [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1410.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-57)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1410.8" textLength="292.8" clip-path="url(#breeze-prod-image-build-line-57)">--additional-python-deps</text><text class="breeze-prod-image-build-r1" x="463.6" y="1410.8" textLength="768.6" clip-path="url(#breeze-prod-image-build-line-57)">Additional python dependencies to use&# [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1435.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-58)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1435.2" textLength="170.8" clip-path="url(#breeze-prod-image-build-line-58)">--dev-apt-deps</text><text class="breeze-prod-image-build-r1" x="463.6" y="1435.2" textLength="646.6" clip-path="url(#breeze-prod-image-build-line-58)">Apt dev dependencies to use when buildi [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-59)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1459.6" textLength="305" clip-path="url(#breeze-prod-image-build-line-59)">--additional-dev-apt-deps</text><text class="breeze-prod-image-build-r1" x="463.6" y="1459.6" textLength="780.8" clip-path="url(#breeze-prod-image-build-line-59)">Additional apt dev dependencies to  [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-60)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1484" textLength="207.4" clip-path="url(#breeze-prod-image-build-line-60)">--dev-apt-command</text><text class="breeze-prod-image-build-r1" x="463.6" y="1484" textLength="622.2" clip-path="url(#breeze-prod-image-build-line-60)">Command executed before dev apt deps are&# [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-61)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1508.4" textLength="341.6" clip-path="url(#breeze-prod-image-build-line-61)">--additional-dev-apt-command</text><text class="breeze-prod-image-build-r1" x="463.6" y="1508.4" textLength="756.4" clip-path="url(#breeze-prod-image-build-line-61)">Additional command executed before  [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1532.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-62)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1532.8" textLength="292.8" clip-path="url(#breeze-prod-image-build-line-62)">--additional-dev-apt-env</text><text class="breeze-prod-image-build-r1" x="463.6" y="1532.8" textLength="805.2" clip-path="url(#breeze-prod-image-build-line-62)">Additional environment variables set wh [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1557.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-63)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1557.2" textLength="219.6" clip-path="url(#breeze-prod-image-build-line-63)">--runtime-apt-deps</text><text class="breeze-prod-image-build-r1" x="463.6" y="1557.2" textLength="695.4" clip-path="url(#breeze-prod-image-build-line-63)">Apt runtime dependencies to use when [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-64)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1581.6" textLength="353.8" clip-path="url(#breeze-prod-image-build-line-64)">--additional-runtime-apt-deps</text><text class="breeze-prod-image-build-r1" x="463.6" y="1581.6" textLength="829.6" clip-path="url(#breeze-prod-image-build-line-64)">Additional apt runtime dependencies [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1606" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-65)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1606" textLength="256.2" clip-path="url(#breeze-prod-image-build-line-65)">--runtime-apt-command</text><text class="breeze-prod-image-build-r1" x="463.6" y="1606" textLength="671" clip-path="url(#breeze-prod-image-build-line-65)">Command executed before runtime apt deps  [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1630.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-66)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1630.4" textLength="390.4" clip-path="url(#breeze-prod-image-build-line-66)">--additional-runtime-apt-command</text><text class="breeze-prod-image-build-r1" x="463.6" y="1630.4" textLength="805.2" clip-path="url(#breeze-prod-image-build-line-66)">Additional command executed before&# [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1654.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-67)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1654.8" textLength="341.6" clip-path="url(#breeze-prod-image-build-line-67)">--additional-runtime-apt-env</text><text class="breeze-prod-image-build-r1" x="463.6" y="1654.8" textLength="854" clip-path="url(#breeze-prod-image-build-line-67)">Additional environment variables set  [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1679.2" textLength="1464" clip-path="url(#breeze-prod-image-build-line-68)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="1679.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-68)">
+</text><text class="breeze-prod-image-build-r5" x="0" y="1703.6" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-69)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="1703.6" textLength="817.4" clip-path="url(#breeze-prod-image-build-line-69)"> Advanced customization options (for specific customization needs) </text><text class="breeze-prod-image-build-r5" x="841.8" y="1703.6" textLength="597.8" clip-path="url(#breeze-pr [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1728" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-70)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1728" textLength="256.2" clip-path="url(#breeze-prod-image-build-line-70)">--installation-method</text><text class="breeze-prod-image-build-r1" x="536.8" y="1728" textLength="463.6" clip-path="url(#breeze-prod-image-build-line-70)">Install Airflow from: sources or PyPI.</tex [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1752.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-71)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1752.4" textLength="329.4" clip-path="url(#breeze-prod-image-build-line-71)">--install-airflow-reference</text><text class="breeze-prod-image-build-r1" x="536.8" y="1752.4" textLength="524.6" clip-path="url(#breeze-prod-image-build-line-71)">Install Airflow using GitHub tag [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-72)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1776.8" textLength="378.2" clip-path="url(#breeze-prod-image-build-line-72)">--install-packages-from-context</text><text class="breeze-prod-image-build-r1" x="536.8" y="1776.8" textLength="902.8" clip-path="url(#breeze-prod-image-build-line-72)">Install wheels from local docker [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-73)">│</text><text class="breeze-prod-image-build-r1" x="536.8" y="1801.2" textLength="97.6" clip-path="url(#breeze-prod-image-build-line-73)">Implies </text><text class="breeze-prod-image-build-r4" x="634.4" y="1801.2" textLength="341.6" clip-path="url(#breeze-prod-image-build-line-73)">--disable-airflow-repo-cache</text><text class="breeze-prod-image-buil [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-74)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1825.6" textLength="329.4" clip-path="url(#breeze-prod-image-build-line-74)">--install-mysql-client-type</text><text class="breeze-prod-image-build-r1" x="536.8" y="1825.6" textLength="475.8" clip-path="url(#breeze-prod-image-build-line-74)">Which client to choose when ins [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-75)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1850" textLength="207.4" clip-path="url(#breeze-prod-image-build-line-75)">--cleanup-context</text><text class="breeze-prod-image-build-r1" x="536.8" y="1850" textLength="902.8" clip-path="url(#breeze-prod-image-build-line-75)">Clean up docker context files before runni [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-76)">│</text><text class="breeze-prod-image-build-r1" x="536.8" y="1874.4" textLength="170.8" clip-path="url(#breeze-prod-image-build-line-76)">together with </text><text class="breeze-prod-image-build-r4" x="707.6" y="1874.4" textLength="378.2" clip-path="url(#breeze-prod-image-build-line-76)">--install-packages-from-context</text><text class="breeze- [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-77)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1898.8" textLength="463.6" clip-path="url(#breeze-prod-image-build-line-77)">--use-constraints-for-context-packages</text><text class="breeze-prod-image-build-r1" x="536.8" y="1898.8" textLength="902.8" clip-path="url(#breeze-prod-image-build-line-77)">Uses constraints for context&# [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-78)">│</text><text class="breeze-prod-image-build-r1" x="536.8" y="1923.2" textLength="902.8" clip-path="url(#breeze-prod-image-build-line-78)">constraints store in docker-context-files or from github.                 </text><text class="breeze-prod [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-79)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1947.6" textLength="341.6" clip-path="url(#breeze-prod-image-build-line-79)">--disable-airflow-repo-cache</text><text class="breeze-prod-image-build-r1" x="536.8" y="1947.6" textLength="658.8" clip-path="url(#breeze-prod-image-build-line-79)">Disable cache from Airflow reposito [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-80)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1972" textLength="427" clip-path="url(#breeze-prod-image-build-line-80)">--disable-mysql-client-installation</text><text class="breeze-prod-image-build-r1" x="536.8" y="1972" textLength="341.6" clip-path="url(#breeze-prod-image-build-line-80)">Do not install MySQL client.</text>< [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-81)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1996.4" textLength="427" clip-path="url(#breeze-prod-image-build-line-81)">--disable-mssql-client-installation</text><text class="breeze-prod-image-build-r1" x="536.8" y="1996.4" textLength="341.6" clip-path="url(#breeze-prod-image-build-line-81)">Do not install MsSQl client.</ [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-82)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2020.8" textLength="463.6" clip-path="url(#breeze-prod-image-build-line-82)">--disable-postgres-client-installation</text><text class="breeze-prod-image-build-r1" x="536.8" y="2020.8" textLength="378.2" clip-path="url(#breeze-prod-image-build-line-82)">Do not install Postgres c [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2045.2" textLength="1464" clip-path="url(#breeze-prod-image-build-line-83)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="2045.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-83)">
+</text><text class="breeze-prod-image-build-r5" x="0" y="2069.6" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-84)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="2069.6" textLength="622.2" clip-path="url(#breeze-prod-image-build-line-84)"> Preparing cache and push (for maintainers and CI) </text><text class="breeze-prod-image-build-r5" x="646.6" y="2069.6" textLength="793" clip-path="url(#breeze-prod-image-buil [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-85)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2094" textLength="109.8" clip-path="url(#breeze-prod-image-build-line-85)">--builder</text><text class="breeze-prod-image-build-r1" x="341.6" y="2094" textLength="756.4" clip-path="url(#breeze-prod-image-build-line-85)">Buildx builder used to perform `docker buildx  [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-86)">│</text><text class="breeze-prod-image-build-r5" x="341.6" y="2118.4" textLength="756.4" clip-path="url(#breeze-prod-image-build-line-86)">[default: autodetect]                                &# [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-87)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2142.8" textLength="122" clip-path="url(#breeze-prod-image-build-line-87)">--platform</text><text class="breeze-prod-image-build-r1" x="341.6" y="2142.8" textLength="329.4" clip-path="url(#breeze-prod-image-build-line-87)">Platform for Airflow image.</text><text class="breeze-prod-i [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-88)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2167.2" textLength="73.2" clip-path="url(#breeze-prod-image-build-line-88)">--push</text><text class="breeze-prod-image-build-r1" x="341.6" y="2167.2" textLength="353.8" clip-path="url(#breeze-prod-image-build-line-88)">Push image after building it.</text><text class="breeze-pr [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-89)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2191.6" textLength="268.4" clip-path="url(#breeze-prod-image-build-line-89)">--prepare-buildx-cache</text><text class="breeze-prod-image-build-r1" x="341.6" y="2191.6" textLength="1098" clip-path="url(#breeze-prod-image-build-line-89)">Prepares build cache (this is done [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-90)">│</text><text class="breeze-prod-image-build-r1" x="341.6" y="2216" textLength="1098" clip-path="url(#breeze-prod-image-build-line-90)">image).                                    &# [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2240.4" textLength="1464" clip-path="url(#breeze-prod-image-build-line-91)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="2240.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-91)">
+</text><text class="breeze-prod-image-build-r5" x="0" y="2264.8" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-92)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="2264.8" textLength="280.6" clip-path="url(#breeze-prod-image-build-line-92)"> Github authentication </text><text class="breeze-prod-image-build-r5" x="305" y="2264.8" textLength="1134.6" clip-path="url(#breeze-prod-image-build-line-92)">───────────────────────────────────────────── [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-93)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2289.2" textLength="231.8" clip-path="url(#breeze-prod-image-build-line-93)">--github-repository</text><text class="breeze-prod-image-build-r7" x="280.6" y="2289.2" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-93)">-g</text><text class="breeze-prod-image-build-r1" x="329.4" y="22 [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-94)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2313.6" textLength="170.8" clip-path="url(#breeze-prod-image-build-line-94)">--github-token</text><text class="breeze-prod-image-build-r1" x="329.4" y="2313.6" textLength="500.2" clip-path="url(#breeze-prod-image-build-line-94)">The token used to authenticate to GitHu [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2338" textLength="1464" clip-path="url(#breeze-prod-image-build-line-95)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="2338" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-95)">
+</text><text class="breeze-prod-image-build-r5" x="0" y="2362.4" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-96)">â•─</text><text class="breeze-prod-image-build-r5" x="24.4" y="2362.4" textLength="195.2" clip-path="url(#breeze-prod-image-build-line-96)"> Common options </text><text class="breeze-prod-image-build-r5" x="219.6" y="2362.4" textLength="1220" clip-path="url(#breeze-prod-image-build-line-96)">──────────────────────────────────────────────────── [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-97)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2386.8" textLength="97.6" clip-path="url(#breeze-prod-image-build-line-97)">--answer</text><text class="breeze-prod-image-build-r7" x="158.6" y="2386.8" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-97)">-a</text><text class="breeze-prod-image-build-r1" x="207.4" y="2386.8" textLe [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2411.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-98)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2411.2" textLength="109.8" clip-path="url(#breeze-prod-image-build-line-98)">--dry-run</text><text class="breeze-prod-image-build-r7" x="158.6" y="2411.2" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-98)">-D</text><text class="breeze-prod-image-build-r1" x="207.4" y="2411.2" text [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2435.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-99)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2435.6" textLength="109.8" clip-path="url(#breeze-prod-image-build-line-99)">--verbose</text><text class="breeze-prod-image-build-r7" x="158.6" y="2435.6" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-99)">-v</text><text class="breeze-prod-image-build-r1" x="207.4" y="2435.6" text [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2460" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-100)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2460" textLength="73.2" clip-path="url(#breeze-prod-image-build-line-100)">--help</text><text class="breeze-prod-image-build-r7" x="158.6" y="2460" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-100)">-h</text><text class="breeze-prod-image-build-r1" x="207.4" y="2460" textLength="3 [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2484.4" textLength="1464" clip-path="url(#breeze-prod-image-build-line-101)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="2484.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-101)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_prod-image_build.txt b/dev/breeze/doc/images/output_prod-image_build.txt
index 406c08e61e2..3b29aa41b4f 100644
--- a/dev/breeze/doc/images/output_prod-image_build.txt
+++ b/dev/breeze/doc/images/output_prod-image_build.txt
@@ -1 +1 @@
-46a046cb3b7ba63753bbc61410d4d8d3
+7ae94b08487a2f3aa25324f0ca46967c
diff --git a/dev/breeze/doc/images/output_prod-image_load.svg b/dev/breeze/doc/images/output_prod-image_load.svg
new file mode 100644
index 00000000000..680ada8df9c
--- /dev/null
+++ b/dev/breeze/doc/images/output_prod-image_load.svg
@@ -0,0 +1,132 @@
+<svg class="rich-terminal" viewBox="0 0 1482 489.2" xmlns="http://www.w3.org/2000/svg">
+ <!-- Generated with Rich https://www.textualize.io -->
+ <style>
+
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Regular"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
+ font-style: normal;
+ font-weight: 400;
+ }
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Bold"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
+ font-style: bold;
+ font-weight: 700;
+ }
+
+ .breeze-prod-image-load-matrix {
+ font-family: Fira Code, monospace;
+ font-size: 20px;
+ line-height: 24.4px;
+ font-variant-east-asian: full-width;
+ }
+
+ .breeze-prod-image-load-title {
+ font-size: 18px;
+ font-weight: bold;
+ font-family: arial;
+ }
+
+ .breeze-prod-image-load-r1 { fill: #c5c8c6 }
+.breeze-prod-image-load-r2 { fill: #d0b344 }
+.breeze-prod-image-load-r3 { fill: #c5c8c6;font-weight: bold }
+.breeze-prod-image-load-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-prod-image-load-r5 { fill: #868887 }
+.breeze-prod-image-load-r6 { fill: #98a84b;font-weight: bold }
+.breeze-prod-image-load-r7 { fill: #8d7b39 }
+ </style>
+
+ <defs>
+ <clipPath id="breeze-prod-image-load-clip-terminal">
+ <rect x="0" y="0" width="1463.0" height="438.2" />
+ </clipPath>
+ <clipPath id="breeze-prod-image-load-line-0">
+ <rect x="0" y="1.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-1">
+ <rect x="0" y="25.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-2">
+ <rect x="0" y="50.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-3">
+ <rect x="0" y="74.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-4">
+ <rect x="0" y="99.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-5">
+ <rect x="0" y="123.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-6">
+ <rect x="0" y="147.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-7">
+ <rect x="0" y="172.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-8">
+ <rect x="0" y="196.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-9">
+ <rect x="0" y="221.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-10">
+ <rect x="0" y="245.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-11">
+ <rect x="0" y="269.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-12">
+ <rect x="0" y="294.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-13">
+ <rect x="0" y="318.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-14">
+ <rect x="0" y="343.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-15">
+ <rect x="0" y="367.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-load-line-16">
+ <rect x="0" y="391.9" 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="487.2" rx="8"/><text class="breeze-prod-image-load-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: prod-image load</text>
+ <g transform="translate(26,22)">
+ <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
+ <circle cx="22" cy="0" r="7" fill="#febc2e"/>
+ <circle cx="44" cy="0" r="7" fill="#28c840"/>
+ </g>
+
+ <g transform="translate(9, 41)" clip-path="url(#breeze-prod-image-load-clip-terminal)">
+
+ <g class="breeze-prod-image-load-matrix">
+ <text class="breeze-prod-image-load-r1" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-0)">
+</text><text class="breeze-prod-image-load-r2" x="12.2" y="44.4" textLength="73.2" clip-path="url(#breeze-prod-image-load-line-1)">Usage:</text><text class="breeze-prod-image-load-r3" x="97.6" y="44.4" textLength="268.4" clip-path="url(#breeze-prod-image-load-line-1)">breeze prod-image load</text><text class="breeze-prod-image-load-r1" x="378.2" y="44.4" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-1)">[</text><text class="breeze-prod-image-load-r4" x="390.4" y [...]
+</text><text class="breeze-prod-image-load-r1" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-2)">
+</text><text class="breeze-prod-image-load-r1" x="12.2" y="93.2" textLength="341.6" clip-path="url(#breeze-prod-image-load-line-3)">Load PROD image from a file.</text><text class="breeze-prod-image-load-r1" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-3)">
+</text><text class="breeze-prod-image-load-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-4)">
+</text><text class="breeze-prod-image-load-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-prod-image-load-line-5)">â•─</text><text class="breeze-prod-image-load-r5" x="24.4" y="142" textLength="219.6" clip-path="url(#breeze-prod-image-load-line-5)"> Load image flags </text><text class="breeze-prod-image-load-r5" x="244" y="142" textLength="1195.6" clip-path="url(#breeze-prod-image-load-line-5)">─────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-prod-image-load-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-6)">│</text><text class="breeze-prod-image-load-r4" x="24.4" y="166.4" textLength="97.6" clip-path="url(#breeze-prod-image-load-line-6)">--python</text><text class="breeze-prod-image-load-r6" x="366" y="166.4" textLength="24.4" clip-path="url(#breeze-prod-image-load-line-6)">-p</text><text class="breeze-prod-image-load-r1" x="414.8" y="166.4" textLength="732" clip- [...]
+</text><text class="breeze-prod-image-load-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-7)">│</text><text class="breeze-prod-image-load-r7" x="414.8" y="190.8" textLength="732" clip-path="url(#breeze-prod-image-load-line-7)">(>3.9< | 3.10 | 3.11 | 3.12)                            [...]
+</text><text class="breeze-prod-image-load-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-8)">│</text><text class="breeze-prod-image-load-r5" x="414.8" y="215.2" textLength="732" clip-path="url(#breeze-prod-image-load-line-8)">[default: 3.9]                                   & [...]
+</text><text class="breeze-prod-image-load-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-9)">│</text><text class="breeze-prod-image-load-r4" x="24.4" y="239.6" textLength="122" clip-path="url(#breeze-prod-image-load-line-9)">--platform</text><text class="breeze-prod-image-load-r1" x="414.8" y="239.6" textLength="329.4" clip-path="url(#breeze-prod-image-load-line-9)">Platform for Airflow image.</text><text class="breeze-prod-image-load-r7 [...]
+</text><text class="breeze-prod-image-load-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-10)">│</text><text class="breeze-prod-image-load-r4" x="24.4" y="264" textLength="146.4" clip-path="url(#breeze-prod-image-load-line-10)">--image-file</text><text class="breeze-prod-image-load-r1" x="414.8" y="264" textLength="427" clip-path="url(#breeze-prod-image-load-line-10)">Optional file to save the image to.</text><text class="bre [...]
+</text><text class="breeze-prod-image-load-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-11)">│</text><text class="breeze-prod-image-load-r4" x="24.4" y="288.4" textLength="317.2" clip-path="url(#breeze-prod-image-load-line-11)">--skip-image-file-deletion</text><text class="breeze-prod-image-load-r1" x="414.8" y="288.4" textLength="414.8" clip-path="url(#breeze-prod-image-load-line-11)">Skip image deletion after loading.</text><text [...]
+</text><text class="breeze-prod-image-load-r5" x="0" y="312.8" textLength="1464" clip-path="url(#breeze-prod-image-load-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-load-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-12)">
+</text><text class="breeze-prod-image-load-r5" x="0" y="337.2" textLength="24.4" clip-path="url(#breeze-prod-image-load-line-13)">â•─</text><text class="breeze-prod-image-load-r5" x="24.4" y="337.2" textLength="195.2" clip-path="url(#breeze-prod-image-load-line-13)"> Common options </text><text class="breeze-prod-image-load-r5" x="219.6" y="337.2" textLength="1220" clip-path="url(#breeze-prod-image-load-line-13)">───────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-prod-image-load-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-14)">│</text><text class="breeze-prod-image-load-r4" x="24.4" y="361.6" textLength="109.8" clip-path="url(#breeze-prod-image-load-line-14)">--verbose</text><text class="breeze-prod-image-load-r6" x="158.6" y="361.6" textLength="24.4" clip-path="url(#breeze-prod-image-load-line-14)">-v</text><text class="breeze-prod-image-load-r1" x="207.4" y="361.6" textLength="585 [...]
+</text><text class="breeze-prod-image-load-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-15)">│</text><text class="breeze-prod-image-load-r4" x="24.4" y="386" textLength="109.8" clip-path="url(#breeze-prod-image-load-line-15)">--dry-run</text><text class="breeze-prod-image-load-r6" x="158.6" y="386" textLength="24.4" clip-path="url(#breeze-prod-image-load-line-15)">-D</text><text class="breeze-prod-image-load-r1" x="207.4" y="386" textLength="719.8" clip [...]
+</text><text class="breeze-prod-image-load-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-16)">│</text><text class="breeze-prod-image-load-r4" x="24.4" y="410.4" textLength="73.2" clip-path="url(#breeze-prod-image-load-line-16)">--help</text><text class="breeze-prod-image-load-r6" x="158.6" y="410.4" textLength="24.4" clip-path="url(#breeze-prod-image-load-line-16)">-h</text><text class="breeze-prod-image-load-r1" x="207.4" y="410.4" textLength="329.4" [...]
+</text><text class="breeze-prod-image-load-r5" x="0" y="434.8" textLength="1464" clip-path="url(#breeze-prod-image-load-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-load-r1" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-prod-image-load-line-17)">
+</text>
+ </g>
+ </g>
+</svg>
diff --git a/dev/breeze/doc/images/output_prod-image_load.txt b/dev/breeze/doc/images/output_prod-image_load.txt
new file mode 100644
index 00000000000..973697202b0
--- /dev/null
+++ b/dev/breeze/doc/images/output_prod-image_load.txt
@@ -0,0 +1 @@
+97cb62e20186843f91556c936863a7af
diff --git a/dev/breeze/doc/images/output_prod-image_pull.svg b/dev/breeze/doc/images/output_prod-image_pull.svg
index ef55df1638d..1b2bce6d549 100644
--- a/dev/breeze/doc/images/output_prod-image_pull.svg
+++ b/dev/breeze/doc/images/output_prod-image_pull.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 879.5999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 806.4" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-prod-image-pull-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="828.5999999999999" />
+ <rect x="0" y="0" width="1463.0" height="755.4" />
</clipPath>
<clipPath id="breeze-prod-image-pull-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -135,18 +135,9 @@
<clipPath id="breeze-prod-image-pull-line-29">
<rect x="0" y="709.1" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-prod-image-pull-line-30">
- <rect x="0" y="733.5" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-prod-image-pull-line-31">
- <rect x="0" y="757.9" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-prod-image-pull-line-32">
- <rect x="0" y="782.3" 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="877.6" rx="8"/><text class="breeze-prod-image-pull-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: prod-image pull</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="804.4" rx="8"/><text class="breeze-prod-image-pull-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: prod-image pull</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -162,34 +153,31 @@
</text><text class="breeze-prod-image-pull-r1" x="12.2" y="93.2" textLength="1122.4" clip-path="url(#breeze-prod-image-pull-line-3)">Pull and optionally verify Production images - possibly in parallel for all Python versions.</text><text class="breeze-prod-image-pull-r1" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-3)">
</text><text class="breeze-prod-image-pull-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-4)">
</text><text class="breeze-prod-image-pull-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-5)">â•─</text><text class="breeze-prod-image-pull-r5" x="24.4" y="142" textLength="219.6" clip-path="url(#breeze-prod-image-pull-line-5)"> Pull image flags </text><text class="breeze-prod-image-pull-r5" x="244" y="142" textLength="1195.6" clip-path="url(#breeze-prod-image-pull-line-5)">─────────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-6)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="166.4" textLength="134.2" clip-path="url(#breeze-prod-image-pull-line-6)">--image-tag</text><text class="breeze-prod-image-pull-r6" x="244" y="166.4" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-6)">-t</text><text class="breeze-prod-image-pull-r1" x="292.8" y="166.4" textLength="597.8" [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-7)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="190.8" textLength="97.6" clip-path="url(#breeze-prod-image-pull-line-7)">--python</text><text class="breeze-prod-image-pull-r6" x="244" y="190.8" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-7)">-p</text><text class="breeze-prod-image-pull-r1" x="292.8" y="190.8" textLength="732" clip- [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-8)">│</text><text class="breeze-prod-image-pull-r5" x="292.8" y="215.2" textLength="732" clip-path="url(#breeze-prod-image-pull-line-8)">[default: 3.9]                                   & [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-9)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="239.6" textLength="97.6" clip-path="url(#breeze-prod-image-pull-line-9)">--verify</text><text class="breeze-prod-image-pull-r1" x="292.8" y="239.6" textLength="158.6" clip-path="url(#breeze-prod-image-pull-line-9)">Verify image.</text><text class="breeze-prod-image-pull-r5" x="1451.8" y="239.6" te [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-10)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="264" textLength="195.2" clip-path="url(#breeze-prod-image-pull-line-10)">--wait-for-image</text><text class="breeze-prod-image-pull-r1" x="292.8" y="264" textLength="366" clip-path="url(#breeze-prod-image-pull-line-10)">Wait until image is available.</text><text class="breeze-prod-im [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-11)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="288.4" textLength="183" clip-path="url(#breeze-prod-image-pull-line-11)">--tag-as-latest</text><text class="breeze-prod-image-pull-r1" x="292.8" y="288.4" textLength="1146.8" clip-path="url(#breeze-prod-image-pull-line-11)">Tags the image as latest and update checksu [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-12)">│</text><text class="breeze-prod-image-pull-r1" x="292.8" y="312.8" textLength="231.8" clip-path="url(#breeze-prod-image-pull-line-12)">or pull image with </text><text class="breeze-prod-image-pull-r4" x="524.6" y="312.8" textLength="134.2" clip-path="url(#breeze-prod-image-pull-line-12)">--image-tag</text><text class="breeze-prod-image-pul [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="337.2" textLength="1464" clip-path="url(#breeze-prod-image-pull-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-pull-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-13)">
-</text><text class="breeze-prod-image-pull-r5" x="0" y="361.6" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-14)">â•─</text><text class="breeze-prod-image-pull-r5" x="24.4" y="361.6" textLength="219.6" clip-path="url(#breeze-prod-image-pull-line-14)"> Parallel running </text><text class="breeze-prod-image-pull-r5" x="244" y="361.6" textLength="1195.6" clip-path="url(#breeze-prod-image-pull-line-14)">─────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-15)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="386" textLength="207.4" clip-path="url(#breeze-prod-image-pull-line-15)">--run-in-parallel</text><text class="breeze-prod-image-pull-r1" x="378.2" y="386" textLength="854" clip-path="url(#breeze-prod-image-pull-line-15)">Run the operation in parallel on all or sel [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-16)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="410.4" textLength="158.6" clip-path="url(#breeze-prod-image-pull-line-16)">--parallelism</text><text class="breeze-prod-image-pull-r1" x="378.2" y="410.4" textLength="915" clip-path="url(#breeze-prod-image-pull-line-16)">Maximum number of processes to use while runni [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-17)">│</text><text class="breeze-prod-image-pull-r7" x="378.2" y="434.8" textLength="915" clip-path="url(#breeze-prod-image-pull-line-17)">(INTEGER RANGE)                                   [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-18)">│</text><text class="breeze-prod-image-pull-r5" x="378.2" y="459.2" textLength="915" clip-path="url(#breeze-prod-image-pull-line-18)">[default: 4; 1<=x<=8]                                 [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-19)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="483.6" textLength="207.4" clip-path="url(#breeze-prod-image-pull-line-19)">--python-versions</text><text class="breeze-prod-image-pull-r1" x="378.2" y="483.6" textLength="951.6" clip-path="url(#breeze-prod-image-pull-line-19)">Space separated list of python versions used& [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-20)">│</text><text class="breeze-prod-image-pull-r5" x="378.2" y="508" textLength="951.6" clip-path="url(#breeze-prod-image-pull-line-20)">[default: 3.9 3.10 3.11 3.12]                              & [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-21)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="532.4" textLength="170.8" clip-path="url(#breeze-prod-image-pull-line-21)">--skip-cleanup</text><text class="breeze-prod-image-pull-r1" x="378.2" y="532.4" textLength="732" clip-path="url(#breeze-prod-image-pull-line-21)">Skip cleanup of temporary files created during [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-22)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="556.8" textLength="207.4" clip-path="url(#breeze-prod-image-pull-line-22)">--debug-resources</text><text class="breeze-prod-image-pull-r1" x="378.2" y="556.8" textLength="768.6" clip-path="url(#breeze-prod-image-pull-line-22)">Whether to show resource information while ru [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-23)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="581.2" textLength="305" clip-path="url(#breeze-prod-image-pull-line-23)">--include-success-outputs</text><text class="breeze-prod-image-pull-r1" x="378.2" y="581.2" textLength="927.2" clip-path="url(#breeze-prod-image-pull-line-23)">Whether to include outputs of successful [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="605.6" textLength="1464" clip-path="url(#breeze-prod-image-pull-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-pull-r1" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-24)">
-</text><text class="breeze-prod-image-pull-r5" x="0" y="630" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-25)">â•─</text><text class="breeze-prod-image-pull-r5" x="24.4" y="630" textLength="280.6" clip-path="url(#breeze-prod-image-pull-line-25)"> Github authentication </text><text class="breeze-prod-image-pull-r5" x="305" y="630" textLength="1134.6" clip-path="url(#breeze-prod-image-pull-line-25)">──────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-26)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="654.4" textLength="231.8" clip-path="url(#breeze-prod-image-pull-line-26)">--github-repository</text><text class="breeze-prod-image-pull-r6" x="280.6" y="654.4" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-26)">-g</text><text class="breeze-prod-image-pull-r1" x="329.4" y="654.4" textL [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-27)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="678.8" textLength="170.8" clip-path="url(#breeze-prod-image-pull-line-27)">--github-token</text><text class="breeze-prod-image-pull-r1" x="329.4" y="678.8" textLength="500.2" clip-path="url(#breeze-prod-image-pull-line-27)">The token used to authenticate to GitHub.</text> [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="703.2" textLength="1464" clip-path="url(#breeze-prod-image-pull-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-pull-r1" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-28)">
-</text><text class="breeze-prod-image-pull-r5" x="0" y="727.6" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-29)">â•─</text><text class="breeze-prod-image-pull-r5" x="24.4" y="727.6" textLength="195.2" clip-path="url(#breeze-prod-image-pull-line-29)"> Common options </text><text class="breeze-prod-image-pull-r5" x="219.6" y="727.6" textLength="1220" clip-path="url(#breeze-prod-image-pull-line-29)">───────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-30)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="752" textLength="109.8" clip-path="url(#breeze-prod-image-pull-line-30)">--verbose</text><text class="breeze-prod-image-pull-r6" x="158.6" y="752" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-30)">-v</text><text class="breeze-prod-image-pull-r1" x="207.4" y="752" textLength="585.6" clip [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-31)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="776.4" textLength="109.8" clip-path="url(#breeze-prod-image-pull-line-31)">--dry-run</text><text class="breeze-prod-image-pull-r6" x="158.6" y="776.4" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-31)">-D</text><text class="breeze-prod-image-pull-r1" x="207.4" y="776.4" textLength="719 [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-32)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="800.8" textLength="73.2" clip-path="url(#breeze-prod-image-pull-line-32)">--help</text><text class="breeze-prod-image-pull-r6" x="158.6" y="800.8" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-32)">-h</text><text class="breeze-prod-image-pull-r1" x="207.4" y="800.8" textLength="329.4" [...]
-</text><text class="breeze-prod-image-pull-r5" x="0" y="825.2" textLength="1464" clip-path="url(#breeze-prod-image-pull-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-pull-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-33)">
+</text><text class="breeze-prod-image-pull-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-6)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="166.4" textLength="97.6" clip-path="url(#breeze-prod-image-pull-line-6)">--python</text><text class="breeze-prod-image-pull-r6" x="244" y="166.4" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-6)">-p</text><text class="breeze-prod-image-pull-r1" x="292.8" y="166.4" textLength="732" clip- [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-7)">│</text><text class="breeze-prod-image-pull-r5" x="292.8" y="190.8" textLength="732" clip-path="url(#breeze-prod-image-pull-line-7)">[default: 3.9]                                   & [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-8)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="215.2" textLength="97.6" clip-path="url(#breeze-prod-image-pull-line-8)">--verify</text><text class="breeze-prod-image-pull-r1" x="292.8" y="215.2" textLength="158.6" clip-path="url(#breeze-prod-image-pull-line-8)">Verify image.</text><text class="breeze-prod-image-pull-r5" x="1451.8" y="215.2" te [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-9)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="239.6" textLength="195.2" clip-path="url(#breeze-prod-image-pull-line-9)">--wait-for-image</text><text class="breeze-prod-image-pull-r1" x="292.8" y="239.6" textLength="366" clip-path="url(#breeze-prod-image-pull-line-9)">Wait until image is available.</text><text class="breeze-prod [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="264" textLength="1464" clip-path="url(#breeze-prod-image-pull-line-10)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-pull-r1" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-10)">
+</text><text class="breeze-prod-image-pull-r5" x="0" y="288.4" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-11)">â•─</text><text class="breeze-prod-image-pull-r5" x="24.4" y="288.4" textLength="219.6" clip-path="url(#breeze-prod-image-pull-line-11)"> Parallel running </text><text class="breeze-prod-image-pull-r5" x="244" y="288.4" textLength="1195.6" clip-path="url(#breeze-prod-image-pull-line-11)">─────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-12)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="312.8" textLength="207.4" clip-path="url(#breeze-prod-image-pull-line-12)">--run-in-parallel</text><text class="breeze-prod-image-pull-r1" x="378.2" y="312.8" textLength="854" clip-path="url(#breeze-prod-image-pull-line-12)">Run the operation in parallel on all or [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-13)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="337.2" textLength="158.6" clip-path="url(#breeze-prod-image-pull-line-13)">--parallelism</text><text class="breeze-prod-image-pull-r1" x="378.2" y="337.2" textLength="915" clip-path="url(#breeze-prod-image-pull-line-13)">Maximum number of processes to use while runni [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-14)">│</text><text class="breeze-prod-image-pull-r7" x="378.2" y="361.6" textLength="915" clip-path="url(#breeze-prod-image-pull-line-14)">(INTEGER RANGE)                                   [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-15)">│</text><text class="breeze-prod-image-pull-r5" x="378.2" y="386" textLength="915" clip-path="url(#breeze-prod-image-pull-line-15)">[default: 4; 1<=x<=8]                                 [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-16)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="410.4" textLength="207.4" clip-path="url(#breeze-prod-image-pull-line-16)">--python-versions</text><text class="breeze-prod-image-pull-r1" x="378.2" y="410.4" textLength="951.6" clip-path="url(#breeze-prod-image-pull-line-16)">Space separated list of python versions used& [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-17)">│</text><text class="breeze-prod-image-pull-r5" x="378.2" y="434.8" textLength="951.6" clip-path="url(#breeze-prod-image-pull-line-17)">[default: 3.9 3.10 3.11 3.12]                              [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-18)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="459.2" textLength="170.8" clip-path="url(#breeze-prod-image-pull-line-18)">--skip-cleanup</text><text class="breeze-prod-image-pull-r1" x="378.2" y="459.2" textLength="732" clip-path="url(#breeze-prod-image-pull-line-18)">Skip cleanup of temporary files created during [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-19)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="483.6" textLength="207.4" clip-path="url(#breeze-prod-image-pull-line-19)">--debug-resources</text><text class="breeze-prod-image-pull-r1" x="378.2" y="483.6" textLength="768.6" clip-path="url(#breeze-prod-image-pull-line-19)">Whether to show resource information while ru [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-20)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="508" textLength="305" clip-path="url(#breeze-prod-image-pull-line-20)">--include-success-outputs</text><text class="breeze-prod-image-pull-r1" x="378.2" y="508" textLength="927.2" clip-path="url(#breeze-prod-image-pull-line-20)">Whether to include outputs of successful para [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="532.4" textLength="1464" clip-path="url(#breeze-prod-image-pull-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-pull-r1" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-21)">
+</text><text class="breeze-prod-image-pull-r5" x="0" y="556.8" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-22)">â•─</text><text class="breeze-prod-image-pull-r5" x="24.4" y="556.8" textLength="280.6" clip-path="url(#breeze-prod-image-pull-line-22)"> Github authentication </text><text class="breeze-prod-image-pull-r5" x="305" y="556.8" textLength="1134.6" clip-path="url(#breeze-prod-image-pull-line-22)">────────────────────────────────────────────────────── [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-23)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="581.2" textLength="231.8" clip-path="url(#breeze-prod-image-pull-line-23)">--github-repository</text><text class="breeze-prod-image-pull-r6" x="280.6" y="581.2" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-23)">-g</text><text class="breeze-prod-image-pull-r1" x="329.4" y="581.2" textL [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-24)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="605.6" textLength="170.8" clip-path="url(#breeze-prod-image-pull-line-24)">--github-token</text><text class="breeze-prod-image-pull-r1" x="329.4" y="605.6" textLength="500.2" clip-path="url(#breeze-prod-image-pull-line-24)">The token used to authenticate to GitHub.</text> [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="630" textLength="1464" clip-path="url(#breeze-prod-image-pull-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-pull-r1" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-25)">
+</text><text class="breeze-prod-image-pull-r5" x="0" y="654.4" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-26)">â•─</text><text class="breeze-prod-image-pull-r5" x="24.4" y="654.4" textLength="195.2" clip-path="url(#breeze-prod-image-pull-line-26)"> Common options </text><text class="breeze-prod-image-pull-r5" x="219.6" y="654.4" textLength="1220" clip-path="url(#breeze-prod-image-pull-line-26)">───────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-27)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="678.8" textLength="109.8" clip-path="url(#breeze-prod-image-pull-line-27)">--verbose</text><text class="breeze-prod-image-pull-r6" x="158.6" y="678.8" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-27)">-v</text><text class="breeze-prod-image-pull-r1" x="207.4" y="678.8" textLength="585 [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-28)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="703.2" textLength="109.8" clip-path="url(#breeze-prod-image-pull-line-28)">--dry-run</text><text class="breeze-prod-image-pull-r6" x="158.6" y="703.2" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-28)">-D</text><text class="breeze-prod-image-pull-r1" x="207.4" y="703.2" textLength="719 [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-29)">│</text><text class="breeze-prod-image-pull-r4" x="24.4" y="727.6" textLength="73.2" clip-path="url(#breeze-prod-image-pull-line-29)">--help</text><text class="breeze-prod-image-pull-r6" x="158.6" y="727.6" textLength="24.4" clip-path="url(#breeze-prod-image-pull-line-29)">-h</text><text class="breeze-prod-image-pull-r1" x="207.4" y="727.6" textLength="329.4" [...]
+</text><text class="breeze-prod-image-pull-r5" x="0" y="752" textLength="1464" clip-path="url(#breeze-prod-image-pull-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-pull-r1" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-prod-image-pull-line-30)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_prod-image_pull.txt b/dev/breeze/doc/images/output_prod-image_pull.txt
index 3fd11c7ba2c..fc54d16f7e3 100644
--- a/dev/breeze/doc/images/output_prod-image_pull.txt
+++ b/dev/breeze/doc/images/output_prod-image_pull.txt
@@ -1 +1 @@
-55b7b67b36baabc8067c3453549bde75
+fdd81a60f74d022da26c934db6abcced
diff --git a/dev/breeze/doc/images/output_prod-image_save.svg b/dev/breeze/doc/images/output_prod-image_save.svg
new file mode 100644
index 00000000000..22a02dcc04f
--- /dev/null
+++ b/dev/breeze/doc/images/output_prod-image_save.svg
@@ -0,0 +1,128 @@
+<svg class="rich-terminal" viewBox="0 0 1482 464.79999999999995" xmlns="http://www.w3.org/2000/svg">
+ <!-- Generated with Rich https://www.textualize.io -->
+ <style>
+
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Regular"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
+ font-style: normal;
+ font-weight: 400;
+ }
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Bold"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
+ font-style: bold;
+ font-weight: 700;
+ }
+
+ .breeze-prod-image-save-matrix {
+ font-family: Fira Code, monospace;
+ font-size: 20px;
+ line-height: 24.4px;
+ font-variant-east-asian: full-width;
+ }
+
+ .breeze-prod-image-save-title {
+ font-size: 18px;
+ font-weight: bold;
+ font-family: arial;
+ }
+
+ .breeze-prod-image-save-r1 { fill: #c5c8c6 }
+.breeze-prod-image-save-r2 { fill: #d0b344 }
+.breeze-prod-image-save-r3 { fill: #c5c8c6;font-weight: bold }
+.breeze-prod-image-save-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-prod-image-save-r5 { fill: #868887 }
+.breeze-prod-image-save-r6 { fill: #98a84b;font-weight: bold }
+.breeze-prod-image-save-r7 { fill: #8d7b39 }
+ </style>
+
+ <defs>
+ <clipPath id="breeze-prod-image-save-clip-terminal">
+ <rect x="0" y="0" width="1463.0" height="413.79999999999995" />
+ </clipPath>
+ <clipPath id="breeze-prod-image-save-line-0">
+ <rect x="0" y="1.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-save-line-1">
+ <rect x="0" y="25.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-save-line-2">
+ <rect x="0" y="50.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-save-line-3">
+ <rect x="0" y="74.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-save-line-4">
+ <rect x="0" y="99.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-save-line-5">
+ <rect x="0" y="123.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-save-line-6">
+ <rect x="0" y="147.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-save-line-7">
+ <rect x="0" y="172.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-save-line-8">
+ <rect x="0" y="196.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-save-line-9">
+ <rect x="0" y="221.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-save-line-10">
+ <rect x="0" y="245.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-save-line-11">
+ <rect x="0" y="269.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-save-line-12">
+ <rect x="0" y="294.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-save-line-13">
+ <rect x="0" y="318.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-save-line-14">
+ <rect x="0" y="343.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-prod-image-save-line-15">
+ <rect x="0" y="367.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="462.8" rx="8"/><text class="breeze-prod-image-save-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: prod-image save</text>
+ <g transform="translate(26,22)">
+ <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
+ <circle cx="22" cy="0" r="7" fill="#febc2e"/>
+ <circle cx="44" cy="0" r="7" fill="#28c840"/>
+ </g>
+
+ <g transform="translate(9, 41)" clip-path="url(#breeze-prod-image-save-clip-terminal)">
+
+ <g class="breeze-prod-image-save-matrix">
+ <text class="breeze-prod-image-save-r1" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-prod-image-save-line-0)">
+</text><text class="breeze-prod-image-save-r2" x="12.2" y="44.4" textLength="73.2" clip-path="url(#breeze-prod-image-save-line-1)">Usage:</text><text class="breeze-prod-image-save-r3" x="97.6" y="44.4" textLength="268.4" clip-path="url(#breeze-prod-image-save-line-1)">breeze prod-image save</text><text class="breeze-prod-image-save-r1" x="378.2" y="44.4" textLength="12.2" clip-path="url(#breeze-prod-image-save-line-1)">[</text><text class="breeze-prod-image-save-r4" x="390.4" y [...]
+</text><text class="breeze-prod-image-save-r1" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-prod-image-save-line-2)">
+</text><text class="breeze-prod-image-save-r1" x="12.2" y="93.2" textLength="317.2" clip-path="url(#breeze-prod-image-save-line-3)">Save PROD image to a file.</text><text class="breeze-prod-image-save-r1" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-prod-image-save-line-3)">
+</text><text class="breeze-prod-image-save-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-prod-image-save-line-4)">
+</text><text class="breeze-prod-image-save-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-prod-image-save-line-5)">â•─</text><text class="breeze-prod-image-save-r5" x="24.4" y="142" textLength="219.6" clip-path="url(#breeze-prod-image-save-line-5)"> Save image flags </text><text class="breeze-prod-image-save-r5" x="244" y="142" textLength="1195.6" clip-path="url(#breeze-prod-image-save-line-5)">─────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-prod-image-save-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-prod-image-save-line-6)">│</text><text class="breeze-prod-image-save-r4" x="24.4" y="166.4" textLength="97.6" clip-path="url(#breeze-prod-image-save-line-6)">--python</text><text class="breeze-prod-image-save-r6" x="280.6" y="166.4" textLength="24.4" clip-path="url(#breeze-prod-image-save-line-6)">-p</text><text class="breeze-prod-image-save-r1" x="329.4" y="166.4" textLength="732" cli [...]
+</text><text class="breeze-prod-image-save-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-prod-image-save-line-7)">│</text><text class="breeze-prod-image-save-r5" x="329.4" y="190.8" textLength="732" clip-path="url(#breeze-prod-image-save-line-7)">[default: 3.9]                                   & [...]
+</text><text class="breeze-prod-image-save-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-prod-image-save-line-8)">│</text><text class="breeze-prod-image-save-r4" x="24.4" y="215.2" textLength="122" clip-path="url(#breeze-prod-image-save-line-8)">--platform</text><text class="breeze-prod-image-save-r1" x="329.4" y="215.2" textLength="329.4" clip-path="url(#breeze-prod-image-save-line-8)">Platform for Airflow image.</text><text class="breeze-prod-image-save-r7 [...]
+</text><text class="breeze-prod-image-save-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-prod-image-save-line-9)">│</text><text class="breeze-prod-image-save-r4" x="24.4" y="239.6" textLength="231.8" clip-path="url(#breeze-prod-image-save-line-9)">--github-repository</text><text class="breeze-prod-image-save-r6" x="280.6" y="239.6" textLength="24.4" clip-path="url(#breeze-prod-image-save-line-9)">-g</text><text class="breeze-prod-image-save-r1" x="329.4" y="239.6" textLeng [...]
+</text><text class="breeze-prod-image-save-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-prod-image-save-line-10)">│</text><text class="breeze-prod-image-save-r4" x="24.4" y="264" textLength="146.4" clip-path="url(#breeze-prod-image-save-line-10)">--image-file</text><text class="breeze-prod-image-save-r1" x="329.4" y="264" textLength="427" clip-path="url(#breeze-prod-image-save-line-10)">Optional file to save the image to.</text><text class="bre [...]
+</text><text class="breeze-prod-image-save-r5" x="0" y="288.4" textLength="1464" clip-path="url(#breeze-prod-image-save-line-11)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-save-r1" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-prod-image-save-line-11)">
+</text><text class="breeze-prod-image-save-r5" x="0" y="312.8" textLength="24.4" clip-path="url(#breeze-prod-image-save-line-12)">â•─</text><text class="breeze-prod-image-save-r5" x="24.4" y="312.8" textLength="195.2" clip-path="url(#breeze-prod-image-save-line-12)"> Common options </text><text class="breeze-prod-image-save-r5" x="219.6" y="312.8" textLength="1220" clip-path="url(#breeze-prod-image-save-line-12)">───────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-prod-image-save-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-prod-image-save-line-13)">│</text><text class="breeze-prod-image-save-r4" x="24.4" y="337.2" textLength="109.8" clip-path="url(#breeze-prod-image-save-line-13)">--verbose</text><text class="breeze-prod-image-save-r6" x="158.6" y="337.2" textLength="24.4" clip-path="url(#breeze-prod-image-save-line-13)">-v</text><text class="breeze-prod-image-save-r1" x="207.4" y="337.2" textLength="585 [...]
+</text><text class="breeze-prod-image-save-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-prod-image-save-line-14)">│</text><text class="breeze-prod-image-save-r4" x="24.4" y="361.6" textLength="109.8" clip-path="url(#breeze-prod-image-save-line-14)">--dry-run</text><text class="breeze-prod-image-save-r6" x="158.6" y="361.6" textLength="24.4" clip-path="url(#breeze-prod-image-save-line-14)">-D</text><text class="breeze-prod-image-save-r1" x="207.4" y="361.6" textLength="719 [...]
+</text><text class="breeze-prod-image-save-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-prod-image-save-line-15)">│</text><text class="breeze-prod-image-save-r4" x="24.4" y="386" textLength="73.2" clip-path="url(#breeze-prod-image-save-line-15)">--help</text><text class="breeze-prod-image-save-r6" x="158.6" y="386" textLength="24.4" clip-path="url(#breeze-prod-image-save-line-15)">-h</text><text class="breeze-prod-image-save-r1" x="207.4" y="386" textLength="329.4" clip-pat [...]
+</text><text class="breeze-prod-image-save-r5" x="0" y="410.4" textLength="1464" clip-path="url(#breeze-prod-image-save-line-16)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-save-r1" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-prod-image-save-line-16)">
+</text>
+ </g>
+ </g>
+</svg>
diff --git a/dev/breeze/doc/images/output_prod-image_save.txt b/dev/breeze/doc/images/output_prod-image_save.txt
new file mode 100644
index 00000000000..6d99ebe8a91
--- /dev/null
+++ b/dev/breeze/doc/images/output_prod-image_save.txt
@@ -0,0 +1 @@
+78350e63d93b1f8f3ae8ea55711dc567
diff --git a/dev/breeze/doc/images/output_prod-image_verify.svg b/dev/breeze/doc/images/output_prod-image_verify.svg
index fae64feb265..61f4644fb35 100644
--- a/dev/breeze/doc/images/output_prod-image_verify.svg
+++ b/dev/breeze/doc/images/output_prod-image_verify.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 855.1999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 830.8" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-prod-image-verify-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="804.1999999999999" />
+ <rect x="0" y="0" width="1463.0" height="779.8" />
</clipPath>
<clipPath id="breeze-prod-image-verify-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -138,12 +138,9 @@
<clipPath id="breeze-prod-image-verify-line-30">
<rect x="0" y="733.5" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-prod-image-verify-line-31">
- <rect x="0" y="757.9" 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="853.2" rx="8"/><text class="breeze-prod-image-verify-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: prod-image verify</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="828.8" rx="8"/><text class="breeze-prod-image-verify-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: prod-image verify</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -159,33 +156,32 @@
</text><text class="breeze-prod-image-verify-r1" x="12.2" y="93.2" textLength="292.8" clip-path="url(#breeze-prod-image-verify-line-3)">Verify Production image.</text><text class="breeze-prod-image-verify-r1" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-3)">
</text><text class="breeze-prod-image-verify-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-4)">
</text><text class="breeze-prod-image-verify-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-5)">â•─</text><text class="breeze-prod-image-verify-r5" x="24.4" y="142" textLength="244" clip-path="url(#breeze-prod-image-verify-line-5)"> Verify image flags </text><text class="breeze-prod-image-verify-r5" x="268.4" y="142" textLength="1171.2" clip-path="url(#breeze-prod-image-verify-line-5)">───────────────────────────────────────────────── [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-6)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="166.4" textLength="146.4" clip-path="url(#breeze-prod-image-verify-line-6)">--image-name</text><text class="breeze-prod-image-verify-r6" x="195.2" y="166.4" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-6)">-n</text><text class="breeze-prod-image-verify-r1" x="244" y="166.4" tex [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-6)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="166.4" textLength="146.4" clip-path="url(#breeze-prod-image-verify-line-6)">--image-name</text><text class="breeze-prod-image-verify-r6" x="195.2" y="166.4" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-6)">-n</text><text class="breeze-prod-image-verify-r1" x="244" y="166.4" tex [...]
</text><text class="breeze-prod-image-verify-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-7)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="190.8" textLength="97.6" clip-path="url(#breeze-prod-image-verify-line-7)">--python</text><text class="breeze-prod-image-verify-r6" x="195.2" y="190.8" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-7)">-p</text><text class="breeze-prod-image-verify-r1" x="244" y="190.8" textLeng [...]
</text><text class="breeze-prod-image-verify-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-8)">│</text><text class="breeze-prod-image-verify-r5" x="244" y="215.2" textLength="732" clip-path="url(#breeze-prod-image-verify-line-8)">[default: 3.9]                                  & [...]
</text><text class="breeze-prod-image-verify-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-9)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="239.6" textLength="146.4" clip-path="url(#breeze-prod-image-verify-line-9)">--slim-image</text><text class="breeze-prod-image-verify-r1" x="244" y="239.6" textLength="793" clip-path="url(#breeze-prod-image-verify-line-9)">The image to verify is slim and non-slim [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-10)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="264" textLength="134.2" clip-path="url(#breeze-prod-image-verify-line-10)">--image-tag</text><text class="breeze-prod-image-verify-r6" x="195.2" y="264" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-10)">-t</text><text class="breeze-prod-image-verify-r1" x="244" y="264" textLengt [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-11)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="288.4" textLength="73.2" clip-path="url(#breeze-prod-image-verify-line-11)">--pull</text><text class="breeze-prod-image-verify-r1" x="244" y="288.4" textLength="646.6" clip-path="url(#breeze-prod-image-verify-line-11)">Pull image is missing before attempting to  [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="312.8" textLength="1464" clip-path="url(#breeze-prod-image-verify-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-verify-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-12)">
-</text><text class="breeze-prod-image-verify-r5" x="0" y="337.2" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-13)">â•─</text><text class="breeze-prod-image-verify-r5" x="24.4" y="337.2" textLength="219.6" clip-path="url(#breeze-prod-image-verify-line-13)"> Parallel running </text><text class="breeze-prod-image-verify-r5" x="244" y="337.2" textLength="1195.6" clip-path="url(#breeze-prod-image-verify-line-13)">─────────────────────────────────────────────── [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-14)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="361.6" textLength="207.4" clip-path="url(#breeze-prod-image-verify-line-14)">--run-in-parallel</text><text class="breeze-prod-image-verify-r1" x="378.2" y="361.6" textLength="854" clip-path="url(#breeze-prod-image-verify-line-14)">Run the operation in parallel on al [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-15)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="386" textLength="158.6" clip-path="url(#breeze-prod-image-verify-line-15)">--parallelism</text><text class="breeze-prod-image-verify-r1" x="378.2" y="386" textLength="915" clip-path="url(#breeze-prod-image-verify-line-15)">Maximum number of processes to use while  [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-16)">│</text><text class="breeze-prod-image-verify-r7" x="378.2" y="410.4" textLength="915" clip-path="url(#breeze-prod-image-verify-line-16)">(INTEGER RANGE)                                 &# [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-17)">│</text><text class="breeze-prod-image-verify-r5" x="378.2" y="434.8" textLength="915" clip-path="url(#breeze-prod-image-verify-line-17)">[default: 4; 1<=x<=8]                               [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-18)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="459.2" textLength="207.4" clip-path="url(#breeze-prod-image-verify-line-18)">--python-versions</text><text class="breeze-prod-image-verify-r1" x="378.2" y="459.2" textLength="951.6" clip-path="url(#breeze-prod-image-verify-line-18)">Space separated list of python version [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-19)">│</text><text class="breeze-prod-image-verify-r5" x="378.2" y="483.6" textLength="951.6" clip-path="url(#breeze-prod-image-verify-line-19)">[default: 3.9 3.10 3.11 3.12]                            & [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-20)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="508" textLength="170.8" clip-path="url(#breeze-prod-image-verify-line-20)">--skip-cleanup</text><text class="breeze-prod-image-verify-r1" x="378.2" y="508" textLength="732" clip-path="url(#breeze-prod-image-verify-line-20)">Skip cleanup of temporary files created duri [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-21)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="532.4" textLength="207.4" clip-path="url(#breeze-prod-image-verify-line-21)">--debug-resources</text><text class="breeze-prod-image-verify-r1" x="378.2" y="532.4" textLength="768.6" clip-path="url(#breeze-prod-image-verify-line-21)">Whether to show resource information w [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-22)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="556.8" textLength="305" clip-path="url(#breeze-prod-image-verify-line-22)">--include-success-outputs</text><text class="breeze-prod-image-verify-r1" x="378.2" y="556.8" textLength="927.2" clip-path="url(#breeze-prod-image-verify-line-22)">Whether to include outputs of su [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="581.2" textLength="1464" clip-path="url(#breeze-prod-image-verify-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-verify-r1" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-23)">
-</text><text class="breeze-prod-image-verify-r5" x="0" y="605.6" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-24)">â•─</text><text class="breeze-prod-image-verify-r5" x="24.4" y="605.6" textLength="280.6" clip-path="url(#breeze-prod-image-verify-line-24)"> Github authentication </text><text class="breeze-prod-image-verify-r5" x="305" y="605.6" textLength="1134.6" clip-path="url(#breeze-prod-image-verify-line-24)">────────────────────────────────────────── [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-25)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="630" textLength="231.8" clip-path="url(#breeze-prod-image-verify-line-25)">--github-repository</text><text class="breeze-prod-image-verify-r6" x="280.6" y="630" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-25)">-g</text><text class="breeze-prod-image-verify-r1" x="329.4" y="630" [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-26)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="654.4" textLength="170.8" clip-path="url(#breeze-prod-image-verify-line-26)">--github-token</text><text class="breeze-prod-image-verify-r1" x="329.4" y="654.4" textLength="500.2" clip-path="url(#breeze-prod-image-verify-line-26)">The token used to authenticate to Gi [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="678.8" textLength="1464" clip-path="url(#breeze-prod-image-verify-line-27)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-verify-r1" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-27)">
-</text><text class="breeze-prod-image-verify-r5" x="0" y="703.2" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-28)">â•─</text><text class="breeze-prod-image-verify-r5" x="24.4" y="703.2" textLength="195.2" clip-path="url(#breeze-prod-image-verify-line-28)"> Common options </text><text class="breeze-prod-image-verify-r5" x="219.6" y="703.2" textLength="1220" clip-path="url(#breeze-prod-image-verify-line-28)">───────────────────────────────────────────────── [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-29)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="727.6" textLength="109.8" clip-path="url(#breeze-prod-image-verify-line-29)">--verbose</text><text class="breeze-prod-image-verify-r6" x="158.6" y="727.6" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-29)">-v</text><text class="breeze-prod-image-verify-r1" x="207.4" y="727.6" t [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-30)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="752" textLength="109.8" clip-path="url(#breeze-prod-image-verify-line-30)">--dry-run</text><text class="breeze-prod-image-verify-r6" x="158.6" y="752" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-30)">-D</text><text class="breeze-prod-image-verify-r1" x="207.4" y="752" textLengt [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-31)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="776.4" textLength="73.2" clip-path="url(#breeze-prod-image-verify-line-31)">--help</text><text class="breeze-prod-image-verify-r6" x="158.6" y="776.4" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-31)">-h</text><text class="breeze-prod-image-verify-r1" x="207.4" y="776.4" textL [...]
-</text><text class="breeze-prod-image-verify-r5" x="0" y="800.8" textLength="1464" clip-path="url(#breeze-prod-image-verify-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-verify-r1" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-32)">
+</text><text class="breeze-prod-image-verify-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-10)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="264" textLength="73.2" clip-path="url(#breeze-prod-image-verify-line-10)">--pull</text><text class="breeze-prod-image-verify-r1" x="244" y="264" textLength="646.6" clip-path="url(#breeze-prod-image-verify-line-10)">Pull image is missing before attempting to verif [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="288.4" textLength="1464" clip-path="url(#breeze-prod-image-verify-line-11)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-verify-r1" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-11)">
+</text><text class="breeze-prod-image-verify-r5" x="0" y="312.8" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-12)">â•─</text><text class="breeze-prod-image-verify-r5" x="24.4" y="312.8" textLength="219.6" clip-path="url(#breeze-prod-image-verify-line-12)"> Parallel running </text><text class="breeze-prod-image-verify-r5" x="244" y="312.8" textLength="1195.6" clip-path="url(#breeze-prod-image-verify-line-12)">─────────────────────────────────────────────── [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-13)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="337.2" textLength="207.4" clip-path="url(#breeze-prod-image-verify-line-13)">--run-in-parallel</text><text class="breeze-prod-image-verify-r1" x="378.2" y="337.2" textLength="854" clip-path="url(#breeze-prod-image-verify-line-13)">Run the operation in parallel on al [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-14)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="361.6" textLength="158.6" clip-path="url(#breeze-prod-image-verify-line-14)">--parallelism</text><text class="breeze-prod-image-verify-r1" x="378.2" y="361.6" textLength="915" clip-path="url(#breeze-prod-image-verify-line-14)">Maximum number of processes to use whil [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-15)">│</text><text class="breeze-prod-image-verify-r7" x="378.2" y="386" textLength="915" clip-path="url(#breeze-prod-image-verify-line-15)">(INTEGER RANGE)                                   [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-16)">│</text><text class="breeze-prod-image-verify-r5" x="378.2" y="410.4" textLength="915" clip-path="url(#breeze-prod-image-verify-line-16)">[default: 4; 1<=x<=8]                               [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-17)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="434.8" textLength="207.4" clip-path="url(#breeze-prod-image-verify-line-17)">--python-versions</text><text class="breeze-prod-image-verify-r1" x="378.2" y="434.8" textLength="951.6" clip-path="url(#breeze-prod-image-verify-line-17)">Space separated list of python version [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-18)">│</text><text class="breeze-prod-image-verify-r5" x="378.2" y="459.2" textLength="951.6" clip-path="url(#breeze-prod-image-verify-line-18)">[default: 3.9 3.10 3.11 3.12]                            & [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-19)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="483.6" textLength="170.8" clip-path="url(#breeze-prod-image-verify-line-19)">--skip-cleanup</text><text class="breeze-prod-image-verify-r1" x="378.2" y="483.6" textLength="732" clip-path="url(#breeze-prod-image-verify-line-19)">Skip cleanup of temporary files created [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-20)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="508" textLength="207.4" clip-path="url(#breeze-prod-image-verify-line-20)">--debug-resources</text><text class="breeze-prod-image-verify-r1" x="378.2" y="508" textLength="768.6" clip-path="url(#breeze-prod-image-verify-line-20)">Whether to show resource information while&# [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-21)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="532.4" textLength="305" clip-path="url(#breeze-prod-image-verify-line-21)">--include-success-outputs</text><text class="breeze-prod-image-verify-r1" x="378.2" y="532.4" textLength="927.2" clip-path="url(#breeze-prod-image-verify-line-21)">Whether to include outputs of su [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="556.8" textLength="1464" clip-path="url(#breeze-prod-image-verify-line-22)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-verify-r1" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-22)">
+</text><text class="breeze-prod-image-verify-r5" x="0" y="581.2" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-23)">â•─</text><text class="breeze-prod-image-verify-r5" x="24.4" y="581.2" textLength="280.6" clip-path="url(#breeze-prod-image-verify-line-23)"> Github authentication </text><text class="breeze-prod-image-verify-r5" x="305" y="581.2" textLength="1134.6" clip-path="url(#breeze-prod-image-verify-line-23)">────────────────────────────────────────── [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-24)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="605.6" textLength="231.8" clip-path="url(#breeze-prod-image-verify-line-24)">--github-repository</text><text class="breeze-prod-image-verify-r6" x="280.6" y="605.6" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-24)">-g</text><text class="breeze-prod-image-verify-r1" x="329.4" y [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-25)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="630" textLength="170.8" clip-path="url(#breeze-prod-image-verify-line-25)">--github-token</text><text class="breeze-prod-image-verify-r1" x="329.4" y="630" textLength="500.2" clip-path="url(#breeze-prod-image-verify-line-25)">The token used to authenticate to GitHub.< [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="654.4" textLength="1464" clip-path="url(#breeze-prod-image-verify-line-26)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-verify-r1" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-26)">
+</text><text class="breeze-prod-image-verify-r5" x="0" y="678.8" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-27)">â•─</text><text class="breeze-prod-image-verify-r5" x="24.4" y="678.8" textLength="195.2" clip-path="url(#breeze-prod-image-verify-line-27)"> Common options </text><text class="breeze-prod-image-verify-r5" x="219.6" y="678.8" textLength="1220" clip-path="url(#breeze-prod-image-verify-line-27)">───────────────────────────────────────────────── [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-28)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="703.2" textLength="109.8" clip-path="url(#breeze-prod-image-verify-line-28)">--verbose</text><text class="breeze-prod-image-verify-r6" x="158.6" y="703.2" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-28)">-v</text><text class="breeze-prod-image-verify-r1" x="207.4" y="703.2" t [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-29)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="727.6" textLength="109.8" clip-path="url(#breeze-prod-image-verify-line-29)">--dry-run</text><text class="breeze-prod-image-verify-r6" x="158.6" y="727.6" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-29)">-D</text><text class="breeze-prod-image-verify-r1" x="207.4" y="727.6" t [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-30)">│</text><text class="breeze-prod-image-verify-r4" x="24.4" y="752" textLength="73.2" clip-path="url(#breeze-prod-image-verify-line-30)">--help</text><text class="breeze-prod-image-verify-r6" x="158.6" y="752" textLength="24.4" clip-path="url(#breeze-prod-image-verify-line-30)">-h</text><text class="breeze-prod-image-verify-r1" x="207.4" y="752" textLength="3 [...]
+</text><text class="breeze-prod-image-verify-r5" x="0" y="776.4" textLength="1464" clip-path="url(#breeze-prod-image-verify-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-verify-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-prod-image-verify-line-31)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_prod-image_verify.txt b/dev/breeze/doc/images/output_prod-image_verify.txt
index c3c52cc0eda..5244eb1b878 100644
--- a/dev/breeze/doc/images/output_prod-image_verify.txt
+++ b/dev/breeze/doc/images/output_prod-image_verify.txt
@@ -1 +1 @@
-476434f4359f3e4e12b76ff55f4ba2f5
+10bfa8746bfb726cc67d5c04ac0cd70d
diff --git a/dev/breeze/doc/images/output_release-management_generate-constraints.svg b/dev/breeze/doc/images/output_release-management_generate-constraints.svg
index a43b171ba21..e0ff7f632c7 100644
--- a/dev/breeze/doc/images/output_release-management_generate-constraints.svg
+++ b/dev/breeze/doc/images/output_release-management_generate-constraints.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 952.8" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 879.5999999999999" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-release-management-generate-constraints-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="901.8" />
+ <rect x="0" y="0" width="1463.0" height="828.5999999999999" />
</clipPath>
<clipPath id="breeze-release-management-generate-constraints-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -144,18 +144,9 @@
<clipPath id="breeze-release-management-generate-constraints-line-32">
<rect x="0" y="782.3" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-release-management-generate-constraints-line-33">
- <rect x="0" y="806.7" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-generate-constraints-line-34">
- <rect x="0" y="831.1" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-generate-constraints-line-35">
- <rect x="0" y="855.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="950.8" rx="8"/><text class="breeze-release-management-generate-constraints-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management generate-constraints</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="877.6" rx="8"/><text class="breeze-release-management-generate-constraints-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management generate-constraints</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -179,29 +170,26 @@
</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-11)">│</text><text class="breeze-release-management-generate-constraints-r1" x="414.8" y="288.4" textLength="1024.8" clip-path="url(#breeze-release-management-generate-constraints-line-11)">current_version.dev0                  & [...]
</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-12)">│</text><text class="breeze-release-management-generate-constraints-r6" x="414.8" y="312.8" textLength="1024.8" clip-path="url(#breeze-release-management-generate-constraints-line-12)">(TEXT)                     [...]
</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-13)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="337.2" textLength="231.8" clip-path="url(#breeze-release-management-generate-constraints-line-13)">--github-repository</text><text class="breeze-release-management-generate-constraints-r7" x="366" y="337.2" textLength="24.4" clip- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-14)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="361.6" textLength="134.2" clip-path="url(#breeze-release-management-generate-constraints-line-14)">--image-tag</text><text class="breeze-release-management-generate-constraints-r1" x="414.8" y="361.6" textLength="695.4" clip-path= [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-15)">│</text><text class="breeze-release-management-generate-constraints-r6" x="414.8" y="386" textLength="963.8" clip-path="url(#breeze-release-management-generate-constraints-line-15)">(TEXT)                     &# [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-16)">│</text><text class="breeze-release-management-generate-constraints-r5" x="414.8" y="410.4" textLength="963.8" clip-path="url(#breeze-release-management-generate-constraints-line-16)">[default: latest]                   [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-17)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="434.8" textLength="97.6" clip-path="url(#breeze-release-management-generate-constraints-line-17)">--python</text><text class="breeze-release-management-generate-constraints-r7" x="366" y="434.8" textLength="24.4" clip-path="url(#b [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-18)">│</text><text class="breeze-release-management-generate-constraints-r6" x="414.8" y="459.2" textLength="732" clip-path="url(#breeze-release-management-generate-constraints-line-18)">(>3.9< | 3.10 | 3.11 | 3.12)           &# [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-19)">│</text><text class="breeze-release-management-generate-constraints-r5" x="414.8" y="483.6" textLength="732" clip-path="url(#breeze-release-management-generate-constraints-line-19)">[default: 3.9]                    [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-20)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="508" textLength="97.6" clip-path="url(#breeze-release-management-generate-constraints-line-20)">--use-uv</text><text class="breeze-release-management-generate-constraints-r1" x="122" y="508" textLength="12.2" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="532.4" textLength="1464" clip-path="url(#breeze-release-management-generate-constraints-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-constraints-r1" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-21)">
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="556.8" textLength="24.4" clip-path="url(#breeze-release-management-generate-constraints-line-22)">â•─</text><text class="breeze-release-management-generate-constraints-r5" x="24.4" y="556.8" textLength="219.6" clip-path="url(#breeze-release-management-generate-constraints-line-22)"> Parallel running </text><text class="breeze-release-management-generate-constraints-r5" x="244" y="556.8" textLeng [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-23)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="581.2" textLength="207.4" clip-path="url(#breeze-release-management-generate-constraints-line-23)">--debug-resources</text><text class="breeze-release-management-generate-constraints-r1" x="280.6" y="581.2" textLength="768.6" clip [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-24)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="605.6" textLength="158.6" clip-path="url(#breeze-release-management-generate-constraints-line-24)">--parallelism</text><text class="breeze-release-management-generate-constraints-r1" x="280.6" y="605.6" textLength="915" clip-path= [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-25)">│</text><text class="breeze-release-management-generate-constraints-r5" x="280.6" y="630" textLength="915" clip-path="url(#breeze-release-management-generate-constraints-line-25)">[default: 4; 1<=x<=8]                 [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-26)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="654.4" textLength="207.4" clip-path="url(#breeze-release-management-generate-constraints-line-26)">--python-versions</text><text class="breeze-release-management-generate-constraints-r1" x="280.6" y="654.4" textLength="951.6" clip [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-27)">│</text><text class="breeze-release-management-generate-constraints-r5" x="280.6" y="678.8" textLength="951.6" clip-path="url(#breeze-release-management-generate-constraints-line-27)">[default: 3.9 3.10 3.11 3.12]              [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-28)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="703.2" textLength="207.4" clip-path="url(#breeze-release-management-generate-constraints-line-28)">--run-in-parallel</text><text class="breeze-release-management-generate-constraints-r1" x="280.6" y="703.2" textLength="854" clip-p [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-29)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="727.6" textLength="170.8" clip-path="url(#breeze-release-management-generate-constraints-line-29)">--skip-cleanup</text><text class="breeze-release-management-generate-constraints-r1" x="280.6" y="727.6" textLength="732" clip-path [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="752" textLength="1464" clip-path="url(#breeze-release-management-generate-constraints-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-constraints-r1" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-30)">
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="776.4" textLength="24.4" clip-path="url(#breeze-release-management-generate-constraints-line-31)">â•─</text><text class="breeze-release-management-generate-constraints-r5" x="24.4" y="776.4" textLength="195.2" clip-path="url(#breeze-release-management-generate-constraints-line-31)"> Common options </text><text class="breeze-release-management-generate-constraints-r5" x="219.6" y="776.4" textLeng [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-32)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="800.8" textLength="109.8" clip-path="url(#breeze-release-management-generate-constraints-line-32)">--verbose</text><text class="breeze-release-management-generate-constraints-r7" x="158.6" y="800.8" textLength="24.4" clip-path="ur [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-33)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="825.2" textLength="109.8" clip-path="url(#breeze-release-management-generate-constraints-line-33)">--dry-run</text><text class="breeze-release-management-generate-constraints-r7" x="158.6" y="825.2" textLength="24.4" clip-path="ur [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-34)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="849.6" textLength="97.6" clip-path="url(#breeze-release-management-generate-constraints-line-34)">--answer</text><text class="breeze-release-management-generate-constraints-r7" x="158.6" y="849.6" textLength="24.4" clip-path="url( [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-35)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="874" textLength="73.2" clip-path="url(#breeze-release-management-generate-constraints-line-35)">--help</text><text class="breeze-release-management-generate-constraints-r7" x="158.6" y="874" textLength="24.4" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="898.4" textLength="1464" clip-path="url(#breeze-release-management-generate-constraints-line-36)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-constraints-r1" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-36)">
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-14)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="361.6" textLength="97.6" clip-path="url(#breeze-release-management-generate-constraints-line-14)">--python</text><text class="breeze-release-management-generate-constraints-r7" x="366" y="361.6" textLength="24.4" clip-path="url(#b [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-15)">│</text><text class="breeze-release-management-generate-constraints-r6" x="414.8" y="386" textLength="732" clip-path="url(#breeze-release-management-generate-constraints-line-15)">(>3.9< | 3.10 | 3.11 | 3.12)             [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-16)">│</text><text class="breeze-release-management-generate-constraints-r5" x="414.8" y="410.4" textLength="732" clip-path="url(#breeze-release-management-generate-constraints-line-16)">[default: 3.9]                    [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-17)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="434.8" textLength="97.6" clip-path="url(#breeze-release-management-generate-constraints-line-17)">--use-uv</text><text class="breeze-release-management-generate-constraints-r1" x="122" y="434.8" textLength="12.2" clip-path="url(#b [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="459.2" textLength="1464" clip-path="url(#breeze-release-management-generate-constraints-line-18)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-constraints-r1" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-18)">
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="483.6" textLength="24.4" clip-path="url(#breeze-release-management-generate-constraints-line-19)">â•─</text><text class="breeze-release-management-generate-constraints-r5" x="24.4" y="483.6" textLength="219.6" clip-path="url(#breeze-release-management-generate-constraints-line-19)"> Parallel running </text><text class="breeze-release-management-generate-constraints-r5" x="244" y="483.6" textLeng [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-20)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="508" textLength="207.4" clip-path="url(#breeze-release-management-generate-constraints-line-20)">--debug-resources</text><text class="breeze-release-management-generate-constraints-r1" x="280.6" y="508" textLength="768.6" clip-path= [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-21)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="532.4" textLength="158.6" clip-path="url(#breeze-release-management-generate-constraints-line-21)">--parallelism</text><text class="breeze-release-management-generate-constraints-r1" x="280.6" y="532.4" textLength="915" clip-path= [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-22)">│</text><text class="breeze-release-management-generate-constraints-r5" x="280.6" y="556.8" textLength="915" clip-path="url(#breeze-release-management-generate-constraints-line-22)">[default: 4; 1<=x<=8]                 [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-23)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="581.2" textLength="207.4" clip-path="url(#breeze-release-management-generate-constraints-line-23)">--python-versions</text><text class="breeze-release-management-generate-constraints-r1" x="280.6" y="581.2" textLength="951.6" clip [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-24)">│</text><text class="breeze-release-management-generate-constraints-r5" x="280.6" y="605.6" textLength="951.6" clip-path="url(#breeze-release-management-generate-constraints-line-24)">[default: 3.9 3.10 3.11 3.12]              [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-25)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="630" textLength="207.4" clip-path="url(#breeze-release-management-generate-constraints-line-25)">--run-in-parallel</text><text class="breeze-release-management-generate-constraints-r1" x="280.6" y="630" textLength="854" clip-path="u [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-26)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="654.4" textLength="170.8" clip-path="url(#breeze-release-management-generate-constraints-line-26)">--skip-cleanup</text><text class="breeze-release-management-generate-constraints-r1" x="280.6" y="654.4" textLength="732" clip-path [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="678.8" textLength="1464" clip-path="url(#breeze-release-management-generate-constraints-line-27)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-constraints-r1" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-27)">
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="703.2" textLength="24.4" clip-path="url(#breeze-release-management-generate-constraints-line-28)">â•─</text><text class="breeze-release-management-generate-constraints-r5" x="24.4" y="703.2" textLength="195.2" clip-path="url(#breeze-release-management-generate-constraints-line-28)"> Common options </text><text class="breeze-release-management-generate-constraints-r5" x="219.6" y="703.2" textLeng [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-29)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="727.6" textLength="109.8" clip-path="url(#breeze-release-management-generate-constraints-line-29)">--verbose</text><text class="breeze-release-management-generate-constraints-r7" x="158.6" y="727.6" textLength="24.4" clip-path="ur [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-30)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="752" textLength="109.8" clip-path="url(#breeze-release-management-generate-constraints-line-30)">--dry-run</text><text class="breeze-release-management-generate-constraints-r7" x="158.6" y="752" textLength="24.4" clip-path="url(#bre [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-31)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="776.4" textLength="97.6" clip-path="url(#breeze-release-management-generate-constraints-line-31)">--answer</text><text class="breeze-release-management-generate-constraints-r7" x="158.6" y="776.4" textLength="24.4" clip-path="url( [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-32)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="800.8" textLength="73.2" clip-path="url(#breeze-release-management-generate-constraints-line-32)">--help</text><text class="breeze-release-management-generate-constraints-r7" x="158.6" y="800.8" textLength="24.4" clip-path="url(#b [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="825.2" textLength="1464" clip-path="url(#breeze-release-management-generate-constraints-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-constraints-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-33)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_release-management_generate-constraints.txt b/dev/breeze/doc/images/output_release-management_generate-constraints.txt
index ac283e82ce2..2cefef2a88e 100644
--- a/dev/breeze/doc/images/output_release-management_generate-constraints.txt
+++ b/dev/breeze/doc/images/output_release-management_generate-constraints.txt
@@ -1 +1 @@
-74e78d80f0339f8069039fa95479ec2a
+255ad61b290f7ec3bf4f607d8e1509bf
diff --git a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg
index 6a312f5b20d..88800f83cde 100644
--- a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg
+++ b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1001.5999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1026.0" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-setup-check-all-params-in-groups-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="950.5999999999999" />
+ <rect x="0" y="0" width="1463.0" height="975.0" />
</clipPath>
<clipPath id="breeze-setup-check-all-params-in-groups-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -159,9 +159,12 @@
<clipPath id="breeze-setup-check-all-params-in-groups-line-37">
<rect x="0" y="904.3" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-38">
+ <rect x="0" y="928.7" 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="999.6" rx="8"/><text class="breeze-setup-check-all-params-in-groups-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: setup check-all-params-in-groups</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1024" rx="8"/><text class="breeze-setup-check-all-params-in-groups-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: setup check-all-params-in-groups</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -178,38 +181,39 @@
</text><text class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-4)">
</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-setup-check-all-params-in-groups-line-5)">â•─</text><text class="breeze-setup-check-all-params-in-groups-r5" x="24.4" y="142" textLength="414.8" clip-path="url(#breeze-setup-check-all-params-in-groups-line-5)"> Check all params in groups flags </text><text class="breeze-setup-check-all-params-in-groups-r5" x="439.2" y="142" textLength="1 [...]
</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-6)">│</text><text class="breeze-setup-check-all-params-in-groups-r4" x="24.4" y="166.4" textLength="109.8" clip-path="url(#breeze-setup-check-all-params-in-groups-line-6)">--command</text><text class="breeze-setup-check-all-params-in-groups-r1" x="183" y="166.4" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-g [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-7)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="190.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-7)">(build-docs | ci | ci-image | ci-image:build | ci-image:pull | ci-image:verify |    &# [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-8)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="215.2" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-8)">ci:find-backtracking-candidates | ci:fix-ownership | ci:free-space | ci:get-workflow-info |       [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-9)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="239.6" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-9)">ci:resource-check | ci:selective-check | cleanup | compile-ui-assets | compile-www-assets | down | ex [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-10)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="264" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-10)">| generate-migration-file | k8s | k8s:build-k8s-image | k8s:configure-cluster | k8s:create-cluster |  & [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-11)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="288.4" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-11)">k8s:delete-cluster | k8s:deploy-airflow | k8s:k9s | k8s:logs | k8s:run-complete-tests | k8s:setup-env |< [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="312.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">k8s:shell | k8s:status | k8s:tests | k8s:upload-k8s-image | prod-image | prod-image:build |  & [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="337.2" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">prod-image:pull | prod-image:verify | release-management | release-management:add-back-references |    < [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="361.6" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">release-management:clean-old-provider-artifacts | release-management:create-minor-branch |          [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="386" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">release-management:generate-constraints | release-management:generate-issue-content-core |          [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="410.4" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">release-management:generate-issue-content-helm-chart |                 [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="434.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">release-management:generate-issue-content-providers | release-management:generate-providers-metadata | </text><text class="breeze-setup-che [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="459.2" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">release-management:install-provider-packages | release-management:prepare-airflow-package |          [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="483.6" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">release-management:prepare-airflow-tarball | release-management:prepare-helm-chart-package |         [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="508" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">release-management:prepare-helm-chart-tarball | release-management:prepare-provider-documentation |    </text><text class="breez [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="532.4" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">release-management:prepare-provider-packages | release-management:prepare-python-client |         & [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="556.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">release-management:prepare-task-sdk-package | release-management:publish-docs |            [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="581.2" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">release-management:release-prod-images | release-management:start-rc-process |            [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-24)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="605.6" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-24)">release-management:start-release | release-management:tag-providers |             [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="630" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">release-management:update-constraints | release-management:verify-provider-packages | sbom |        [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="654.4" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">sbom:build-all-airflow-images | sbom:export-dependency-information |             [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-27)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="678.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-27)">sbom:generate-providers-requirements | sbom:update-sbom-information | setup | setup:autocomplete |    &# [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-28)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="703.2" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-28)">setup:check-all-params-in-groups | setup:config | setup:regenerate-command-images | setup:self-upgrade </text><text class="b [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-29)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="727.6" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-29)">| setup:synchronize-local-mounts | setup:version | shell | start-airflow | static-checks | testing  [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-30)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="752" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-30)">testing:core-integration-tests | testing:core-tests | testing:docker-compose-tests | testing:helm-tests</text><text class="breeze-set [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-31)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="776.4" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-31)">| testing:providers-integration-tests | testing:providers-tests | testing:python-api-client-tests |    </text [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-32)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="800.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-32)">testing:system-tests | testing:task-sdk-tests)                 & [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="825.2" textLength="1464" clip-path="url(#breeze-setup-check-all-params-in-groups-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-33)">
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="849.6" textLength="24.4" clip-path="url(#breeze-setup-check-all-params-in-groups-line-34)">â•─</text><text class="breeze-setup-check-all-params-in-groups-r5" x="24.4" y="849.6" textLength="195.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-34)"> Common options </text><text class="breeze-setup-check-all-params-in-groups-r5" x="219.6" y="849.6" textLength="1220" clip-path="url(#breeze-se [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-35)">│</text><text class="breeze-setup-check-all-params-in-groups-r4" x="24.4" y="874" textLength="109.8" clip-path="url(#breeze-setup-check-all-params-in-groups-line-35)">--verbose</text><text class="breeze-setup-check-all-params-in-groups-r7" x="158.6" y="874" textLength="24.4" clip-path="url(#breeze-setup-check-all-params-in-group [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-36)">│</text><text class="breeze-setup-check-all-params-in-groups-r4" x="24.4" y="898.4" textLength="109.8" clip-path="url(#breeze-setup-check-all-params-in-groups-line-36)">--dry-run</text><text class="breeze-setup-check-all-params-in-groups-r7" x="158.6" y="898.4" textLength="24.4" clip-path="url(#breeze-setup-check-all-params-in [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-37)">│</text><text class="breeze-setup-check-all-params-in-groups-r4" x="24.4" y="922.8" textLength="73.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-37)">--help</text><text class="breeze-setup-check-all-params-in-groups-r7" x="158.6" y="922.8" textLength="24.4" clip-path="url(#breeze-setup-check-all-params-in-gro [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="947.2" textLength="1464" clip-path="url(#breeze-setup-check-all-params-in-groups-line-38)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="947.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-38)">
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-7)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="190.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-7)">(build-docs | ci | ci-image | ci-image:build | ci-image:load | ci-image:pull | ci-image:save |&# [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-8)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="215.2" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-8)">ci-image:verify | ci:find-backtracking-candidates | ci:fix-ownership | ci:free-space |       [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-9)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="239.6" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-9)">ci:get-workflow-info | ci:resource-check | ci:selective-check | cleanup | compile-ui-assets |     [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-10)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="264" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-10)">compile-www-assets | down | exec | generate-migration-file | k8s | k8s:build-k8s-image |   &# [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-11)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="288.4" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-11)">k8s:configure-cluster | k8s:create-cluster | k8s:delete-cluster | k8s:deploy-airflow | k8s:k9s |    [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="312.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">k8s:logs | k8s:run-complete-tests | k8s:setup-env | k8s:shell | k8s:status | k8s:tests |   [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="337.2" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">k8s:upload-k8s-image | prod-image | prod-image:build | prod-image:load | prod-image:pull |     [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="361.6" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">prod-image:save | prod-image:verify | release-management | release-management:add-back-references |    < [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="386" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">release-management:clean-old-provider-artifacts | release-management:create-minor-branch |          [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="410.4" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">release-management:generate-constraints | release-management:generate-issue-content-core |          [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="434.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">release-management:generate-issue-content-helm-chart |                 [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="459.2" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">release-management:generate-issue-content-providers | release-management:generate-providers-metadata | </text><text class="breeze-setup-che [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="483.6" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">release-management:install-provider-packages | release-management:prepare-airflow-package |          [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="508" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">release-management:prepare-airflow-tarball | release-management:prepare-helm-chart-package |         &# [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="532.4" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">release-management:prepare-helm-chart-tarball | release-management:prepare-provider-documentation |    </text><text class="b [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="556.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">release-management:prepare-provider-packages | release-management:prepare-python-client |         & [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="581.2" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">release-management:prepare-task-sdk-package | release-management:publish-docs |            [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-24)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="605.6" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-24)">release-management:release-prod-images | release-management:start-rc-process |            [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="630" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">release-management:start-release | release-management:tag-providers |             & [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="654.4" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">release-management:update-constraints | release-management:verify-provider-packages | sbom |        [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-27)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="678.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-27)">sbom:build-all-airflow-images | sbom:export-dependency-information |             [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-28)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="703.2" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-28)">sbom:generate-providers-requirements | sbom:update-sbom-information | setup | setup:autocomplete |    &# [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-29)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="727.6" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-29)">setup:check-all-params-in-groups | setup:config | setup:regenerate-command-images | setup:self-upgrade </text><text class="b [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-30)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="752" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-30)">| setup:synchronize-local-mounts | setup:version | shell | start-airflow | static-checks | testing | [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-31)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="776.4" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-31)">testing:core-integration-tests | testing:core-tests | testing:docker-compose-tests | testing:helm-tests</text><text class="breeze [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-32)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="800.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-32)">| testing:providers-integration-tests | testing:providers-tests | testing:python-api-client-tests |    </text [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-33)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="825.2" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-33)">testing:system-tests | testing:task-sdk-tests)                 & [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="849.6" textLength="1464" clip-path="url(#breeze-setup-check-all-params-in-groups-line-34)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-34)">
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="874" textLength="24.4" clip-path="url(#breeze-setup-check-all-params-in-groups-line-35)">â•─</text><text class="breeze-setup-check-all-params-in-groups-r5" x="24.4" y="874" textLength="195.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-35)"> Common options </text><text class="breeze-setup-check-all-params-in-groups-r5" x="219.6" y="874" textLength="1220" clip-path="url(#breeze-setup-ch [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-36)">│</text><text class="breeze-setup-check-all-params-in-groups-r4" x="24.4" y="898.4" textLength="109.8" clip-path="url(#breeze-setup-check-all-params-in-groups-line-36)">--verbose</text><text class="breeze-setup-check-all-params-in-groups-r7" x="158.6" y="898.4" textLength="24.4" clip-path="url(#breeze-setup-check-all-params-in [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-37)">│</text><text class="breeze-setup-check-all-params-in-groups-r4" x="24.4" y="922.8" textLength="109.8" clip-path="url(#breeze-setup-check-all-params-in-groups-line-37)">--dry-run</text><text class="breeze-setup-check-all-params-in-groups-r7" x="158.6" y="922.8" textLength="24.4" clip-path="url(#breeze-setup-check-all-params-in [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-38)">│</text><text class="breeze-setup-check-all-params-in-groups-r4" x="24.4" y="947.2" textLength="73.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-38)">--help</text><text class="breeze-setup-check-all-params-in-groups-r7" x="158.6" y="947.2" textLength="24.4" clip-path="url(#breeze-setup-check-all-params-in-gro [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="971.6" textLength="1464" clip-path="url(#breeze-setup-check-all-params-in-groups-line-39)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="971.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-39)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt
index 998b7fa5ca5..86455d4f335 100644
--- a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt
+++ b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt
@@ -1 +1 @@
-c4fd2fc3abe08380651f5c165250d870
+286c81a6b3698abf7a2bb689940c86a8
diff --git a/dev/breeze/doc/images/output_setup_regenerate-command-images.svg b/dev/breeze/doc/images/output_setup_regenerate-command-images.svg
index 2956a66972d..1a251b4fcae 100644
--- a/dev/breeze/doc/images/output_setup_regenerate-command-images.svg
+++ b/dev/breeze/doc/images/output_setup_regenerate-command-images.svg
@@ -194,16 +194,16 @@
</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-setup-regenerate-command-images-line-5)">â•─</text><text class="breeze-setup-regenerate-command-images-r5" x="24.4" y="142" textLength="329.4" clip-path="url(#breeze-setup-regenerate-command-images-line-5)"> Image regeneration option </text><text class="breeze-setup-regenerate-command-images-r5" x="353.8" y="142" textLength="1085.8" clip-path="url(#bree [...]
</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-6)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="166.4" textLength="85.4" clip-path="url(#breeze-setup-regenerate-command-images-line-6)">--force</text><text class="breeze-setup-regenerate-command-images-r1" x="219.6" y="166.4" textLength="402.6" clip-path="url(#breeze-setup-regenerate-command-images-li [...]
</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-7)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="190.8" textLength="109.8" clip-path="url(#breeze-setup-regenerate-command-images-line-7)">--command</text><text class="breeze-setup-regenerate-command-images-r1" x="219.6" y="190.8" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images- [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-8)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="215.2" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-8)">(build-docs | ci | ci-image | ci-image:build | ci-image:pull | ci-image:verify |      [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-9)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="239.6" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-9)">ci:find-backtracking-candidates | ci:fix-ownership | ci:free-space | ci:get-workflow-info |       [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-10)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="264" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-10)">ci:resource-check | ci:selective-check | cleanup | compile-ui-assets | compile-www-assets | down |  </ [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-11)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="288.4" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-11)">exec | generate-migration-file | k8s | k8s:build-k8s-image | k8s:configure-cluster |      [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-12)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="312.8" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-12)">k8s:create-cluster | k8s:delete-cluster | k8s:deploy-airflow | k8s:k9s | k8s:logs |       [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="337.2" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">k8s:run-complete-tests | k8s:setup-env | k8s:shell | k8s:status | k8s:tests | k8s:upload-k8s-image |</text>< [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="361.6" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">prod-image | prod-image:build | prod-image:pull | prod-image:verify | release-management |     [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="386" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">release-management:add-back-references | release-management:clean-old-provider-artifacts |          </ [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="410.4" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">release-management:create-minor-branch | release-management:generate-constraints |            [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="434.8" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">release-management:generate-issue-content-core |                  &# [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-8)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="215.2" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-8)">(build-docs | ci | ci-image | ci-image:build | ci-image:load | ci-image:pull | ci-image:save |  [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-9)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="239.6" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-9)">ci-image:verify | ci:find-backtracking-candidates | ci:fix-ownership | ci:free-space |       &# [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-10)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="264" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-10)">ci:get-workflow-info | ci:resource-check | ci:selective-check | cleanup | compile-ui-assets |      [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-11)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="288.4" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-11)">compile-www-assets | down | exec | generate-migration-file | k8s | k8s:build-k8s-image |   &# [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-12)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="312.8" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-12)">k8s:configure-cluster | k8s:create-cluster | k8s:delete-cluster | k8s:deploy-airflow | k8s:k9s |    [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="337.2" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">k8s:logs | k8s:run-complete-tests | k8s:setup-env | k8s:shell | k8s:status | k8s:tests |   &# [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="361.6" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">k8s:upload-k8s-image | prod-image | prod-image:build | prod-image:load | prod-image:pull |     [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="386" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">prod-image:save | prod-image:verify | release-management | release-management:add-back-references | </text><text class="breeze- [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="410.4" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">release-management:clean-old-provider-artifacts | release-management:create-minor-branch |          [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="434.8" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">release-management:generate-constraints | release-management:generate-issue-content-core |          [...]
</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-18)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="459.2" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-18)">release-management:generate-issue-content-helm-chart |                 &# [...]
</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-19)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="483.6" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-19)">release-management:generate-issue-content-providers | release-management:generate-providers-metadata</text><text class="breeze-setup-regenerate-command-i [...]
</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-20)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="508" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-20)">| release-management:install-provider-packages | release-management:prepare-airflow-package |       </text><text [...]
diff --git a/dev/breeze/doc/images/output_setup_regenerate-command-images.txt b/dev/breeze/doc/images/output_setup_regenerate-command-images.txt
index 75bfb1fa71f..3d8a354f20c 100644
--- a/dev/breeze/doc/images/output_setup_regenerate-command-images.txt
+++ b/dev/breeze/doc/images/output_setup_regenerate-command-images.txt
@@ -1 +1 @@
-2e42a9de8b8ed2ce83b5a1fcbdaa0158
+4996f888c771debd6faf36ca88e07e12
diff --git a/dev/breeze/doc/images/output_shell.svg b/dev/breeze/doc/images/output_shell.svg
index ba91fc0d662..34f39e1d48f 100644
--- a/dev/breeze/doc/images/output_shell.svg
+++ b/dev/breeze/doc/images/output_shell.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 3856.3999999999996" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 3807.6" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-shell-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="3805.3999999999996" />
+ <rect x="0" y="0" width="1463.0" height="3756.6" />
</clipPath>
<clipPath id="breeze-shell-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -504,15 +504,9 @@
<clipPath id="breeze-shell-line-152">
<rect x="0" y="3710.3" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-shell-line-153">
- <rect x="0" y="3734.7" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-shell-line-154">
- <rect x="0" y="3759.1" 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="3854.4" rx="8"/><text class="breeze-shell-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: shell</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="3805.6" rx="8"/><text class="breeze-shell-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: shell</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -581,103 +575,101 @@
</text><text class="breeze-shell-r5" x="0" y="1386.4" textLength="24.4" clip-path="url(#breeze-shell-line-56)">â•─</text><text class="breeze-shell-r5" x="24.4" y="1386.4" textLength="488" clip-path="url(#breeze-shell-line-56)"> Build CI image (before entering shell) </text><text class="breeze-shell-r5" x="512.4" y="1386.4" textLength="927.2" clip-path="url(#breeze-shell-line-56)">─────────────────────────────────────────────────────────────────────────── [...]
</text><text class="breeze-shell-r5" x="0" y="1410.8" textLength="12.2" clip-path="url(#breeze-shell-line-57)">│</text><text class="breeze-shell-r4" x="24.4" y="1410.8" textLength="158.6" clip-path="url(#breeze-shell-line-57)">--force-build</text><text class="breeze-shell-r1" x="341.6" y="1410.8" textLength="707.6" clip-path="url(#breeze-shell-line-57)">Force image build no matter if it is determined as needed.</text><text class="breeze-s [...]
</text><text class="breeze-shell-r5" x="0" y="1435.2" textLength="12.2" clip-path="url(#breeze-shell-line-58)">│</text><text class="breeze-shell-r4" x="24.4" y="1435.2" textLength="122" clip-path="url(#breeze-shell-line-58)">--platform</text><text class="breeze-shell-r1" x="341.6" y="1435.2" textLength="329.4" clip-path="url(#breeze-shell-line-58)">Platform for Airflow image.</text><text class="breeze-shell-r7" x="683.2" y="1435.2" textLength="329.4" clip-path="url(#breeze [...]
-</text><text class="breeze-shell-r5" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">│</text><text class="breeze-shell-r4" x="24.4" y="1459.6" textLength="134.2" clip-path="url(#breeze-shell-line-59)">--image-tag</text><text class="breeze-shell-r1" x="341.6" y="1459.6" textLength="695.4" clip-path="url(#breeze-shell-line-59)">Tag of the image which is used to run the image (implies </text><text class="b [...]
-</text><text class="breeze-shell-r5" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">│</text><text class="breeze-shell-r5" x="341.6" y="1484" textLength="963.8" clip-path="url(#breeze-shell-line-60)">[default: latest]                                          [...]
-</text><text class="breeze-shell-r5" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r4" x="24.4" y="1508.4" textLength="231.8" clip-path="url(#breeze-shell-line-61)">--github-repository</text><text class="breeze-shell-r6" x="292.8" y="1508.4" textLength="24.4" clip-path="url(#breeze-shell-line-61)">-g</text><text class="breeze-shell-r1" x="341.6" y="1508.4" textLength="585.6" clip-path="url(#breeze-shell-line-61)">GitHub r [...]
-</text><text class="breeze-shell-r5" x="0" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">│</text><text class="breeze-shell-r4" x="24.4" y="1532.8" textLength="109.8" clip-path="url(#breeze-shell-line-62)">--builder</text><text class="breeze-shell-r1" x="341.6" y="1532.8" textLength="756.4" clip-path="url(#breeze-shell-line-62)">Buildx builder used to perform `docker buildx build` commands.</text><text class="breeze-shell-r7" x [...]
-</text><text class="breeze-shell-r5" x="0" y="1557.2" textLength="12.2" clip-path="url(#breeze-shell-line-63)">│</text><text class="breeze-shell-r5" x="341.6" y="1557.2" textLength="756.4" clip-path="url(#breeze-shell-line-63)">[default: autodetect]                                        [...]
-</text><text class="breeze-shell-r5" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-shell-line-64)">│</text><text class="breeze-shell-r4" x="24.4" y="1581.6" textLength="97.6" clip-path="url(#breeze-shell-line-64)">--use-uv</text><text class="breeze-shell-r1" x="122" y="1581.6" textLength="12.2" clip-path="url(#breeze-shell-line-64)">/</text><text class="breeze-shell-r4" x="134.2" y="1581.6" textLength="134.2" clip-path="url(#breeze-shell-line-64)">--no-use-uv</text><text clas [...]
-</text><text class="breeze-shell-r5" x="0" y="1606" textLength="12.2" clip-path="url(#breeze-shell-line-65)">│</text><text class="breeze-shell-r4" x="24.4" y="1606" textLength="207.4" clip-path="url(#breeze-shell-line-65)">--uv-http-timeout</text><text class="breeze-shell-r1" x="341.6" y="1606" textLength="829.6" clip-path="url(#breeze-shell-line-65)">Timeout for requests that UV makes (only used in case of UV builds).</text><te [...]
-</text><text class="breeze-shell-r5" x="0" y="1630.4" textLength="12.2" clip-path="url(#breeze-shell-line-66)">│</text><text class="breeze-shell-r5" x="341.6" y="1630.4" textLength="829.6" clip-path="url(#breeze-shell-line-66)">[default: 300; x>=1]                                       [...]
-</text><text class="breeze-shell-r5" x="0" y="1654.8" textLength="1464" clip-path="url(#breeze-shell-line-67)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="1654.8" textLength="12.2" clip-path="url(#breeze-shell-line-67)">
-</text><text class="breeze-shell-r5" x="0" y="1679.2" textLength="24.4" clip-path="url(#breeze-shell-line-68)">â•─</text><text class="breeze-shell-r5" x="24.4" y="1679.2" textLength="414.8" clip-path="url(#breeze-shell-line-68)"> Mounting the sources and volumes </text><text class="breeze-shell-r5" x="439.2" y="1679.2" textLength="1000.4" clip-path="url(#breeze-shell-line-68)">──────────────────────────────────────────────────────────────────────────────────< [...]
-</text><text class="breeze-shell-r5" x="0" y="1703.6" textLength="12.2" clip-path="url(#breeze-shell-line-69)">│</text><text class="breeze-shell-r4" x="24.4" y="1703.6" textLength="183" clip-path="url(#breeze-shell-line-69)">--mount-sources</text><text class="breeze-shell-r1" x="329.4" y="1703.6" textLength="1110.2" clip-path="url(#breeze-shell-line-69)">Choose scope of local sources that should be mounted, skipped, or removed ( [...]
-</text><text class="breeze-shell-r5" x="0" y="1728" textLength="12.2" clip-path="url(#breeze-shell-line-70)">│</text><text class="breeze-shell-r1" x="329.4" y="1728" textLength="1110.2" clip-path="url(#breeze-shell-line-70)">selected).                                            [...]
-</text><text class="breeze-shell-r5" x="0" y="1752.4" textLength="12.2" clip-path="url(#breeze-shell-line-71)">│</text><text class="breeze-shell-r7" x="329.4" y="1752.4" textLength="1110.2" clip-path="url(#breeze-shell-line-71)">(selected | all | skip | remove | tests | providers-and-tests)                         & [...]
-</text><text class="breeze-shell-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-shell-line-72)">│</text><text class="breeze-shell-r5" x="329.4" y="1776.8" textLength="1110.2" clip-path="url(#breeze-shell-line-72)">[default: selected]                                         [...]
-</text><text class="breeze-shell-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-shell-line-73)">│</text><text class="breeze-shell-r4" x="24.4" y="1801.2" textLength="256.2" clip-path="url(#breeze-shell-line-73)">--include-mypy-volume</text><text class="breeze-shell-r1" x="329.4" y="1801.2" textLength="915" clip-path="url(#breeze-shell-line-73)">Whether to include mounting of the mypy volume (useful for debugging mypy). [...]
-</text><text class="breeze-shell-r5" x="0" y="1825.6" textLength="1464" clip-path="url(#breeze-shell-line-74)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="1825.6" textLength="12.2" clip-path="url(#breeze-shell-line-74)">
-</text><text class="breeze-shell-r5" x="0" y="1850" textLength="24.4" clip-path="url(#breeze-shell-line-75)">â•─</text><text class="breeze-shell-r5" x="24.4" y="1850" textLength="512.4" clip-path="url(#breeze-shell-line-75)"> Installing packages after entering shell </text><text class="breeze-shell-r5" x="536.8" y="1850" textLength="902.8" clip-path="url(#breeze-shell-line-75)">──────────────────────────────────────────────────────────────────────────</text>< [...]
-</text><text class="breeze-shell-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-shell-line-76)">│</text><text class="breeze-shell-r4" x="24.4" y="1874.4" textLength="366" clip-path="url(#breeze-shell-line-76)">--airflow-constraints-location</text><text class="breeze-shell-r1" x="756.4" y="1874.4" textLength="683.2" clip-path="url(#breeze-shell-line-76)">Location of airflow constraints to use (remote URL or   </text><te [...]
-</text><text class="breeze-shell-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-shell-line-77)">│</text><text class="breeze-shell-r1" x="756.4" y="1898.8" textLength="683.2" clip-path="url(#breeze-shell-line-77)">local context file).                                    </text><text class [...]
-</text><text class="breeze-shell-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-shell-line-78)">│</text><text class="breeze-shell-r7" x="756.4" y="1923.2" textLength="683.2" clip-path="url(#breeze-shell-line-78)">(TEXT)                                            [...]
-</text><text class="breeze-shell-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-shell-line-79)">│</text><text class="breeze-shell-r4" x="24.4" y="1947.6" textLength="317.2" clip-path="url(#breeze-shell-line-79)">--airflow-constraints-mode</text><text class="breeze-shell-r1" x="756.4" y="1947.6" textLength="683.2" clip-path="url(#breeze-shell-line-79)">Mode of constraints for Airflow for CI image building.  </text><text clas [...]
-</text><text class="breeze-shell-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-shell-line-80)">│</text><text class="breeze-shell-r7" x="756.4" y="1972" textLength="683.2" clip-path="url(#breeze-shell-line-80)">(constraints-source-providers | constraints |           </text><text class="breeze-shell-r5" x="1451.8" y="1972" textLength="12.2" clip-path="url(#breeze-shell-line-80)">│</text><text class="breeze- [...]
-</text><text class="breeze-shell-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-shell-line-81)">│</text><text class="breeze-shell-r7" x="756.4" y="1996.4" textLength="683.2" clip-path="url(#breeze-shell-line-81)">constraints-no-providers)                               </text><text class="breeze-shell-r5" x="1451.8" y="19 [...]
-</text><text class="breeze-shell-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-shell-line-82)">│</text><text class="breeze-shell-r5" x="756.4" y="2020.8" textLength="683.2" clip-path="url(#breeze-shell-line-82)">[default: constraints-source-providers]                 </text><text class="breeze-shell-r5" x="1451.8" y="2020.8" textLength="12.2" clip-path="url(#breeze-shell-line-82)">│< [...]
-</text><text class="breeze-shell-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-shell-line-83)">│</text><text class="breeze-shell-r4" x="24.4" y="2045.2" textLength="378.2" clip-path="url(#breeze-shell-line-83)">--airflow-constraints-reference</text><text class="breeze-shell-r1" x="756.4" y="2045.2" textLength="683.2" clip-path="url(#breeze-shell-line-83)">Constraint reference to use for airflow installation    </text><text [...]
-</text><text class="breeze-shell-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-shell-line-84)">│</text><text class="breeze-shell-r1" x="756.4" y="2069.6" textLength="683.2" clip-path="url(#breeze-shell-line-84)">(used in calculated constraints URL).                   </text><text class="breeze-shell-r5" x="1451.8" y="2069.6" textLength="12.2" clip-path="url(# [...]
-</text><text class="breeze-shell-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-shell-line-85)">│</text><text class="breeze-shell-r7" x="756.4" y="2094" textLength="683.2" clip-path="url(#breeze-shell-line-85)">(TEXT)                                            [...]
-</text><text class="breeze-shell-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-shell-line-86)">│</text><text class="breeze-shell-r4" x="24.4" y="2118.4" textLength="195.2" clip-path="url(#breeze-shell-line-86)">--airflow-extras</text><text class="breeze-shell-r1" x="756.4" y="2118.4" textLength="378.2" clip-path="url(#breeze-shell-line-86)">Airflow extras to install when </text><text class="breeze-shell-r4" x="1134.6" y="2118.4" textLength="256.2" [...]
-</text><text class="breeze-shell-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-shell-line-87)">│</text><text class="breeze-shell-r1" x="756.4" y="2142.8" textLength="683.2" clip-path="url(#breeze-shell-line-87)">used                                           &# [...]
-</text><text class="breeze-shell-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-shell-line-88)">│</text><text class="breeze-shell-r7" x="756.4" y="2167.2" textLength="683.2" clip-path="url(#breeze-shell-line-88)">(TEXT)                                            [...]
-</text><text class="breeze-shell-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-shell-line-89)">│</text><text class="breeze-shell-r5" x="756.4" y="2191.6" textLength="683.2" clip-path="url(#breeze-shell-line-89)">[default: ""]                                       &# [...]
-</text><text class="breeze-shell-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-shell-line-90)">│</text><text class="breeze-shell-r4" x="24.4" y="2216" textLength="317.2" clip-path="url(#breeze-shell-line-90)">--airflow-skip-constraints</text><text class="breeze-shell-r1" x="756.4" y="2216" textLength="573.4" clip-path="url(#breeze-shell-line-90)">Do not use constraints when installing airflow.</text><text class="breeze-shell-r5" x="1451.8" y="2 [...]
-</text><text class="breeze-shell-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-shell-line-91)">│</text><text class="breeze-shell-r4" x="24.4" y="2240.4" textLength="341.6" clip-path="url(#breeze-shell-line-91)">--clean-airflow-installation</text><text class="breeze-shell-r1" x="756.4" y="2240.4" textLength="683.2" clip-path="url(#breeze-shell-line-91)">Clean the airflow installation before installing version</text><text class="breeze-shell-r5 [...]
-</text><text class="breeze-shell-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-shell-line-92)">│</text><text class="breeze-shell-r1" x="756.4" y="2264.8" textLength="158.6" clip-path="url(#breeze-shell-line-92)">specified by </text><text class="breeze-shell-r4" x="915" y="2264.8" textLength="256.2" clip-path="url(#breeze-shell-line-92)">--use-airflow-version</text><text class="breeze-shell-r1" x="1171.2" y="2264.8" textLength="268.4" clip-path="url(#breeze-shell [...]
-</text><text class="breeze-shell-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-shell-line-93)">│</text><text class="breeze-shell-r4" x="24.4" y="2289.2" textLength="244" clip-path="url(#breeze-shell-line-93)">--excluded-providers</text><text class="breeze-shell-r1" x="756.4" y="2289.2" textLength="683.2" clip-path="url(#breeze-shell-line-93)">JSON-string of dictionary containing excluded providers </text><text class="breeze-shell-r5" x="1451. [...]
-</text><text class="breeze-shell-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-shell-line-94)">│</text><text class="breeze-shell-r1" x="756.4" y="2313.6" textLength="683.2" clip-path="url(#breeze-shell-line-94)">per python version ({'3.12': ['provider']})             </text><text class="breeze-shell-r5" x="1451.8" y="2313.6" textLength="12.2" clip-path="url(#breeze-she [...]
-</text><text class="breeze-shell-r5" x="0" y="2338" textLength="12.2" clip-path="url(#breeze-shell-line-95)">│</text><text class="breeze-shell-r7" x="756.4" y="2338" textLength="683.2" clip-path="url(#breeze-shell-line-95)">(TEXT)                                            [...]
-</text><text class="breeze-shell-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-shell-line-96)">│</text><text class="breeze-shell-r4" x="24.4" y="2362.4" textLength="329.4" clip-path="url(#breeze-shell-line-96)">--force-lowest-dependencies</text><text class="breeze-shell-r1" x="756.4" y="2362.4" textLength="683.2" clip-path="url(#breeze-shell-line-96)">Run tests for the lowest direct dependencies of Airflow </text><text class="b [...]
-</text><text class="breeze-shell-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-shell-line-97)">│</text><text class="breeze-shell-r1" x="756.4" y="2386.8" textLength="683.2" clip-path="url(#breeze-shell-line-97)">or selected provider if `Provider[PROVIDER_ID]` is used </text><text class="breeze-shell-r5" x="1451.8" y="2386.8" textLength="12.2" clip-path="url(#breeze-shell-line-97)">│</text><text class="breeze-shell-r1" x="1464" y="2386.8" [...]
-</text><text class="breeze-shell-r5" x="0" y="2411.2" textLength="12.2" clip-path="url(#breeze-shell-line-98)">│</text><text class="breeze-shell-r1" x="756.4" y="2411.2" textLength="683.2" clip-path="url(#breeze-shell-line-98)">as test type.                                        & [...]
-</text><text class="breeze-shell-r5" x="0" y="2435.6" textLength="12.2" clip-path="url(#breeze-shell-line-99)">│</text><text class="breeze-shell-r4" x="24.4" y="2435.6" textLength="414.8" clip-path="url(#breeze-shell-line-99)">--install-airflow-with-constraints</text><text class="breeze-shell-r1" x="439.2" y="2435.6" textLength="12.2" clip-path="url(#breeze-shell-line-99)">/</text><text class="breeze-shell-r4" x="451.4" y="2435.6" textLength="256.2" clip-path="url(#breeze-shell-line-99)" [...]
-</text><text class="breeze-shell-r5" x="0" y="2460" textLength="12.2" clip-path="url(#breeze-shell-line-100)">│</text><text class="breeze-shell-r1" x="756.4" y="2460" textLength="683.2" clip-path="url(#breeze-shell-line-100)">determined from package or airflow version.             </text><text class="breeze-shell-r5" x="1451.8" y="2460" textLength="12.2" clip-path="url(#breeze-shell-line-100)">│</te [...]
-</text><text class="breeze-shell-r5" x="0" y="2484.4" textLength="12.2" clip-path="url(#breeze-shell-line-101)">│</text><text class="breeze-shell-r5" x="756.4" y="2484.4" textLength="683.2" clip-path="url(#breeze-shell-line-101)">[default: install-airflow-with-constraints]             </text><text class="breeze-shell-r5" x="1451.8" y="2484.4" textLength="12.2" clip-path="url(#breeze-shell-line-101)">│</text><text class [...]
-</text><text class="breeze-shell-r5" x="0" y="2508.8" textLength="12.2" clip-path="url(#breeze-shell-line-102)">│</text><text class="breeze-shell-r4" x="24.4" y="2508.8" textLength="341.6" clip-path="url(#breeze-shell-line-102)">--install-selected-providers</text><text class="breeze-shell-r1" x="756.4" y="2508.8" textLength="683.2" clip-path="url(#breeze-shell-line-102)">Comma-separated list of providers selected to be       [...]
-</text><text class="breeze-shell-r5" x="0" y="2533.2" textLength="12.2" clip-path="url(#breeze-shell-line-103)">│</text><text class="breeze-shell-r1" x="756.4" y="2533.2" textLength="231.8" clip-path="url(#breeze-shell-line-103)">installed (implies </text><text class="breeze-shell-r4" x="988.2" y="2533.2" textLength="292.8" clip-path="url(#breeze-shell-line-103)">--use-packages-from-dist</text><text class="breeze-shell-r1" x="1281" y="2533.2" textLength="158.6" clip-path="url(# [...]
-</text><text class="breeze-shell-r5" x="0" y="2557.6" textLength="12.2" clip-path="url(#breeze-shell-line-104)">│</text><text class="breeze-shell-r7" x="756.4" y="2557.6" textLength="683.2" clip-path="url(#breeze-shell-line-104)">(TEXT)                                           [...]
-</text><text class="breeze-shell-r5" x="0" y="2582" textLength="12.2" clip-path="url(#breeze-shell-line-105)">│</text><text class="breeze-shell-r4" x="24.4" y="2582" textLength="195.2" clip-path="url(#breeze-shell-line-105)">--package-format</text><text class="breeze-shell-r1" x="756.4" y="2582" textLength="658.8" clip-path="url(#breeze-shell-line-105)">Format of packages that should be installed from dist.</text><text class="breeze-shell-r5" x="14 [...]
-</text><text class="breeze-shell-r5" x="0" y="2606.4" textLength="12.2" clip-path="url(#breeze-shell-line-106)">│</text><text class="breeze-shell-r7" x="756.4" y="2606.4" textLength="658.8" clip-path="url(#breeze-shell-line-106)">(wheel | sdist)                                       </t [...]
-</text><text class="breeze-shell-r5" x="0" y="2630.8" textLength="12.2" clip-path="url(#breeze-shell-line-107)">│</text><text class="breeze-shell-r5" x="756.4" y="2630.8" textLength="658.8" clip-path="url(#breeze-shell-line-107)">[default: wheel]                                      </text><text [...]
-</text><text class="breeze-shell-r5" x="0" y="2655.2" textLength="12.2" clip-path="url(#breeze-shell-line-108)">│</text><text class="breeze-shell-r4" x="24.4" y="2655.2" textLength="390.4" clip-path="url(#breeze-shell-line-108)">--providers-constraints-location</text><text class="breeze-shell-r1" x="756.4" y="2655.2" textLength="683.2" clip-path="url(#breeze-shell-line-108)">Location of providers constraints to use (remote URL or </text><text [...]
-</text><text class="breeze-shell-r5" x="0" y="2679.6" textLength="12.2" clip-path="url(#breeze-shell-line-109)">│</text><text class="breeze-shell-r1" x="756.4" y="2679.6" textLength="683.2" clip-path="url(#breeze-shell-line-109)">local context file).                                    </text><text cla [...]
-</text><text class="breeze-shell-r5" x="0" y="2704" textLength="12.2" clip-path="url(#breeze-shell-line-110)">│</text><text class="breeze-shell-r7" x="756.4" y="2704" textLength="683.2" clip-path="url(#breeze-shell-line-110)">(TEXT)                                           &# [...]
-</text><text class="breeze-shell-r5" x="0" y="2728.4" textLength="12.2" clip-path="url(#breeze-shell-line-111)">│</text><text class="breeze-shell-r4" x="24.4" y="2728.4" textLength="341.6" clip-path="url(#breeze-shell-line-111)">--providers-constraints-mode</text><text class="breeze-shell-r1" x="756.4" y="2728.4" textLength="683.2" clip-path="url(#breeze-shell-line-111)">Mode of constraints for Providers for CI image building.</text><text class="br [...]
-</text><text class="breeze-shell-r5" x="0" y="2752.8" textLength="12.2" clip-path="url(#breeze-shell-line-112)">│</text><text class="breeze-shell-r7" x="756.4" y="2752.8" textLength="683.2" clip-path="url(#breeze-shell-line-112)">(constraints-source-providers | constraints |           </text><text class="breeze-shell-r5" x="1451.8" y="2752.8" textLength="12.2" clip-path="url(#breeze-shell-line-112)">│</text><text class [...]
-</text><text class="breeze-shell-r5" x="0" y="2777.2" textLength="12.2" clip-path="url(#breeze-shell-line-113)">│</text><text class="breeze-shell-r7" x="756.4" y="2777.2" textLength="683.2" clip-path="url(#breeze-shell-line-113)">constraints-no-providers)                               </text><text class="breeze-shell-r5" x="1451.8" y=" [...]
-</text><text class="breeze-shell-r5" x="0" y="2801.6" textLength="12.2" clip-path="url(#breeze-shell-line-114)">│</text><text class="breeze-shell-r5" x="756.4" y="2801.6" textLength="683.2" clip-path="url(#breeze-shell-line-114)">[default: constraints-source-providers]                 </text><text class="breeze-shell-r5" x="1451.8" y="2801.6" textLength="12.2" clip-path="url(#breeze-shell-line-114)" [...]
-</text><text class="breeze-shell-r5" x="0" y="2826" textLength="12.2" clip-path="url(#breeze-shell-line-115)">│</text><text class="breeze-shell-r4" x="24.4" y="2826" textLength="402.6" clip-path="url(#breeze-shell-line-115)">--providers-constraints-reference</text><text class="breeze-shell-r1" x="756.4" y="2826" textLength="683.2" clip-path="url(#breeze-shell-line-115)">Constraint reference to use for providers installation  </text><text class="bre [...]
-</text><text class="breeze-shell-r5" x="0" y="2850.4" textLength="12.2" clip-path="url(#breeze-shell-line-116)">│</text><text class="breeze-shell-r1" x="756.4" y="2850.4" textLength="683.2" clip-path="url(#breeze-shell-line-116)">(used in calculated constraints URL). Can be 'default'  </text><text class="breeze-shell-r5" x="1451.8" y="2850.4" textLength="12.2" clip-path="url(#breeze-shell-line-116)">│</text><text class="breeze-shell- [...]
-</text><text class="breeze-shell-r5" x="0" y="2874.8" textLength="12.2" clip-path="url(#breeze-shell-line-117)">│</text><text class="breeze-shell-r1" x="756.4" y="2874.8" textLength="683.2" clip-path="url(#breeze-shell-line-117)">in which case the default constraints-reference is used.</text><text class="breeze-shell-r5" x="1451.8" y="2874.8" textLength="12.2" clip-path="url(#breeze-shell-line-117)">│</text><text class="breeze-shell-r1" x="1464" y="2874 [...]
-</text><text class="breeze-shell-r5" x="0" y="2899.2" textLength="12.2" clip-path="url(#breeze-shell-line-118)">│</text><text class="breeze-shell-r7" x="756.4" y="2899.2" textLength="683.2" clip-path="url(#breeze-shell-line-118)">(TEXT)                                           [...]
-</text><text class="breeze-shell-r5" x="0" y="2923.6" textLength="12.2" clip-path="url(#breeze-shell-line-119)">│</text><text class="breeze-shell-r4" x="24.4" y="2923.6" textLength="341.6" clip-path="url(#breeze-shell-line-119)">--providers-skip-constraints</text><text class="breeze-shell-r1" x="756.4" y="2923.6" textLength="597.8" clip-path="url(#breeze-shell-line-119)">Do not use constraints when installing providers.</text><text class="breeze-shell-r5" x= [...]
-</text><text class="breeze-shell-r5" x="0" y="2948" textLength="12.2" clip-path="url(#breeze-shell-line-120)">│</text><text class="breeze-shell-r4" x="24.4" y="2948" textLength="256.2" clip-path="url(#breeze-shell-line-120)">--use-airflow-version</text><text class="breeze-shell-r1" x="756.4" y="2948" textLength="683.2" clip-path="url(#breeze-shell-line-120)">Use (reinstall at entry) Airflow version from PyPI. It  </text><text class="breez [...]
-</text><text class="breeze-shell-r5" x="0" y="2972.4" textLength="12.2" clip-path="url(#breeze-shell-line-121)">│</text><text class="breeze-shell-r1" x="756.4" y="2972.4" textLength="683.2" clip-path="url(#breeze-shell-line-121)">can also be version (to install from PyPI), `none`,     </text><text class="breeze-shell-r5" x="1451.8" y="2972.4" textLength="12.2" clip-path="url(#breeze-shell-line-121)">│</text><text class="bre [...]
-</text><text class="breeze-shell-r5" x="0" y="2996.8" textLength="12.2" clip-path="url(#breeze-shell-line-122)">│</text><text class="breeze-shell-r1" x="756.4" y="2996.8" textLength="683.2" clip-path="url(#breeze-shell-line-122)">`wheel`, or `sdist` to install from `dist` folder, or   </text><text class="breeze-shell-r5" x="1451.8" y="2996.8" textLength="12.2" clip-path="url(#breeze-shell-line-122)">│</text><text class="breeze-shell- [...]
-</text><text class="breeze-shell-r5" x="0" y="3021.2" textLength="12.2" clip-path="url(#breeze-shell-line-123)">│</text><text class="breeze-shell-r1" x="756.4" y="3021.2" textLength="683.2" clip-path="url(#breeze-shell-line-123)">VCS URL to install from                                 </text><text class="b [...]
-</text><text class="breeze-shell-r5" x="0" y="3045.6" textLength="12.2" clip-path="url(#breeze-shell-line-124)">│</text><text class="breeze-shell-r1" x="756.4" y="3045.6" textLength="683.2" clip-path="url(#breeze-shell-line-124)">(https://pip.pypa.io/en/stable/topics/vcs-support/).    </text><text class="breeze-shell-r5" x="1451.8" y="3045.6" textLength="12.2" clip-path="url(#breeze-shell-line-124)">│</text><text class="breeze-shell-r1" x="1464" y="3045.6" textLength= [...]
-</text><text class="breeze-shell-r5" x="0" y="3070" textLength="12.2" clip-path="url(#breeze-shell-line-125)">│</text><text class="breeze-shell-r1" x="756.4" y="3070" textLength="97.6" clip-path="url(#breeze-shell-line-125)">Implies </text><text class="breeze-shell-r4" x="854" y="3070" textLength="183" clip-path="url(#breeze-shell-line-125)">--mount-sources</text><text class="breeze-shell-r1" x="1037" y="3070" textLength="402.6" clip-path="url(#breeze-shell-line-125)"> `remove` [...]
-</text><text class="breeze-shell-r5" x="0" y="3094.4" textLength="12.2" clip-path="url(#breeze-shell-line-126)">│</text><text class="breeze-shell-r7" x="756.4" y="3094.4" textLength="683.2" clip-path="url(#breeze-shell-line-126)">(none | wheel | sdist | <airflow_version>)              </text><text class="breeze-shell-r5" x="1451.8" y="3094.4" textLength="12.2" clip-path="url(#breeze- [...]
-</text><text class="breeze-shell-r5" x="0" y="3118.8" textLength="12.2" clip-path="url(#breeze-shell-line-127)">│</text><text class="breeze-shell-r4" x="24.4" y="3118.8" textLength="292.8" clip-path="url(#breeze-shell-line-127)">--use-packages-from-dist</text><text class="breeze-shell-r1" x="756.4" y="3118.8" textLength="341.6" clip-path="url(#breeze-shell-line-127)">Install all found packages (</text><text class="breeze-shell-r4" x="1098" y="3118.8" textLength="195.2 [...]
-</text><text class="breeze-shell-r5" x="0" y="3143.2" textLength="12.2" clip-path="url(#breeze-shell-line-128)">│</text><text class="breeze-shell-r1" x="756.4" y="3143.2" textLength="683.2" clip-path="url(#breeze-shell-line-128)">type) from 'dist' folder when entering breeze.          </text><text class="breeze-shell-r5" x="1451.8" y="3143.2" textLength="12.2" clip-path="url(#breeze-shell-line-128)" [...]
-</text><text class="breeze-shell-r5" x="0" y="3167.6" textLength="12.2" clip-path="url(#breeze-shell-line-129)">│</text><text class="breeze-shell-r4" x="24.4" y="3167.6" textLength="378.2" clip-path="url(#breeze-shell-line-129)">--install-airflow-python-client</text><text class="breeze-shell-r1" x="756.4" y="3167.6" textLength="488" clip-path="url(#breeze-shell-line-129)">Install airflow python client packages (</text><text class="breeze-shell-r4" x="1244.4" y="3 [...]
-</text><text class="breeze-shell-r5" x="0" y="3192" textLength="12.2" clip-path="url(#breeze-shell-line-130)">│</text><text class="breeze-shell-r1" x="756.4" y="3192" textLength="683.2" clip-path="url(#breeze-shell-line-130)">determines type) from 'dist' folder when entering       </text><text class="breeze-shell-r5" x="1451.8" y="3192" textLength="12.2" clip-path="url(#breeze-shell-line-130)">│</text><text class= [...]
-</text><text class="breeze-shell-r5" x="0" y="3216.4" textLength="12.2" clip-path="url(#breeze-shell-line-131)">│</text><text class="breeze-shell-r1" x="756.4" y="3216.4" textLength="683.2" clip-path="url(#breeze-shell-line-131)">breeze.                                           [...]
-</text><text class="breeze-shell-r5" x="0" y="3240.8" textLength="1464" clip-path="url(#breeze-shell-line-132)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="3240.8" textLength="12.2" clip-path="url(#breeze-shell-line-132)">
-</text><text class="breeze-shell-r5" x="0" y="3265.2" textLength="24.4" clip-path="url(#breeze-shell-line-133)">â•─</text><text class="breeze-shell-r5" x="24.4" y="3265.2" textLength="610" clip-path="url(#breeze-shell-line-133)"> Upgrading/downgrading/removing selected packages </text><text class="breeze-shell-r5" x="634.4" y="3265.2" textLength="805.2" clip-path="url(#breeze-shell-line-133)">──────────────────────────────────────────────────────────────────</text><tex [...]
-</text><text class="breeze-shell-r5" x="0" y="3289.6" textLength="12.2" clip-path="url(#breeze-shell-line-134)">│</text><text class="breeze-shell-r4" x="24.4" y="3289.6" textLength="170.8" clip-path="url(#breeze-shell-line-134)">--upgrade-boto</text><text class="breeze-shell-r1" x="341.6" y="3289.6" textLength="866.2" clip-path="url(#breeze-shell-line-134)">Remove aiobotocore and upgrade botocore and boto to the latest version.</text><tex [...]
-</text><text class="breeze-shell-r5" x="0" y="3314" textLength="12.2" clip-path="url(#breeze-shell-line-135)">│</text><text class="breeze-shell-r4" x="24.4" y="3314" textLength="268.4" clip-path="url(#breeze-shell-line-135)">--downgrade-sqlalchemy</text><text class="breeze-shell-r1" x="341.6" y="3314" textLength="610" clip-path="url(#breeze-shell-line-135)">Downgrade SQLAlchemy to minimum supported version.</text><text class="breeze-shell-r5" x="1451.8" y="3314" [...]
-</text><text class="breeze-shell-r5" x="0" y="3338.4" textLength="12.2" clip-path="url(#breeze-shell-line-136)">│</text><text class="breeze-shell-r4" x="24.4" y="3338.4" textLength="244" clip-path="url(#breeze-shell-line-136)">--downgrade-pendulum</text><text class="breeze-shell-r1" x="341.6" y="3338.4" textLength="585.6" clip-path="url(#breeze-shell-line-136)">Downgrade Pendulum to minimum supported version.</text><text class="breeze-shell-r5" x="1451.8" y="3338 [...]
-</text><text class="breeze-shell-r5" x="0" y="3362.8" textLength="1464" clip-path="url(#breeze-shell-line-137)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="3362.8" textLength="12.2" clip-path="url(#breeze-shell-line-137)">
-</text><text class="breeze-shell-r5" x="0" y="3387.2" textLength="24.4" clip-path="url(#breeze-shell-line-138)">â•─</text><text class="breeze-shell-r5" x="24.4" y="3387.2" textLength="183" clip-path="url(#breeze-shell-line-138)"> DB test flags </text><text class="breeze-shell-r5" x="207.4" y="3387.2" textLength="1232.2" clip-path="url(#breeze-shell-line-138)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><te [...]
-</text><text class="breeze-shell-r5" x="0" y="3411.6" textLength="12.2" clip-path="url(#breeze-shell-line-139)">│</text><text class="breeze-shell-r4" x="24.4" y="3411.6" textLength="231.8" clip-path="url(#breeze-shell-line-139)">--run-db-tests-only</text><text class="breeze-shell-r1" x="305" y="3411.6" textLength="475.8" clip-path="url(#breeze-shell-line-139)">Only runs tests that require a database</text><text class="breeze-shell-r5" x="1451.8" y="3411.6" t [...]
-</text><text class="breeze-shell-r5" x="0" y="3436" textLength="12.2" clip-path="url(#breeze-shell-line-140)">│</text><text class="breeze-shell-r4" x="24.4" y="3436" textLength="183" clip-path="url(#breeze-shell-line-140)">--skip-db-tests</text><text class="breeze-shell-r1" x="305" y="3436" textLength="414.8" clip-path="url(#breeze-shell-line-140)">Skip tests that require a database</text><text class="breeze-shell-r5" x="1451.8" y="3436" textLength="12.2" clip-pa [...]
-</text><text class="breeze-shell-r5" x="0" y="3460.4" textLength="1464" clip-path="url(#breeze-shell-line-141)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="3460.4" textLength="12.2" clip-path="url(#breeze-shell-line-141)">
-</text><text class="breeze-shell-r5" x="0" y="3484.8" textLength="24.4" clip-path="url(#breeze-shell-line-142)">â•─</text><text class="breeze-shell-r5" x="24.4" y="3484.8" textLength="183" clip-path="url(#breeze-shell-line-142)"> Other options </text><text class="breeze-shell-r5" x="207.4" y="3484.8" textLength="1232.2" clip-path="url(#breeze-shell-line-142)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text cl [...]
-</text><text class="breeze-shell-r5" x="0" y="3509.2" textLength="12.2" clip-path="url(#breeze-shell-line-143)">│</text><text class="breeze-shell-r4" x="24.4" y="3509.2" textLength="256.2" clip-path="url(#breeze-shell-line-143)">--forward-credentials</text><text class="breeze-shell-r6" x="305" y="3509.2" textLength="24.4" clip-path="url(#breeze-shell-line-143)">-f</text><text class="breeze-shell-r1" x="353.8" y="3509.2" textLength="634.4" clip-path="url(#breeze-shell-line-143)">Forward&# [...]
-</text><text class="breeze-shell-r5" x="0" y="3533.6" textLength="12.2" clip-path="url(#breeze-shell-line-144)">│</text><text class="breeze-shell-r4" x="24.4" y="3533.6" textLength="122" clip-path="url(#breeze-shell-line-144)">--max-time</text><text class="breeze-shell-r1" x="353.8" y="3533.6" textLength="1049.2" clip-path="url(#breeze-shell-line-144)">Maximum time that the command should take - if it takes longer, the comm [...]
-</text><text class="breeze-shell-r5" x="0" y="3558" textLength="12.2" clip-path="url(#breeze-shell-line-145)">│</text><text class="breeze-shell-r7" x="353.8" y="3558" textLength="1049.2" clip-path="url(#breeze-shell-line-145)">(INTEGER RANGE)                                          [...]
-</text><text class="breeze-shell-r5" x="0" y="3582.4" textLength="12.2" clip-path="url(#breeze-shell-line-146)">│</text><text class="breeze-shell-r4" x="24.4" y="3582.4" textLength="219.6" clip-path="url(#breeze-shell-line-146)">--verbose-commands</text><text class="breeze-shell-r1" x="353.8" y="3582.4" textLength="414.8" clip-path="url(#breeze-shell-line-146)">Show details of commands executed.</text><text class="breeze-shell-r5" x="1451.8" y="3582.4" textLength="12. [...]
-</text><text class="breeze-shell-r5" x="0" y="3606.8" textLength="12.2" clip-path="url(#breeze-shell-line-147)">│</text><text class="breeze-shell-r4" x="24.4" y="3606.8" textLength="244" clip-path="url(#breeze-shell-line-147)">--keep-env-variables</text><text class="breeze-shell-r1" x="353.8" y="3606.8" textLength="1000.4" clip-path="url(#breeze-shell-line-147)">Do not clear environment variables that might have side effect while run [...]
-</text><text class="breeze-shell-r5" x="0" y="3631.2" textLength="12.2" clip-path="url(#breeze-shell-line-148)">│</text><text class="breeze-shell-r4" x="24.4" y="3631.2" textLength="183" clip-path="url(#breeze-shell-line-148)">--no-db-cleanup</text><text class="breeze-shell-r1" x="353.8" y="3631.2" textLength="597.8" clip-path="url(#breeze-shell-line-148)">Do not clear the database before each test module</text><text class="breeze-shell-r5" x="1451 [...]
-</text><text class="breeze-shell-r5" x="0" y="3655.6" textLength="1464" clip-path="url(#breeze-shell-line-149)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="3655.6" textLength="12.2" clip-path="url(#breeze-shell-line-149)">
-</text><text class="breeze-shell-r5" x="0" y="3680" textLength="24.4" clip-path="url(#breeze-shell-line-150)">â•─</text><text class="breeze-shell-r5" x="24.4" y="3680" textLength="195.2" clip-path="url(#breeze-shell-line-150)"> Common options </text><text class="breeze-shell-r5" x="219.6" y="3680" textLength="1220" clip-path="url(#breeze-shell-line-150)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="b [...]
-</text><text class="breeze-shell-r5" x="0" y="3704.4" textLength="12.2" clip-path="url(#breeze-shell-line-151)">│</text><text class="breeze-shell-r4" x="24.4" y="3704.4" textLength="97.6" clip-path="url(#breeze-shell-line-151)">--answer</text><text class="breeze-shell-r6" x="158.6" y="3704.4" textLength="24.4" clip-path="url(#breeze-shell-line-151)">-a</text><text class="breeze-shell-r1" x="207.4" y="3704.4" textLength="317.2" clip-path="url(#breeze-shell-line-151)">Force answer [...]
-</text><text class="breeze-shell-r5" x="0" y="3728.8" textLength="12.2" clip-path="url(#breeze-shell-line-152)">│</text><text class="breeze-shell-r4" x="24.4" y="3728.8" textLength="109.8" clip-path="url(#breeze-shell-line-152)">--dry-run</text><text class="breeze-shell-r6" x="158.6" y="3728.8" textLength="24.4" clip-path="url(#breeze-shell-line-152)">-D</text><text class="breeze-shell-r1" x="207.4" y="3728.8" textLength="719.8" clip-path="url(#breeze-shell-line-152)">If dry-run [...]
-</text><text class="breeze-shell-r5" x="0" y="3753.2" textLength="12.2" clip-path="url(#breeze-shell-line-153)">│</text><text class="breeze-shell-r4" x="24.4" y="3753.2" textLength="109.8" clip-path="url(#breeze-shell-line-153)">--verbose</text><text class="breeze-shell-r6" x="158.6" y="3753.2" textLength="24.4" clip-path="url(#breeze-shell-line-153)">-v</text><text class="breeze-shell-r1" x="207.4" y="3753.2" textLength="585.6" clip-path="url(#breeze-shell-line-153)">Print verbose& [...]
-</text><text class="breeze-shell-r5" x="0" y="3777.6" textLength="12.2" clip-path="url(#breeze-shell-line-154)">│</text><text class="breeze-shell-r4" x="24.4" y="3777.6" textLength="73.2" clip-path="url(#breeze-shell-line-154)">--help</text><text class="breeze-shell-r6" x="158.6" y="3777.6" textLength="24.4" clip-path="url(#breeze-shell-line-154)">-h</text><text class="breeze-shell-r1" x="207.4" y="3777.6" textLength="329.4" clip-path="url(#breeze-shell-line-154)">Show this mes [...]
-</text><text class="breeze-shell-r5" x="0" y="3802" textLength="1464" clip-path="url(#breeze-shell-line-155)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="3802" textLength="12.2" clip-path="url(#breeze-shell-line-155)">
+</text><text class="breeze-shell-r5" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">│</text><text class="breeze-shell-r4" x="24.4" y="1459.6" textLength="231.8" clip-path="url(#breeze-shell-line-59)">--github-repository</text><text class="breeze-shell-r6" x="292.8" y="1459.6" textLength="24.4" clip-path="url(#breeze-shell-line-59)">-g</text><text class="breeze-shell-r1" x="341.6" y="1459.6" textLength="585.6" clip-path="url(#breeze-shell-line-59)">GitHub r [...]
+</text><text class="breeze-shell-r5" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">│</text><text class="breeze-shell-r4" x="24.4" y="1484" textLength="109.8" clip-path="url(#breeze-shell-line-60)">--builder</text><text class="breeze-shell-r1" x="341.6" y="1484" textLength="756.4" clip-path="url(#breeze-shell-line-60)">Buildx builder used to perform `docker buildx build` commands.</text><text class="breeze-shell-r7" x="1110 [...]
+</text><text class="breeze-shell-r5" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r5" x="341.6" y="1508.4" textLength="756.4" clip-path="url(#breeze-shell-line-61)">[default: autodetect]                                        [...]
+</text><text class="breeze-shell-r5" x="0" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">│</text><text class="breeze-shell-r4" x="24.4" y="1532.8" textLength="97.6" clip-path="url(#breeze-shell-line-62)">--use-uv</text><text class="breeze-shell-r1" x="122" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">/</text><text class="breeze-shell-r4" x="134.2" y="1532.8" textLength="134.2" clip-path="url(#breeze-shell-line-62)">--no-use-uv</text><text clas [...]
+</text><text class="breeze-shell-r5" x="0" y="1557.2" textLength="12.2" clip-path="url(#breeze-shell-line-63)">│</text><text class="breeze-shell-r4" x="24.4" y="1557.2" textLength="207.4" clip-path="url(#breeze-shell-line-63)">--uv-http-timeout</text><text class="breeze-shell-r1" x="341.6" y="1557.2" textLength="829.6" clip-path="url(#breeze-shell-line-63)">Timeout for requests that UV makes (only used in case of UV builds).</te [...]
+</text><text class="breeze-shell-r5" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-shell-line-64)">│</text><text class="breeze-shell-r5" x="341.6" y="1581.6" textLength="829.6" clip-path="url(#breeze-shell-line-64)">[default: 300; x>=1]                                       [...]
+</text><text class="breeze-shell-r5" x="0" y="1606" textLength="1464" clip-path="url(#breeze-shell-line-65)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="1606" textLength="12.2" clip-path="url(#breeze-shell-line-65)">
+</text><text class="breeze-shell-r5" x="0" y="1630.4" textLength="24.4" clip-path="url(#breeze-shell-line-66)">â•─</text><text class="breeze-shell-r5" x="24.4" y="1630.4" textLength="414.8" clip-path="url(#breeze-shell-line-66)"> Mounting the sources and volumes </text><text class="breeze-shell-r5" x="439.2" y="1630.4" textLength="1000.4" clip-path="url(#breeze-shell-line-66)">──────────────────────────────────────────────────────────────────────────────────< [...]
+</text><text class="breeze-shell-r5" x="0" y="1654.8" textLength="12.2" clip-path="url(#breeze-shell-line-67)">│</text><text class="breeze-shell-r4" x="24.4" y="1654.8" textLength="183" clip-path="url(#breeze-shell-line-67)">--mount-sources</text><text class="breeze-shell-r1" x="329.4" y="1654.8" textLength="1110.2" clip-path="url(#breeze-shell-line-67)">Choose scope of local sources that should be mounted, skipped, or removed ( [...]
+</text><text class="breeze-shell-r5" x="0" y="1679.2" textLength="12.2" clip-path="url(#breeze-shell-line-68)">│</text><text class="breeze-shell-r1" x="329.4" y="1679.2" textLength="1110.2" clip-path="url(#breeze-shell-line-68)">selected).                                          & [...]
+</text><text class="breeze-shell-r5" x="0" y="1703.6" textLength="12.2" clip-path="url(#breeze-shell-line-69)">│</text><text class="breeze-shell-r7" x="329.4" y="1703.6" textLength="1110.2" clip-path="url(#breeze-shell-line-69)">(selected | all | skip | remove | tests | providers-and-tests)                         & [...]
+</text><text class="breeze-shell-r5" x="0" y="1728" textLength="12.2" clip-path="url(#breeze-shell-line-70)">│</text><text class="breeze-shell-r5" x="329.4" y="1728" textLength="1110.2" clip-path="url(#breeze-shell-line-70)">[default: selected]                                         [...]
+</text><text class="breeze-shell-r5" x="0" y="1752.4" textLength="12.2" clip-path="url(#breeze-shell-line-71)">│</text><text class="breeze-shell-r4" x="24.4" y="1752.4" textLength="256.2" clip-path="url(#breeze-shell-line-71)">--include-mypy-volume</text><text class="breeze-shell-r1" x="329.4" y="1752.4" textLength="915" clip-path="url(#breeze-shell-line-71)">Whether to include mounting of the mypy volume (useful for debugging mypy). [...]
+</text><text class="breeze-shell-r5" x="0" y="1776.8" textLength="1464" clip-path="url(#breeze-shell-line-72)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="1776.8" textLength="12.2" clip-path="url(#breeze-shell-line-72)">
+</text><text class="breeze-shell-r5" x="0" y="1801.2" textLength="24.4" clip-path="url(#breeze-shell-line-73)">â•─</text><text class="breeze-shell-r5" x="24.4" y="1801.2" textLength="512.4" clip-path="url(#breeze-shell-line-73)"> Installing packages after entering shell </text><text class="breeze-shell-r5" x="536.8" y="1801.2" textLength="902.8" clip-path="url(#breeze-shell-line-73)">──────────────────────────────────────────────────────────────────────────</ [...]
+</text><text class="breeze-shell-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-shell-line-74)">│</text><text class="breeze-shell-r4" x="24.4" y="1825.6" textLength="366" clip-path="url(#breeze-shell-line-74)">--airflow-constraints-location</text><text class="breeze-shell-r1" x="756.4" y="1825.6" textLength="683.2" clip-path="url(#breeze-shell-line-74)">Location of airflow constraints to use (remote URL or   </text><te [...]
+</text><text class="breeze-shell-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-shell-line-75)">│</text><text class="breeze-shell-r1" x="756.4" y="1850" textLength="683.2" clip-path="url(#breeze-shell-line-75)">local context file).                                    </text><text class="br [...]
+</text><text class="breeze-shell-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-shell-line-76)">│</text><text class="breeze-shell-r7" x="756.4" y="1874.4" textLength="683.2" clip-path="url(#breeze-shell-line-76)">(TEXT)                                            [...]
+</text><text class="breeze-shell-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-shell-line-77)">│</text><text class="breeze-shell-r4" x="24.4" y="1898.8" textLength="317.2" clip-path="url(#breeze-shell-line-77)">--airflow-constraints-mode</text><text class="breeze-shell-r1" x="756.4" y="1898.8" textLength="683.2" clip-path="url(#breeze-shell-line-77)">Mode of constraints for Airflow for CI image building.  </text><text clas [...]
+</text><text class="breeze-shell-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-shell-line-78)">│</text><text class="breeze-shell-r7" x="756.4" y="1923.2" textLength="683.2" clip-path="url(#breeze-shell-line-78)">(constraints-source-providers | constraints |           </text><text class="breeze-shell-r5" x="1451.8" y="1923.2" textLength="12.2" clip-path="url(#breeze-shell-line-78)">│</text><text class="b [...]
+</text><text class="breeze-shell-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-shell-line-79)">│</text><text class="breeze-shell-r7" x="756.4" y="1947.6" textLength="683.2" clip-path="url(#breeze-shell-line-79)">constraints-no-providers)                               </text><text class="breeze-shell-r5" x="1451.8" y="19 [...]
+</text><text class="breeze-shell-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-shell-line-80)">│</text><text class="breeze-shell-r5" x="756.4" y="1972" textLength="683.2" clip-path="url(#breeze-shell-line-80)">[default: constraints-source-providers]                 </text><text class="breeze-shell-r5" x="1451.8" y="1972" textLength="12.2" clip-path="url(#breeze-shell-line-80)">│</text> [...]
+</text><text class="breeze-shell-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-shell-line-81)">│</text><text class="breeze-shell-r4" x="24.4" y="1996.4" textLength="378.2" clip-path="url(#breeze-shell-line-81)">--airflow-constraints-reference</text><text class="breeze-shell-r1" x="756.4" y="1996.4" textLength="683.2" clip-path="url(#breeze-shell-line-81)">Constraint reference to use for airflow installation    </text><text [...]
+</text><text class="breeze-shell-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-shell-line-82)">│</text><text class="breeze-shell-r1" x="756.4" y="2020.8" textLength="683.2" clip-path="url(#breeze-shell-line-82)">(used in calculated constraints URL).                   </text><text class="breeze-shell-r5" x="1451.8" y="2020.8" textLength="12.2" clip-path="url(# [...]
+</text><text class="breeze-shell-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-shell-line-83)">│</text><text class="breeze-shell-r7" x="756.4" y="2045.2" textLength="683.2" clip-path="url(#breeze-shell-line-83)">(TEXT)                                            [...]
+</text><text class="breeze-shell-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-shell-line-84)">│</text><text class="breeze-shell-r4" x="24.4" y="2069.6" textLength="195.2" clip-path="url(#breeze-shell-line-84)">--airflow-extras</text><text class="breeze-shell-r1" x="756.4" y="2069.6" textLength="378.2" clip-path="url(#breeze-shell-line-84)">Airflow extras to install when </text><text class="breeze-shell-r4" x="1134.6" y="2069.6" textLength="256.2" [...]
+</text><text class="breeze-shell-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-shell-line-85)">│</text><text class="breeze-shell-r1" x="756.4" y="2094" textLength="683.2" clip-path="url(#breeze-shell-line-85)">used                                             [...]
+</text><text class="breeze-shell-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-shell-line-86)">│</text><text class="breeze-shell-r7" x="756.4" y="2118.4" textLength="683.2" clip-path="url(#breeze-shell-line-86)">(TEXT)                                            [...]
+</text><text class="breeze-shell-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-shell-line-87)">│</text><text class="breeze-shell-r5" x="756.4" y="2142.8" textLength="683.2" clip-path="url(#breeze-shell-line-87)">[default: ""]                                       &# [...]
+</text><text class="breeze-shell-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-shell-line-88)">│</text><text class="breeze-shell-r4" x="24.4" y="2167.2" textLength="317.2" clip-path="url(#breeze-shell-line-88)">--airflow-skip-constraints</text><text class="breeze-shell-r1" x="756.4" y="2167.2" textLength="573.4" clip-path="url(#breeze-shell-line-88)">Do not use constraints when installing airflow.</text><text class="breeze-shell-r5" x="1451.8 [...]
+</text><text class="breeze-shell-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-shell-line-89)">│</text><text class="breeze-shell-r4" x="24.4" y="2191.6" textLength="341.6" clip-path="url(#breeze-shell-line-89)">--clean-airflow-installation</text><text class="breeze-shell-r1" x="756.4" y="2191.6" textLength="683.2" clip-path="url(#breeze-shell-line-89)">Clean the airflow installation before installing version</text><text class="breeze-shell-r5 [...]
+</text><text class="breeze-shell-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-shell-line-90)">│</text><text class="breeze-shell-r1" x="756.4" y="2216" textLength="158.6" clip-path="url(#breeze-shell-line-90)">specified by </text><text class="breeze-shell-r4" x="915" y="2216" textLength="256.2" clip-path="url(#breeze-shell-line-90)">--use-airflow-version</text><text class="breeze-shell-r1" x="1171.2" y="2216" textLength="268.4" clip-path="url(#breeze-shell-line-90 [...]
+</text><text class="breeze-shell-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-shell-line-91)">│</text><text class="breeze-shell-r4" x="24.4" y="2240.4" textLength="244" clip-path="url(#breeze-shell-line-91)">--excluded-providers</text><text class="breeze-shell-r1" x="756.4" y="2240.4" textLength="683.2" clip-path="url(#breeze-shell-line-91)">JSON-string of dictionary containing excluded providers </text><text class="breeze-shell-r5" x="1451. [...]
+</text><text class="breeze-shell-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-shell-line-92)">│</text><text class="breeze-shell-r1" x="756.4" y="2264.8" textLength="683.2" clip-path="url(#breeze-shell-line-92)">per python version ({'3.12': ['provider']})             </text><text class="breeze-shell-r5" x="1451.8" y="2264.8" textLength="12.2" clip-path="url(#breeze-she [...]
+</text><text class="breeze-shell-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-shell-line-93)">│</text><text class="breeze-shell-r7" x="756.4" y="2289.2" textLength="683.2" clip-path="url(#breeze-shell-line-93)">(TEXT)                                            [...]
+</text><text class="breeze-shell-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-shell-line-94)">│</text><text class="breeze-shell-r4" x="24.4" y="2313.6" textLength="329.4" clip-path="url(#breeze-shell-line-94)">--force-lowest-dependencies</text><text class="breeze-shell-r1" x="756.4" y="2313.6" textLength="683.2" clip-path="url(#breeze-shell-line-94)">Run tests for the lowest direct dependencies of Airflow </text><text class="b [...]
+</text><text class="breeze-shell-r5" x="0" y="2338" textLength="12.2" clip-path="url(#breeze-shell-line-95)">│</text><text class="breeze-shell-r1" x="756.4" y="2338" textLength="683.2" clip-path="url(#breeze-shell-line-95)">or selected provider if `Provider[PROVIDER_ID]` is used </text><text class="breeze-shell-r5" x="1451.8" y="2338" textLength="12.2" clip-path="url(#breeze-shell-line-95)">│</text><text class="breeze-shell-r1" x="1464" y="2338" textLen [...]
+</text><text class="breeze-shell-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-shell-line-96)">│</text><text class="breeze-shell-r1" x="756.4" y="2362.4" textLength="683.2" clip-path="url(#breeze-shell-line-96)">as test type.                                        & [...]
+</text><text class="breeze-shell-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-shell-line-97)">│</text><text class="breeze-shell-r4" x="24.4" y="2386.8" textLength="414.8" clip-path="url(#breeze-shell-line-97)">--install-airflow-with-constraints</text><text class="breeze-shell-r1" x="439.2" y="2386.8" textLength="12.2" clip-path="url(#breeze-shell-line-97)">/</text><text class="breeze-shell-r4" x="451.4" y="2386.8" textLength="256.2" clip-path="url(#breeze-shell-line-97)" [...]
+</text><text class="breeze-shell-r5" x="0" y="2411.2" textLength="12.2" clip-path="url(#breeze-shell-line-98)">│</text><text class="breeze-shell-r1" x="756.4" y="2411.2" textLength="683.2" clip-path="url(#breeze-shell-line-98)">determined from package or airflow version.             </text><text class="breeze-shell-r5" x="1451.8" y="2411.2" textLength="12.2" clip-path="url(#breeze-shell-line-98)">│< [...]
+</text><text class="breeze-shell-r5" x="0" y="2435.6" textLength="12.2" clip-path="url(#breeze-shell-line-99)">│</text><text class="breeze-shell-r5" x="756.4" y="2435.6" textLength="683.2" clip-path="url(#breeze-shell-line-99)">[default: install-airflow-with-constraints]             </text><text class="breeze-shell-r5" x="1451.8" y="2435.6" textLength="12.2" clip-path="url(#breeze-shell-line-99)">│</text><text class="b [...]
+</text><text class="breeze-shell-r5" x="0" y="2460" textLength="12.2" clip-path="url(#breeze-shell-line-100)">│</text><text class="breeze-shell-r4" x="24.4" y="2460" textLength="341.6" clip-path="url(#breeze-shell-line-100)">--install-selected-providers</text><text class="breeze-shell-r1" x="756.4" y="2460" textLength="683.2" clip-path="url(#breeze-shell-line-100)">Comma-separated list of providers selected to be        [...]
+</text><text class="breeze-shell-r5" x="0" y="2484.4" textLength="12.2" clip-path="url(#breeze-shell-line-101)">│</text><text class="breeze-shell-r1" x="756.4" y="2484.4" textLength="231.8" clip-path="url(#breeze-shell-line-101)">installed (implies </text><text class="breeze-shell-r4" x="988.2" y="2484.4" textLength="292.8" clip-path="url(#breeze-shell-line-101)">--use-packages-from-dist</text><text class="breeze-shell-r1" x="1281" y="2484.4" textLength="158.6" clip-path="url(# [...]
+</text><text class="breeze-shell-r5" x="0" y="2508.8" textLength="12.2" clip-path="url(#breeze-shell-line-102)">│</text><text class="breeze-shell-r7" x="756.4" y="2508.8" textLength="683.2" clip-path="url(#breeze-shell-line-102)">(TEXT)                                           [...]
+</text><text class="breeze-shell-r5" x="0" y="2533.2" textLength="12.2" clip-path="url(#breeze-shell-line-103)">│</text><text class="breeze-shell-r4" x="24.4" y="2533.2" textLength="195.2" clip-path="url(#breeze-shell-line-103)">--package-format</text><text class="breeze-shell-r1" x="756.4" y="2533.2" textLength="658.8" clip-path="url(#breeze-shell-line-103)">Format of packages that should be installed from dist.</text><text class="breeze-shell-r5" [...]
+</text><text class="breeze-shell-r5" x="0" y="2557.6" textLength="12.2" clip-path="url(#breeze-shell-line-104)">│</text><text class="breeze-shell-r7" x="756.4" y="2557.6" textLength="658.8" clip-path="url(#breeze-shell-line-104)">(wheel | sdist)                                       </t [...]
+</text><text class="breeze-shell-r5" x="0" y="2582" textLength="12.2" clip-path="url(#breeze-shell-line-105)">│</text><text class="breeze-shell-r5" x="756.4" y="2582" textLength="658.8" clip-path="url(#breeze-shell-line-105)">[default: wheel]                                      </text><text clas [...]
+</text><text class="breeze-shell-r5" x="0" y="2606.4" textLength="12.2" clip-path="url(#breeze-shell-line-106)">│</text><text class="breeze-shell-r4" x="24.4" y="2606.4" textLength="390.4" clip-path="url(#breeze-shell-line-106)">--providers-constraints-location</text><text class="breeze-shell-r1" x="756.4" y="2606.4" textLength="683.2" clip-path="url(#breeze-shell-line-106)">Location of providers constraints to use (remote URL or </text><text [...]
+</text><text class="breeze-shell-r5" x="0" y="2630.8" textLength="12.2" clip-path="url(#breeze-shell-line-107)">│</text><text class="breeze-shell-r1" x="756.4" y="2630.8" textLength="683.2" clip-path="url(#breeze-shell-line-107)">local context file).                                    </text><text cla [...]
+</text><text class="breeze-shell-r5" x="0" y="2655.2" textLength="12.2" clip-path="url(#breeze-shell-line-108)">│</text><text class="breeze-shell-r7" x="756.4" y="2655.2" textLength="683.2" clip-path="url(#breeze-shell-line-108)">(TEXT)                                           [...]
+</text><text class="breeze-shell-r5" x="0" y="2679.6" textLength="12.2" clip-path="url(#breeze-shell-line-109)">│</text><text class="breeze-shell-r4" x="24.4" y="2679.6" textLength="341.6" clip-path="url(#breeze-shell-line-109)">--providers-constraints-mode</text><text class="breeze-shell-r1" x="756.4" y="2679.6" textLength="683.2" clip-path="url(#breeze-shell-line-109)">Mode of constraints for Providers for CI image building.</text><text class="br [...]
+</text><text class="breeze-shell-r5" x="0" y="2704" textLength="12.2" clip-path="url(#breeze-shell-line-110)">│</text><text class="breeze-shell-r7" x="756.4" y="2704" textLength="683.2" clip-path="url(#breeze-shell-line-110)">(constraints-source-providers | constraints |           </text><text class="breeze-shell-r5" x="1451.8" y="2704" textLength="12.2" clip-path="url(#breeze-shell-line-110)">│</text><text class="bree [...]
+</text><text class="breeze-shell-r5" x="0" y="2728.4" textLength="12.2" clip-path="url(#breeze-shell-line-111)">│</text><text class="breeze-shell-r7" x="756.4" y="2728.4" textLength="683.2" clip-path="url(#breeze-shell-line-111)">constraints-no-providers)                               </text><text class="breeze-shell-r5" x="1451.8" y=" [...]
+</text><text class="breeze-shell-r5" x="0" y="2752.8" textLength="12.2" clip-path="url(#breeze-shell-line-112)">│</text><text class="breeze-shell-r5" x="756.4" y="2752.8" textLength="683.2" clip-path="url(#breeze-shell-line-112)">[default: constraints-source-providers]                 </text><text class="breeze-shell-r5" x="1451.8" y="2752.8" textLength="12.2" clip-path="url(#breeze-shell-line-112)" [...]
+</text><text class="breeze-shell-r5" x="0" y="2777.2" textLength="12.2" clip-path="url(#breeze-shell-line-113)">│</text><text class="breeze-shell-r4" x="24.4" y="2777.2" textLength="402.6" clip-path="url(#breeze-shell-line-113)">--providers-constraints-reference</text><text class="breeze-shell-r1" x="756.4" y="2777.2" textLength="683.2" clip-path="url(#breeze-shell-line-113)">Constraint reference to use for providers installation  </text><text clas [...]
+</text><text class="breeze-shell-r5" x="0" y="2801.6" textLength="12.2" clip-path="url(#breeze-shell-line-114)">│</text><text class="breeze-shell-r1" x="756.4" y="2801.6" textLength="683.2" clip-path="url(#breeze-shell-line-114)">(used in calculated constraints URL). Can be 'default'  </text><text class="breeze-shell-r5" x="1451.8" y="2801.6" textLength="12.2" clip-path="url(#breeze-shell-line-114)">│</text><text class="breeze-shell- [...]
+</text><text class="breeze-shell-r5" x="0" y="2826" textLength="12.2" clip-path="url(#breeze-shell-line-115)">│</text><text class="breeze-shell-r1" x="756.4" y="2826" textLength="683.2" clip-path="url(#breeze-shell-line-115)">in which case the default constraints-reference is used.</text><text class="breeze-shell-r5" x="1451.8" y="2826" textLength="12.2" clip-path="url(#breeze-shell-line-115)">│</text><text class="breeze-shell-r1" x="1464" y="2826" text [...]
+</text><text class="breeze-shell-r5" x="0" y="2850.4" textLength="12.2" clip-path="url(#breeze-shell-line-116)">│</text><text class="breeze-shell-r7" x="756.4" y="2850.4" textLength="683.2" clip-path="url(#breeze-shell-line-116)">(TEXT)                                           [...]
+</text><text class="breeze-shell-r5" x="0" y="2874.8" textLength="12.2" clip-path="url(#breeze-shell-line-117)">│</text><text class="breeze-shell-r4" x="24.4" y="2874.8" textLength="341.6" clip-path="url(#breeze-shell-line-117)">--providers-skip-constraints</text><text class="breeze-shell-r1" x="756.4" y="2874.8" textLength="597.8" clip-path="url(#breeze-shell-line-117)">Do not use constraints when installing providers.</text><text class="breeze-shell-r5" x= [...]
+</text><text class="breeze-shell-r5" x="0" y="2899.2" textLength="12.2" clip-path="url(#breeze-shell-line-118)">│</text><text class="breeze-shell-r4" x="24.4" y="2899.2" textLength="256.2" clip-path="url(#breeze-shell-line-118)">--use-airflow-version</text><text class="breeze-shell-r1" x="756.4" y="2899.2" textLength="683.2" clip-path="url(#breeze-shell-line-118)">Use (reinstall at entry) Airflow version from PyPI. It  </text><text class= [...]
+</text><text class="breeze-shell-r5" x="0" y="2923.6" textLength="12.2" clip-path="url(#breeze-shell-line-119)">│</text><text class="breeze-shell-r1" x="756.4" y="2923.6" textLength="683.2" clip-path="url(#breeze-shell-line-119)">can also be version (to install from PyPI), `none`,     </text><text class="breeze-shell-r5" x="1451.8" y="2923.6" textLength="12.2" clip-path="url(#breeze-shell-line-119)">│</text><text class="bre [...]
+</text><text class="breeze-shell-r5" x="0" y="2948" textLength="12.2" clip-path="url(#breeze-shell-line-120)">│</text><text class="breeze-shell-r1" x="756.4" y="2948" textLength="683.2" clip-path="url(#breeze-shell-line-120)">`wheel`, or `sdist` to install from `dist` folder, or   </text><text class="breeze-shell-r5" x="1451.8" y="2948" textLength="12.2" clip-path="url(#breeze-shell-line-120)">│</text><text class="breeze-shell-r1" x= [...]
+</text><text class="breeze-shell-r5" x="0" y="2972.4" textLength="12.2" clip-path="url(#breeze-shell-line-121)">│</text><text class="breeze-shell-r1" x="756.4" y="2972.4" textLength="683.2" clip-path="url(#breeze-shell-line-121)">VCS URL to install from                                 </text><text class="b [...]
+</text><text class="breeze-shell-r5" x="0" y="2996.8" textLength="12.2" clip-path="url(#breeze-shell-line-122)">│</text><text class="breeze-shell-r1" x="756.4" y="2996.8" textLength="683.2" clip-path="url(#breeze-shell-line-122)">(https://pip.pypa.io/en/stable/topics/vcs-support/).    </text><text class="breeze-shell-r5" x="1451.8" y="2996.8" textLength="12.2" clip-path="url(#breeze-shell-line-122)">│</text><text class="breeze-shell-r1" x="1464" y="2996.8" textLength= [...]
+</text><text class="breeze-shell-r5" x="0" y="3021.2" textLength="12.2" clip-path="url(#breeze-shell-line-123)">│</text><text class="breeze-shell-r1" x="756.4" y="3021.2" textLength="97.6" clip-path="url(#breeze-shell-line-123)">Implies </text><text class="breeze-shell-r4" x="854" y="3021.2" textLength="183" clip-path="url(#breeze-shell-line-123)">--mount-sources</text><text class="breeze-shell-r1" x="1037" y="3021.2" textLength="402.6" clip-path="url(#breeze-shell-line-123)">  [...]
+</text><text class="breeze-shell-r5" x="0" y="3045.6" textLength="12.2" clip-path="url(#breeze-shell-line-124)">│</text><text class="breeze-shell-r7" x="756.4" y="3045.6" textLength="683.2" clip-path="url(#breeze-shell-line-124)">(none | wheel | sdist | <airflow_version>)              </text><text class="breeze-shell-r5" x="1451.8" y="3045.6" textLength="12.2" clip-path="url(#breeze- [...]
+</text><text class="breeze-shell-r5" x="0" y="3070" textLength="12.2" clip-path="url(#breeze-shell-line-125)">│</text><text class="breeze-shell-r4" x="24.4" y="3070" textLength="292.8" clip-path="url(#breeze-shell-line-125)">--use-packages-from-dist</text><text class="breeze-shell-r1" x="756.4" y="3070" textLength="341.6" clip-path="url(#breeze-shell-line-125)">Install all found packages (</text><text class="breeze-shell-r4" x="1098" y="3070" textLength="195.2" clip-p [...]
+</text><text class="breeze-shell-r5" x="0" y="3094.4" textLength="12.2" clip-path="url(#breeze-shell-line-126)">│</text><text class="breeze-shell-r1" x="756.4" y="3094.4" textLength="683.2" clip-path="url(#breeze-shell-line-126)">type) from 'dist' folder when entering breeze.          </text><text class="breeze-shell-r5" x="1451.8" y="3094.4" textLength="12.2" clip-path="url(#breeze-shell-line-126)" [...]
+</text><text class="breeze-shell-r5" x="0" y="3118.8" textLength="12.2" clip-path="url(#breeze-shell-line-127)">│</text><text class="breeze-shell-r4" x="24.4" y="3118.8" textLength="378.2" clip-path="url(#breeze-shell-line-127)">--install-airflow-python-client</text><text class="breeze-shell-r1" x="756.4" y="3118.8" textLength="488" clip-path="url(#breeze-shell-line-127)">Install airflow python client packages (</text><text class="breeze-shell-r4" x="1244.4" y="3 [...]
+</text><text class="breeze-shell-r5" x="0" y="3143.2" textLength="12.2" clip-path="url(#breeze-shell-line-128)">│</text><text class="breeze-shell-r1" x="756.4" y="3143.2" textLength="683.2" clip-path="url(#breeze-shell-line-128)">determines type) from 'dist' folder when entering       </text><text class="breeze-shell-r5" x="1451.8" y="3143.2" textLength="12.2" clip-path="url(#breeze-shell-line-128)">│</text><text [...]
+</text><text class="breeze-shell-r5" x="0" y="3167.6" textLength="12.2" clip-path="url(#breeze-shell-line-129)">│</text><text class="breeze-shell-r1" x="756.4" y="3167.6" textLength="683.2" clip-path="url(#breeze-shell-line-129)">breeze.                                           [...]
+</text><text class="breeze-shell-r5" x="0" y="3192" textLength="1464" clip-path="url(#breeze-shell-line-130)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="3192" textLength="12.2" clip-path="url(#breeze-shell-line-130)">
+</text><text class="breeze-shell-r5" x="0" y="3216.4" textLength="24.4" clip-path="url(#breeze-shell-line-131)">â•─</text><text class="breeze-shell-r5" x="24.4" y="3216.4" textLength="610" clip-path="url(#breeze-shell-line-131)"> Upgrading/downgrading/removing selected packages </text><text class="breeze-shell-r5" x="634.4" y="3216.4" textLength="805.2" clip-path="url(#breeze-shell-line-131)">──────────────────────────────────────────────────────────────────</text><tex [...]
+</text><text class="breeze-shell-r5" x="0" y="3240.8" textLength="12.2" clip-path="url(#breeze-shell-line-132)">│</text><text class="breeze-shell-r4" x="24.4" y="3240.8" textLength="170.8" clip-path="url(#breeze-shell-line-132)">--upgrade-boto</text><text class="breeze-shell-r1" x="341.6" y="3240.8" textLength="866.2" clip-path="url(#breeze-shell-line-132)">Remove aiobotocore and upgrade botocore and boto to the latest version.</text><tex [...]
+</text><text class="breeze-shell-r5" x="0" y="3265.2" textLength="12.2" clip-path="url(#breeze-shell-line-133)">│</text><text class="breeze-shell-r4" x="24.4" y="3265.2" textLength="268.4" clip-path="url(#breeze-shell-line-133)">--downgrade-sqlalchemy</text><text class="breeze-shell-r1" x="341.6" y="3265.2" textLength="610" clip-path="url(#breeze-shell-line-133)">Downgrade SQLAlchemy to minimum supported version.</text><text class="breeze-shell-r5" x="1451.8" y=" [...]
+</text><text class="breeze-shell-r5" x="0" y="3289.6" textLength="12.2" clip-path="url(#breeze-shell-line-134)">│</text><text class="breeze-shell-r4" x="24.4" y="3289.6" textLength="244" clip-path="url(#breeze-shell-line-134)">--downgrade-pendulum</text><text class="breeze-shell-r1" x="341.6" y="3289.6" textLength="585.6" clip-path="url(#breeze-shell-line-134)">Downgrade Pendulum to minimum supported version.</text><text class="breeze-shell-r5" x="1451.8" y="3289 [...]
+</text><text class="breeze-shell-r5" x="0" y="3314" textLength="1464" clip-path="url(#breeze-shell-line-135)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="3314" textLength="12.2" clip-path="url(#breeze-shell-line-135)">
+</text><text class="breeze-shell-r5" x="0" y="3338.4" textLength="24.4" clip-path="url(#breeze-shell-line-136)">â•─</text><text class="breeze-shell-r5" x="24.4" y="3338.4" textLength="183" clip-path="url(#breeze-shell-line-136)"> DB test flags </text><text class="breeze-shell-r5" x="207.4" y="3338.4" textLength="1232.2" clip-path="url(#breeze-shell-line-136)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><te [...]
+</text><text class="breeze-shell-r5" x="0" y="3362.8" textLength="12.2" clip-path="url(#breeze-shell-line-137)">│</text><text class="breeze-shell-r4" x="24.4" y="3362.8" textLength="231.8" clip-path="url(#breeze-shell-line-137)">--run-db-tests-only</text><text class="breeze-shell-r1" x="305" y="3362.8" textLength="475.8" clip-path="url(#breeze-shell-line-137)">Only runs tests that require a database</text><text class="breeze-shell-r5" x="1451.8" y="3362.8" t [...]
+</text><text class="breeze-shell-r5" x="0" y="3387.2" textLength="12.2" clip-path="url(#breeze-shell-line-138)">│</text><text class="breeze-shell-r4" x="24.4" y="3387.2" textLength="183" clip-path="url(#breeze-shell-line-138)">--skip-db-tests</text><text class="breeze-shell-r1" x="305" y="3387.2" textLength="414.8" clip-path="url(#breeze-shell-line-138)">Skip tests that require a database</text><text class="breeze-shell-r5" x="1451.8" y="3387.2" textLength="12.2" [...]
+</text><text class="breeze-shell-r5" x="0" y="3411.6" textLength="1464" clip-path="url(#breeze-shell-line-139)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="3411.6" textLength="12.2" clip-path="url(#breeze-shell-line-139)">
+</text><text class="breeze-shell-r5" x="0" y="3436" textLength="24.4" clip-path="url(#breeze-shell-line-140)">â•─</text><text class="breeze-shell-r5" x="24.4" y="3436" textLength="183" clip-path="url(#breeze-shell-line-140)"> Other options </text><text class="breeze-shell-r5" x="207.4" y="3436" textLength="1232.2" clip-path="url(#breeze-shell-line-140)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="b [...]
+</text><text class="breeze-shell-r5" x="0" y="3460.4" textLength="12.2" clip-path="url(#breeze-shell-line-141)">│</text><text class="breeze-shell-r4" x="24.4" y="3460.4" textLength="256.2" clip-path="url(#breeze-shell-line-141)">--forward-credentials</text><text class="breeze-shell-r6" x="305" y="3460.4" textLength="24.4" clip-path="url(#breeze-shell-line-141)">-f</text><text class="breeze-shell-r1" x="353.8" y="3460.4" textLength="634.4" clip-path="url(#breeze-shell-line-141)">Forward&# [...]
+</text><text class="breeze-shell-r5" x="0" y="3484.8" textLength="12.2" clip-path="url(#breeze-shell-line-142)">│</text><text class="breeze-shell-r4" x="24.4" y="3484.8" textLength="122" clip-path="url(#breeze-shell-line-142)">--max-time</text><text class="breeze-shell-r1" x="353.8" y="3484.8" textLength="1049.2" clip-path="url(#breeze-shell-line-142)">Maximum time that the command should take - if it takes longer, the comm [...]
+</text><text class="breeze-shell-r5" x="0" y="3509.2" textLength="12.2" clip-path="url(#breeze-shell-line-143)">│</text><text class="breeze-shell-r7" x="353.8" y="3509.2" textLength="1049.2" clip-path="url(#breeze-shell-line-143)">(INTEGER RANGE)                                        & [...]
+</text><text class="breeze-shell-r5" x="0" y="3533.6" textLength="12.2" clip-path="url(#breeze-shell-line-144)">│</text><text class="breeze-shell-r4" x="24.4" y="3533.6" textLength="219.6" clip-path="url(#breeze-shell-line-144)">--verbose-commands</text><text class="breeze-shell-r1" x="353.8" y="3533.6" textLength="414.8" clip-path="url(#breeze-shell-line-144)">Show details of commands executed.</text><text class="breeze-shell-r5" x="1451.8" y="3533.6" textLength="12. [...]
+</text><text class="breeze-shell-r5" x="0" y="3558" textLength="12.2" clip-path="url(#breeze-shell-line-145)">│</text><text class="breeze-shell-r4" x="24.4" y="3558" textLength="244" clip-path="url(#breeze-shell-line-145)">--keep-env-variables</text><text class="breeze-shell-r1" x="353.8" y="3558" textLength="1000.4" clip-path="url(#breeze-shell-line-145)">Do not clear environment variables that might have side effect while running&# [...]
+</text><text class="breeze-shell-r5" x="0" y="3582.4" textLength="12.2" clip-path="url(#breeze-shell-line-146)">│</text><text class="breeze-shell-r4" x="24.4" y="3582.4" textLength="183" clip-path="url(#breeze-shell-line-146)">--no-db-cleanup</text><text class="breeze-shell-r1" x="353.8" y="3582.4" textLength="597.8" clip-path="url(#breeze-shell-line-146)">Do not clear the database before each test module</text><text class="breeze-shell-r5" x="1451 [...]
+</text><text class="breeze-shell-r5" x="0" y="3606.8" textLength="1464" clip-path="url(#breeze-shell-line-147)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="3606.8" textLength="12.2" clip-path="url(#breeze-shell-line-147)">
+</text><text class="breeze-shell-r5" x="0" y="3631.2" textLength="24.4" clip-path="url(#breeze-shell-line-148)">â•─</text><text class="breeze-shell-r5" x="24.4" y="3631.2" textLength="195.2" clip-path="url(#breeze-shell-line-148)"> Common options </text><text class="breeze-shell-r5" x="219.6" y="3631.2" textLength="1220" clip-path="url(#breeze-shell-line-148)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text cl [...]
+</text><text class="breeze-shell-r5" x="0" y="3655.6" textLength="12.2" clip-path="url(#breeze-shell-line-149)">│</text><text class="breeze-shell-r4" x="24.4" y="3655.6" textLength="97.6" clip-path="url(#breeze-shell-line-149)">--answer</text><text class="breeze-shell-r6" x="158.6" y="3655.6" textLength="24.4" clip-path="url(#breeze-shell-line-149)">-a</text><text class="breeze-shell-r1" x="207.4" y="3655.6" textLength="317.2" clip-path="url(#breeze-shell-line-149)">Force answer [...]
+</text><text class="breeze-shell-r5" x="0" y="3680" textLength="12.2" clip-path="url(#breeze-shell-line-150)">│</text><text class="breeze-shell-r4" x="24.4" y="3680" textLength="109.8" clip-path="url(#breeze-shell-line-150)">--dry-run</text><text class="breeze-shell-r6" x="158.6" y="3680" textLength="24.4" clip-path="url(#breeze-shell-line-150)">-D</text><text class="breeze-shell-r1" x="207.4" y="3680" textLength="719.8" clip-path="url(#breeze-shell-line-150)">If dry-run is [...]
+</text><text class="breeze-shell-r5" x="0" y="3704.4" textLength="12.2" clip-path="url(#breeze-shell-line-151)">│</text><text class="breeze-shell-r4" x="24.4" y="3704.4" textLength="109.8" clip-path="url(#breeze-shell-line-151)">--verbose</text><text class="breeze-shell-r6" x="158.6" y="3704.4" textLength="24.4" clip-path="url(#breeze-shell-line-151)">-v</text><text class="breeze-shell-r1" x="207.4" y="3704.4" textLength="585.6" clip-path="url(#breeze-shell-line-151)">Print verbose& [...]
+</text><text class="breeze-shell-r5" x="0" y="3728.8" textLength="12.2" clip-path="url(#breeze-shell-line-152)">│</text><text class="breeze-shell-r4" x="24.4" y="3728.8" textLength="73.2" clip-path="url(#breeze-shell-line-152)">--help</text><text class="breeze-shell-r6" x="158.6" y="3728.8" textLength="24.4" clip-path="url(#breeze-shell-line-152)">-h</text><text class="breeze-shell-r1" x="207.4" y="3728.8" textLength="329.4" clip-path="url(#breeze-shell-line-152)">Show this mes [...]
+</text><text class="breeze-shell-r5" x="0" y="3753.2" textLength="1464" clip-path="url(#breeze-shell-line-153)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="3753.2" textLength="12.2" clip-path="url(#breeze-shell-line-153)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_shell.txt b/dev/breeze/doc/images/output_shell.txt
index d0d3581adbe..06595a6f818 100644
--- a/dev/breeze/doc/images/output_shell.txt
+++ b/dev/breeze/doc/images/output_shell.txt
@@ -1 +1 @@
-95baddb3c9561fd3d0dda0199ceff91a
+efd5cdefe6f99a82f8a9eb611f4cc25e
diff --git a/dev/breeze/doc/images/output_start-airflow.svg b/dev/breeze/doc/images/output_start-airflow.svg
index f4da7055455..5b6a589e2af 100644
--- a/dev/breeze/doc/images/output_start-airflow.svg
+++ b/dev/breeze/doc/images/output_start-airflow.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 2831.6" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 2782.7999999999997" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-start-airflow-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="2780.6" />
+ <rect x="0" y="0" width="1463.0" height="2731.7999999999997" />
</clipPath>
<clipPath id="breeze-start-airflow-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -378,15 +378,9 @@
<clipPath id="breeze-start-airflow-line-110">
<rect x="0" y="2685.5" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-start-airflow-line-111">
- <rect x="0" y="2709.9" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-start-airflow-line-112">
- <rect x="0" y="2734.3" 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="2829.6" rx="8"/><text class="breeze-start-airflow-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: start-airflow</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2780.8" rx="8"/><text class="breeze-start-airflow-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: start-airflow</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -450,66 +444,64 @@
</text><text class="breeze-start-airflow-r5" x="0" y="1264.4" textLength="1464" clip-path="url(#breeze-start-airflow-line-51)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="1264.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-51)">
</text><text class="breeze-start-airflow-r5" x="0" y="1288.8" textLength="24.4" clip-path="url(#breeze-start-airflow-line-52)">â•─</text><text class="breeze-start-airflow-r5" x="24.4" y="1288.8" textLength="488" clip-path="url(#breeze-start-airflow-line-52)"> Build CI image (before entering shell) </text><text class="breeze-start-airflow-r5" x="512.4" y="1288.8" textLength="927.2" clip-path="url(#breeze-start-airflow-line-52)">─────────────────────────── [...]
</text><text class="breeze-start-airflow-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-53)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1313.2" textLength="158.6" clip-path="url(#breeze-start-airflow-line-53)">--force-build</text><text class="breeze-start-airflow-r1" x="341.6" y="1313.2" textLength="707.6" clip-path="url(#breeze-start-airflow-line-53)">Force image build no matter if it is determined& [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-54)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1337.6" textLength="134.2" clip-path="url(#breeze-start-airflow-line-54)">--image-tag</text><text class="breeze-start-airflow-r1" x="341.6" y="1337.6" textLength="695.4" clip-path="url(#breeze-start-airflow-line-54)">Tag of the image which is used to run the [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-start-airflow-line-55)">│</text><text class="breeze-start-airflow-r5" x="341.6" y="1362" textLength="963.8" clip-path="url(#breeze-start-airflow-line-55)">[default: latest]                                    [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-56)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1386.4" textLength="231.8" clip-path="url(#breeze-start-airflow-line-56)">--github-repository</text><text class="breeze-start-airflow-r6" x="292.8" y="1386.4" textLength="24.4" clip-path="url(#breeze-start-airflow-line-56)">-g</text><text class="breeze-start-airflow-r1" x="341.6" y="1386.4" textLength="585 [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1410.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-57)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1410.8" textLength="109.8" clip-path="url(#breeze-start-airflow-line-57)">--builder</text><text class="breeze-start-airflow-r1" x="341.6" y="1410.8" textLength="756.4" clip-path="url(#breeze-start-airflow-line-57)">Buildx builder used to perform `docker buildx build`  [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1435.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-58)">│</text><text class="breeze-start-airflow-r5" x="341.6" y="1435.2" textLength="756.4" clip-path="url(#breeze-start-airflow-line-58)">[default: autodetect]                                  &# [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-59)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1459.6" textLength="97.6" clip-path="url(#breeze-start-airflow-line-59)">--use-uv</text><text class="breeze-start-airflow-r1" x="122" y="1459.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-59)">/</text><text class="breeze-start-airflow-r4" x="134.2" y="1459.6" textLength="134.2" clip-path=" [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-start-airflow-line-60)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1484" textLength="207.4" clip-path="url(#breeze-start-airflow-line-60)">--uv-http-timeout</text><text class="breeze-start-airflow-r1" x="341.6" y="1484" textLength="829.6" clip-path="url(#breeze-start-airflow-line-60)">Timeout for requests that UV makes (only used in&# [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-61)">│</text><text class="breeze-start-airflow-r5" x="341.6" y="1508.4" textLength="829.6" clip-path="url(#breeze-start-airflow-line-61)">[default: 300; x>=1]                                 & [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1532.8" textLength="1464" clip-path="url(#breeze-start-airflow-line-62)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="1532.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-62)">
-</text><text class="breeze-start-airflow-r5" x="0" y="1557.2" textLength="24.4" clip-path="url(#breeze-start-airflow-line-63)">â•─</text><text class="breeze-start-airflow-r5" x="24.4" y="1557.2" textLength="414.8" clip-path="url(#breeze-start-airflow-line-63)"> Mounting the sources and volumes </text><text class="breeze-start-airflow-r5" x="439.2" y="1557.2" textLength="1000.4" clip-path="url(#breeze-start-airflow-line-63)">─────────────────────────────────── [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-64)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1581.6" textLength="183" clip-path="url(#breeze-start-airflow-line-64)">--mount-sources</text><text class="breeze-start-airflow-r1" x="256.2" y="1581.6" textLength="1159" clip-path="url(#breeze-start-airflow-line-64)">Choose scope of local sources that should be moun [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1606" textLength="12.2" clip-path="url(#breeze-start-airflow-line-65)">│</text><text class="breeze-start-airflow-r7" x="256.2" y="1606" textLength="1159" clip-path="url(#breeze-start-airflow-line-65)">(selected | all | skip | remove | tests | providers-and-tests)                      [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1630.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-66)">│</text><text class="breeze-start-airflow-r5" x="256.2" y="1630.4" textLength="1159" clip-path="url(#breeze-start-airflow-line-66)">[default: selected]                                    [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1654.8" textLength="1464" clip-path="url(#breeze-start-airflow-line-67)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="1654.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-67)">
-</text><text class="breeze-start-airflow-r5" x="0" y="1679.2" textLength="24.4" clip-path="url(#breeze-start-airflow-line-68)">â•─</text><text class="breeze-start-airflow-r5" x="24.4" y="1679.2" textLength="512.4" clip-path="url(#breeze-start-airflow-line-68)"> Installing packages after entering shell </text><text class="breeze-start-airflow-r5" x="536.8" y="1679.2" textLength="902.8" clip-path="url(#breeze-start-airflow-line-68)">──────────────────────────── [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1703.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-69)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1703.6" textLength="366" clip-path="url(#breeze-start-airflow-line-69)">--airflow-constraints-location</text><text class="breeze-start-airflow-r1" x="475.8" y="1703.6" textLength="902.8" clip-path="url(#breeze-start-airflow-line-69)">Location of airflow constraints to use (rem [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1728" textLength="12.2" clip-path="url(#breeze-start-airflow-line-70)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="1728" textLength="902.8" clip-path="url(#breeze-start-airflow-line-70)">(TEXT)                                      &# [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1752.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-71)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1752.4" textLength="317.2" clip-path="url(#breeze-start-airflow-line-71)">--airflow-constraints-mode</text><text class="breeze-start-airflow-r1" x="475.8" y="1752.4" textLength="866.2" clip-path="url(#breeze-start-airflow-line-71)">Mode of constraints for Airflow for CI i [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-72)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="1776.8" textLength="866.2" clip-path="url(#breeze-start-airflow-line-72)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-start-airflow-r5" x="1451.8" y="1776.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-72)">│</text>< [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-73)">│</text><text class="breeze-start-airflow-r5" x="475.8" y="1801.2" textLength="866.2" clip-path="url(#breeze-start-airflow-line-73)">[default: constraints-source-providers]                               &# [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-74)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1825.6" textLength="378.2" clip-path="url(#breeze-start-airflow-line-74)">--airflow-constraints-reference</text><text class="breeze-start-airflow-r1" x="475.8" y="1825.6" textLength="963.8" clip-path="url(#breeze-start-airflow-line-74)">Constraint reference to use for airflow  [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-start-airflow-line-75)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="1850" textLength="963.8" clip-path="url(#breeze-start-airflow-line-75)">constraints URL).                                    [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-76)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="1874.4" textLength="963.8" clip-path="url(#breeze-start-airflow-line-76)">(TEXT)                                      [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-77)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1898.8" textLength="195.2" clip-path="url(#breeze-start-airflow-line-77)">--airflow-extras</text><text class="breeze-start-airflow-r1" x="475.8" y="1898.8" textLength="378.2" clip-path="url(#breeze-start-airflow-line-77)">Airflow extras to install when </text><text class="breeze-st [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-78)">│</text><text class="breeze-start-airflow-r5" x="475.8" y="1923.2" textLength="732" clip-path="url(#breeze-start-airflow-line-78)">[default: ""]                                  &# [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-79)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1947.6" textLength="317.2" clip-path="url(#breeze-start-airflow-line-79)">--airflow-skip-constraints</text><text class="breeze-start-airflow-r1" x="475.8" y="1947.6" textLength="573.4" clip-path="url(#breeze-start-airflow-line-79)">Do not use constraints when installing airflo [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-start-airflow-line-80)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1972" textLength="341.6" clip-path="url(#breeze-start-airflow-line-80)">--clean-airflow-installation</text><text class="breeze-start-airflow-r1" x="475.8" y="1972" textLength="963.8" clip-path="url(#breeze-start-airflow-line-80)">Clean the airflow installation before installing  [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-81)">│</text><text class="breeze-start-airflow-r4" x="475.8" y="1996.4" textLength="256.2" clip-path="url(#breeze-start-airflow-line-81)">--use-airflow-version</text><text class="breeze-start-airflow-r1" x="732" y="1996.4" textLength="707.6" clip-path="url(#breeze-start-airflow-line-81)">.             &# [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-82)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2020.8" textLength="341.6" clip-path="url(#breeze-start-airflow-line-82)">--install-selected-providers</text><text class="breeze-start-airflow-r1" x="475.8" y="2020.8" textLength="963.8" clip-path="url(#breeze-start-airflow-line-82)">Comma-separated list of providers selected to [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-83)">│</text><text class="breeze-start-airflow-r4" x="475.8" y="2045.2" textLength="292.8" clip-path="url(#breeze-start-airflow-line-83)">--use-packages-from-dist</text><text class="breeze-start-airflow-r1" x="768.6" y="2045.2" textLength="671" clip-path="url(#breeze-start-airflow-line-83)">).             [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-84)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2069.6" textLength="963.8" clip-path="url(#breeze-start-airflow-line-84)">(TEXT)                                      [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-start-airflow-line-85)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2094" textLength="195.2" clip-path="url(#breeze-start-airflow-line-85)">--package-format</text><text class="breeze-start-airflow-r1" x="475.8" y="2094" textLength="658.8" clip-path="url(#breeze-start-airflow-line-85)">Format of packages that should be installed from di [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-86)">│</text><text class="breeze-start-airflow-r5" x="475.8" y="2118.4" textLength="658.8" clip-path="url(#breeze-start-airflow-line-86)">[default: wheel]                                   & [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-87)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2142.8" textLength="390.4" clip-path="url(#breeze-start-airflow-line-87)">--providers-constraints-location</text><text class="breeze-start-airflow-r1" x="475.8" y="2142.8" textLength="927.2" clip-path="url(#breeze-start-airflow-line-87)">Location of providers constraints to use [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-88)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2167.2" textLength="927.2" clip-path="url(#breeze-start-airflow-line-88)">(TEXT)                                      [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-89)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2191.6" textLength="341.6" clip-path="url(#breeze-start-airflow-line-89)">--providers-constraints-mode</text><text class="breeze-start-airflow-r1" x="475.8" y="2191.6" textLength="866.2" clip-path="url(#breeze-start-airflow-line-89)">Mode of constraints for Providers for CI [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-start-airflow-line-90)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2216" textLength="866.2" clip-path="url(#breeze-start-airflow-line-90)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-start-airflow-r5" x="1451.8" y="2216" textLength="12.2" clip-path="url(#breeze-start-airflow-line-90)">│</text><text c [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-91)">│</text><text class="breeze-start-airflow-r5" x="475.8" y="2240.4" textLength="866.2" clip-path="url(#breeze-start-airflow-line-91)">[default: constraints-source-providers]                               &# [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-92)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2264.8" textLength="402.6" clip-path="url(#breeze-start-airflow-line-92)">--providers-constraints-reference</text><text class="breeze-start-airflow-r1" x="475.8" y="2264.8" textLength="963.8" clip-path="url(#breeze-start-airflow-line-92)">Constraint reference to use for providers&# [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-93)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2289.2" textLength="963.8" clip-path="url(#breeze-start-airflow-line-93)">constraints URL). Can be 'default' in which case the default                   </t [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-94)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2313.6" textLength="963.8" clip-path="url(#breeze-start-airflow-line-94)">constraints-reference is used.                                 [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2338" textLength="12.2" clip-path="url(#breeze-start-airflow-line-95)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2338" textLength="963.8" clip-path="url(#breeze-start-airflow-line-95)">(TEXT)                                      &# [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-96)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2362.4" textLength="341.6" clip-path="url(#breeze-start-airflow-line-96)">--providers-skip-constraints</text><text class="breeze-start-airflow-r1" x="475.8" y="2362.4" textLength="597.8" clip-path="url(#breeze-start-airflow-line-96)">Do not use constraints when installing prov [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-97)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2386.8" textLength="256.2" clip-path="url(#breeze-start-airflow-line-97)">--use-airflow-version</text><text class="breeze-start-airflow-r1" x="475.8" y="2386.8" textLength="963.8" clip-path="url(#breeze-start-airflow-line-97)">Use (reinstall at entry) Airflow version from  [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2411.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-98)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2411.2" textLength="963.8" clip-path="url(#breeze-start-airflow-line-98)">install from PyPI), `none`, `wheel`, or `sdist` to install from `dist` folder, </text><text class="breeze-start-airflow-r5" x="1451.8" y="2411.2" textLength="12.2" clip-pat [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2435.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-99)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2435.6" textLength="963.8" clip-path="url(#breeze-start-airflow-line-99)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/).</text><text class="breeze-start-airflow-r5" x="1451.8" y="2435.6" textLength="12.2" clip-path="url(#breeze-start-airflow-l [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2460" textLength="12.2" clip-path="url(#breeze-start-airflow-line-100)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2460" textLength="97.6" clip-path="url(#breeze-start-airflow-line-100)">Implies </text><text class="breeze-start-airflow-r4" x="573.4" y="2460" textLength="183" clip-path="url(#breeze-start-airflow-line-100)">--mount-sources</text><text class="breeze-start-airflow-r1" x="756.4" y="2460" textLength="68 [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2484.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-101)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2484.4" textLength="963.8" clip-path="url(#breeze-start-airflow-line-101)">(none | wheel | sdist | <airflow_version>)                         &# [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2508.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-102)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2508.8" textLength="292.8" clip-path="url(#breeze-start-airflow-line-102)">--use-packages-from-dist</text><text class="breeze-start-airflow-r1" x="475.8" y="2508.8" textLength="341.6" clip-path="url(#breeze-start-airflow-line-102)">Install all found packages (</text><text class="breeze [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2533.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-103)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2533.2" textLength="963.8" clip-path="url(#breeze-start-airflow-line-103)">folder when entering breeze.                               & [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2557.6" textLength="1464" clip-path="url(#breeze-start-airflow-line-104)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="2557.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-104)">
-</text><text class="breeze-start-airflow-r5" x="0" y="2582" textLength="24.4" clip-path="url(#breeze-start-airflow-line-105)">â•─</text><text class="breeze-start-airflow-r5" x="24.4" y="2582" textLength="183" clip-path="url(#breeze-start-airflow-line-105)"> Other options </text><text class="breeze-start-airflow-r5" x="207.4" y="2582" textLength="1232.2" clip-path="url(#breeze-start-airflow-line-105)">────────────────────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2606.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-106)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2606.4" textLength="256.2" clip-path="url(#breeze-start-airflow-line-106)">--forward-credentials</text><text class="breeze-start-airflow-r6" x="305" y="2606.4" textLength="24.4" clip-path="url(#breeze-start-airflow-line-106)">-f</text><text class="breeze-start-airflow-r1" x="353.8" y="2606.4" textLength=" [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2630.8" textLength="1464" clip-path="url(#breeze-start-airflow-line-107)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="2630.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-107)">
-</text><text class="breeze-start-airflow-r5" x="0" y="2655.2" textLength="24.4" clip-path="url(#breeze-start-airflow-line-108)">â•─</text><text class="breeze-start-airflow-r5" x="24.4" y="2655.2" textLength="195.2" clip-path="url(#breeze-start-airflow-line-108)"> Common options </text><text class="breeze-start-airflow-r5" x="219.6" y="2655.2" textLength="1220" clip-path="url(#breeze-start-airflow-line-108)">─────────────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2679.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-109)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2679.6" textLength="97.6" clip-path="url(#breeze-start-airflow-line-109)">--answer</text><text class="breeze-start-airflow-r6" x="158.6" y="2679.6" textLength="24.4" clip-path="url(#breeze-start-airflow-line-109)">-a</text><text class="breeze-start-airflow-r1" x="207.4" y="2679.6" textLength="317.2" clip- [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2704" textLength="12.2" clip-path="url(#breeze-start-airflow-line-110)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2704" textLength="109.8" clip-path="url(#breeze-start-airflow-line-110)">--dry-run</text><text class="breeze-start-airflow-r6" x="158.6" y="2704" textLength="24.4" clip-path="url(#breeze-start-airflow-line-110)">-D</text><text class="breeze-start-airflow-r1" x="207.4" y="2704" textLength="719.8" clip-path=" [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2728.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-111)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2728.4" textLength="109.8" clip-path="url(#breeze-start-airflow-line-111)">--verbose</text><text class="breeze-start-airflow-r6" x="158.6" y="2728.4" textLength="24.4" clip-path="url(#breeze-start-airflow-line-111)">-v</text><text class="breeze-start-airflow-r1" x="207.4" y="2728.4" textLength="585.6" cli [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2752.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-112)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2752.8" textLength="73.2" clip-path="url(#breeze-start-airflow-line-112)">--help</text><text class="breeze-start-airflow-r6" x="158.6" y="2752.8" textLength="24.4" clip-path="url(#breeze-start-airflow-line-112)">-h</text><text class="breeze-start-airflow-r1" x="207.4" y="2752.8" textLength="329.4" clip-pa [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2777.2" textLength="1464" clip-path="url(#breeze-start-airflow-line-113)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="2777.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-113)">
+</text><text class="breeze-start-airflow-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-54)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1337.6" textLength="231.8" clip-path="url(#breeze-start-airflow-line-54)">--github-repository</text><text class="breeze-start-airflow-r6" x="292.8" y="1337.6" textLength="24.4" clip-path="url(#breeze-start-airflow-line-54)">-g</text><text class="breeze-start-airflow-r1" x="341.6" y="1337.6" textLength="585 [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-start-airflow-line-55)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1362" textLength="109.8" clip-path="url(#breeze-start-airflow-line-55)">--builder</text><text class="breeze-start-airflow-r1" x="341.6" y="1362" textLength="756.4" clip-path="url(#breeze-start-airflow-line-55)">Buildx builder used to perform `docker buildx build` comma [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-56)">│</text><text class="breeze-start-airflow-r5" x="341.6" y="1386.4" textLength="756.4" clip-path="url(#breeze-start-airflow-line-56)">[default: autodetect]                                  &# [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1410.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-57)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1410.8" textLength="97.6" clip-path="url(#breeze-start-airflow-line-57)">--use-uv</text><text class="breeze-start-airflow-r1" x="122" y="1410.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-57)">/</text><text class="breeze-start-airflow-r4" x="134.2" y="1410.8" textLength="134.2" clip-path=" [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1435.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-58)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1435.2" textLength="207.4" clip-path="url(#breeze-start-airflow-line-58)">--uv-http-timeout</text><text class="breeze-start-airflow-r1" x="341.6" y="1435.2" textLength="829.6" clip-path="url(#breeze-start-airflow-line-58)">Timeout for requests that UV makes (only used [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-59)">│</text><text class="breeze-start-airflow-r5" x="341.6" y="1459.6" textLength="829.6" clip-path="url(#breeze-start-airflow-line-59)">[default: 300; x>=1]                                 & [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1484" textLength="1464" clip-path="url(#breeze-start-airflow-line-60)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="1484" textLength="12.2" clip-path="url(#breeze-start-airflow-line-60)">
+</text><text class="breeze-start-airflow-r5" x="0" y="1508.4" textLength="24.4" clip-path="url(#breeze-start-airflow-line-61)">â•─</text><text class="breeze-start-airflow-r5" x="24.4" y="1508.4" textLength="414.8" clip-path="url(#breeze-start-airflow-line-61)"> Mounting the sources and volumes </text><text class="breeze-start-airflow-r5" x="439.2" y="1508.4" textLength="1000.4" clip-path="url(#breeze-start-airflow-line-61)">─────────────────────────────────── [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1532.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-62)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1532.8" textLength="183" clip-path="url(#breeze-start-airflow-line-62)">--mount-sources</text><text class="breeze-start-airflow-r1" x="256.2" y="1532.8" textLength="1159" clip-path="url(#breeze-start-airflow-line-62)">Choose scope of local sources that should be moun [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1557.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-63)">│</text><text class="breeze-start-airflow-r7" x="256.2" y="1557.2" textLength="1159" clip-path="url(#breeze-start-airflow-line-63)">(selected | all | skip | remove | tests | providers-and-tests)                    & [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-64)">│</text><text class="breeze-start-airflow-r5" x="256.2" y="1581.6" textLength="1159" clip-path="url(#breeze-start-airflow-line-64)">[default: selected]                                    [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1606" textLength="1464" clip-path="url(#breeze-start-airflow-line-65)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="1606" textLength="12.2" clip-path="url(#breeze-start-airflow-line-65)">
+</text><text class="breeze-start-airflow-r5" x="0" y="1630.4" textLength="24.4" clip-path="url(#breeze-start-airflow-line-66)">â•─</text><text class="breeze-start-airflow-r5" x="24.4" y="1630.4" textLength="512.4" clip-path="url(#breeze-start-airflow-line-66)"> Installing packages after entering shell </text><text class="breeze-start-airflow-r5" x="536.8" y="1630.4" textLength="902.8" clip-path="url(#breeze-start-airflow-line-66)">──────────────────────────── [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1654.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-67)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1654.8" textLength="366" clip-path="url(#breeze-start-airflow-line-67)">--airflow-constraints-location</text><text class="breeze-start-airflow-r1" x="475.8" y="1654.8" textLength="902.8" clip-path="url(#breeze-start-airflow-line-67)">Location of airflow constraints to use (rem [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1679.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-68)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="1679.2" textLength="902.8" clip-path="url(#breeze-start-airflow-line-68)">(TEXT)                                      [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1703.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-69)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1703.6" textLength="317.2" clip-path="url(#breeze-start-airflow-line-69)">--airflow-constraints-mode</text><text class="breeze-start-airflow-r1" x="475.8" y="1703.6" textLength="866.2" clip-path="url(#breeze-start-airflow-line-69)">Mode of constraints for Airflow for CI i [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1728" textLength="12.2" clip-path="url(#breeze-start-airflow-line-70)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="1728" textLength="866.2" clip-path="url(#breeze-start-airflow-line-70)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-start-airflow-r5" x="1451.8" y="1728" textLength="12.2" clip-path="url(#breeze-start-airflow-line-70)">│</text><text c [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1752.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-71)">│</text><text class="breeze-start-airflow-r5" x="475.8" y="1752.4" textLength="866.2" clip-path="url(#breeze-start-airflow-line-71)">[default: constraints-source-providers]                               &# [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-72)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1776.8" textLength="378.2" clip-path="url(#breeze-start-airflow-line-72)">--airflow-constraints-reference</text><text class="breeze-start-airflow-r1" x="475.8" y="1776.8" textLength="963.8" clip-path="url(#breeze-start-airflow-line-72)">Constraint reference to use for airflow  [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-73)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="1801.2" textLength="963.8" clip-path="url(#breeze-start-airflow-line-73)">constraints URL).                                    [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-74)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="1825.6" textLength="963.8" clip-path="url(#breeze-start-airflow-line-74)">(TEXT)                                      [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-start-airflow-line-75)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1850" textLength="195.2" clip-path="url(#breeze-start-airflow-line-75)">--airflow-extras</text><text class="breeze-start-airflow-r1" x="475.8" y="1850" textLength="378.2" clip-path="url(#breeze-start-airflow-line-75)">Airflow extras to install when </text><text class="breeze-start-ai [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-76)">│</text><text class="breeze-start-airflow-r5" x="475.8" y="1874.4" textLength="732" clip-path="url(#breeze-start-airflow-line-76)">[default: ""]                                  &# [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-77)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1898.8" textLength="317.2" clip-path="url(#breeze-start-airflow-line-77)">--airflow-skip-constraints</text><text class="breeze-start-airflow-r1" x="475.8" y="1898.8" textLength="573.4" clip-path="url(#breeze-start-airflow-line-77)">Do not use constraints when installing airflo [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-78)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1923.2" textLength="341.6" clip-path="url(#breeze-start-airflow-line-78)">--clean-airflow-installation</text><text class="breeze-start-airflow-r1" x="475.8" y="1923.2" textLength="963.8" clip-path="url(#breeze-start-airflow-line-78)">Clean the airflow installation before installing [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-79)">│</text><text class="breeze-start-airflow-r4" x="475.8" y="1947.6" textLength="256.2" clip-path="url(#breeze-start-airflow-line-79)">--use-airflow-version</text><text class="breeze-start-airflow-r1" x="732" y="1947.6" textLength="707.6" clip-path="url(#breeze-start-airflow-line-79)">.             &# [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-start-airflow-line-80)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1972" textLength="341.6" clip-path="url(#breeze-start-airflow-line-80)">--install-selected-providers</text><text class="breeze-start-airflow-r1" x="475.8" y="1972" textLength="963.8" clip-path="url(#breeze-start-airflow-line-80)">Comma-separated list of providers selected to be& [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-81)">│</text><text class="breeze-start-airflow-r4" x="475.8" y="1996.4" textLength="292.8" clip-path="url(#breeze-start-airflow-line-81)">--use-packages-from-dist</text><text class="breeze-start-airflow-r1" x="768.6" y="1996.4" textLength="671" clip-path="url(#breeze-start-airflow-line-81)">).             [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-82)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2020.8" textLength="963.8" clip-path="url(#breeze-start-airflow-line-82)">(TEXT)                                      [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-83)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2045.2" textLength="195.2" clip-path="url(#breeze-start-airflow-line-83)">--package-format</text><text class="breeze-start-airflow-r1" x="475.8" y="2045.2" textLength="658.8" clip-path="url(#breeze-start-airflow-line-83)">Format of packages that should be installed from&# [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-84)">│</text><text class="breeze-start-airflow-r5" x="475.8" y="2069.6" textLength="658.8" clip-path="url(#breeze-start-airflow-line-84)">[default: wheel]                                   & [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-start-airflow-line-85)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2094" textLength="390.4" clip-path="url(#breeze-start-airflow-line-85)">--providers-constraints-location</text><text class="breeze-start-airflow-r1" x="475.8" y="2094" textLength="927.2" clip-path="url(#breeze-start-airflow-line-85)">Location of providers constraints to use (rem [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-86)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2118.4" textLength="927.2" clip-path="url(#breeze-start-airflow-line-86)">(TEXT)                                      [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-87)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2142.8" textLength="341.6" clip-path="url(#breeze-start-airflow-line-87)">--providers-constraints-mode</text><text class="breeze-start-airflow-r1" x="475.8" y="2142.8" textLength="866.2" clip-path="url(#breeze-start-airflow-line-87)">Mode of constraints for Providers for CI [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-88)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2167.2" textLength="866.2" clip-path="url(#breeze-start-airflow-line-88)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-start-airflow-r5" x="1451.8" y="2167.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-88)">│</text>< [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-89)">│</text><text class="breeze-start-airflow-r5" x="475.8" y="2191.6" textLength="866.2" clip-path="url(#breeze-start-airflow-line-89)">[default: constraints-source-providers]                               &# [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-start-airflow-line-90)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2216" textLength="402.6" clip-path="url(#breeze-start-airflow-line-90)">--providers-constraints-reference</text><text class="breeze-start-airflow-r1" x="475.8" y="2216" textLength="963.8" clip-path="url(#breeze-start-airflow-line-90)">Constraint reference to use for providers in [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-91)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2240.4" textLength="963.8" clip-path="url(#breeze-start-airflow-line-91)">constraints URL). Can be 'default' in which case the default                   </t [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-92)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2264.8" textLength="963.8" clip-path="url(#breeze-start-airflow-line-92)">constraints-reference is used.                                 [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-93)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2289.2" textLength="963.8" clip-path="url(#breeze-start-airflow-line-93)">(TEXT)                                      [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-94)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2313.6" textLength="341.6" clip-path="url(#breeze-start-airflow-line-94)">--providers-skip-constraints</text><text class="breeze-start-airflow-r1" x="475.8" y="2313.6" textLength="597.8" clip-path="url(#breeze-start-airflow-line-94)">Do not use constraints when installing prov [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2338" textLength="12.2" clip-path="url(#breeze-start-airflow-line-95)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2338" textLength="256.2" clip-path="url(#breeze-start-airflow-line-95)">--use-airflow-version</text><text class="breeze-start-airflow-r1" x="475.8" y="2338" textLength="963.8" clip-path="url(#breeze-start-airflow-line-95)">Use (reinstall at entry) Airflow version from PyPI. [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-96)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2362.4" textLength="963.8" clip-path="url(#breeze-start-airflow-line-96)">install from PyPI), `none`, `wheel`, or `sdist` to install from `dist` folder, </text><text class="breeze-start-airflow-r5" x="1451.8" y="2362.4" textLength="12.2" clip-pat [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-97)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2386.8" textLength="963.8" clip-path="url(#breeze-start-airflow-line-97)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/).</text><text class="breeze-start-airflow-r5" x="1451.8" y="2386.8" textLength="12.2" clip-path="url(#breeze-start-airflow-l [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2411.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-98)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2411.2" textLength="97.6" clip-path="url(#breeze-start-airflow-line-98)">Implies </text><text class="breeze-start-airflow-r4" x="573.4" y="2411.2" textLength="183" clip-path="url(#breeze-start-airflow-line-98)">--mount-sources</text><text class="breeze-start-airflow-r1" x="756.4" y="2411.2" textLengt [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2435.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-99)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2435.6" textLength="963.8" clip-path="url(#breeze-start-airflow-line-99)">(none | wheel | sdist | <airflow_version>)                          [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2460" textLength="12.2" clip-path="url(#breeze-start-airflow-line-100)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2460" textLength="292.8" clip-path="url(#breeze-start-airflow-line-100)">--use-packages-from-dist</text><text class="breeze-start-airflow-r1" x="475.8" y="2460" textLength="341.6" clip-path="url(#breeze-start-airflow-line-100)">Install all found packages (</text><text class="breeze-start [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2484.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-101)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2484.4" textLength="963.8" clip-path="url(#breeze-start-airflow-line-101)">folder when entering breeze.                               & [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2508.8" textLength="1464" clip-path="url(#breeze-start-airflow-line-102)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="2508.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-102)">
+</text><text class="breeze-start-airflow-r5" x="0" y="2533.2" textLength="24.4" clip-path="url(#breeze-start-airflow-line-103)">â•─</text><text class="breeze-start-airflow-r5" x="24.4" y="2533.2" textLength="183" clip-path="url(#breeze-start-airflow-line-103)"> Other options </text><text class="breeze-start-airflow-r5" x="207.4" y="2533.2" textLength="1232.2" clip-path="url(#breeze-start-airflow-line-103)">──────────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2557.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-104)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2557.6" textLength="256.2" clip-path="url(#breeze-start-airflow-line-104)">--forward-credentials</text><text class="breeze-start-airflow-r6" x="305" y="2557.6" textLength="24.4" clip-path="url(#breeze-start-airflow-line-104)">-f</text><text class="breeze-start-airflow-r1" x="353.8" y="2557.6" textLength=" [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2582" textLength="1464" clip-path="url(#breeze-start-airflow-line-105)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="2582" textLength="12.2" clip-path="url(#breeze-start-airflow-line-105)">
+</text><text class="breeze-start-airflow-r5" x="0" y="2606.4" textLength="24.4" clip-path="url(#breeze-start-airflow-line-106)">â•─</text><text class="breeze-start-airflow-r5" x="24.4" y="2606.4" textLength="195.2" clip-path="url(#breeze-start-airflow-line-106)"> Common options </text><text class="breeze-start-airflow-r5" x="219.6" y="2606.4" textLength="1220" clip-path="url(#breeze-start-airflow-line-106)">─────────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2630.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-107)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2630.8" textLength="97.6" clip-path="url(#breeze-start-airflow-line-107)">--answer</text><text class="breeze-start-airflow-r6" x="158.6" y="2630.8" textLength="24.4" clip-path="url(#breeze-start-airflow-line-107)">-a</text><text class="breeze-start-airflow-r1" x="207.4" y="2630.8" textLength="317.2" clip- [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2655.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-108)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2655.2" textLength="109.8" clip-path="url(#breeze-start-airflow-line-108)">--dry-run</text><text class="breeze-start-airflow-r6" x="158.6" y="2655.2" textLength="24.4" clip-path="url(#breeze-start-airflow-line-108)">-D</text><text class="breeze-start-airflow-r1" x="207.4" y="2655.2" textLength="719.8" cli [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2679.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-109)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2679.6" textLength="109.8" clip-path="url(#breeze-start-airflow-line-109)">--verbose</text><text class="breeze-start-airflow-r6" x="158.6" y="2679.6" textLength="24.4" clip-path="url(#breeze-start-airflow-line-109)">-v</text><text class="breeze-start-airflow-r1" x="207.4" y="2679.6" textLength="585.6" cli [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2704" textLength="12.2" clip-path="url(#breeze-start-airflow-line-110)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2704" textLength="73.2" clip-path="url(#breeze-start-airflow-line-110)">--help</text><text class="breeze-start-airflow-r6" x="158.6" y="2704" textLength="24.4" clip-path="url(#breeze-start-airflow-line-110)">-h</text><text class="breeze-start-airflow-r1" x="207.4" y="2704" textLength="329.4" clip-path="url( [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2728.4" textLength="1464" clip-path="url(#breeze-start-airflow-line-111)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="2728.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-111)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_start-airflow.txt b/dev/breeze/doc/images/output_start-airflow.txt
index 39671a27b8a..38c79c1f70e 100644
--- a/dev/breeze/doc/images/output_start-airflow.txt
+++ b/dev/breeze/doc/images/output_start-airflow.txt
@@ -1 +1 @@
-0b622999bd75f2f86d444f82be0efb4f
+e0c5377c9e26b5c5fa79b61ace516ea7
diff --git a/dev/breeze/doc/images/output_static-checks.svg b/dev/breeze/doc/images/output_static-checks.svg
index 8d78c5924b4..9b18f111052 100644
--- a/dev/breeze/doc/images/output_static-checks.svg
+++ b/dev/breeze/doc/images/output_static-checks.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 2270.4" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 2197.2" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-static-checks-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="2219.4" />
+ <rect x="0" y="0" width="1463.0" height="2146.2" />
</clipPath>
<clipPath id="breeze-static-checks-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -306,18 +306,9 @@
<clipPath id="breeze-static-checks-line-86">
<rect x="0" y="2099.9" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-static-checks-line-87">
- <rect x="0" y="2124.3" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-static-checks-line-88">
- <rect x="0" y="2148.7" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-static-checks-line-89">
- <rect x="0" y="2173.1" 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="2268.4" rx="8"/><text class="breeze-static-checks-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: static-checks</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2195.2" rx="8"/><text class="breeze-static-checks-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: static-checks</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -406,18 +397,15 @@
</text><text class="breeze-static-checks-r5" x="0" y="1874.4" textLength="24.4" clip-path="url(#breeze-static-checks-line-76)">â•─</text><text class="breeze-static-checks-r5" x="24.4" y="1874.4" textLength="463.6" clip-path="url(#breeze-static-checks-line-76)"> Building image before running checks </text><text class="breeze-static-checks-r5" x="488" y="1874.4" textLength="951.6" clip-path="url(#breeze-static-checks-line-76)">────────────────────────────────── [...]
</text><text class="breeze-static-checks-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-77)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1898.8" textLength="317.2" clip-path="url(#breeze-static-checks-line-77)">--skip-image-upgrade-check</text><text class="breeze-static-checks-r1" x="414.8" y="1898.8" textLength="536.8" clip-path="url(#breeze-static-checks-line-77)">Skip checking if the CI image is up  [...]
</text><text class="breeze-static-checks-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-78)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1923.2" textLength="158.6" clip-path="url(#breeze-static-checks-line-78)">--force-build</text><text class="breeze-static-checks-r1" x="414.8" y="1923.2" textLength="707.6" clip-path="url(#breeze-static-checks-line-78)">Force image build no matter if it is determined& [...]
-</text><text class="breeze-static-checks-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-79)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1947.6" textLength="134.2" clip-path="url(#breeze-static-checks-line-79)">--image-tag</text><text class="breeze-static-checks-r1" x="414.8" y="1947.6" textLength="695.4" clip-path="url(#breeze-static-checks-line-79)">Tag of the image which is used to run the [...]
-</text><text class="breeze-static-checks-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-static-checks-line-80)">│</text><text class="breeze-static-checks-r7" x="414.8" y="1972" textLength="963.8" clip-path="url(#breeze-static-checks-line-80)">(TEXT)                                      &# [...]
-</text><text class="breeze-static-checks-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-81)">│</text><text class="breeze-static-checks-r5" x="414.8" y="1996.4" textLength="963.8" clip-path="url(#breeze-static-checks-line-81)">[default: latest]                                    [...]
-</text><text class="breeze-static-checks-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-82)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2020.8" textLength="231.8" clip-path="url(#breeze-static-checks-line-82)">--github-repository</text><text class="breeze-static-checks-r6" x="366" y="2020.8" textLength="24.4" clip-path="url(#breeze-static-checks-line-82)">-g</text><text class="breeze-static-checks-r1" x="414.8" y="2020.8" textLength="585.6 [...]
-</text><text class="breeze-static-checks-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-83)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2045.2" textLength="109.8" clip-path="url(#breeze-static-checks-line-83)">--builder</text><text class="breeze-static-checks-r1" x="414.8" y="2045.2" textLength="756.4" clip-path="url(#breeze-static-checks-line-83)">Buildx builder used to perform `docker buildx build`  [...]
-</text><text class="breeze-static-checks-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-84)">│</text><text class="breeze-static-checks-r5" x="414.8" y="2069.6" textLength="756.4" clip-path="url(#breeze-static-checks-line-84)">[default: autodetect]                                  &# [...]
-</text><text class="breeze-static-checks-r5" x="0" y="2094" textLength="1464" clip-path="url(#breeze-static-checks-line-85)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="2094" textLength="12.2" clip-path="url(#breeze-static-checks-line-85)">
-</text><text class="breeze-static-checks-r5" x="0" y="2118.4" textLength="24.4" clip-path="url(#breeze-static-checks-line-86)">â•─</text><text class="breeze-static-checks-r5" x="24.4" y="2118.4" textLength="195.2" clip-path="url(#breeze-static-checks-line-86)"> Common options </text><text class="breeze-static-checks-r5" x="219.6" y="2118.4" textLength="1220" clip-path="url(#breeze-static-checks-line-86)">────────────────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-static-checks-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-87)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2142.8" textLength="109.8" clip-path="url(#breeze-static-checks-line-87)">--dry-run</text><text class="breeze-static-checks-r6" x="158.6" y="2142.8" textLength="24.4" clip-path="url(#breeze-static-checks-line-87)">-D</text><text class="breeze-static-checks-r1" x="207.4" y="2142.8" textLength="719.8" clip-p [...]
-</text><text class="breeze-static-checks-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-88)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2167.2" textLength="109.8" clip-path="url(#breeze-static-checks-line-88)">--verbose</text><text class="breeze-static-checks-r6" x="158.6" y="2167.2" textLength="24.4" clip-path="url(#breeze-static-checks-line-88)">-v</text><text class="breeze-static-checks-r1" x="207.4" y="2167.2" textLength="585.6" clip-p [...]
-</text><text class="breeze-static-checks-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-89)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2191.6" textLength="73.2" clip-path="url(#breeze-static-checks-line-89)">--help</text><text class="breeze-static-checks-r6" x="158.6" y="2191.6" textLength="24.4" clip-path="url(#breeze-static-checks-line-89)">-h</text><text class="breeze-static-checks-r1" x="207.4" y="2191.6" textLength="329.4" clip-path= [...]
-</text><text class="breeze-static-checks-r5" x="0" y="2216" textLength="1464" clip-path="url(#breeze-static-checks-line-90)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="2216" textLength="12.2" clip-path="url(#breeze-static-checks-line-90)">
+</text><text class="breeze-static-checks-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-79)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1947.6" textLength="231.8" clip-path="url(#breeze-static-checks-line-79)">--github-repository</text><text class="breeze-static-checks-r6" x="366" y="1947.6" textLength="24.4" clip-path="url(#breeze-static-checks-line-79)">-g</text><text class="breeze-static-checks-r1" x="414.8" y="1947.6" textLength="585.6 [...]
+</text><text class="breeze-static-checks-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-static-checks-line-80)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1972" textLength="109.8" clip-path="url(#breeze-static-checks-line-80)">--builder</text><text class="breeze-static-checks-r1" x="414.8" y="1972" textLength="756.4" clip-path="url(#breeze-static-checks-line-80)">Buildx builder used to perform `docker buildx build` comma [...]
+</text><text class="breeze-static-checks-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-81)">│</text><text class="breeze-static-checks-r5" x="414.8" y="1996.4" textLength="756.4" clip-path="url(#breeze-static-checks-line-81)">[default: autodetect]                                  &# [...]
+</text><text class="breeze-static-checks-r5" x="0" y="2020.8" textLength="1464" clip-path="url(#breeze-static-checks-line-82)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="2020.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-82)">
+</text><text class="breeze-static-checks-r5" x="0" y="2045.2" textLength="24.4" clip-path="url(#breeze-static-checks-line-83)">â•─</text><text class="breeze-static-checks-r5" x="24.4" y="2045.2" textLength="195.2" clip-path="url(#breeze-static-checks-line-83)"> Common options </text><text class="breeze-static-checks-r5" x="219.6" y="2045.2" textLength="1220" clip-path="url(#breeze-static-checks-line-83)">────────────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-static-checks-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-84)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2069.6" textLength="109.8" clip-path="url(#breeze-static-checks-line-84)">--dry-run</text><text class="breeze-static-checks-r6" x="158.6" y="2069.6" textLength="24.4" clip-path="url(#breeze-static-checks-line-84)">-D</text><text class="breeze-static-checks-r1" x="207.4" y="2069.6" textLength="719.8" clip-p [...]
+</text><text class="breeze-static-checks-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-static-checks-line-85)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2094" textLength="109.8" clip-path="url(#breeze-static-checks-line-85)">--verbose</text><text class="breeze-static-checks-r6" x="158.6" y="2094" textLength="24.4" clip-path="url(#breeze-static-checks-line-85)">-v</text><text class="breeze-static-checks-r1" x="207.4" y="2094" textLength="585.6" clip-path="url [...]
+</text><text class="breeze-static-checks-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-86)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2118.4" textLength="73.2" clip-path="url(#breeze-static-checks-line-86)">--help</text><text class="breeze-static-checks-r6" x="158.6" y="2118.4" textLength="24.4" clip-path="url(#breeze-static-checks-line-86)">-h</text><text class="breeze-static-checks-r1" x="207.4" y="2118.4" textLength="329.4" clip-path= [...]
+</text><text class="breeze-static-checks-r5" x="0" y="2142.8" textLength="1464" clip-path="url(#breeze-static-checks-line-87)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="2142.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-87)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_static-checks.txt b/dev/breeze/doc/images/output_static-checks.txt
index d7e83bd3b25..b1b1e424085 100644
--- a/dev/breeze/doc/images/output_static-checks.txt
+++ b/dev/breeze/doc/images/output_static-checks.txt
@@ -1 +1 @@
-757276214066768488bf8c3e2be03921
+008d474dccfab2873f4d67935b5be81c
diff --git a/dev/breeze/doc/images/output_testing_core-integration-tests.svg b/dev/breeze/doc/images/output_testing_core-integration-tests.svg
index f9670b91070..db0aa27cf48 100644
--- a/dev/breeze/doc/images/output_testing_core-integration-tests.svg
+++ b/dev/breeze/doc/images/output_testing_core-integration-tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1318.8" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1245.6" 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-integration-tests-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="1267.8" />
+ <rect x="0" y="0" width="1463.0" height="1194.6" />
</clipPath>
<clipPath id="breeze-testing-core-integration-tests-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -189,18 +189,9 @@
<clipPath id="breeze-testing-core-integration-tests-line-47">
<rect x="0" y="1148.3" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-testing-core-integration-tests-line-48">
- <rect x="0" y="1172.7" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-testing-core-integration-tests-line-49">
- <rect x="0" y="1197.1" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-testing-core-integration-tests-line-50">
- <rect x="0" y="1221.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="1316.8" rx="8"/><text class="breeze-testing-core-integration-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing core-integration-tests</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1243.6" rx="8"/><text class="breeze-testing-core-integration-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing core-integration-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"/>
@@ -247,21 +238,18 @@
</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="849.6" textLength="1464" clip-path="url(#breeze-testing-core-integration-tests-line-34)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-integration-tests-r1" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-34)">
</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="874" textLength="24.4" clip-path="url(#breeze-testing-core-integration-tests-line-35)">â•─</text><text class="breeze-testing-core-integration-tests-r5" x="24.4" y="874" textLength="402.6" clip-path="url(#breeze-testing-core-integration-tests-line-35)"> Advanced flag for tests command </text><text class="breeze-testing-core-integration-tests-r5" x="427" y="874" textLength="1012.6" clip-path [...]
</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-36)">│</text><text class="breeze-testing-core-integration-tests-r4" x="24.4" y="898.4" textLength="231.8" clip-path="url(#breeze-testing-core-integration-tests-line-36)">--github-repository</text><text class="breeze-testing-core-integration-tests-r7" x="366" y="898.4" textLength="24.4" clip-path="url(#breeze-testing-core-integration-te [...]
-</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-37)">│</text><text class="breeze-testing-core-integration-tests-r4" x="24.4" y="922.8" textLength="134.2" clip-path="url(#breeze-testing-core-integration-tests-line-37)">--image-tag</text><text class="breeze-testing-core-integration-tests-r1" x="414.8" y="922.8" textLength="695.4" clip-path="url(#breeze-testing-core-integration-tests-l [...]
-</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-38)">│</text><text class="breeze-testing-core-integration-tests-r6" x="414.8" y="947.2" textLength="963.8" clip-path="url(#breeze-testing-core-integration-tests-line-38)">(TEXT)                           [...]
-</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-39)">│</text><text class="breeze-testing-core-integration-tests-r5" x="414.8" y="971.6" textLength="963.8" clip-path="url(#breeze-testing-core-integration-tests-line-39)">[default: latest]                         [...]
-</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-40)">│</text><text class="breeze-testing-core-integration-tests-r4" x="24.4" y="996" textLength="183" clip-path="url(#breeze-testing-core-integration-tests-line-40)">--mount-sources</text><text class="breeze-testing-core-integration-tests-r1" x="414.8" y="996" textLength="1024.8" clip-path="url(#breeze-testing-core-integration-tests-line [...]
-</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-41)">│</text><text class="breeze-testing-core-integration-tests-r1" x="414.8" y="1020.4" textLength="1024.8" clip-path="url(#breeze-testing-core-integration-tests-line-41)">selected).                          [...]
-</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-42)">│</text><text class="breeze-testing-core-integration-tests-r6" x="414.8" y="1044.8" textLength="1024.8" clip-path="url(#breeze-testing-core-integration-tests-line-42)">(selected | all | skip | remove | tests | providers-and-tests)         [...]
-</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-43)">│</text><text class="breeze-testing-core-integration-tests-r5" x="414.8" y="1069.2" textLength="1024.8" clip-path="url(#breeze-testing-core-integration-tests-line-43)">[default: selected]                       & [...]
-</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-44)">│</text><text class="breeze-testing-core-integration-tests-r4" x="24.4" y="1093.6" textLength="317.2" clip-path="url(#breeze-testing-core-integration-tests-line-44)">--skip-docker-compose-down</text><text class="breeze-testing-core-integration-tests-r1" x="414.8" y="1093.6" textLength="549" clip-path="url(#breeze-testing-core-int [...]
-</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-45)">│</text><text class="breeze-testing-core-integration-tests-r4" x="24.4" y="1118" textLength="244" clip-path="url(#breeze-testing-core-integration-tests-line-45)">--keep-env-variables</text><text class="breeze-testing-core-integration-tests-r1" x="414.8" y="1118" textLength="1000.4" clip-path="url(#breeze-testing-core-integration-te [...]
-</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1142.4" textLength="1464" clip-path="url(#breeze-testing-core-integration-tests-line-46)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-integration-tests-r1" x="1464" y="1142.4" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-46)">
-</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1166.8" textLength="24.4" clip-path="url(#breeze-testing-core-integration-tests-line-47)">â•─</text><text class="breeze-testing-core-integration-tests-r5" x="24.4" y="1166.8" textLength="195.2" clip-path="url(#breeze-testing-core-integration-tests-line-47)"> Common options </text><text class="breeze-testing-core-integration-tests-r5" x="219.6" y="1166.8" textLength="1220" clip-path="url(#breeze-testing-c [...]
-</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-48)">│</text><text class="breeze-testing-core-integration-tests-r4" x="24.4" y="1191.2" textLength="109.8" clip-path="url(#breeze-testing-core-integration-tests-line-48)">--dry-run</text><text class="breeze-testing-core-integration-tests-r7" x="158.6" y="1191.2" textLength="24.4" clip-path="url(#breeze-testing-core-integration-tests-l [...]
-</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-49)">│</text><text class="breeze-testing-core-integration-tests-r4" x="24.4" y="1215.6" textLength="109.8" clip-path="url(#breeze-testing-core-integration-tests-line-49)">--verbose</text><text class="breeze-testing-core-integration-tests-r7" x="158.6" y="1215.6" textLength="24.4" clip-path="url(#breeze-testing-core-integration-tests-l [...]
-</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-50)">│</text><text class="breeze-testing-core-integration-tests-r4" x="24.4" y="1240" textLength="73.2" clip-path="url(#breeze-testing-core-integration-tests-line-50)">--help</text><text class="breeze-testing-core-integration-tests-r7" x="158.6" y="1240" textLength="24.4" clip-path="url(#breeze-testing-core-integration-tests-line-50)">- [...]
-</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1264.4" textLength="1464" clip-path="url(#breeze-testing-core-integration-tests-line-51)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-integration-tests-r1" x="1464" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-51)">
+</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-37)">│</text><text class="breeze-testing-core-integration-tests-r4" x="24.4" y="922.8" textLength="183" clip-path="url(#breeze-testing-core-integration-tests-line-37)">--mount-sources</text><text class="breeze-testing-core-integration-tests-r1" x="414.8" y="922.8" textLength="1024.8" clip-path="url(#breeze-testing-core-integration-test [...]
+</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-38)">│</text><text class="breeze-testing-core-integration-tests-r1" x="414.8" y="947.2" textLength="1024.8" clip-path="url(#breeze-testing-core-integration-tests-line-38)">selected).                           [...]
+</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-39)">│</text><text class="breeze-testing-core-integration-tests-r6" x="414.8" y="971.6" textLength="1024.8" clip-path="url(#breeze-testing-core-integration-tests-line-39)">(selected | all | skip | remove | tests | providers-and-tests)          [...]
+</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-40)">│</text><text class="breeze-testing-core-integration-tests-r5" x="414.8" y="996" textLength="1024.8" clip-path="url(#breeze-testing-core-integration-tests-line-40)">[default: selected]                        & [...]
+</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-41)">│</text><text class="breeze-testing-core-integration-tests-r4" x="24.4" y="1020.4" textLength="317.2" clip-path="url(#breeze-testing-core-integration-tests-line-41)">--skip-docker-compose-down</text><text class="breeze-testing-core-integration-tests-r1" x="414.8" y="1020.4" textLength="549" clip-path="url(#breeze-testing-core-int [...]
+</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-42)">│</text><text class="breeze-testing-core-integration-tests-r4" x="24.4" y="1044.8" textLength="244" clip-path="url(#breeze-testing-core-integration-tests-line-42)">--keep-env-variables</text><text class="breeze-testing-core-integration-tests-r1" x="414.8" y="1044.8" textLength="1000.4" clip-path="url(#breeze-testing-core-integrat [...]
+</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1069.2" textLength="1464" clip-path="url(#breeze-testing-core-integration-tests-line-43)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-integration-tests-r1" x="1464" y="1069.2" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-43)">
+</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1093.6" textLength="24.4" clip-path="url(#breeze-testing-core-integration-tests-line-44)">â•─</text><text class="breeze-testing-core-integration-tests-r5" x="24.4" y="1093.6" textLength="195.2" clip-path="url(#breeze-testing-core-integration-tests-line-44)"> Common options </text><text class="breeze-testing-core-integration-tests-r5" x="219.6" y="1093.6" textLength="1220" clip-path="url(#breeze-testing-c [...]
+</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-45)">│</text><text class="breeze-testing-core-integration-tests-r4" x="24.4" y="1118" textLength="109.8" clip-path="url(#breeze-testing-core-integration-tests-line-45)">--dry-run</text><text class="breeze-testing-core-integration-tests-r7" x="158.6" y="1118" textLength="24.4" clip-path="url(#breeze-testing-core-integration-tests-line-45 [...]
+</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-46)">│</text><text class="breeze-testing-core-integration-tests-r4" x="24.4" y="1142.4" textLength="109.8" clip-path="url(#breeze-testing-core-integration-tests-line-46)">--verbose</text><text class="breeze-testing-core-integration-tests-r7" x="158.6" y="1142.4" textLength="24.4" clip-path="url(#breeze-testing-core-integration-tests-l [...]
+</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-47)">│</text><text class="breeze-testing-core-integration-tests-r4" x="24.4" y="1166.8" textLength="73.2" clip-path="url(#breeze-testing-core-integration-tests-line-47)">--help</text><text class="breeze-testing-core-integration-tests-r7" x="158.6" y="1166.8" textLength="24.4" clip-path="url(#breeze-testing-core-integration-tests-line- [...]
+</text><text class="breeze-testing-core-integration-tests-r5" x="0" y="1191.2" textLength="1464" clip-path="url(#breeze-testing-core-integration-tests-line-48)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-integration-tests-r1" x="1464" y="1191.2" textLength="12.2" clip-path="url(#breeze-testing-core-integration-tests-line-48)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_testing_core-integration-tests.txt b/dev/breeze/doc/images/output_testing_core-integration-tests.txt
index 406ecbf1e23..396d683ed93 100644
--- a/dev/breeze/doc/images/output_testing_core-integration-tests.txt
+++ b/dev/breeze/doc/images/output_testing_core-integration-tests.txt
@@ -1 +1 @@
-07940986aa097af9110fba4f5804e0c8
+785e50cd80468737c655d5ffa7778a54
diff --git a/dev/breeze/doc/images/output_testing_core-tests.svg b/dev/breeze/doc/images/output_testing_core-tests.svg
index 57dc12aa034..90a210455db 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 2709.6" 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="2658.6" />
+ <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,18 +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>
-<clipPath id="breeze-testing-core-tests-line-106">
- <rect x="0" y="2587.9" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-testing-core-tests-line-107">
- <rect x="0" y="2612.3" 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="2707.6" 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"/>
@@ -451,45 +442,42 @@
</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="134.2" clip-path="url(#breeze-testing-core-tests-line-70)">--image-tag</text><text class="breeze-testing-core-tests-r1" x="414.8" y="1728" textLength="695.4" clip-path="url(#breeze-testing-core-tests-line-70)">Tag of the image which is used  [...]
-</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="963.8" clip-path="url(#breeze-testing-core-tests-line-71)">(TEXT)                                  &# [...]
-</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="963.8" clip-path="url(#breeze-testing-core-tests-line-72)">[default: latest]                                [...]
-</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="183" clip-path="url(#breeze-testing-core-tests-line-73)">--mount-sources</text><text class="breeze-testing-core-tests-r1" x="414.8" y="1801.2" textLength="1024.8" clip-path="url(#breeze-testing-core-tests-line-73)">Choose scope of local sources th [...]
-</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-r1" x="414.8" y="1825.6" textLength="1024.8" clip-path="url(#breeze-testing-core-tests-line-74)">selected).                                  [...]
-</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-r6" x="414.8" y="1850" textLength="1024.8" clip-path="url(#breeze-testing-core-tests-line-75)">(selected | all | skip | remove | tests | providers-and-tests)                 & [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-76)">│</text><text class="breeze-testing-core-tests-r5" x="414.8" y="1874.4" textLength="1024.8" clip-path="url(#breeze-testing-core-tests-line-76)">[default: selected]                               & [...]
-</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="317.2" clip-path="url(#breeze-testing-core-tests-line-77)">--skip-docker-compose-down</text><text class="breeze-testing-core-tests-r1" x="414.8" y="1898.8" textLength="549" clip-path="url(#breeze-testing-core-tests-line-77)">Skips running docker-compose dow [...]
-</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="244" clip-path="url(#breeze-testing-core-tests-line-78)">--keep-env-variables</text><text class="breeze-testing-core-tests-r1" x="414.8" y="1923.2" textLength="1000.4" clip-path="url(#breeze-testing-core-tests-line-78)">Do not clear environment variabl [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1947.6" textLength="1464" clip-path="url(#breeze-testing-core-tests-line-79)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-tests-r1" x="1464" y="1947.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-79)">
-</text><text class="breeze-testing-core-tests-r5" x="0" y="1972" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-80)">â•─</text><text class="breeze-testing-core-tests-r5" x="24.4" y="1972" textLength="622.2" clip-path="url(#breeze-testing-core-tests-line-80)"> Advanced flag for installing airflow in container </text><text class="breeze-testing-core-tests-r5" x="646.6" y="1972" textLength="793" clip-path="url(#breeze-testing-core-tes [...]
-</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="378.2" clip-path="url(#breeze-testing-core-tests-line-81)">--airflow-constraints-reference</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)">Constraint reference to u [...]
-</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="683.2" clip-path="url(#breeze-testing-core-tests-line-82)">(used in calculated constraints URL).                   </text><text class="breeze-testing-core-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-r6" x="756.4" y="2045.2" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-83)">(TEXT)                                  &# [...]
-</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-r4" x="24.4" y="2069.6" textLength="341.6" clip-path="url(#breeze-testing-core-tests-line-84)">--clean-airflow-installation</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)">Clean the airflow installati [...]
-</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="158.6" clip-path="url(#breeze-testing-core-tests-line-85)">specified by </text><text class="breeze-testing-core-tests-r4" x="915" y="2094" textLength="256.2" clip-path="url(#breeze-testing-core-tests-line-85)">--use-airflow-version</text><text class="breeze-testing [...]
-</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="329.4" clip-path="url(#breeze-testing-core-tests-line-86)">--force-lowest-dependencies</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)">Run tests for the lowest [...]
-</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-r1" x="756.4" y="2142.8" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-87)">or selected provider if `Provider[PROVIDER_ID]` is used </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2142.8" textLength="12.2" clip-path="url(#breeze-testing- [...]
-</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-r1" x="756.4" y="2167.2" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-88)">as test type.                                [...]
-</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="414.8" clip-path="url(#breeze-testing-core-tests-line-89)">--install-airflow-with-constraints</text><text class="breeze-testing-core-tests-r1" x="439.2" y="2191.6" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-89)">/</text><text class="breeze-testing-co [...]
-</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-r1" x="756.4" y="2216" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-90)">determined from package or airflow version.             </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2216" [...]
-</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-r5" x="756.4" y="2240.4" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-91)">[default: no-install-airflow-with-constraints]          </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2240.4" textLength="12.2" clip-path=" [...]
-</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-r4" x="24.4" y="2264.8" textLength="195.2" clip-path="url(#breeze-testing-core-tests-line-92)">--package-format</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2264.8" textLength="231.8" clip-path="url(#breeze-testing-core-tests-line-92)">Format of packages.</text><text class="breeze [...]
-</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-r5" x="756.4" y="2289.2" textLength="231.8" clip-path="url(#breeze-testing-core-tests-line-93)">[default: wheel]   </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2289.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-93)">│</text><text class="breeze-tes [...]
-</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-r4" x="24.4" y="2313.6" textLength="256.2" clip-path="url(#breeze-testing-core-tests-line-94)">--use-airflow-version</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)">Use (reinstall at entry) Airfl [...]
-</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)">can also be version (to install from PyPI), `none`,     </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2338" textLength="12.2" clip-pa [...]
-</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="683.2" clip-path="url(#breeze-testing-core-tests-line-96)">`wheel`, or `sdist` to install from `dist` folder, or   </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2362.4" textLength="12.2" clip-path=" [...]
-</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-r1" x="756.4" y="2386.8" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-97)">VCS URL to install from                            & [...]
-</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)">(https://pip.pypa.io/en/stable/topics/vcs-support/).    </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="2411.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line [...]
-</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="97.6" clip-path="url(#breeze-testing-core-tests-line-99)">Implies </text><text class="breeze-testing-core-tests-r4" x="854" y="2435.6" textLength="183" clip-path="url(#breeze-testing-core-tests-line-99)">--mount-sources</text><text class="breeze-testing-core-tests-r [...]
-</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-r6" x="756.4" y="2460" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-100)">(none | wheel | sdist | <airflow_version>)              </text><text class="breeze-testing-core-tests-r5" x= [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2484.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-101)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2484.4" textLength="292.8" clip-path="url(#breeze-testing-core-tests-line-101)">--use-packages-from-dist</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2484.4" textLength="341.6" clip-path="url(#breeze-testing-core-tests-line-101)">Install all found packages [...]
-</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-r1" x="756.4" y="2508.8" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-102)">type) from 'dist' folder when entering breeze.          </text><text class="breeze-testing-core-tests-r5" x="1451.8" y=" [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2533.2" textLength="1464" clip-path="url(#breeze-testing-core-tests-line-103)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-tests-r1" x="1464" y="2533.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-103)">
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2557.6" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-104)">â•─</text><text class="breeze-testing-core-tests-r5" x="24.4" y="2557.6" textLength="195.2" clip-path="url(#breeze-testing-core-tests-line-104)"> Common options </text><text class="breeze-testing-core-tests-r5" x="219.6" y="2557.6" textLength="1220" clip-path="url(#breeze-testing-core-tests-line-104)">───────────────────────────────────── [...]
-</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="109.8" clip-path="url(#breeze-testing-core-tests-line-105)">--dry-run</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)">-D</text><text class="breeze-testing-core-tests-r1" x="207.4" y="2 [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2606.4" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-106)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2606.4" textLength="109.8" clip-path="url(#breeze-testing-core-tests-line-106)">--verbose</text><text class="breeze-testing-core-tests-r7" x="158.6" y="2606.4" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-106)">-v</text><text class="breeze-testing-core-tests-r1" x="207.4 [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2630.8" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-107)">│</text><text class="breeze-testing-core-tests-r4" x="24.4" y="2630.8" textLength="73.2" clip-path="url(#breeze-testing-core-tests-line-107)">--help</text><text class="breeze-testing-core-tests-r7" x="158.6" y="2630.8" textLength="24.4" clip-path="url(#breeze-testing-core-tests-line-107)">-h</text><text class="breeze-testing-core-tests-r1" x="207.4" y= [...]
-</text><text class="breeze-testing-core-tests-r5" x="0" y="2655.2" textLength="1464" clip-path="url(#breeze-testing-core-tests-line-108)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-core-tests-r1" x="1464" y="2655.2" textLength="12.2" clip-path="url(#breeze-testing-core-tests-line-108)">
+</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-r1" x="756.4" y="2142.8" textLength="683.2" clip-path="url(#breeze-testing-core-tests-line-87)">determined from package or airflow version.             </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="21 [...]
+</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="195.2" clip-path="url(#breeze-testing-core-tests-line-89)">--package-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="breeze [...]
+</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="292.8" clip-path="url(#breeze-testing-core-tests-line-98)">--use-packages-from-dist</text><text class="breeze-testing-core-tests-r1" x="756.4" y="2411.2" textLength="341.6" clip-path="url(#breeze-testing-core-tests-line-98)">Install all found packages  [...]
+</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)">type) from 'dist' folder when entering breeze.          </text><text class="breeze-testing-core-tests-r5" x="1451.8" y="24 [...]
+</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 6c307cc3008..e480bcdd34a 100644
--- a/dev/breeze/doc/images/output_testing_core-tests.txt
+++ b/dev/breeze/doc/images/output_testing_core-tests.txt
@@ -1 +1 @@
-64ed81d840d3fad63635c617af522264
+c365493082aa3a10e3d9fc031f1d530e
diff --git a/dev/breeze/doc/images/output_testing_docker-compose-tests.svg b/dev/breeze/doc/images/output_testing_docker-compose-tests.svg
index deb86e79ea7..915ec7eb8d4 100644
--- a/dev/breeze/doc/images/output_testing_docker-compose-tests.svg
+++ b/dev/breeze/doc/images/output_testing_docker-compose-tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 586.8" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 513.5999999999999" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-testing-docker-compose-tests-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="535.8" />
+ <rect x="0" y="0" width="1463.0" height="462.59999999999997" />
</clipPath>
<clipPath id="breeze-testing-docker-compose-tests-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -99,18 +99,9 @@
<clipPath id="breeze-testing-docker-compose-tests-line-17">
<rect x="0" y="416.3" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-testing-docker-compose-tests-line-18">
- <rect x="0" y="440.7" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-testing-docker-compose-tests-line-19">
- <rect x="0" y="465.1" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-testing-docker-compose-tests-line-20">
- <rect x="0" y="489.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="584.8" rx="8"/><text class="breeze-testing-docker-compose-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing docker-compose-tests</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="511.6" rx="8"/><text class="breeze-testing-docker-compose-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing docker-compose-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"/>
@@ -126,22 +117,19 @@
</text><text class="breeze-testing-docker-compose-tests-r1" x="12.2" y="93.2" textLength="305" clip-path="url(#breeze-testing-docker-compose-tests-line-3)">Run docker-compose tests.</text><text class="breeze-testing-docker-compose-tests-r1" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-3)">
</text><text class="breeze-testing-docker-compose-tests-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-4)">
</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-testing-docker-compose-tests-line-5)">â•─</text><text class="breeze-testing-docker-compose-tests-r5" x="24.4" y="142" textLength="329.4" clip-path="url(#breeze-testing-docker-compose-tests-line-5)"> Docker-compose tests flag </text><text class="breeze-testing-docker-compose-tests-r5" x="353.8" y="142" textLength="1085.8" clip-path="url(#breeze-testing-dock [...]
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-6)">│</text><text class="breeze-testing-docker-compose-tests-r4" x="24.4" y="166.4" textLength="146.4" clip-path="url(#breeze-testing-docker-compose-tests-line-6)">--image-name</text><text class="breeze-testing-docker-compose-tests-r6" x="414.8" y="166.4" textLength="24.4" clip-path="url(#breeze-testing-docker-compose-tests-line-6)">-n</te [...]
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-7)">│</text><text class="breeze-testing-docker-compose-tests-r4" x="24.4" y="190.8" textLength="134.2" clip-path="url(#breeze-testing-docker-compose-tests-line-7)">--image-tag</text><text class="breeze-testing-docker-compose-tests-r1" x="463.6" y="190.8" textLength="695.4" clip-path="url(#breeze-testing-docker-compose-tests-line-7)">Tag [...]
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-8)">│</text><text class="breeze-testing-docker-compose-tests-r7" x="463.6" y="215.2" textLength="963.8" clip-path="url(#breeze-testing-docker-compose-tests-line-8)">(TEXT)                            &# [...]
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-9)">│</text><text class="breeze-testing-docker-compose-tests-r5" x="463.6" y="239.6" textLength="963.8" clip-path="url(#breeze-testing-docker-compose-tests-line-9)">[default: latest]                          [...]
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-10)">│</text><text class="breeze-testing-docker-compose-tests-r4" x="24.4" y="264" textLength="97.6" clip-path="url(#breeze-testing-docker-compose-tests-line-10)">--python</text><text class="breeze-testing-docker-compose-tests-r6" x="414.8" y="264" textLength="24.4" clip-path="url(#breeze-testing-docker-compose-tests-line-10)">-p</text><text [...]
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-11)">│</text><text class="breeze-testing-docker-compose-tests-r7" x="463.6" y="288.4" textLength="732" clip-path="url(#breeze-testing-docker-compose-tests-line-11)">(>3.9< | 3.10 | 3.11 | 3.12)                   [...]
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-12)">│</text><text class="breeze-testing-docker-compose-tests-r5" x="463.6" y="312.8" textLength="732" clip-path="url(#breeze-testing-docker-compose-tests-line-12)">[default: 3.9]                          & [...]
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-13)">│</text><text class="breeze-testing-docker-compose-tests-r4" x="24.4" y="337.2" textLength="366" clip-path="url(#breeze-testing-docker-compose-tests-line-13)">--skip-docker-compose-deletion</text><text class="breeze-testing-docker-compose-tests-r1" x="463.6" y="337.2" textLength="671" clip-path="url(#breeze-testing-docker-compose-test [...]
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-14)">│</text><text class="breeze-testing-docker-compose-tests-r4" x="24.4" y="361.6" textLength="231.8" clip-path="url(#breeze-testing-docker-compose-tests-line-14)">--github-repository</text><text class="breeze-testing-docker-compose-tests-r6" x="414.8" y="361.6" textLength="24.4" clip-path="url(#breeze-testing-docker-compose-tests-line-1 [...]
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-15)">│</text><text class="breeze-testing-docker-compose-tests-r5" x="463.6" y="386" textLength="585.6" clip-path="url(#breeze-testing-docker-compose-tests-line-15)">[default: apache/airflow]                       </text><te [...]
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="410.4" textLength="1464" clip-path="url(#breeze-testing-docker-compose-tests-line-16)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-docker-compose-tests-r1" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-16)">
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="434.8" textLength="24.4" clip-path="url(#breeze-testing-docker-compose-tests-line-17)">â•─</text><text class="breeze-testing-docker-compose-tests-r5" x="24.4" y="434.8" textLength="195.2" clip-path="url(#breeze-testing-docker-compose-tests-line-17)"> Common options </text><text class="breeze-testing-docker-compose-tests-r5" x="219.6" y="434.8" textLength="1220" clip-path="url(#breeze-testing-docker-compose [...]
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-18)">│</text><text class="breeze-testing-docker-compose-tests-r4" x="24.4" y="459.2" textLength="109.8" clip-path="url(#breeze-testing-docker-compose-tests-line-18)">--verbose</text><text class="breeze-testing-docker-compose-tests-r6" x="158.6" y="459.2" textLength="24.4" clip-path="url(#breeze-testing-docker-compose-tests-line-18)">-v</te [...]
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-19)">│</text><text class="breeze-testing-docker-compose-tests-r4" x="24.4" y="483.6" textLength="109.8" clip-path="url(#breeze-testing-docker-compose-tests-line-19)">--dry-run</text><text class="breeze-testing-docker-compose-tests-r6" x="158.6" y="483.6" textLength="24.4" clip-path="url(#breeze-testing-docker-compose-tests-line-19)">-D</te [...]
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-20)">│</text><text class="breeze-testing-docker-compose-tests-r4" x="24.4" y="508" textLength="73.2" clip-path="url(#breeze-testing-docker-compose-tests-line-20)">--help</text><text class="breeze-testing-docker-compose-tests-r6" x="158.6" y="508" textLength="24.4" clip-path="url(#breeze-testing-docker-compose-tests-line-20)">-h</text><text c [...]
-</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="532.4" textLength="1464" clip-path="url(#breeze-testing-docker-compose-tests-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-docker-compose-tests-r1" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-21)">
+</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-6)">│</text><text class="breeze-testing-docker-compose-tests-r4" x="24.4" y="166.4" textLength="146.4" clip-path="url(#breeze-testing-docker-compose-tests-line-6)">--image-name</text><text class="breeze-testing-docker-compose-tests-r6" x="414.8" y="166.4" textLength="24.4" clip-path="url(#breeze-testing-docker-compose-tests-line-6)">-n</te [...]
+</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-7)">│</text><text class="breeze-testing-docker-compose-tests-r4" x="24.4" y="190.8" textLength="97.6" clip-path="url(#breeze-testing-docker-compose-tests-line-7)">--python</text><text class="breeze-testing-docker-compose-tests-r6" x="414.8" y="190.8" textLength="24.4" clip-path="url(#breeze-testing-docker-compose-tests-line-7)">-p</text><t [...]
+</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-8)">│</text><text class="breeze-testing-docker-compose-tests-r7" x="463.6" y="215.2" textLength="732" clip-path="url(#breeze-testing-docker-compose-tests-line-8)">(>3.9< | 3.10 | 3.11 | 3.12)                    [...]
+</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-9)">│</text><text class="breeze-testing-docker-compose-tests-r5" x="463.6" y="239.6" textLength="732" clip-path="url(#breeze-testing-docker-compose-tests-line-9)">[default: 3.9]                           [...]
+</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-10)">│</text><text class="breeze-testing-docker-compose-tests-r4" x="24.4" y="264" textLength="366" clip-path="url(#breeze-testing-docker-compose-tests-line-10)">--skip-docker-compose-deletion</text><text class="breeze-testing-docker-compose-tests-r1" x="463.6" y="264" textLength="671" clip-path="url(#breeze-testing-docker-compose-tests-line [...]
+</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-11)">│</text><text class="breeze-testing-docker-compose-tests-r4" x="24.4" y="288.4" textLength="231.8" clip-path="url(#breeze-testing-docker-compose-tests-line-11)">--github-repository</text><text class="breeze-testing-docker-compose-tests-r6" x="414.8" y="288.4" textLength="24.4" clip-path="url(#breeze-testing-docker-compose-tests-line-1 [...]
+</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-12)">│</text><text class="breeze-testing-docker-compose-tests-r5" x="463.6" y="312.8" textLength="585.6" clip-path="url(#breeze-testing-docker-compose-tests-line-12)">[default: apache/airflow]                       </text [...]
+</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="337.2" textLength="1464" clip-path="url(#breeze-testing-docker-compose-tests-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-docker-compose-tests-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-13)">
+</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="361.6" textLength="24.4" clip-path="url(#breeze-testing-docker-compose-tests-line-14)">â•─</text><text class="breeze-testing-docker-compose-tests-r5" x="24.4" y="361.6" textLength="195.2" clip-path="url(#breeze-testing-docker-compose-tests-line-14)"> Common options </text><text class="breeze-testing-docker-compose-tests-r5" x="219.6" y="361.6" textLength="1220" clip-path="url(#breeze-testing-docker-compose [...]
+</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-15)">│</text><text class="breeze-testing-docker-compose-tests-r4" x="24.4" y="386" textLength="109.8" clip-path="url(#breeze-testing-docker-compose-tests-line-15)">--verbose</text><text class="breeze-testing-docker-compose-tests-r6" x="158.6" y="386" textLength="24.4" clip-path="url(#breeze-testing-docker-compose-tests-line-15)">-v</text><te [...]
+</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-16)">│</text><text class="breeze-testing-docker-compose-tests-r4" x="24.4" y="410.4" textLength="109.8" clip-path="url(#breeze-testing-docker-compose-tests-line-16)">--dry-run</text><text class="breeze-testing-docker-compose-tests-r6" x="158.6" y="410.4" textLength="24.4" clip-path="url(#breeze-testing-docker-compose-tests-line-16)">-D</te [...]
+</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-17)">│</text><text class="breeze-testing-docker-compose-tests-r4" x="24.4" y="434.8" textLength="73.2" clip-path="url(#breeze-testing-docker-compose-tests-line-17)">--help</text><text class="breeze-testing-docker-compose-tests-r6" x="158.6" y="434.8" textLength="24.4" clip-path="url(#breeze-testing-docker-compose-tests-line-17)">-h</text>< [...]
+</text><text class="breeze-testing-docker-compose-tests-r5" x="0" y="459.2" textLength="1464" clip-path="url(#breeze-testing-docker-compose-tests-line-18)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-docker-compose-tests-r1" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-testing-docker-compose-tests-line-18)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_testing_docker-compose-tests.txt b/dev/breeze/doc/images/output_testing_docker-compose-tests.txt
index 70ca0dfd6e5..66bedc7bb83 100644
--- a/dev/breeze/doc/images/output_testing_docker-compose-tests.txt
+++ b/dev/breeze/doc/images/output_testing_docker-compose-tests.txt
@@ -1 +1 @@
-dced71bc07c38daccbcb9a19c5f04a5c
+73b209e41fec5642624d40a92fdeda71
diff --git a/dev/breeze/doc/images/output_testing_helm-tests.svg b/dev/breeze/doc/images/output_testing_helm-tests.svg
index 4fd8f49b122..8acca12aa5d 100644
--- a/dev/breeze/doc/images/output_testing_helm-tests.svg
+++ b/dev/breeze/doc/images/output_testing_helm-tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 757.5999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 708.8" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-testing-helm-tests-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="706.5999999999999" />
+ <rect x="0" y="0" width="1463.0" height="657.8" />
</clipPath>
<clipPath id="breeze-testing-helm-tests-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -123,15 +123,9 @@
<clipPath id="breeze-testing-helm-tests-line-25">
<rect x="0" y="611.5" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-testing-helm-tests-line-26">
- <rect x="0" y="635.9" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-testing-helm-tests-line-27">
- <rect x="0" y="660.3" 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="755.6" rx="8"/><text class="breeze-testing-helm-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing helm-tests</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="706.8" rx="8"/><text class="breeze-testing-helm-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing helm-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"/>
@@ -158,18 +152,16 @@
</text><text class="breeze-testing-helm-tests-r5" x="0" y="361.6" textLength="1464" clip-path="url(#breeze-testing-helm-tests-line-14)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-helm-tests-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-14)">
</text><text class="breeze-testing-helm-tests-r5" x="0" y="386" textLength="24.4" clip-path="url(#breeze-testing-helm-tests-line-15)">â•─</text><text class="breeze-testing-helm-tests-r5" x="24.4" y="386" textLength="451.4" clip-path="url(#breeze-testing-helm-tests-line-15)"> Advanced flag for helm-test command </text><text class="breeze-testing-helm-tests-r5" x="475.8" y="386" textLength="963.8" clip-path="url(#breeze-testing-helm-tests-line-15)">──────────── [...]
</text><text class="breeze-testing-helm-tests-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-16)">│</text><text class="breeze-testing-helm-tests-r4" x="24.4" y="410.4" textLength="231.8" clip-path="url(#breeze-testing-helm-tests-line-16)">--github-repository</text><text class="breeze-testing-helm-tests-r7" x="280.6" y="410.4" textLength="24.4" clip-path="url(#breeze-testing-helm-tests-line-16)">-g</text><text class="breeze-testing-helm-tests-r1" x="3 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-17)">│</text><text class="breeze-testing-helm-tests-r4" x="24.4" y="434.8" textLength="134.2" clip-path="url(#breeze-testing-helm-tests-line-17)">--image-tag</text><text class="breeze-testing-helm-tests-r1" x="329.4" y="434.8" textLength="695.4" clip-path="url(#breeze-testing-helm-tests-line-17)">Tag of the image which is used [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-18)">│</text><text class="breeze-testing-helm-tests-r5" x="329.4" y="459.2" textLength="963.8" clip-path="url(#breeze-testing-helm-tests-line-18)">[default: latest]                                 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-19)">│</text><text class="breeze-testing-helm-tests-r4" x="24.4" y="483.6" textLength="183" clip-path="url(#breeze-testing-helm-tests-line-19)">--mount-sources</text><text class="breeze-testing-helm-tests-r1" x="329.4" y="483.6" textLength="1110.2" clip-path="url(#breeze-testing-helm-tests-line-19)">Choose scope of local sources that& [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-20)">│</text><text class="breeze-testing-helm-tests-r1" x="329.4" y="508" textLength="1110.2" clip-path="url(#breeze-testing-helm-tests-line-20)">selected).                                   [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-21)">│</text><text class="breeze-testing-helm-tests-r6" x="329.4" y="532.4" textLength="1110.2" clip-path="url(#breeze-testing-helm-tests-line-21)">(selected | all | skip | remove | tests | providers-and-tests)                  [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-22)">│</text><text class="breeze-testing-helm-tests-r5" x="329.4" y="556.8" textLength="1110.2" clip-path="url(#breeze-testing-helm-tests-line-22)">[default: selected]                                [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="581.2" textLength="1464" clip-path="url(#breeze-testing-helm-tests-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-helm-tests-r1" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-23)">
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="605.6" textLength="24.4" clip-path="url(#breeze-testing-helm-tests-line-24)">â•─</text><text class="breeze-testing-helm-tests-r5" x="24.4" y="605.6" textLength="195.2" clip-path="url(#breeze-testing-helm-tests-line-24)"> Common options </text><text class="breeze-testing-helm-tests-r5" x="219.6" y="605.6" textLength="1220" clip-path="url(#breeze-testing-helm-tests-line-24)">─────────────────────────────────────────── [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-25)">│</text><text class="breeze-testing-helm-tests-r4" x="24.4" y="630" textLength="109.8" clip-path="url(#breeze-testing-helm-tests-line-25)">--verbose</text><text class="breeze-testing-helm-tests-r7" x="158.6" y="630" textLength="24.4" clip-path="url(#breeze-testing-helm-tests-line-25)">-v</text><text class="breeze-testing-helm-tests-r1" x="207.4" y="630" te [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-26)">│</text><text class="breeze-testing-helm-tests-r4" x="24.4" y="654.4" textLength="109.8" clip-path="url(#breeze-testing-helm-tests-line-26)">--dry-run</text><text class="breeze-testing-helm-tests-r7" x="158.6" y="654.4" textLength="24.4" clip-path="url(#breeze-testing-helm-tests-line-26)">-D</text><text class="breeze-testing-helm-tests-r1" x="207.4" y="6 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-27)">│</text><text class="breeze-testing-helm-tests-r4" x="24.4" y="678.8" textLength="73.2" clip-path="url(#breeze-testing-helm-tests-line-27)">--help</text><text class="breeze-testing-helm-tests-r7" x="158.6" y="678.8" textLength="24.4" clip-path="url(#breeze-testing-helm-tests-line-27)">-h</text><text class="breeze-testing-helm-tests-r1" x="207.4" y="678.8 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="703.2" textLength="1464" clip-path="url(#breeze-testing-helm-tests-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-helm-tests-r1" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-28)">
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-17)">│</text><text class="breeze-testing-helm-tests-r4" x="24.4" y="434.8" textLength="183" clip-path="url(#breeze-testing-helm-tests-line-17)">--mount-sources</text><text class="breeze-testing-helm-tests-r1" x="329.4" y="434.8" textLength="1110.2" clip-path="url(#breeze-testing-helm-tests-line-17)">Choose scope of local sources that& [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-18)">│</text><text class="breeze-testing-helm-tests-r1" x="329.4" y="459.2" textLength="1110.2" clip-path="url(#breeze-testing-helm-tests-line-18)">selected).                                   [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-19)">│</text><text class="breeze-testing-helm-tests-r6" x="329.4" y="483.6" textLength="1110.2" clip-path="url(#breeze-testing-helm-tests-line-19)">(selected | all | skip | remove | tests | providers-and-tests)                  [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-20)">│</text><text class="breeze-testing-helm-tests-r5" x="329.4" y="508" textLength="1110.2" clip-path="url(#breeze-testing-helm-tests-line-20)">[default: selected]                                & [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="532.4" textLength="1464" clip-path="url(#breeze-testing-helm-tests-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-helm-tests-r1" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-21)">
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="556.8" textLength="24.4" clip-path="url(#breeze-testing-helm-tests-line-22)">â•─</text><text class="breeze-testing-helm-tests-r5" x="24.4" y="556.8" textLength="195.2" clip-path="url(#breeze-testing-helm-tests-line-22)"> Common options </text><text class="breeze-testing-helm-tests-r5" x="219.6" y="556.8" textLength="1220" clip-path="url(#breeze-testing-helm-tests-line-22)">─────────────────────────────────────────── [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-23)">│</text><text class="breeze-testing-helm-tests-r4" x="24.4" y="581.2" textLength="109.8" clip-path="url(#breeze-testing-helm-tests-line-23)">--verbose</text><text class="breeze-testing-helm-tests-r7" x="158.6" y="581.2" textLength="24.4" clip-path="url(#breeze-testing-helm-tests-line-23)">-v</text><text class="breeze-testing-helm-tests-r1" x="207.4" y="5 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-24)">│</text><text class="breeze-testing-helm-tests-r4" x="24.4" y="605.6" textLength="109.8" clip-path="url(#breeze-testing-helm-tests-line-24)">--dry-run</text><text class="breeze-testing-helm-tests-r7" x="158.6" y="605.6" textLength="24.4" clip-path="url(#breeze-testing-helm-tests-line-24)">-D</text><text class="breeze-testing-helm-tests-r1" x="207.4" y="6 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-25)">│</text><text class="breeze-testing-helm-tests-r4" x="24.4" y="630" textLength="73.2" clip-path="url(#breeze-testing-helm-tests-line-25)">--help</text><text class="breeze-testing-helm-tests-r7" x="158.6" y="630" textLength="24.4" clip-path="url(#breeze-testing-helm-tests-line-25)">-h</text><text class="breeze-testing-helm-tests-r1" x="207.4" y="630" textLe [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="654.4" textLength="1464" clip-path="url(#breeze-testing-helm-tests-line-26)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-helm-tests-r1" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-26)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_testing_helm-tests.txt b/dev/breeze/doc/images/output_testing_helm-tests.txt
index e3f8185c340..29ca892768f 100644
--- a/dev/breeze/doc/images/output_testing_helm-tests.txt
+++ b/dev/breeze/doc/images/output_testing_helm-tests.txt
@@ -1 +1 @@
-9d76d5747514d7151daba398105f621e
+18fef2fe6824a0f8ef859246d55d587e
diff --git a/dev/breeze/doc/images/output_testing_providers-integration-tests.svg b/dev/breeze/doc/images/output_testing_providers-integration-tests.svg
index 496148e346f..58e01e5815e 100644
--- a/dev/breeze/doc/images/output_testing_providers-integration-tests.svg
+++ b/dev/breeze/doc/images/output_testing_providers-integration-tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1343.1999999999998" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1270.0" 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-integration-tests-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="1292.1999999999998" />
+ <rect x="0" y="0" width="1463.0" height="1219.0" />
</clipPath>
<clipPath id="breeze-testing-providers-integration-tests-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -192,18 +192,9 @@
<clipPath id="breeze-testing-providers-integration-tests-line-48">
<rect x="0" y="1172.7" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-testing-providers-integration-tests-line-49">
- <rect x="0" y="1197.1" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-testing-providers-integration-tests-line-50">
- <rect x="0" y="1221.5" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-testing-providers-integration-tests-line-51">
- <rect x="0" y="1245.9" 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="1341.2" rx="8"/><text class="breeze-testing-providers-integration-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing providers-integration-tests</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1268" rx="8"/><text class="breeze-testing-providers-integration-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing providers-integration-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"/>
@@ -251,21 +242,18 @@
</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="874" textLength="1464" clip-path="url(#breeze-testing-providers-integration-tests-line-35)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-integration-tests-r1" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-35)">
</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="898.4" textLength="24.4" clip-path="url(#breeze-testing-providers-integration-tests-line-36)">â•─</text><text class="breeze-testing-providers-integration-tests-r5" x="24.4" y="898.4" textLength="402.6" clip-path="url(#breeze-testing-providers-integration-tests-line-36)"> Advanced flag for tests command </text><text class="breeze-testing-providers-integration-tests-r5" x="427" y="898.4 [...]
</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-37)">│</text><text class="breeze-testing-providers-integration-tests-r4" x="24.4" y="922.8" textLength="231.8" clip-path="url(#breeze-testing-providers-integration-tests-line-37)">--github-repository</text><text class="breeze-testing-providers-integration-tests-r7" x="366" y="922.8" textLength="24.4" clip-path="url(#breeze-te [...]
-</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-38)">│</text><text class="breeze-testing-providers-integration-tests-r4" x="24.4" y="947.2" textLength="134.2" clip-path="url(#breeze-testing-providers-integration-tests-line-38)">--image-tag</text><text class="breeze-testing-providers-integration-tests-r1" x="414.8" y="947.2" textLength="695.4" clip-path="url(#breeze-testing [...]
-</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-39)">│</text><text class="breeze-testing-providers-integration-tests-r6" x="414.8" y="971.6" textLength="963.8" clip-path="url(#breeze-testing-providers-integration-tests-line-39)">(TEXT)                       &# [...]
-</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-40)">│</text><text class="breeze-testing-providers-integration-tests-r5" x="414.8" y="996" textLength="963.8" clip-path="url(#breeze-testing-providers-integration-tests-line-40)">[default: latest]                     &# [...]
-</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-41)">│</text><text class="breeze-testing-providers-integration-tests-r4" x="24.4" y="1020.4" textLength="183" clip-path="url(#breeze-testing-providers-integration-tests-line-41)">--mount-sources</text><text class="breeze-testing-providers-integration-tests-r1" x="414.8" y="1020.4" textLength="1024.8" clip-path="url(#breeze-t [...]
-</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-42)">│</text><text class="breeze-testing-providers-integration-tests-r1" x="414.8" y="1044.8" textLength="1024.8" clip-path="url(#breeze-testing-providers-integration-tests-line-42)">selected).                      & [...]
-</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-43)">│</text><text class="breeze-testing-providers-integration-tests-r6" x="414.8" y="1069.2" textLength="1024.8" clip-path="url(#breeze-testing-providers-integration-tests-line-43)">(selected | all | skip | remove | tests | providers-and-tests)     & [...]
-</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-44)">│</text><text class="breeze-testing-providers-integration-tests-r5" x="414.8" y="1093.6" textLength="1024.8" clip-path="url(#breeze-testing-providers-integration-tests-line-44)">[default: selected]                     [...]
-</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-45)">│</text><text class="breeze-testing-providers-integration-tests-r4" x="24.4" y="1118" textLength="317.2" clip-path="url(#breeze-testing-providers-integration-tests-line-45)">--skip-docker-compose-down</text><text class="breeze-testing-providers-integration-tests-r1" x="414.8" y="1118" textLength="549" clip-path="url(#bree [...]
-</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-46)">│</text><text class="breeze-testing-providers-integration-tests-r4" x="24.4" y="1142.4" textLength="244" clip-path="url(#breeze-testing-providers-integration-tests-line-46)">--keep-env-variables</text><text class="breeze-testing-providers-integration-tests-r1" x="414.8" y="1142.4" textLength="1000.4" clip-path="url(#bre [...]
-</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1166.8" textLength="1464" clip-path="url(#breeze-testing-providers-integration-tests-line-47)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-integration-tests-r1" x="1464" y="1166.8" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-47)">
-</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1191.2" textLength="24.4" clip-path="url(#breeze-testing-providers-integration-tests-line-48)">â•─</text><text class="breeze-testing-providers-integration-tests-r5" x="24.4" y="1191.2" textLength="195.2" clip-path="url(#breeze-testing-providers-integration-tests-line-48)"> Common options </text><text class="breeze-testing-providers-integration-tests-r5" x="219.6" y="1191.2" textLength="1220" clip-pa [...]
-</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-49)">│</text><text class="breeze-testing-providers-integration-tests-r4" x="24.4" y="1215.6" textLength="109.8" clip-path="url(#breeze-testing-providers-integration-tests-line-49)">--dry-run</text><text class="breeze-testing-providers-integration-tests-r7" x="158.6" y="1215.6" textLength="24.4" clip-path="url(#breeze-testing [...]
-</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-50)">│</text><text class="breeze-testing-providers-integration-tests-r4" x="24.4" y="1240" textLength="109.8" clip-path="url(#breeze-testing-providers-integration-tests-line-50)">--verbose</text><text class="breeze-testing-providers-integration-tests-r7" x="158.6" y="1240" textLength="24.4" clip-path="url(#breeze-testing-provi [...]
-</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-51)">│</text><text class="breeze-testing-providers-integration-tests-r4" x="24.4" y="1264.4" textLength="73.2" clip-path="url(#breeze-testing-providers-integration-tests-line-51)">--help</text><text class="breeze-testing-providers-integration-tests-r7" x="158.6" y="1264.4" textLength="24.4" clip-path="url(#breeze-testing-pro [...]
-</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1288.8" textLength="1464" clip-path="url(#breeze-testing-providers-integration-tests-line-52)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-integration-tests-r1" x="1464" y="1288.8" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-52)">
+</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-38)">│</text><text class="breeze-testing-providers-integration-tests-r4" x="24.4" y="947.2" textLength="183" clip-path="url(#breeze-testing-providers-integration-tests-line-38)">--mount-sources</text><text class="breeze-testing-providers-integration-tests-r1" x="414.8" y="947.2" textLength="1024.8" clip-path="url(#breeze-test [...]
+</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-39)">│</text><text class="breeze-testing-providers-integration-tests-r1" x="414.8" y="971.6" textLength="1024.8" clip-path="url(#breeze-testing-providers-integration-tests-line-39)">selected).                       [...]
+</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-40)">│</text><text class="breeze-testing-providers-integration-tests-r6" x="414.8" y="996" textLength="1024.8" clip-path="url(#breeze-testing-providers-integration-tests-line-40)">(selected | all | skip | remove | tests | providers-and-tests)      & [...]
+</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-41)">│</text><text class="breeze-testing-providers-integration-tests-r5" x="414.8" y="1020.4" textLength="1024.8" clip-path="url(#breeze-testing-providers-integration-tests-line-41)">[default: selected]                     [...]
+</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-42)">│</text><text class="breeze-testing-providers-integration-tests-r4" x="24.4" y="1044.8" textLength="317.2" clip-path="url(#breeze-testing-providers-integration-tests-line-42)">--skip-docker-compose-down</text><text class="breeze-testing-providers-integration-tests-r1" x="414.8" y="1044.8" textLength="549" clip-path="url [...]
+</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-43)">│</text><text class="breeze-testing-providers-integration-tests-r4" x="24.4" y="1069.2" textLength="244" clip-path="url(#breeze-testing-providers-integration-tests-line-43)">--keep-env-variables</text><text class="breeze-testing-providers-integration-tests-r1" x="414.8" y="1069.2" textLength="1000.4" clip-path="url(#bre [...]
+</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1093.6" textLength="1464" clip-path="url(#breeze-testing-providers-integration-tests-line-44)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-integration-tests-r1" x="1464" y="1093.6" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-44)">
+</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1118" textLength="24.4" clip-path="url(#breeze-testing-providers-integration-tests-line-45)">â•─</text><text class="breeze-testing-providers-integration-tests-r5" x="24.4" y="1118" textLength="195.2" clip-path="url(#breeze-testing-providers-integration-tests-line-45)"> Common options </text><text class="breeze-testing-providers-integration-tests-r5" x="219.6" y="1118" textLength="1220" clip-path="ur [...]
+</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-46)">│</text><text class="breeze-testing-providers-integration-tests-r4" x="24.4" y="1142.4" textLength="109.8" clip-path="url(#breeze-testing-providers-integration-tests-line-46)">--dry-run</text><text class="breeze-testing-providers-integration-tests-r7" x="158.6" y="1142.4" textLength="24.4" clip-path="url(#breeze-testing [...]
+</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-47)">│</text><text class="breeze-testing-providers-integration-tests-r4" x="24.4" y="1166.8" textLength="109.8" clip-path="url(#breeze-testing-providers-integration-tests-line-47)">--verbose</text><text class="breeze-testing-providers-integration-tests-r7" x="158.6" y="1166.8" textLength="24.4" clip-path="url(#breeze-testing [...]
+</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-48)">│</text><text class="breeze-testing-providers-integration-tests-r4" x="24.4" y="1191.2" textLength="73.2" clip-path="url(#breeze-testing-providers-integration-tests-line-48)">--help</text><text class="breeze-testing-providers-integration-tests-r7" x="158.6" y="1191.2" textLength="24.4" clip-path="url(#breeze-testing-pro [...]
+</text><text class="breeze-testing-providers-integration-tests-r5" x="0" y="1215.6" textLength="1464" clip-path="url(#breeze-testing-providers-integration-tests-line-49)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-integration-tests-r1" x="1464" y="1215.6" textLength="12.2" clip-path="url(#breeze-testing-providers-integration-tests-line-49)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_testing_providers-integration-tests.txt b/dev/breeze/doc/images/output_testing_providers-integration-tests.txt
index c63fb9f03a7..d005ba372b9 100644
--- a/dev/breeze/doc/images/output_testing_providers-integration-tests.txt
+++ b/dev/breeze/doc/images/output_testing_providers-integration-tests.txt
@@ -1 +1 @@
-ffad8017d4bdd9bbb186cfd55856cc49
+1408ef278ed356f02031139bdfbe79d4
diff --git a/dev/breeze/doc/images/output_testing_providers-tests.svg b/dev/breeze/doc/images/output_testing_providers-tests.svg
index 74a0de866da..3b98f69276b 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 2953.6" 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="2902.6" />
+ <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,18 +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>
-<clipPath id="breeze-testing-providers-tests-line-116">
- <rect x="0" y="2831.9" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-testing-providers-tests-line-117">
- <rect x="0" y="2856.3" 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="2951.6" 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"/>
@@ -482,54 +473,51 @@
</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="134.2" clip-path="url(#breeze-testing-providers-tests-line-71)">--image-tag</text><text class="breeze-testing-providers-tests-r1" x="414.8" y="1752.4" textLength="695.4" clip-path="url(#breeze-testing-providers-tests-line-71)">Tag of the imag [...]
-</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="963.8" clip-path="url(#breeze-testing-providers-tests-line-72)">(TEXT)                                [...]
-</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="963.8" clip-path="url(#breeze-testing-providers-tests-line-73)">[default: latest]                            &# [...]
-</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="183" clip-path="url(#breeze-testing-providers-tests-line-74)">--mount-sources</text><text class="breeze-testing-providers-tests-r1" x="414.8" y="1825.6" textLength="1024.8" clip-path="url(#breeze-testing-providers-tests-line-74)">Choose scope of&# [...]
-</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-r1" x="414.8" y="1850" textLength="1024.8" clip-path="url(#breeze-testing-providers-tests-line-75)">selected).                                [...]
-</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-r7" x="414.8" y="1874.4" textLength="1024.8" clip-path="url(#breeze-testing-providers-tests-line-76)">(selected | all | skip | remove | tests | providers-and-tests)             & [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-77)">│</text><text class="breeze-testing-providers-tests-r5" x="414.8" y="1898.8" textLength="1024.8" clip-path="url(#breeze-testing-providers-tests-line-77)">[default: selected]                             [...]
-</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="317.2" clip-path="url(#breeze-testing-providers-tests-line-78)">--skip-docker-compose-down</text><text class="breeze-testing-providers-tests-r1" x="414.8" y="1923.2" textLength="549" clip-path="url(#breeze-testing-providers-tests-line-78)">Skips runnin [...]
-</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="244" clip-path="url(#breeze-testing-providers-tests-line-79)">--keep-env-variables</text><text class="breeze-testing-providers-tests-r1" x="414.8" y="1947.6" textLength="1000.4" clip-path="url(#breeze-testing-providers-tests-line-79)">Do not clear [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1972" textLength="1464" clip-path="url(#breeze-testing-providers-tests-line-80)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-tests-r1" x="1464" y="1972" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-80)">
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="1996.4" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-81)">â•─</text><text class="breeze-testing-providers-tests-r5" x="24.4" y="1996.4" textLength="622.2" clip-path="url(#breeze-testing-providers-tests-line-81)"> Advanced flag for installing airflow in container </text><text class="breeze-testing-providers-tests-r5" x="646.6" y="1996.4" textLength="793" clip-pat [...]
-</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="378.2" clip-path="url(#breeze-testing-providers-tests-line-82)">--airflow-constraints-reference</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)">Constraint [...]
-</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="683.2" clip-path="url(#breeze-testing-providers-tests-line-83)">(used in calculated constraints URL).                   </text><text class="b [...]
-</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-r7" x="756.4" y="2069.6" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-84)">(TEXT)                                [...]
-</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-r4" x="24.4" y="2094" textLength="341.6" clip-path="url(#breeze-testing-providers-tests-line-85)">--clean-airflow-installation</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)">Clean the  [...]
-</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="158.6" clip-path="url(#breeze-testing-providers-tests-line-86)">specified by </text><text class="breeze-testing-providers-tests-r4" x="915" y="2118.4" textLength="256.2" clip-path="url(#breeze-testing-providers-tests-line-86)">--use-airflow-versi [...]
-</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="329.4" clip-path="url(#breeze-testing-providers-tests-line-87)">--force-lowest-dependencies</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)">Run tests [...]
-</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-r1" x="756.4" y="2167.2" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-88)">or selected provider if `Provider[PROVIDER_ID]` is used </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="2167.2" textLength="12.2" clip-p [...]
-</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-r1" x="756.4" y="2191.6" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-89)">as test type.                            & [...]
-</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="414.8" clip-path="url(#breeze-testing-providers-tests-line-90)">--install-airflow-with-constraints</text><text class="breeze-testing-providers-tests-r1" x="439.2" y="2216" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-90)">/</text><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-r1" x="756.4" y="2240.4" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-91)">determined from package or airflow version.             </text><text class="breeze-testing-providers-t [...]
-</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-r5" x="756.4" y="2264.8" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-92)">[default: no-install-airflow-with-constraints]          </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="2264.8" text [...]
-</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-r4" x="24.4" y="2289.2" textLength="195.2" clip-path="url(#breeze-testing-providers-tests-line-93)">--package-format</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2289.2" textLength="231.8" clip-path="url(#breeze-testing-providers-tests-line-93)">Format of packa [...]
-</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-r5" x="756.4" y="2313.6" textLength="231.8" clip-path="url(#breeze-testing-providers-tests-line-94)">[default: wheel]   </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="2313.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-94)">│ [...]
-</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-r4" x="24.4" y="2338" textLength="256.2" clip-path="url(#breeze-testing-providers-tests-line-95)">--use-airflow-version</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)">Use (reinstall a [...]
-</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)">can also be version (to install from PyPI), `none`,     </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="23 [...]
-</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="683.2" clip-path="url(#breeze-testing-providers-tests-line-97)">`wheel`, or `sdist` to install from `dist` folder, or   </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="2386.8" text [...]
-</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-r1" x="756.4" y="2411.2" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-98)">VCS URL to install from                          [...]
-</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)">(https://pip.pypa.io/en/stable/topics/vcs-support/).    </text><text class="breeze-testing-providers-tests-r5" x="1451.8" y="2435.6" textLength="12.2" clip-path="url(#breez [...]
-</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="97.6" clip-path="url(#breeze-testing-providers-tests-line-100)">Implies </text><text class="breeze-testing-providers-tests-r4" x="854" y="2460" textLength="183" clip-path="url(#breeze-testing-providers-tests-line-100)">--mount-sources</text><text class=" [...]
-</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-r7" x="756.4" y="2484.4" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-101)">(none | wheel | sdist | <airflow_version>)              </text><text class="breeze-t [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2508.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-102)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2508.8" textLength="292.8" clip-path="url(#breeze-testing-providers-tests-line-102)">--use-packages-from-dist</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2508.8" textLength="341.6" clip-path="url(#breeze-testing-providers-tests-line-102)">Install a [...]
-</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-r1" x="756.4" y="2533.2" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-103)">type) from 'dist' folder when entering breeze.          </text><text class="breeze-testing-providers [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2557.6" textLength="1464" clip-path="url(#breeze-testing-providers-tests-line-104)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-tests-r1" x="1464" y="2557.6" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-104)">
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2582" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-105)">â•─</text><text class="breeze-testing-providers-tests-r5" x="24.4" y="2582" textLength="512.4" clip-path="url(#breeze-testing-providers-tests-line-105)"> Advanced flag for provider tests command </text><text class="breeze-testing-providers-tests-r5" x="536.8" y="2582" textLength="902.8" clip-path="url(#breeze-t [...]
-</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="244" clip-path="url(#breeze-testing-providers-tests-line-106)">--excluded-providers</text><text class="breeze-testing-providers-tests-r1" x="463.6" y="2606.4" textLength="976" clip-path="url(#breeze-testing-providers-tests-line-106)">JSON-string of [...]
-</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-r1" x="463.6" y="2630.8" textLength="976" clip-path="url(#breeze-testing-providers-tests-line-107)">({'3.12': ['provider']})                         [...]
-</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="976" 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="390.4" clip-path="url(#breeze-testing-providers-tests-line-109)">--providers-constraints-location</text><text class="breeze-testing-providers-tests-r1" x="463.6" y="2679.6" textLength="927.2" clip-path="url(#breeze-testing-providers-tests-line-109)">Locati [...]
-</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-r7" x="463.6" y="2704" textLength="927.2" clip-path="url(#breeze-testing-providers-tests-line-110)">(TEXT)                               &# [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2728.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-111)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2728.4" textLength="341.6" clip-path="url(#breeze-testing-providers-tests-line-111)">--providers-skip-constraints</text><text class="breeze-testing-providers-tests-r1" x="463.6" y="2728.4" textLength="597.8" clip-path="url(#breeze-testing-providers-tests-line-111)">Do no [...]
-</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="195.2" clip-path="url(#breeze-testing-providers-tests-line-112)">--skip-providers</text><text class="breeze-testing-providers-tests-r1" x="463.6" y="2752.8" textLength="768.6" clip-path="url(#breeze-testing-providers-tests-line-112)">Space-separated l [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2777.2" textLength="1464" clip-path="url(#breeze-testing-providers-tests-line-113)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-tests-r1" x="1464" y="2777.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-113)">
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2801.6" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-114)">â•─</text><text class="breeze-testing-providers-tests-r5" x="24.4" y="2801.6" textLength="195.2" clip-path="url(#breeze-testing-providers-tests-line-114)"> Common options </text><text class="breeze-testing-providers-tests-r5" x="219.6" y="2801.6" textLength="1220" clip-path="url(#breeze-testing-providers-tests-line-114)">─────── [...]
-</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="109.8" clip-path="url(#breeze-testing-providers-tests-line-115)">--dry-run</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)">-D</text><text class="breeze-testing [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2850.4" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-116)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2850.4" textLength="109.8" clip-path="url(#breeze-testing-providers-tests-line-116)">--verbose</text><text class="breeze-testing-providers-tests-r6" x="158.6" y="2850.4" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-116)">-v</text><text class="breeze-t [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2874.8" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-117)">│</text><text class="breeze-testing-providers-tests-r4" x="24.4" y="2874.8" textLength="73.2" clip-path="url(#breeze-testing-providers-tests-line-117)">--help</text><text class="breeze-testing-providers-tests-r6" x="158.6" y="2874.8" textLength="24.4" clip-path="url(#breeze-testing-providers-tests-line-117)">-h</text><text class="breeze-testi [...]
-</text><text class="breeze-testing-providers-tests-r5" x="0" y="2899.2" textLength="1464" clip-path="url(#breeze-testing-providers-tests-line-118)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-providers-tests-r1" x="1464" y="2899.2" textLength="12.2" clip-path="url(#breeze-testing-providers-tests-line-118)">
+</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-r1" x="756.4" y="2167.2" textLength="683.2" clip-path="url(#breeze-testing-providers-tests-line-88)">determined from package or airflow version.             </text><text class="breeze-testing-providers-t [...]
+</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="195.2" clip-path="url(#breeze-testing-providers-tests-line-90)">--package-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 packages.</ [...]
+</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="292.8" clip-path="url(#breeze-testing-providers-tests-line-99)">--use-packages-from-dist</text><text class="breeze-testing-providers-tests-r1" x="756.4" y="2435.6" textLength="341.6" clip-path="url(#breeze-testing-providers-tests-line-99)">Install all& [...]
+</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)">type) from 'dist' folder when entering breeze.          </text><text class="breeze-testing-providers-tes [...]
+</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 b002075d206..818d095c47f 100644
--- a/dev/breeze/doc/images/output_testing_providers-tests.txt
+++ b/dev/breeze/doc/images/output_testing_providers-tests.txt
@@ -1 +1 @@
-09a9f163f8493f9b1a4fc4e713d4d5eb
+a7fb7d5e2046c6ab230fe16aefac8cc5
diff --git a/dev/breeze/doc/images/output_testing_python-api-client-tests.svg b/dev/breeze/doc/images/output_testing_python-api-client-tests.svg
index d9bdf19d5e3..0babcf97548 100644
--- a/dev/breeze/doc/images/output_testing_python-api-client-tests.svg
+++ b/dev/breeze/doc/images/output_testing_python-api-client-tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1123.6" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1050.4" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-testing-python-api-client-tests-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="1072.6" />
+ <rect x="0" y="0" width="1463.0" height="999.4" />
</clipPath>
<clipPath id="breeze-testing-python-api-client-tests-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -165,18 +165,9 @@
<clipPath id="breeze-testing-python-api-client-tests-line-39">
<rect x="0" y="953.1" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-testing-python-api-client-tests-line-40">
- <rect x="0" y="977.5" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-testing-python-api-client-tests-line-41">
- <rect x="0" y="1001.9" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-testing-python-api-client-tests-line-42">
- <rect x="0" y="1026.3" 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="1121.6" rx="8"/><text class="breeze-testing-python-api-client-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing python-api-client-tests</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1048.4" rx="8"/><text class="breeze-testing-python-api-client-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing python-api-client-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"/>
@@ -193,43 +184,40 @@
</text><text class="breeze-testing-python-api-client-tests-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-4)">
</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-tests-line-5)">â•─</text><text class="breeze-testing-python-api-client-tests-r5" x="24.4" y="142" textLength="402.6" clip-path="url(#breeze-testing-python-api-client-tests-line-5)"> Advanced flag for tests command </text><text class="breeze-testing-python-api-client-tests-r5" x="427" y="142" textLength="1012.6" clip-p [...]
</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-6)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="166.4" textLength="231.8" clip-path="url(#breeze-testing-python-api-client-tests-line-6)">--github-repository</text><text class="breeze-testing-python-api-client-tests-r6" x="366" y="166.4" textLength="24.4" clip-path="url(#breeze-testing-python-api-clien [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-7)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="190.8" textLength="134.2" clip-path="url(#breeze-testing-python-api-client-tests-line-7)">--image-tag</text><text class="breeze-testing-python-api-client-tests-r1" x="414.8" y="190.8" textLength="695.4" clip-path="url(#breeze-testing-python-api-client-tes [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-8)">│</text><text class="breeze-testing-python-api-client-tests-r7" x="414.8" y="215.2" textLength="963.8" clip-path="url(#breeze-testing-python-api-client-tests-line-8)">(TEXT)                          &# [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-9)">│</text><text class="breeze-testing-python-api-client-tests-r5" x="414.8" y="239.6" textLength="963.8" clip-path="url(#breeze-testing-python-api-client-tests-line-9)">[default: latest]                        [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-10)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="264" textLength="317.2" clip-path="url(#breeze-testing-python-api-client-tests-line-10)">--skip-docker-compose-down</text><text class="breeze-testing-python-api-client-tests-r1" x="414.8" y="264" textLength="549" clip-path="url(#breeze-testing-python-api-c [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-11)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="288.4" textLength="244" clip-path="url(#breeze-testing-python-api-client-tests-line-11)">--keep-env-variables</text><text class="breeze-testing-python-api-client-tests-r1" x="414.8" y="288.4" textLength="1000.4" clip-path="url(#breeze-testing-python-api- [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="312.8" textLength="1464" clip-path="url(#breeze-testing-python-api-client-tests-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-python-api-client-tests-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-12)">
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="337.2" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-tests-line-13)">â•─</text><text class="breeze-testing-python-api-client-tests-r5" x="24.4" y="337.2" textLength="170.8" clip-path="url(#breeze-testing-python-api-client-tests-line-13)"> Test options </text><text class="breeze-testing-python-api-client-tests-r5" x="195.2" y="337.2" textLength="1244.4" clip-path="url(#breeze-testing [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-14)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="361.6" textLength="170.8" clip-path="url(#breeze-testing-python-api-client-tests-line-14)">--test-timeout</text><text class="breeze-testing-python-api-client-tests-r1" x="475.8" y="361.6" textLength="963.8" clip-path="url(#breeze-testing-python-api-clien [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-15)">│</text><text class="breeze-testing-python-api-client-tests-r1" x="475.8" y="386" textLength="963.8" clip-path="url(#breeze-testing-python-api-client-tests-line-15)">to this value                         [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-16)">│</text><text class="breeze-testing-python-api-client-tests-r7" x="475.8" y="410.4" textLength="963.8" clip-path="url(#breeze-testing-python-api-client-tests-line-16)">(INTEGER RANGE)                        [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-17)">│</text><text class="breeze-testing-python-api-client-tests-r5" x="475.8" y="434.8" textLength="963.8" clip-path="url(#breeze-testing-python-api-client-tests-line-17)">[default: 60; x>=0]                      [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-18)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="459.2" textLength="207.4" clip-path="url(#breeze-testing-python-api-client-tests-line-18)">--enable-coverage</text><text class="breeze-testing-python-api-client-tests-r1" x="475.8" y="459.2" textLength="732" clip-path="url(#breeze-testing-python-api-clie [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-19)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="483.6" textLength="170.8" clip-path="url(#breeze-testing-python-api-client-tests-line-19)">--collect-only</text><text class="breeze-testing-python-api-client-tests-r1" x="475.8" y="483.6" textLength="439.2" clip-path="url(#breeze-testing-python-api-clien [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-20)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="508" textLength="122" clip-path="url(#breeze-testing-python-api-client-tests-line-20)">--db-reset</text><text class="breeze-testing-python-api-client-tests-r6" x="256.2" y="508" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-tests-line- [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="532.4" textLength="1464" clip-path="url(#breeze-testing-python-api-client-tests-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-python-api-client-tests-r1" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-21)">
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="556.8" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-tests-line-22)">â•─</text><text class="breeze-testing-python-api-client-tests-r5" x="24.4" y="556.8" textLength="219.6" clip-path="url(#breeze-testing-python-api-client-tests-line-22)"> Test environment </text><text class="breeze-testing-python-api-client-tests-r5" x="244" y="556.8" textLength="1195.6" clip-path="url(#breeze-testi [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-23)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="581.2" textLength="109.8" clip-path="url(#breeze-testing-python-api-client-tests-line-23)">--backend</text><text class="breeze-testing-python-api-client-tests-r6" x="561.2" y="581.2" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-test [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-24)">│</text><text class="breeze-testing-python-api-client-tests-r1" x="610" y="605.6" textLength="829.6" clip-path="url(#breeze-testing-python-api-client-tests-line-24)">an invalid database configuration, meaning there will be no database</text><text class="breeze-testing-python-api-clien [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-25)">│</text><text class="breeze-testing-python-api-client-tests-r1" x="610" y="630" textLength="829.6" clip-path="url(#breeze-testing-python-api-client-tests-line-25)">available, and any attempts to connect to the Airflow database will </text><text class="breeze-testing-python-api [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-26)">│</text><text class="breeze-testing-python-api-client-tests-r1" x="610" y="654.4" textLength="829.6" clip-path="url(#breeze-testing-python-api-client-tests-line-26)">fail.                           [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-27)">│</text><text class="breeze-testing-python-api-client-tests-r7" x="610" y="678.8" textLength="829.6" clip-path="url(#breeze-testing-python-api-client-tests-line-27)">(>sqlite< | mysql | postgres | none)               &# [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-28)">│</text><text class="breeze-testing-python-api-client-tests-r5" x="610" y="703.2" textLength="829.6" clip-path="url(#breeze-testing-python-api-client-tests-line-28)">[default: sqlite]                        [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-29)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="727.6" textLength="183" clip-path="url(#breeze-testing-python-api-client-tests-line-29)">--no-db-cleanup</text><text class="breeze-testing-python-api-client-tests-r1" x="610" y="727.6" textLength="597.8" clip-path="url(#breeze-testing-python-api-client-t [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-30)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="752" textLength="97.6" clip-path="url(#breeze-testing-python-api-client-tests-line-30)">--python</text><text class="breeze-testing-python-api-client-tests-r6" x="561.2" y="752" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-tests-line-3 [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-31)">│</text><text class="breeze-testing-python-api-client-tests-r7" x="610" y="776.4" textLength="732" clip-path="url(#breeze-testing-python-api-client-tests-line-31)">(>3.9< | 3.10 | 3.11 | 3.12)                  [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-32)">│</text><text class="breeze-testing-python-api-client-tests-r5" x="610" y="800.8" textLength="732" clip-path="url(#breeze-testing-python-api-client-tests-line-32)">[default: 3.9]                         [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-33)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="825.2" textLength="219.6" clip-path="url(#breeze-testing-python-api-client-tests-line-33)">--postgres-version</text><text class="breeze-testing-python-api-client-tests-r6" x="561.2" y="825.2" textLength="24.4" clip-path="url(#breeze-testing-python-api-cl [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-34)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="849.6" textLength="183" clip-path="url(#breeze-testing-python-api-client-tests-line-34)">--mysql-version</text><text class="breeze-testing-python-api-client-tests-r6" x="561.2" y="849.6" textLength="24.4" clip-path="url(#breeze-testing-python-api-client- [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-35)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="874" textLength="256.2" clip-path="url(#breeze-testing-python-api-client-tests-line-35)">--forward-credentials</text><text class="breeze-testing-python-api-client-tests-r6" x="561.2" y="874" textLength="24.4" clip-path="url(#breeze-testing-python-api-clien [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-36)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="898.4" textLength="231.8" clip-path="url(#breeze-testing-python-api-client-tests-line-36)">--force-sa-warnings</text><text class="breeze-testing-python-api-client-tests-r1" x="256.2" y="898.4" textLength="12.2" clip-path="url(#breeze-testing-python-api-c [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-37)">│</text><text class="breeze-testing-python-api-client-tests-r5" x="610" y="922.8" textLength="768.6" clip-path="url(#breeze-testing-python-api-client-tests-line-37)">[default: force-sa-warnings]                       [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="947.2" textLength="1464" clip-path="url(#breeze-testing-python-api-client-tests-line-38)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-python-api-client-tests-r1" x="1464" y="947.2" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-38)">
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="971.6" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-tests-line-39)">â•─</text><text class="breeze-testing-python-api-client-tests-r5" x="24.4" y="971.6" textLength="195.2" clip-path="url(#breeze-testing-python-api-client-tests-line-39)"> Common options </text><text class="breeze-testing-python-api-client-tests-r5" x="219.6" y="971.6" textLength="1220" clip-path="url(#breeze-testing [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-40)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="996" textLength="109.8" clip-path="url(#breeze-testing-python-api-client-tests-line-40)">--dry-run</text><text class="breeze-testing-python-api-client-tests-r6" x="158.6" y="996" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-tests-line [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-41)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="1020.4" textLength="109.8" clip-path="url(#breeze-testing-python-api-client-tests-line-41)">--verbose</text><text class="breeze-testing-python-api-client-tests-r6" x="158.6" y="1020.4" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-t [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-42)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="1044.8" textLength="73.2" clip-path="url(#breeze-testing-python-api-client-tests-line-42)">--help</text><text class="breeze-testing-python-api-client-tests-r6" x="158.6" y="1044.8" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-tests [...]
-</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="1069.2" textLength="1464" clip-path="url(#breeze-testing-python-api-client-tests-line-43)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-python-api-client-tests-r1" x="1464" y="1069.2" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-43)">
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-7)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="190.8" textLength="317.2" clip-path="url(#breeze-testing-python-api-client-tests-line-7)">--skip-docker-compose-down</text><text class="breeze-testing-python-api-client-tests-r1" x="414.8" y="190.8" textLength="549" clip-path="url(#breeze-testing-python-a [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-8)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="215.2" textLength="244" clip-path="url(#breeze-testing-python-api-client-tests-line-8)">--keep-env-variables</text><text class="breeze-testing-python-api-client-tests-r1" x="414.8" y="215.2" textLength="1000.4" clip-path="url(#breeze-testing-python-api-cl [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="239.6" textLength="1464" clip-path="url(#breeze-testing-python-api-client-tests-line-9)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-python-api-client-tests-r1" x="1464" y="239.6" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-9)">
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="264" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-tests-line-10)">â•─</text><text class="breeze-testing-python-api-client-tests-r5" x="24.4" y="264" textLength="170.8" clip-path="url(#breeze-testing-python-api-client-tests-line-10)"> Test options </text><text class="breeze-testing-python-api-client-tests-r5" x="195.2" y="264" textLength="1244.4" clip-path="url(#breeze-testing-pytho [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-11)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="288.4" textLength="170.8" clip-path="url(#breeze-testing-python-api-client-tests-line-11)">--test-timeout</text><text class="breeze-testing-python-api-client-tests-r1" x="475.8" y="288.4" textLength="963.8" clip-path="url(#breeze-testing-python-api-clien [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-12)">│</text><text class="breeze-testing-python-api-client-tests-r1" x="475.8" y="312.8" textLength="963.8" clip-path="url(#breeze-testing-python-api-client-tests-line-12)">to this value                       & [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-13)">│</text><text class="breeze-testing-python-api-client-tests-r7" x="475.8" y="337.2" textLength="963.8" clip-path="url(#breeze-testing-python-api-client-tests-line-13)">(INTEGER RANGE)                        [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-14)">│</text><text class="breeze-testing-python-api-client-tests-r5" x="475.8" y="361.6" textLength="963.8" clip-path="url(#breeze-testing-python-api-client-tests-line-14)">[default: 60; x>=0]                      [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-15)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="386" textLength="207.4" clip-path="url(#breeze-testing-python-api-client-tests-line-15)">--enable-coverage</text><text class="breeze-testing-python-api-client-tests-r1" x="475.8" y="386" textLength="732" clip-path="url(#breeze-testing-python-api-client-tes [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-16)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="410.4" textLength="170.8" clip-path="url(#breeze-testing-python-api-client-tests-line-16)">--collect-only</text><text class="breeze-testing-python-api-client-tests-r1" x="475.8" y="410.4" textLength="439.2" clip-path="url(#breeze-testing-python-api-clien [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-17)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="434.8" textLength="122" clip-path="url(#breeze-testing-python-api-client-tests-line-17)">--db-reset</text><text class="breeze-testing-python-api-client-tests-r6" x="256.2" y="434.8" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-tests [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="459.2" textLength="1464" clip-path="url(#breeze-testing-python-api-client-tests-line-18)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-python-api-client-tests-r1" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-18)">
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="483.6" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-tests-line-19)">â•─</text><text class="breeze-testing-python-api-client-tests-r5" x="24.4" y="483.6" textLength="219.6" clip-path="url(#breeze-testing-python-api-client-tests-line-19)"> Test environment </text><text class="breeze-testing-python-api-client-tests-r5" x="244" y="483.6" textLength="1195.6" clip-path="url(#breeze-testi [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-20)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="508" textLength="109.8" clip-path="url(#breeze-testing-python-api-client-tests-line-20)">--backend</text><text class="breeze-testing-python-api-client-tests-r6" x="561.2" y="508" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-tests-line [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-21)">│</text><text class="breeze-testing-python-api-client-tests-r1" x="610" y="532.4" textLength="829.6" clip-path="url(#breeze-testing-python-api-client-tests-line-21)">an invalid database configuration, meaning there will be no database</text><text class="breeze-testing-python-api-clien [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-22)">│</text><text class="breeze-testing-python-api-client-tests-r1" x="610" y="556.8" textLength="829.6" clip-path="url(#breeze-testing-python-api-client-tests-line-22)">available, and any attempts to connect to the Airflow database will </text><text class="breeze-testing-python [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-23)">│</text><text class="breeze-testing-python-api-client-tests-r1" x="610" y="581.2" textLength="829.6" clip-path="url(#breeze-testing-python-api-client-tests-line-23)">fail.                           [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-24)">│</text><text class="breeze-testing-python-api-client-tests-r7" x="610" y="605.6" textLength="829.6" clip-path="url(#breeze-testing-python-api-client-tests-line-24)">(>sqlite< | mysql | postgres | none)               &# [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-25)">│</text><text class="breeze-testing-python-api-client-tests-r5" x="610" y="630" textLength="829.6" clip-path="url(#breeze-testing-python-api-client-tests-line-25)">[default: sqlite]                        &# [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-26)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="654.4" textLength="183" clip-path="url(#breeze-testing-python-api-client-tests-line-26)">--no-db-cleanup</text><text class="breeze-testing-python-api-client-tests-r1" x="610" y="654.4" textLength="597.8" clip-path="url(#breeze-testing-python-api-client-t [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-27)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="678.8" textLength="97.6" clip-path="url(#breeze-testing-python-api-client-tests-line-27)">--python</text><text class="breeze-testing-python-api-client-tests-r6" x="561.2" y="678.8" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-tests- [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-28)">│</text><text class="breeze-testing-python-api-client-tests-r7" x="610" y="703.2" textLength="732" clip-path="url(#breeze-testing-python-api-client-tests-line-28)">(>3.9< | 3.10 | 3.11 | 3.12)                  [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-29)">│</text><text class="breeze-testing-python-api-client-tests-r5" x="610" y="727.6" textLength="732" clip-path="url(#breeze-testing-python-api-client-tests-line-29)">[default: 3.9]                         [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-30)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="752" textLength="219.6" clip-path="url(#breeze-testing-python-api-client-tests-line-30)">--postgres-version</text><text class="breeze-testing-python-api-client-tests-r6" x="561.2" y="752" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-t [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-31)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="776.4" textLength="183" clip-path="url(#breeze-testing-python-api-client-tests-line-31)">--mysql-version</text><text class="breeze-testing-python-api-client-tests-r6" x="561.2" y="776.4" textLength="24.4" clip-path="url(#breeze-testing-python-api-client- [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-32)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="800.8" textLength="256.2" clip-path="url(#breeze-testing-python-api-client-tests-line-32)">--forward-credentials</text><text class="breeze-testing-python-api-client-tests-r6" x="561.2" y="800.8" textLength="24.4" clip-path="url(#breeze-testing-python-api [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-33)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="825.2" textLength="231.8" clip-path="url(#breeze-testing-python-api-client-tests-line-33)">--force-sa-warnings</text><text class="breeze-testing-python-api-client-tests-r1" x="256.2" y="825.2" textLength="12.2" clip-path="url(#breeze-testing-python-api-c [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-34)">│</text><text class="breeze-testing-python-api-client-tests-r5" x="610" y="849.6" textLength="768.6" clip-path="url(#breeze-testing-python-api-client-tests-line-34)">[default: force-sa-warnings]                       [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="874" textLength="1464" clip-path="url(#breeze-testing-python-api-client-tests-line-35)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-python-api-client-tests-r1" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-35)">
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="898.4" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-tests-line-36)">â•─</text><text class="breeze-testing-python-api-client-tests-r5" x="24.4" y="898.4" textLength="195.2" clip-path="url(#breeze-testing-python-api-client-tests-line-36)"> Common options </text><text class="breeze-testing-python-api-client-tests-r5" x="219.6" y="898.4" textLength="1220" clip-path="url(#breeze-testing [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-37)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="922.8" textLength="109.8" clip-path="url(#breeze-testing-python-api-client-tests-line-37)">--dry-run</text><text class="breeze-testing-python-api-client-tests-r6" x="158.6" y="922.8" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-test [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-38)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="947.2" textLength="109.8" clip-path="url(#breeze-testing-python-api-client-tests-line-38)">--verbose</text><text class="breeze-testing-python-api-client-tests-r6" x="158.6" y="947.2" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-test [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-39)">│</text><text class="breeze-testing-python-api-client-tests-r4" x="24.4" y="971.6" textLength="73.2" clip-path="url(#breeze-testing-python-api-client-tests-line-39)">--help</text><text class="breeze-testing-python-api-client-tests-r6" x="158.6" y="971.6" textLength="24.4" clip-path="url(#breeze-testing-python-api-client-tests-li [...]
+</text><text class="breeze-testing-python-api-client-tests-r5" x="0" y="996" textLength="1464" clip-path="url(#breeze-testing-python-api-client-tests-line-40)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-python-api-client-tests-r1" x="1464" y="996" textLength="12.2" clip-path="url(#breeze-testing-python-api-client-tests-line-40)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_testing_python-api-client-tests.txt b/dev/breeze/doc/images/output_testing_python-api-client-tests.txt
index 072ece75342..d357add35d9 100644
--- a/dev/breeze/doc/images/output_testing_python-api-client-tests.txt
+++ b/dev/breeze/doc/images/output_testing_python-api-client-tests.txt
@@ -1 +1 @@
-a53e56e8d35e4ffd29ee4b5939ea8e69
+bd5df7204b8255b938c2910ae46c578f
diff --git a/dev/breeze/doc/images/output_testing_system-tests.svg b/dev/breeze/doc/images/output_testing_system-tests.svg
index 79a7e6eea3f..154e3b06e33 100644
--- a/dev/breeze/doc/images/output_testing_system-tests.svg
+++ b/dev/breeze/doc/images/output_testing_system-tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1221.1999999999998" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1148.0" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-testing-system-tests-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="1170.1999999999998" />
+ <rect x="0" y="0" width="1463.0" height="1097.0" />
</clipPath>
<clipPath id="breeze-testing-system-tests-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -177,18 +177,9 @@
<clipPath id="breeze-testing-system-tests-line-43">
<rect x="0" y="1050.7" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-testing-system-tests-line-44">
- <rect x="0" y="1075.1" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-testing-system-tests-line-45">
- <rect x="0" y="1099.5" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-testing-system-tests-line-46">
- <rect x="0" y="1123.9" 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="1219.2" rx="8"/><text class="breeze-testing-system-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing system-tests</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1146" rx="8"/><text class="breeze-testing-system-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing system-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"/>
@@ -231,21 +222,18 @@
</text><text class="breeze-testing-system-tests-r5" x="0" y="752" textLength="1464" clip-path="url(#breeze-testing-system-tests-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-system-tests-r1" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-30)">
</text><text class="breeze-testing-system-tests-r5" x="0" y="776.4" textLength="24.4" clip-path="url(#breeze-testing-system-tests-line-31)">â•─</text><text class="breeze-testing-system-tests-r5" x="24.4" y="776.4" textLength="402.6" clip-path="url(#breeze-testing-system-tests-line-31)"> Advanced flag for tests command </text><text class="breeze-testing-system-tests-r5" x="427" y="776.4" textLength="1012.6" clip-path="url(#breeze-testing-system-tests-line-31)" [...]
</text><text class="breeze-testing-system-tests-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-32)">│</text><text class="breeze-testing-system-tests-r4" x="24.4" y="800.8" textLength="231.8" clip-path="url(#breeze-testing-system-tests-line-32)">--github-repository</text><text class="breeze-testing-system-tests-r7" x="366" y="800.8" textLength="24.4" clip-path="url(#breeze-testing-system-tests-line-32)">-g</text><text class="breeze-testing-system-te [...]
-</text><text class="breeze-testing-system-tests-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-33)">│</text><text class="breeze-testing-system-tests-r4" x="24.4" y="825.2" textLength="134.2" clip-path="url(#breeze-testing-system-tests-line-33)">--image-tag</text><text class="breeze-testing-system-tests-r1" x="414.8" y="825.2" textLength="695.4" clip-path="url(#breeze-testing-system-tests-line-33)">Tag of the image which is& [...]
-</text><text class="breeze-testing-system-tests-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-34)">│</text><text class="breeze-testing-system-tests-r6" x="414.8" y="849.6" textLength="963.8" clip-path="url(#breeze-testing-system-tests-line-34)">(TEXT)                                 &# [...]
-</text><text class="breeze-testing-system-tests-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-35)">│</text><text class="breeze-testing-system-tests-r5" x="414.8" y="874" textLength="963.8" clip-path="url(#breeze-testing-system-tests-line-35)">[default: latest]                               &# [...]
-</text><text class="breeze-testing-system-tests-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-36)">│</text><text class="breeze-testing-system-tests-r4" x="24.4" y="898.4" textLength="183" clip-path="url(#breeze-testing-system-tests-line-36)">--mount-sources</text><text class="breeze-testing-system-tests-r1" x="414.8" y="898.4" textLength="1024.8" clip-path="url(#breeze-testing-system-tests-line-36)">Choose scope of local source [...]
-</text><text class="breeze-testing-system-tests-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-37)">│</text><text class="breeze-testing-system-tests-r1" x="414.8" y="922.8" textLength="1024.8" clip-path="url(#breeze-testing-system-tests-line-37)">selected).                                 [...]
-</text><text class="breeze-testing-system-tests-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-38)">│</text><text class="breeze-testing-system-tests-r6" x="414.8" y="947.2" textLength="1024.8" clip-path="url(#breeze-testing-system-tests-line-38)">(selected | all | skip | remove | tests | providers-and-tests)                [...]
-</text><text class="breeze-testing-system-tests-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-39)">│</text><text class="breeze-testing-system-tests-r5" x="414.8" y="971.6" textLength="1024.8" clip-path="url(#breeze-testing-system-tests-line-39)">[default: selected]                              & [...]
-</text><text class="breeze-testing-system-tests-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-40)">│</text><text class="breeze-testing-system-tests-r4" x="24.4" y="996" textLength="317.2" clip-path="url(#breeze-testing-system-tests-line-40)">--skip-docker-compose-down</text><text class="breeze-testing-system-tests-r1" x="414.8" y="996" textLength="549" clip-path="url(#breeze-testing-system-tests-line-40)">Skips running docker-compose  [...]
-</text><text class="breeze-testing-system-tests-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-41)">│</text><text class="breeze-testing-system-tests-r4" x="24.4" y="1020.4" textLength="244" clip-path="url(#breeze-testing-system-tests-line-41)">--keep-env-variables</text><text class="breeze-testing-system-tests-r1" x="414.8" y="1020.4" textLength="1000.4" clip-path="url(#breeze-testing-system-tests-line-41)">Do not clear environment& [...]
-</text><text class="breeze-testing-system-tests-r5" x="0" y="1044.8" textLength="1464" clip-path="url(#breeze-testing-system-tests-line-42)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-system-tests-r1" x="1464" y="1044.8" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-42)">
-</text><text class="breeze-testing-system-tests-r5" x="0" y="1069.2" textLength="24.4" clip-path="url(#breeze-testing-system-tests-line-43)">â•─</text><text class="breeze-testing-system-tests-r5" x="24.4" y="1069.2" textLength="195.2" clip-path="url(#breeze-testing-system-tests-line-43)"> Common options </text><text class="breeze-testing-system-tests-r5" x="219.6" y="1069.2" textLength="1220" clip-path="url(#breeze-testing-system-tests-line-43)">──────────────────────────── [...]
-</text><text class="breeze-testing-system-tests-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-44)">│</text><text class="breeze-testing-system-tests-r4" x="24.4" y="1093.6" textLength="109.8" clip-path="url(#breeze-testing-system-tests-line-44)">--dry-run</text><text class="breeze-testing-system-tests-r7" x="158.6" y="1093.6" textLength="24.4" clip-path="url(#breeze-testing-system-tests-line-44)">-D</text><text class="breeze-testing-system-tests-r [...]
-</text><text class="breeze-testing-system-tests-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-45)">│</text><text class="breeze-testing-system-tests-r4" x="24.4" y="1118" textLength="109.8" clip-path="url(#breeze-testing-system-tests-line-45)">--verbose</text><text class="breeze-testing-system-tests-r7" x="158.6" y="1118" textLength="24.4" clip-path="url(#breeze-testing-system-tests-line-45)">-v</text><text class="breeze-testing-system-tests-r1" x=" [...]
-</text><text class="breeze-testing-system-tests-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-46)">│</text><text class="breeze-testing-system-tests-r4" x="24.4" y="1142.4" textLength="73.2" clip-path="url(#breeze-testing-system-tests-line-46)">--help</text><text class="breeze-testing-system-tests-r7" x="158.6" y="1142.4" textLength="24.4" clip-path="url(#breeze-testing-system-tests-line-46)">-h</text><text class="breeze-testing-system-tests-r1" x [...]
-</text><text class="breeze-testing-system-tests-r5" x="0" y="1166.8" textLength="1464" clip-path="url(#breeze-testing-system-tests-line-47)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-system-tests-r1" x="1464" y="1166.8" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-47)">
+</text><text class="breeze-testing-system-tests-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-33)">│</text><text class="breeze-testing-system-tests-r4" x="24.4" y="825.2" textLength="183" clip-path="url(#breeze-testing-system-tests-line-33)">--mount-sources</text><text class="breeze-testing-system-tests-r1" x="414.8" y="825.2" textLength="1024.8" clip-path="url(#breeze-testing-system-tests-line-33)">Choose scope of local source [...]
+</text><text class="breeze-testing-system-tests-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-34)">│</text><text class="breeze-testing-system-tests-r1" x="414.8" y="849.6" textLength="1024.8" clip-path="url(#breeze-testing-system-tests-line-34)">selected).                                 [...]
+</text><text class="breeze-testing-system-tests-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-35)">│</text><text class="breeze-testing-system-tests-r6" x="414.8" y="874" textLength="1024.8" clip-path="url(#breeze-testing-system-tests-line-35)">(selected | all | skip | remove | tests | providers-and-tests)                & [...]
+</text><text class="breeze-testing-system-tests-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-36)">│</text><text class="breeze-testing-system-tests-r5" x="414.8" y="898.4" textLength="1024.8" clip-path="url(#breeze-testing-system-tests-line-36)">[default: selected]                              & [...]
+</text><text class="breeze-testing-system-tests-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-37)">│</text><text class="breeze-testing-system-tests-r4" x="24.4" y="922.8" textLength="317.2" clip-path="url(#breeze-testing-system-tests-line-37)">--skip-docker-compose-down</text><text class="breeze-testing-system-tests-r1" x="414.8" y="922.8" textLength="549" clip-path="url(#breeze-testing-system-tests-line-37)">Skips running docker-compose [...]
+</text><text class="breeze-testing-system-tests-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-38)">│</text><text class="breeze-testing-system-tests-r4" x="24.4" y="947.2" textLength="244" clip-path="url(#breeze-testing-system-tests-line-38)">--keep-env-variables</text><text class="breeze-testing-system-tests-r1" x="414.8" y="947.2" textLength="1000.4" clip-path="url(#breeze-testing-system-tests-line-38)">Do not clear environment [...]
+</text><text class="breeze-testing-system-tests-r5" x="0" y="971.6" textLength="1464" clip-path="url(#breeze-testing-system-tests-line-39)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-system-tests-r1" x="1464" y="971.6" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-39)">
+</text><text class="breeze-testing-system-tests-r5" x="0" y="996" textLength="24.4" clip-path="url(#breeze-testing-system-tests-line-40)">â•─</text><text class="breeze-testing-system-tests-r5" x="24.4" y="996" textLength="195.2" clip-path="url(#breeze-testing-system-tests-line-40)"> Common options </text><text class="breeze-testing-system-tests-r5" x="219.6" y="996" textLength="1220" clip-path="url(#breeze-testing-system-tests-line-40)">───────────────────────────────────── [...]
+</text><text class="breeze-testing-system-tests-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-41)">│</text><text class="breeze-testing-system-tests-r4" x="24.4" y="1020.4" textLength="109.8" clip-path="url(#breeze-testing-system-tests-line-41)">--dry-run</text><text class="breeze-testing-system-tests-r7" x="158.6" y="1020.4" textLength="24.4" clip-path="url(#breeze-testing-system-tests-line-41)">-D</text><text class="breeze-testing-system-tests-r [...]
+</text><text class="breeze-testing-system-tests-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-42)">│</text><text class="breeze-testing-system-tests-r4" x="24.4" y="1044.8" textLength="109.8" clip-path="url(#breeze-testing-system-tests-line-42)">--verbose</text><text class="breeze-testing-system-tests-r7" x="158.6" y="1044.8" textLength="24.4" clip-path="url(#breeze-testing-system-tests-line-42)">-v</text><text class="breeze-testing-system-tests-r [...]
+</text><text class="breeze-testing-system-tests-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-43)">│</text><text class="breeze-testing-system-tests-r4" x="24.4" y="1069.2" textLength="73.2" clip-path="url(#breeze-testing-system-tests-line-43)">--help</text><text class="breeze-testing-system-tests-r7" x="158.6" y="1069.2" textLength="24.4" clip-path="url(#breeze-testing-system-tests-line-43)">-h</text><text class="breeze-testing-system-tests-r1" x [...]
+</text><text class="breeze-testing-system-tests-r5" x="0" y="1093.6" textLength="1464" clip-path="url(#breeze-testing-system-tests-line-44)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-system-tests-r1" x="1464" y="1093.6" textLength="12.2" clip-path="url(#breeze-testing-system-tests-line-44)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_testing_system-tests.txt b/dev/breeze/doc/images/output_testing_system-tests.txt
index bce6f1b64be..f28b2011b57 100644
--- a/dev/breeze/doc/images/output_testing_system-tests.txt
+++ b/dev/breeze/doc/images/output_testing_system-tests.txt
@@ -1 +1 @@
-36778baa5d9371a1058b7d37002e7e55
+f8497602ee5b93941f2e357824114940
diff --git a/dev/breeze/doc/images/output_testing_task-sdk-tests.svg b/dev/breeze/doc/images/output_testing_task-sdk-tests.svg
index a8e91851eca..36bb1a37346 100644
--- a/dev/breeze/doc/images/output_testing_task-sdk-tests.svg
+++ b/dev/breeze/doc/images/output_testing_task-sdk-tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 952.8" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 879.5999999999999" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-testing-task-sdk-tests-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="901.8" />
+ <rect x="0" y="0" width="1463.0" height="828.5999999999999" />
</clipPath>
<clipPath id="breeze-testing-task-sdk-tests-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -144,18 +144,9 @@
<clipPath id="breeze-testing-task-sdk-tests-line-32">
<rect x="0" y="782.3" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-testing-task-sdk-tests-line-33">
- <rect x="0" y="806.7" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-testing-task-sdk-tests-line-34">
- <rect x="0" y="831.1" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-testing-task-sdk-tests-line-35">
- <rect x="0" y="855.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="950.8" rx="8"/><text class="breeze-testing-task-sdk-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing task-sdk-tests</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="877.6" rx="8"/><text class="breeze-testing-task-sdk-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: testing task-sdk-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"/>
@@ -187,21 +178,18 @@
</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="483.6" textLength="1464" clip-path="url(#breeze-testing-task-sdk-tests-line-19)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-task-sdk-tests-r1" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-19)">
</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="508" textLength="24.4" clip-path="url(#breeze-testing-task-sdk-tests-line-20)">â•─</text><text class="breeze-testing-task-sdk-tests-r5" x="24.4" y="508" textLength="402.6" clip-path="url(#breeze-testing-task-sdk-tests-line-20)"> Advanced flag for tests command </text><text class="breeze-testing-task-sdk-tests-r5" x="427" y="508" textLength="1012.6" clip-path="url(#breeze-testing-task-sdk-tests-lin [...]
</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-21)">│</text><text class="breeze-testing-task-sdk-tests-r4" x="24.4" y="532.4" textLength="231.8" clip-path="url(#breeze-testing-task-sdk-tests-line-21)">--github-repository</text><text class="breeze-testing-task-sdk-tests-r7" x="366" y="532.4" textLength="24.4" clip-path="url(#breeze-testing-task-sdk-tests-line-21)">-g</text><text class="breeze-testi [...]
-</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-22)">│</text><text class="breeze-testing-task-sdk-tests-r4" x="24.4" y="556.8" textLength="134.2" clip-path="url(#breeze-testing-task-sdk-tests-line-22)">--image-tag</text><text class="breeze-testing-task-sdk-tests-r1" x="414.8" y="556.8" textLength="695.4" clip-path="url(#breeze-testing-task-sdk-tests-line-22)">Tag of the image wh [...]
-</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-23)">│</text><text class="breeze-testing-task-sdk-tests-r6" x="414.8" y="581.2" textLength="963.8" clip-path="url(#breeze-testing-task-sdk-tests-line-23)">(TEXT)                                 [...]
-</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-24)">│</text><text class="breeze-testing-task-sdk-tests-r5" x="414.8" y="605.6" textLength="963.8" clip-path="url(#breeze-testing-task-sdk-tests-line-24)">[default: latest]                             &# [...]
-</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-25)">│</text><text class="breeze-testing-task-sdk-tests-r4" x="24.4" y="630" textLength="183" clip-path="url(#breeze-testing-task-sdk-tests-line-25)">--mount-sources</text><text class="breeze-testing-task-sdk-tests-r1" x="414.8" y="630" textLength="1024.8" clip-path="url(#breeze-testing-task-sdk-tests-line-25)">Choose scope of local  [...]
-</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-26)">│</text><text class="breeze-testing-task-sdk-tests-r1" x="414.8" y="654.4" textLength="1024.8" clip-path="url(#breeze-testing-task-sdk-tests-line-26)">selected).                               & [...]
-</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-27)">│</text><text class="breeze-testing-task-sdk-tests-r6" x="414.8" y="678.8" textLength="1024.8" clip-path="url(#breeze-testing-task-sdk-tests-line-27)">(selected | all | skip | remove | tests | providers-and-tests)              & [...]
-</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-28)">│</text><text class="breeze-testing-task-sdk-tests-r5" x="414.8" y="703.2" textLength="1024.8" clip-path="url(#breeze-testing-task-sdk-tests-line-28)">[default: selected]                              [...]
-</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-29)">│</text><text class="breeze-testing-task-sdk-tests-r4" x="24.4" y="727.6" textLength="317.2" clip-path="url(#breeze-testing-task-sdk-tests-line-29)">--skip-docker-compose-down</text><text class="breeze-testing-task-sdk-tests-r1" x="414.8" y="727.6" textLength="549" clip-path="url(#breeze-testing-task-sdk-tests-line-29)">Skips running do [...]
-</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-30)">│</text><text class="breeze-testing-task-sdk-tests-r4" x="24.4" y="752" textLength="244" clip-path="url(#breeze-testing-task-sdk-tests-line-30)">--keep-env-variables</text><text class="breeze-testing-task-sdk-tests-r1" x="414.8" y="752" textLength="1000.4" clip-path="url(#breeze-testing-task-sdk-tests-line-30)">Do not clear environme [...]
-</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="776.4" textLength="1464" clip-path="url(#breeze-testing-task-sdk-tests-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-task-sdk-tests-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-31)">
-</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="800.8" textLength="24.4" clip-path="url(#breeze-testing-task-sdk-tests-line-32)">â•─</text><text class="breeze-testing-task-sdk-tests-r5" x="24.4" y="800.8" textLength="195.2" clip-path="url(#breeze-testing-task-sdk-tests-line-32)"> Common options </text><text class="breeze-testing-task-sdk-tests-r5" x="219.6" y="800.8" textLength="1220" clip-path="url(#breeze-testing-task-sdk-tests-line-32)">─────────────────── [...]
-</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-33)">│</text><text class="breeze-testing-task-sdk-tests-r4" x="24.4" y="825.2" textLength="109.8" clip-path="url(#breeze-testing-task-sdk-tests-line-33)">--dry-run</text><text class="breeze-testing-task-sdk-tests-r7" x="158.6" y="825.2" textLength="24.4" clip-path="url(#breeze-testing-task-sdk-tests-line-33)">-D</text><text class="breeze-testing-task- [...]
-</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-34)">│</text><text class="breeze-testing-task-sdk-tests-r4" x="24.4" y="849.6" textLength="109.8" clip-path="url(#breeze-testing-task-sdk-tests-line-34)">--verbose</text><text class="breeze-testing-task-sdk-tests-r7" x="158.6" y="849.6" textLength="24.4" clip-path="url(#breeze-testing-task-sdk-tests-line-34)">-v</text><text class="breeze-testing-task- [...]
-</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-35)">│</text><text class="breeze-testing-task-sdk-tests-r4" x="24.4" y="874" textLength="73.2" clip-path="url(#breeze-testing-task-sdk-tests-line-35)">--help</text><text class="breeze-testing-task-sdk-tests-r7" x="158.6" y="874" textLength="24.4" clip-path="url(#breeze-testing-task-sdk-tests-line-35)">-h</text><text class="breeze-testing-task-sdk-tests- [...]
-</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="898.4" textLength="1464" clip-path="url(#breeze-testing-task-sdk-tests-line-36)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-task-sdk-tests-r1" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-36)">
+</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-22)">│</text><text class="breeze-testing-task-sdk-tests-r4" x="24.4" y="556.8" textLength="183" clip-path="url(#breeze-testing-task-sdk-tests-line-22)">--mount-sources</text><text class="breeze-testing-task-sdk-tests-r1" x="414.8" y="556.8" textLength="1024.8" clip-path="url(#breeze-testing-task-sdk-tests-line-22)">Choose scope of local [...]
+</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-23)">│</text><text class="breeze-testing-task-sdk-tests-r1" x="414.8" y="581.2" textLength="1024.8" clip-path="url(#breeze-testing-task-sdk-tests-line-23)">selected).                               & [...]
+</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-24)">│</text><text class="breeze-testing-task-sdk-tests-r6" x="414.8" y="605.6" textLength="1024.8" clip-path="url(#breeze-testing-task-sdk-tests-line-24)">(selected | all | skip | remove | tests | providers-and-tests)              & [...]
+</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-25)">│</text><text class="breeze-testing-task-sdk-tests-r5" x="414.8" y="630" textLength="1024.8" clip-path="url(#breeze-testing-task-sdk-tests-line-25)">[default: selected]                              [...]
+</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-26)">│</text><text class="breeze-testing-task-sdk-tests-r4" x="24.4" y="654.4" textLength="317.2" clip-path="url(#breeze-testing-task-sdk-tests-line-26)">--skip-docker-compose-down</text><text class="breeze-testing-task-sdk-tests-r1" x="414.8" y="654.4" textLength="549" clip-path="url(#breeze-testing-task-sdk-tests-line-26)">Skips running do [...]
+</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-27)">│</text><text class="breeze-testing-task-sdk-tests-r4" x="24.4" y="678.8" textLength="244" clip-path="url(#breeze-testing-task-sdk-tests-line-27)">--keep-env-variables</text><text class="breeze-testing-task-sdk-tests-r1" x="414.8" y="678.8" textLength="1000.4" clip-path="url(#breeze-testing-task-sdk-tests-line-27)">Do not clear env [...]
+</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="703.2" textLength="1464" clip-path="url(#breeze-testing-task-sdk-tests-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-task-sdk-tests-r1" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-28)">
+</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="727.6" textLength="24.4" clip-path="url(#breeze-testing-task-sdk-tests-line-29)">â•─</text><text class="breeze-testing-task-sdk-tests-r5" x="24.4" y="727.6" textLength="195.2" clip-path="url(#breeze-testing-task-sdk-tests-line-29)"> Common options </text><text class="breeze-testing-task-sdk-tests-r5" x="219.6" y="727.6" textLength="1220" clip-path="url(#breeze-testing-task-sdk-tests-line-29)">─────────────────── [...]
+</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-30)">│</text><text class="breeze-testing-task-sdk-tests-r4" x="24.4" y="752" textLength="109.8" clip-path="url(#breeze-testing-task-sdk-tests-line-30)">--dry-run</text><text class="breeze-testing-task-sdk-tests-r7" x="158.6" y="752" textLength="24.4" clip-path="url(#breeze-testing-task-sdk-tests-line-30)">-D</text><text class="breeze-testing-task-sdk-te [...]
+</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-31)">│</text><text class="breeze-testing-task-sdk-tests-r4" x="24.4" y="776.4" textLength="109.8" clip-path="url(#breeze-testing-task-sdk-tests-line-31)">--verbose</text><text class="breeze-testing-task-sdk-tests-r7" x="158.6" y="776.4" textLength="24.4" clip-path="url(#breeze-testing-task-sdk-tests-line-31)">-v</text><text class="breeze-testing-task- [...]
+</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-32)">│</text><text class="breeze-testing-task-sdk-tests-r4" x="24.4" y="800.8" textLength="73.2" clip-path="url(#breeze-testing-task-sdk-tests-line-32)">--help</text><text class="breeze-testing-task-sdk-tests-r7" x="158.6" y="800.8" textLength="24.4" clip-path="url(#breeze-testing-task-sdk-tests-line-32)">-h</text><text class="breeze-testing-task-sdk- [...]
+</text><text class="breeze-testing-task-sdk-tests-r5" x="0" y="825.2" textLength="1464" clip-path="url(#breeze-testing-task-sdk-tests-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-task-sdk-tests-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-testing-task-sdk-tests-line-33)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_testing_task-sdk-tests.txt b/dev/breeze/doc/images/output_testing_task-sdk-tests.txt
index 6055d46298d..e6a7b3b14f7 100644
--- a/dev/breeze/doc/images/output_testing_task-sdk-tests.txt
+++ b/dev/breeze/doc/images/output_testing_task-sdk-tests.txt
@@ -1 +1 @@
-34f5540ea79291765605d9cf9ec9b7be
+05f9a5f75222a48aa104060aecab4bf5
diff --git a/dev/breeze/src/airflow_breeze/commands/ci_commands.py b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
index d40aedfc68d..65ef9f548ec 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
@@ -296,8 +296,6 @@ class WorkflowInfo(NamedTuple):
yield get_ga_output(name="pr_number", value=str(self.pr_number) if self.pr_number else "")
yield get_ga_output(name="event_name", value=str(self.event_name))
yield get_ga_output(name="runs-on", value=self.get_runs_on())
- yield get_ga_output(name="in-workflow-build", value=self.in_workflow_build())
- yield get_ga_output(name="build-job-description", value=self.get_build_job_description())
yield get_ga_output(name="canary-run", value=self.is_canary_run())
yield get_ga_output(name="run-coverage", value=self.run_coverage())
@@ -314,16 +312,6 @@ class WorkflowInfo(NamedTuple):
return RUNS_ON_PUBLIC_RUNNER
return RUNS_ON_SELF_HOSTED_RUNNER
- def in_workflow_build(self) -> str:
- if self.event_name == GithubEvents.PUSH.value or self.head_repo == self.target_repo:
- return "true"
- return "false"
-
- def get_build_job_description(self) -> str:
- if self.in_workflow_build() == "true":
- return "Build"
- return "Skip Build (look in pull_request_target)"
-
def is_canary_run(self) -> str:
if (
self.event_name
diff --git a/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py b/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
index 9ab3250fc2c..770feeaf219 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
@@ -43,16 +43,13 @@ from airflow_breeze.commands.common_image_options import (
option_dev_apt_deps,
option_disable_airflow_repo_cache,
option_docker_cache,
- option_image_tag_for_building,
- option_image_tag_for_pulling,
- option_image_tag_for_verifying,
option_install_mysql_client_type,
option_platform_multiple,
option_prepare_buildx_cache,
option_pull,
option_push,
option_python_image,
- option_tag_as_latest,
+ option_skip_image_file_deletion,
option_verify,
option_wait_for_image,
)
@@ -68,6 +65,7 @@ from airflow_breeze.commands.common_options import (
option_image_name,
option_include_success_outputs,
option_parallelism,
+ option_platform_single,
option_python,
option_python_versions,
option_run_in_parallel,
@@ -94,7 +92,7 @@ from airflow_breeze.utils.docker_command_utils import (
prepare_docker_build_command,
warm_up_docker_builder,
)
-from airflow_breeze.utils.image import run_pull_image, run_pull_in_parallel, tag_image_as_latest
+from airflow_breeze.utils.image import run_pull_image, run_pull_in_parallel
from airflow_breeze.utils.mark_image_as_refreshed import mark_image_as_refreshed
from airflow_breeze.utils.md5_build_check import md5sum_check_if_build_is_needed
from airflow_breeze.utils.parallel import (
@@ -129,7 +127,7 @@ def ci_image():
def check_if_image_building_is_needed(ci_image_params: BuildCiParams, output: Output | None) -> bool:
"""Starts building attempt. Returns false if we should not continue"""
result = run_command(
- ["docker", "inspect", ci_image_params.airflow_image_name_with_tag],
+ ["docker", "inspect", ci_image_params.airflow_image_name],
capture_output=True,
text=True,
check=False,
@@ -277,6 +275,23 @@ option_version_suffix_for_pypi_ci = click.option(
envvar="VERSION_SUFFIX_FOR_PYPI",
)
+option_ci_image_file_to_save = click.option(
+ "--image-file",
+ required=False,
+ type=click.Path(exists=False, dir_okay=False, writable=True, path_type=Path),
+ envvar="IMAGE_FILE",
+ help="Optional file to save the image to.",
+)
+
+option_ci_image_file_to_load = click.option(
+ "--image-file",
+ required=False,
+ type=click.Path(exists=True, dir_okay=False, readable=True, path_type=Path, resolve_path=True),
+ envvar="IMAGE_FILE",
+ help="Optional file name to load the image from - name must follow the convention:"
+ "`ci-image-save-{escaped_platform}-*-{python_version}.tar`.",
+)
+
@ci_image.command(name="build")
@option_additional_airflow_extras
@@ -305,7 +320,6 @@ option_version_suffix_for_pypi_ci = click.option(
@option_github_repository
@option_github_token
@option_install_mysql_client_type
-@option_image_tag_for_building
@option_include_success_outputs
@option_parallelism
@option_platform_multiple
@@ -316,7 +330,6 @@ option_version_suffix_for_pypi_ci = click.option(
@option_python_versions
@option_run_in_parallel
@option_skip_cleanup
-@option_tag_as_latest
@option_upgrade_on_failure
@option_upgrade_to_newer_dependencies
@option_use_uv
@@ -347,7 +360,6 @@ def build(
eager_upgrade_additional_requirements: str | None,
github_repository: str,
github_token: str | None,
- image_tag: str,
include_success_outputs,
install_mysql_client_type: str,
parallelism: int,
@@ -359,7 +371,6 @@ def build(
python_versions: str,
run_in_parallel: bool,
skip_cleanup: bool,
- tag_as_latest: bool,
upgrade_on_failure: bool,
upgrade_to_newer_dependencies: bool,
use_uv: bool,
@@ -423,13 +434,11 @@ def build(
force_build=True,
github_repository=github_repository,
github_token=github_token,
- image_tag=image_tag,
install_mysql_client_type=install_mysql_client_type,
prepare_buildx_cache=prepare_buildx_cache,
push=push,
python=python,
python_image=python_image,
- tag_as_latest=tag_as_latest,
upgrade_on_failure=upgrade_on_failure,
upgrade_to_newer_dependencies=upgrade_to_newer_dependencies,
use_uv=use_uv,
@@ -489,8 +498,6 @@ def build(
@option_github_token
@option_verify
@option_wait_for_image
-@option_image_tag_for_pulling
-@option_tag_as_latest
@option_github_repository
@option_verbose
@option_dry_run
@@ -504,9 +511,7 @@ def pull(
skip_cleanup: bool,
debug_resources: bool,
include_success_outputs: bool,
- image_tag: str,
wait_for_image: bool,
- tag_as_latest: bool,
verify: bool,
github_repository: str,
extra_pytest_args: tuple,
@@ -518,7 +523,6 @@ def pull(
python_version_list = get_python_version_list(python_versions)
ci_image_params_list = [
BuildCiParams(
- image_tag=image_tag,
python=python,
github_repository=github_repository,
github_token=github_token,
@@ -534,12 +538,10 @@ def pull(
python_version_list=python_version_list,
verify=verify,
wait_for_image=wait_for_image,
- tag_as_latest=tag_as_latest,
extra_pytest_args=extra_pytest_args if extra_pytest_args is not None else (),
)
else:
image_params = BuildCiParams(
- image_tag=image_tag,
python=python,
github_repository=github_repository,
github_token=github_token,
@@ -548,7 +550,6 @@ def pull(
image_params=image_params,
output=None,
wait_for_image=wait_for_image,
- tag_as_latest=tag_as_latest,
)
if return_code != 0:
get_console().print(f"[error]There was an error when pulling CI image: {info}[/]")
@@ -576,7 +577,7 @@ def run_verify_in_parallel(
pool.apply_async(
verify_an_image,
kwds={
- "image_name": image_params.airflow_image_name_with_tag,
+ "image_name": image_params.airflow_image_name,
"image_type": "CI",
"slim_image": False,
"extra_pytest_args": extra_pytest_args,
@@ -594,6 +595,87 @@ def run_verify_in_parallel(
)
+@ci_image.command(name="save")
+@option_python
+@option_platform_single
+@option_github_repository
+@option_verbose
+@option_ci_image_file_to_save
+@option_dry_run
+def save(
+ python: str,
+ platform: str,
+ github_repository: str,
+ image_file: Path | None,
+):
+ """Save CI image to a file."""
+ perform_environment_checks()
+ image_name = BuildCiParams(
+ python=python,
+ github_repository=github_repository,
+ ).airflow_image_name
+ with ci_group("Buildx disk usage"):
+ run_command(["docker", "buildx", "du", "--verbose"], check=False)
+ escaped_platform = platform.replace("/", "_")
+ if not image_file:
+ image_file = Path(f"/tmp/ci-image-save-{escaped_platform}-{python}.tar")
+ get_console().print(f"[info]Saving Python CI image {image_name} to {image_file}[/]")
+ result = run_command(["docker", "image", "save", "-o", image_file.as_posix(), image_name], check=False)
+ if result.returncode != 0:
+ get_console().print(f"[error]Error when saving image: {result.stdout}[/]")
+ sys.exit(result.returncode)
+
+
+@ci_image.command(name="load")
+@option_python
+@option_platform_single
+@option_github_repository
+@option_skip_image_file_deletion
+@option_verbose
+@option_ci_image_file_to_load
+@option_dry_run
+def load(
+ python: str,
+ platform: str,
+ github_repository: str,
+ image_file: Path | None,
+ skip_image_file_deletion: bool,
+):
+ """Load CI image from a file."""
+ perform_environment_checks()
+ build_ci_params = BuildCiParams(
+ python=python,
+ github_repository=github_repository,
+ )
+ escaped_platform = platform.replace("/", "_")
+ if not image_file:
+ image_file = Path(f"/tmp/ci-image-save-{escaped_platform}-{python}.tar")
+ if not image_file.exists():
+ get_console().print(f"[error]The image {image_file} does not exist.[/]")
+ sys.exit(1)
+ if not image_file.name.endswith(f"-{python}.tar"):
+ get_console().print(
+ f"[error]The image file {image_file} does not end with '-{python}.tar'. Exiting.[/]"
+ )
+ sys.exit(1)
+ if not image_file.name.startswith(f"ci-image-save-{escaped_platform}"):
+ get_console().print(
+ f"[error]The image file {image_file} does not start with 'ci-image-save-{escaped_platform}'. "
+ f"Exiting.[/]"
+ )
+ sys.exit(1)
+ get_console().print(f"[info]Loading Python CI image from {image_file}[/]")
+ result = run_command(["docker", "image", "load", "-i", image_file.as_posix()], check=False)
+ if result.returncode != 0:
+ get_console().print(f"[error]Error when loading image: {result.stdout}[/]")
+ sys.exit(result.returncode)
+ if not skip_image_file_deletion:
+ get_console().print(f"[info]Deleting image file {image_file}[/]")
+ image_file.unlink()
+ run_command(["docker", "images", "-a"])
+ mark_image_as_refreshed(ci_image_params=build_ci_params)
+
+
@ci_image.command(
name="verify",
context_settings=dict(
@@ -604,7 +686,6 @@ def run_verify_in_parallel(
@option_python
@option_python_versions
@option_github_repository
-@option_image_tag_for_verifying
@option_image_name
@option_pull
@option_github_token
@@ -620,7 +701,6 @@ def verify(
python: str,
python_versions: str,
image_name: str,
- image_tag: str | None,
pull: bool,
github_token: str,
github_repository: str,
@@ -643,7 +723,6 @@ def verify(
base_build_params = BuildCiParams(
python=python,
github_repository=github_repository,
- image_tag=image_tag,
)
python_version_list = get_python_version_list(python_versions)
params_list: list[BuildCiParams] = []
@@ -664,11 +743,10 @@ def verify(
if image_name is None:
build_params = BuildCiParams(
python=python,
- image_tag=image_tag,
github_repository=github_repository,
github_token=github_token,
)
- image_name = build_params.airflow_image_name_with_tag
+ image_name = build_params.airflow_image_name
if pull:
check_remote_ghcr_io_commands()
command_to_run = ["docker", "pull", image_name]
@@ -841,16 +919,6 @@ def run_build_ci_image(
get_console().print(
"[info]Run `breeze ci-image build --upgrade-to-newer-dependencies` to upgrade them.\n"
)
- if build_command_result.returncode == 0:
- if ci_image_params.tag_as_latest:
- build_command_result = tag_image_as_latest(image_params=ci_image_params, output=output)
- if ci_image_params.preparing_latest_image():
- if get_dry_run():
- get_console(output=output).print(
- "[info]Not updating build hash because we are in `dry_run` mode.[/]"
- )
- else:
- mark_image_as_refreshed(ci_image_params)
return build_command_result.returncode, f"Image build: {param_description}"
@@ -868,7 +936,6 @@ def rebuild_or_pull_ci_image_if_needed(command_params: ShellParams | BuildCiPara
docker_host=command_params.docker_host,
force_build=command_params.force_build,
github_repository=command_params.github_repository,
- image_tag=command_params.image_tag,
platform=command_params.platform,
python=command_params.python,
skip_image_upgrade_check=command_params.skip_image_upgrade_check,
@@ -879,17 +946,6 @@ def rebuild_or_pull_ci_image_if_needed(command_params: ShellParams | BuildCiPara
# accidentally upgrading dependencies on CI
upgrade_on_failure=not os.environ.get("CI", ""),
)
- if command_params.image_tag is not None and command_params.image_tag != "latest":
- return_code, message = run_pull_image(
- image_params=ci_image_params,
- output=None,
- wait_for_image=True,
- tag_as_latest=False,
- )
- if return_code != 0:
- get_console().print(f"[error]Pulling image with {command_params.image_tag} failed! {message}[/]")
- sys.exit(return_code)
- return
if build_ci_image_check_cache.exists():
if get_verbose():
get_console().print(f"[info]{command_params.image_type} image already built locally.[/]")
diff --git a/dev/breeze/src/airflow_breeze/commands/ci_image_commands_config.py b/dev/breeze/src/airflow_breeze/commands/ci_image_commands_config.py
index 0fe458c9d6a..b0189f4b15f 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_image_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_image_commands_config.py
@@ -22,6 +22,8 @@ CI_IMAGE_TOOLS_COMMANDS: dict[str, str | list[str]] = {
"build",
"pull",
"verify",
+ "save",
+ "load",
],
}
CI_IMAGE_TOOLS_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
@@ -32,8 +34,6 @@ CI_IMAGE_TOOLS_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"--python",
"--upgrade-to-newer-dependencies",
"--upgrade-on-failure",
- "--image-tag",
- "--tag-as-latest",
"--docker-cache",
"--version-suffix-for-pypi",
"--build-progress",
@@ -112,11 +112,9 @@ CI_IMAGE_TOOLS_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
{
"name": "Pull image flags",
"options": [
- "--image-tag",
"--python",
"--verify",
"--wait-for-image",
- "--tag-as-latest",
],
},
{
@@ -144,7 +142,6 @@ CI_IMAGE_TOOLS_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"options": [
"--image-name",
"--python",
- "--image-tag",
"--pull",
],
},
@@ -167,4 +164,27 @@ CI_IMAGE_TOOLS_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
],
},
],
+ "breeze ci-image save": [
+ {
+ "name": "Save image flags",
+ "options": [
+ "--python",
+ "--platform",
+ "--github-repository",
+ "--image-file",
+ ],
+ },
+ ],
+ "breeze ci-image load": [
+ {
+ "name": "Load image flags",
+ "options": [
+ "--python",
+ "--platform",
+ "--image-file",
+ "--github-repository",
+ "--skip-image-file-deletion",
+ ],
+ },
+ ],
}
diff --git a/dev/breeze/src/airflow_breeze/commands/common_image_options.py b/dev/breeze/src/airflow_breeze/commands/common_image_options.py
index e80b2f284d2..e48c2e9bb8f 100644
--- a/dev/breeze/src/airflow_breeze/commands/common_image_options.py
+++ b/dev/breeze/src/airflow_breeze/commands/common_image_options.py
@@ -123,29 +123,6 @@ option_docker_cache = click.option(
type=BetterChoice(ALLOWED_BUILD_CACHE),
envvar="DOCKER_CACHE",
)
-option_image_tag_for_pulling = click.option(
- "-t",
- "--image-tag",
- help="Tag of the image which is used to pull the image.",
- show_default=True,
- default="latest",
- envvar="IMAGE_TAG",
-)
-option_image_tag_for_building = click.option(
- "--image-tag",
- help="Tag the image after building it.",
- show_default=True,
- default="latest",
- envvar="IMAGE_TAG",
-)
-option_image_tag_for_verifying = click.option(
- "-t",
- "--image-tag",
- help="Tag of the image when verifying it.",
- show_default=True,
- default="latest",
- envvar="IMAGE_TAG",
-)
option_install_mysql_client_type = click.option(
"--install-mysql-client-type",
help="Which client to choose when installing.",
@@ -194,13 +171,6 @@ option_runtime_apt_deps = click.option(
help="Apt runtime dependencies to use when building the images.",
envvar="RUNTIME_APT_DEPS",
)
-option_tag_as_latest = click.option(
- "--tag-as-latest",
- help="Tags the image as latest and update checksum of all files after pulling. "
- "Useful when you build or pull image with --image-tag.",
- is_flag=True,
- envvar="TAG_AS_LATEST",
-)
option_verify = click.option(
"--verify",
help="Verify image.",
@@ -213,3 +183,9 @@ option_wait_for_image = click.option(
is_flag=True,
envvar="WAIT_FOR_IMAGE",
)
+option_skip_image_file_deletion = click.option(
+ "--skip-image-file-deletion",
+ help="Skip image deletion after loading.",
+ is_flag=True,
+ envvar="SKIP_IMAGE_FILE_DELETION",
+)
diff --git a/dev/breeze/src/airflow_breeze/commands/common_options.py b/dev/breeze/src/airflow_breeze/commands/common_options.py
index 76316d907ff..ac36152ef19 100644
--- a/dev/breeze/src/airflow_breeze/commands/common_options.py
+++ b/dev/breeze/src/airflow_breeze/commands/common_options.py
@@ -36,6 +36,8 @@ from airflow_breeze.global_constants import (
AUTOCOMPLETE_CORE_INTEGRATIONS,
AUTOCOMPLETE_PROVIDERS_INTEGRATIONS,
DEFAULT_UV_HTTP_TIMEOUT,
+ DOCKER_DEFAULT_PLATFORM,
+ SINGLE_PLATFORMS,
)
from airflow_breeze.utils.custom_param_types import (
AnswerChoice,
@@ -248,14 +250,7 @@ option_providers_integration = click.option(
multiple=True,
)
option_image_name = click.option(
- "-n", "--image-name", help="Name of the image to verify (overrides --python and --image-tag)."
-)
-option_image_tag_for_running = click.option(
- "--image-tag",
- help="Tag of the image which is used to run the image (implies --mount-sources=skip).",
- show_default=True,
- default="latest",
- envvar="IMAGE_TAG",
+ "-n", "--image-name", help="Name of the image to verify (overrides --python)."
)
option_keep_env_variables = click.option(
"--keep-env-variables",
@@ -436,3 +431,10 @@ option_version_suffix_for_pypi = click.option(
envvar="VERSION_SUFFIX_FOR_PYPI",
default="",
)
+option_platform_single = click.option(
+ "--platform",
+ help="Platform for Airflow image.",
+ default=DOCKER_DEFAULT_PLATFORM if not generating_command_images() else SINGLE_PLATFORMS[0],
+ envvar="PLATFORM",
+ type=BetterChoice(SINGLE_PLATFORMS),
+)
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index 4bb5925e744..438903e6b28 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -46,7 +46,6 @@ from airflow_breeze.commands.common_options import (
option_excluded_providers,
option_forward_credentials,
option_github_repository,
- option_image_tag_for_running,
option_include_not_ready_providers,
option_include_removed_providers,
option_installation_package_format,
@@ -55,6 +54,7 @@ from airflow_breeze.commands.common_options import (
option_mount_sources,
option_mysql_version,
option_no_db_cleanup,
+ option_platform_single,
option_postgres_version,
option_project_name,
option_python,
@@ -92,8 +92,6 @@ from airflow_breeze.global_constants import (
DEFAULT_ALLOWED_EXECUTOR,
DEFAULT_CELERY_BROKER,
DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
- DOCKER_DEFAULT_PLATFORM,
- SINGLE_PLATFORMS,
START_AIRFLOW_ALLOWED_EXECUTORS,
START_AIRFLOW_DEFAULT_ALLOWED_EXECUTOR,
)
@@ -117,7 +115,7 @@ from airflow_breeze.utils.path_utils import (
AIRFLOW_SOURCES_ROOT,
cleanup_python_generated_files,
)
-from airflow_breeze.utils.recording import generating_command_images
+from airflow_breeze.utils.platforms import get_real_platform
from airflow_breeze.utils.run_utils import (
assert_pre_commit_installed,
run_command,
@@ -193,13 +191,6 @@ option_include_mypy_volume = click.option(
is_flag=True,
envvar="INCLUDE_MYPY_VOLUME",
)
-option_platform_single = click.option(
- "--platform",
- help="Platform for Airflow image.",
- default=DOCKER_DEFAULT_PLATFORM if not generating_command_images() else SINGLE_PLATFORMS[0],
- envvar="PLATFORM",
- type=BetterChoice(SINGLE_PLATFORMS),
-)
option_restart = click.option(
"--restart",
"--remove-orphans",
@@ -293,7 +284,6 @@ option_start_webserver_with_examples = click.option(
@option_force_lowest_dependencies
@option_forward_credentials
@option_github_repository
-@option_image_tag_for_running
@option_include_mypy_volume
@option_install_airflow_with_constraints_default_true
@option_install_selected_providers
@@ -347,7 +337,6 @@ def shell(
force_lowest_dependencies: bool,
forward_credentials: bool,
github_repository: str,
- image_tag: str | None,
include_mypy_volume: bool,
install_selected_providers: str,
install_airflow_with_constraints: bool,
@@ -394,6 +383,7 @@ def shell(
airflow_constraints_reference = _determine_constraint_branch_used(
airflow_constraints_reference, use_airflow_version
)
+ platform = get_real_platform(platform)
shell_params = ShellParams(
airflow_constraints_location=airflow_constraints_location,
airflow_constraints_mode=airflow_constraints_mode,
@@ -416,7 +406,6 @@ def shell(
force_lowest_dependencies=force_lowest_dependencies,
forward_credentials=forward_credentials,
github_repository=github_repository,
- image_tag=image_tag,
include_mypy_volume=include_mypy_volume,
install_airflow_with_constraints=install_airflow_with_constraints,
install_airflow_python_client=install_airflow_python_client,
@@ -514,7 +503,6 @@ option_executor_start_airflow = click.option(
@option_force_build
@option_forward_credentials
@option_github_repository
-@option_image_tag_for_running
@option_installation_package_format
@option_install_selected_providers
@option_all_integration
@@ -556,7 +544,6 @@ def start_airflow(
force_build: bool,
forward_credentials: bool,
github_repository: str,
- image_tag: str | None,
integration: tuple[str, ...],
install_selected_providers: str,
load_default_connections: bool,
@@ -605,6 +592,7 @@ def start_airflow(
# Otherwise default to LocalExecutor
executor = START_AIRFLOW_DEFAULT_ALLOWED_EXECUTOR
+ platform = get_real_platform(platform)
shell_params = ShellParams(
airflow_constraints_location=airflow_constraints_location,
airflow_constraints_mode=airflow_constraints_mode,
@@ -624,7 +612,6 @@ def start_airflow(
force_build=force_build,
forward_credentials=forward_credentials,
github_repository=github_repository,
- image_tag=image_tag,
integration=integration,
install_selected_providers=install_selected_providers,
install_airflow_with_constraints=True,
@@ -826,7 +813,6 @@ def build_docs(
@option_dry_run
@option_force_build
@option_github_repository
-@option_image_tag_for_running
@option_skip_image_upgrade_check
@option_verbose
@click.argument("precommit_args", nargs=-1, type=click.UNPROCESSED)
@@ -837,7 +823,6 @@ def static_checks(
file: Iterable[str],
force_build: bool,
github_repository: str,
- image_tag: str,
initialize_environment: bool,
last_commit: bool,
max_initialization_attempts: int,
@@ -852,7 +837,6 @@ def static_checks(
build_params = BuildCiParams(
builder=builder,
force_build=force_build,
- image_tag=image_tag,
github_repository=github_repository,
# for static checks we do not want to regenerate dependencies before pre-commits are run
# we want the pre-commit to do it for us (and detect the case the dependencies are updated)
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py b/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
index 3ca110ebdd9..67134784316 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
@@ -125,7 +125,6 @@ DEVELOPER_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"options": [
"--force-build",
"--platform",
- "--image-tag",
"--github-repository",
"--builder",
"--use-uv",
@@ -254,7 +253,6 @@ DEVELOPER_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"name": "Build CI image (before entering shell)",
"options": [
"--force-build",
- "--image-tag",
"--github-repository",
"--builder",
"--use-uv",
@@ -348,7 +346,6 @@ DEVELOPER_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"options": [
"--skip-image-upgrade-check",
"--force-build",
- "--image-tag",
"--github-repository",
"--builder",
],
diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
index d60289e4612..a13daaefa3c 100644
--- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
@@ -131,14 +131,6 @@ option_force_venv_setup = click.option(
is_flag=True,
envvar="FORCE_VENV_SETUP",
)
-option_image_tag = click.option(
- "-t",
- "--image-tag",
- help="Image tag used to build K8S image from.",
- default="latest",
- show_default=True,
- envvar="IMAGE_TAG",
-)
option_kubernetes_version = click.option(
"--kubernetes-version",
help="Kubernetes version used to create the KinD cluster of.",
@@ -556,18 +548,17 @@ def status(kubernetes_version: str, python: str, wait_time_in_seconds: int, all:
def check_if_base_image_exists(params: BuildProdParams) -> bool:
- return check_if_image_exists(image=params.airflow_image_name_with_tag)
+ return check_if_image_exists(image=params.airflow_image_name)
def _rebuild_k8s_image(
python: str,
- image_tag: str,
rebuild_base_image: bool,
copy_local_sources: bool,
use_uv: bool,
output: Output | None,
) -> tuple[int, str]:
- params = BuildProdParams(python=python, image_tag=image_tag, use_uv=use_uv)
+ params = BuildProdParams(python=python, use_uv=use_uv)
if rebuild_base_image:
run_build_production_image(
prod_image_params=params,
@@ -577,29 +568,23 @@ def _rebuild_k8s_image(
else:
if not check_if_base_image_exists(params):
get_console(output=output).print(
- f"[error]The base PROD image {params.airflow_image_name_with_tag} does not exist locally.\n"
+ f"[error]The base PROD image {params.airflow_image_name} does not exist locally.\n"
)
- if image_tag == "latest":
- get_console(output=output).print(
- "[warning]Please add `--rebuild-base-image` flag or rebuild it manually with:\n"
- )
- get_console(output=output).print(f"breeze prod-image build --python {python}\n")
- else:
- get_console(output=output).print("[warning]Please pull the image:\n")
- get_console(output=output).print(
- f"breeze prod-image pull --python {python} --image-tag {image_tag}\n"
- )
+ get_console(output=output).print(
+ "[warning]Please add `--rebuild-base-image` flag or rebuild it manually with:\n"
+ )
+ get_console(output=output).print(f"breeze prod-image build --python {python}\n")
sys.exit(1)
get_console(output=output).print(
f"[info]Building the K8S image for Python {python} using "
- f"airflow base image: {params.airflow_image_name_with_tag}\n"
+ f"airflow base image: {params.airflow_image_name}\n"
)
if copy_local_sources:
extra_copy_command = "COPY --chown=airflow:0 . /opt/airflow/"
else:
extra_copy_command = ""
docker_image_for_kubernetes_tests = f"""
-FROM {params.airflow_image_name_with_tag}
+FROM {params.airflow_image_name}
USER airflow
@@ -653,7 +638,6 @@ def _upload_k8s_image(python: str, kubernetes_version: str, output: Output | Non
@option_copy_local_sources
@option_debug_resources
@option_dry_run
-@option_image_tag
@option_include_success_outputs
@option_parallelism
@option_python
@@ -666,7 +650,6 @@ def _upload_k8s_image(python: str, kubernetes_version: str, output: Output | Non
def build_k8s_image(
copy_local_sources: bool,
debug_resources: bool,
- image_tag: str,
include_success_outputs: bool,
parallelism: int,
python: str,
@@ -694,7 +677,6 @@ def build_k8s_image(
_rebuild_k8s_image,
kwds={
"python": _python,
- "image_tag": image_tag,
"rebuild_base_image": rebuild_base_image,
"copy local sources": copy_local_sources,
"use_uv": use_uv,
@@ -713,7 +695,6 @@ def build_k8s_image(
else:
return_code, _ = _rebuild_k8s_image(
python=python,
- image_tag=image_tag,
rebuild_base_image=rebuild_base_image,
copy_local_sources=copy_local_sources,
use_uv=use_uv,
@@ -1538,7 +1519,6 @@ def _run_complete_tests(
python: str,
kubernetes_version: str,
executor: str,
- image_tag: str,
rebuild_base_image: bool,
copy_local_sources: bool,
use_uv: bool,
@@ -1555,7 +1535,6 @@ def _run_complete_tests(
returncode, message = _rebuild_k8s_image(
python=python,
output=output,
- image_tag=image_tag,
use_uv=use_uv,
rebuild_base_image=rebuild_base_image,
copy_local_sources=copy_local_sources,
@@ -1677,7 +1656,6 @@ def _run_complete_tests(
@option_executor
@option_force_recreate_cluster
@option_force_venv_setup
-@option_image_tag
@option_include_success_outputs
@option_kubernetes_version
@option_kubernetes_versions
@@ -1699,7 +1677,6 @@ def run_complete_tests(
executor: str,
force_recreate_cluster: bool,
force_venv_setup: bool,
- image_tag: str,
include_success_outputs: bool,
kubernetes_version: str,
kubernetes_versions: str,
@@ -1725,7 +1702,6 @@ def run_complete_tests(
)
get_console().print(f"[info]Running complete tests for: {short_combo_titles}")
get_console().print(f"[info]Parallelism: {parallelism}")
- get_console().print(f"[info]Image tag: {image_tag}")
get_console().print(f"[info]Extra test args: {executor}")
get_console().print(f"[info]Executor: {executor}")
get_console().print(f"[info]Use standard naming: {use_standard_naming}")
@@ -1755,7 +1731,6 @@ def run_complete_tests(
"python": combo.python_version,
"kubernetes_version": combo.kubernetes_version,
"executor": executor,
- "image_tag": image_tag,
"rebuild_base_image": rebuild_base_image,
"copy_local_sources": copy_local_sources,
"use_uv": use_uv,
@@ -1783,7 +1758,6 @@ def run_complete_tests(
python=python,
kubernetes_version=kubernetes_version,
executor=executor,
- image_tag=image_tag,
rebuild_base_image=rebuild_base_image,
copy_local_sources=copy_local_sources,
use_uv=use_uv,
diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
index f54a3238043..1a38be39022 100644
--- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
@@ -71,7 +71,6 @@ KUBERNETES_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"name": "Build image flags",
"options": [
"--python",
- "--image-tag",
"--rebuild-base-image",
"--copy-local-sources",
"--use-uv",
@@ -232,7 +231,6 @@ KUBERNETES_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
{
"name": "Build image flags",
"options": [
- "--image-tag",
"--rebuild-base-image",
"--copy-local-sources",
"--use-uv",
diff --git a/dev/breeze/src/airflow_breeze/commands/production_image_commands.py b/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
index d266dd027bd..64b3c38fb13 100644
--- a/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
@@ -18,6 +18,7 @@ from __future__ import annotations
import sys
from copy import deepcopy
+from pathlib import Path
import click
@@ -38,9 +39,6 @@ from airflow_breeze.commands.common_image_options import (
option_dev_apt_deps,
option_disable_airflow_repo_cache,
option_docker_cache,
- option_image_tag_for_building,
- option_image_tag_for_pulling,
- option_image_tag_for_verifying,
option_install_mysql_client_type,
option_platform_multiple,
option_prepare_buildx_cache,
@@ -49,7 +47,7 @@ from airflow_breeze.commands.common_image_options import (
option_python_image,
option_runtime_apt_command,
option_runtime_apt_deps,
- option_tag_as_latest,
+ option_skip_image_file_deletion,
option_verify,
option_wait_for_image,
)
@@ -65,6 +63,7 @@ from airflow_breeze.commands.common_options import (
option_image_name,
option_include_success_outputs,
option_parallelism,
+ option_platform_single,
option_python,
option_python_versions,
option_run_in_parallel,
@@ -93,7 +92,7 @@ from airflow_breeze.utils.docker_command_utils import (
prepare_docker_build_command,
warm_up_docker_builder,
)
-from airflow_breeze.utils.image import run_pull_image, run_pull_in_parallel, tag_image_as_latest
+from airflow_breeze.utils.image import run_pull_image, run_pull_in_parallel
from airflow_breeze.utils.parallel import (
DockerBuildxProgressMatcher,
ShowLastLineProgressMatcher,
@@ -151,6 +150,24 @@ def prepare_for_building_prod_image(params: BuildProdParams):
check_docker_context_files(params.install_packages_from_context)
+option_prod_image_file_to_save = click.option(
+ "--image-file",
+ required=False,
+ type=click.Path(exists=False, dir_okay=False, writable=True, path_type=Path),
+ envvar="IMAGE_FILE",
+ help="Optional file to save the image to.",
+)
+
+option_prod_image_file_to_load = click.option(
+ "--image-file",
+ required=False,
+ type=click.Path(exists=True, dir_okay=False, readable=True, path_type=Path, resolve_path=True),
+ envvar="IMAGE_FILE",
+ help="Optional file name to load the image from - name must follow the convention:"
+ "`prod-image-save-{escaped_platform}-*-{python_version}.tar`.",
+)
+
+
@click.group(
cls=BreezeGroup, name="prod-image", help="Tools that developers can use to manually manage PROD images"
)
@@ -224,7 +241,6 @@ def prod_image():
@option_dry_run
@option_github_repository
@option_github_token
-@option_image_tag_for_building
@option_include_success_outputs
@option_install_mysql_client_type
@option_parallelism
@@ -238,7 +254,6 @@ def prod_image():
@option_runtime_apt_command
@option_runtime_apt_deps
@option_skip_cleanup
-@option_tag_as_latest
@option_use_uv_default_disabled
@option_uv_http_timeout
@option_verbose
@@ -273,7 +288,6 @@ def build(
docker_host: str | None,
github_repository: str,
github_token: str | None,
- image_tag: str,
include_success_outputs,
install_airflow_reference: str | None,
install_airflow_version: str | None,
@@ -291,7 +305,6 @@ def build(
runtime_apt_command: str | None,
runtime_apt_deps: str | None,
skip_cleanup: bool,
- tag_as_latest: bool,
use_constraints_for_context_packages: bool,
use_uv: bool,
uv_http_timeout: int,
@@ -342,7 +355,6 @@ def build(
docker_cache=docker_cache,
github_repository=github_repository,
github_token=github_token,
- image_tag=image_tag,
install_airflow_reference=install_airflow_reference,
install_airflow_version=install_airflow_version,
install_mysql_client_type=install_mysql_client_type,
@@ -354,7 +366,6 @@ def build(
python_image=python_image,
runtime_apt_command=runtime_apt_command,
runtime_apt_deps=runtime_apt_deps,
- tag_as_latest=tag_as_latest,
use_constraints_for_context_packages=use_constraints_for_context_packages,
use_uv=use_uv,
uv_http_timeout=uv_http_timeout,
@@ -409,9 +420,7 @@ def build(
@option_include_success_outputs
@option_python_versions
@option_github_token
-@option_image_tag_for_pulling
@option_wait_for_image
-@option_tag_as_latest
@option_verify
@option_github_repository
@option_verbose
@@ -426,9 +435,7 @@ def pull_prod_image(
include_success_outputs,
python_versions: str,
github_token: str,
- image_tag: str,
wait_for_image: bool,
- tag_as_latest: bool,
verify: bool,
github_repository: str,
extra_pytest_args: tuple,
@@ -440,7 +447,6 @@ def pull_prod_image(
python_version_list = get_python_version_list(python_versions)
prod_image_params_list = [
BuildProdParams(
- image_tag=image_tag,
python=python,
github_repository=github_repository,
github_token=github_token,
@@ -456,18 +462,16 @@ def pull_prod_image(
python_version_list=python_version_list,
verify=verify,
wait_for_image=wait_for_image,
- tag_as_latest=tag_as_latest,
extra_pytest_args=extra_pytest_args if extra_pytest_args is not None else (),
)
else:
image_params = BuildProdParams(
- image_tag=image_tag, python=python, github_repository=github_repository, github_token=github_token
+ python=python, github_repository=github_repository, github_token=github_token
)
return_code, info = run_pull_image(
image_params=image_params,
output=None,
wait_for_image=wait_for_image,
- tag_as_latest=tag_as_latest,
poll_time_seconds=10.0,
)
if return_code != 0:
@@ -496,7 +500,7 @@ def run_verify_in_parallel(
pool.apply_async(
verify_an_image,
kwds={
- "image_name": image_params.airflow_image_name_with_tag,
+ "image_name": image_params.airflow_image_name,
"image_type": "PROD",
"slim_image": False,
"extra_pytest_args": extra_pytest_args,
@@ -529,7 +533,6 @@ def run_verify_in_parallel(
@click.argument("extra_pytest_args", nargs=-1, type=click.UNPROCESSED)
@option_python
@option_python_versions
-@option_image_tag_for_verifying
@option_image_name
@option_pull
@option_github_repository
@@ -546,7 +549,6 @@ def verify(
python_versions: str,
github_repository: str,
image_name: str,
- image_tag: str | None,
pull: bool,
slim_image: bool,
github_token: str,
@@ -569,7 +571,6 @@ def verify(
base_build_params = BuildProdParams(
python=python,
github_repository=github_repository,
- image_tag=image_tag,
)
python_version_list = get_python_version_list(python_versions)
params_list: list[BuildProdParams] = []
@@ -590,11 +591,10 @@ def verify(
if image_name is None:
build_params = BuildProdParams(
python=python,
- image_tag=image_tag,
github_repository=github_repository,
github_token=github_token,
)
- image_name = build_params.airflow_image_name_with_tag
+ image_name = build_params.airflow_image_name
if pull:
check_remote_ghcr_io_commands()
command_to_run = ["docker", "pull", image_name]
@@ -610,6 +610,80 @@ def verify(
sys.exit(return_code)
+@prod_image.command(name="save")
+@option_python
+@option_platform_single
+@option_github_repository
+@option_verbose
+@option_prod_image_file_to_save
+@option_dry_run
+def save(
+ python: str,
+ platform: str,
+ github_repository: str,
+ image_file: Path | None,
+):
+ """Save PROD image to a file."""
+ perform_environment_checks()
+ image_name = BuildProdParams(
+ python=python,
+ github_repository=github_repository,
+ ).airflow_image_name
+ with ci_group("Buildx disk usage"):
+ run_command(["docker", "buildx", "du", "--verbose"], check=False)
+ escaped_platform = platform.replace("/", "-")
+ if not image_file:
+ image_file = Path(f"/tmp/prod-image-save-{escaped_platform}-{python}.tar")
+ get_console().print(f"[info]Saving Python PROD image {image_name} to {image_file}[/]")
+ result = run_command(["docker", "image", "save", "-o", image_file.as_posix(), image_name], check=False)
+ if result.returncode != 0:
+ get_console().print(f"[error]Error when saving image: {result.stdout}[/]")
+ sys.exit(result.returncode)
+
+
+@prod_image.command(name="load")
+@option_python
+@option_platform_single
+@option_skip_image_file_deletion
+@option_verbose
+@option_prod_image_file_to_save
+@option_dry_run
+def load(
+ python: str,
+ platform: str,
+ skip_image_file_deletion: bool,
+ image_file: Path | None,
+):
+ """Load PROD image from a file."""
+ perform_environment_checks()
+ escaped_platform = platform.replace("/", "-")
+ if not image_file:
+ image_file = Path(f"/tmp/prod-image-save-{escaped_platform}-{python}.tar")
+ if not image_file.exists():
+ get_console().print(f"[error]The image {image_file} does not exist.[/]")
+ sys.exit(1)
+ if not image_file.name.endswith(f"-{python}.tar"):
+ get_console().print(
+ f"[error]The image file {image_file} does not end with '-{python}.tar'. Exiting.[/]"
+ )
+ sys.exit(1)
+ if not image_file.name.startswith(f"prod-image-save-{escaped_platform}"):
+ get_console().print(
+ f"[error]The image file {image_file} does not start with 'prod-image-save-{escaped_platform}'"
+ f". Exiting.[/]"
+ )
+ sys.exit(1)
+ get_console().print(f"[info]Loading Python PROD image from {image_file}[/]")
+ result = run_command(["docker", "image", "load", "-i", image_file.as_posix()], check=False)
+ if result.returncode != 0:
+ get_console().print(f"[error]Error when loading image: {result.stdout}[/]")
+ sys.exit(result.returncode)
+ if not skip_image_file_deletion:
+ get_console().print(f"[info]Deleting image file {image_file}[/]")
+ image_file.unlink()
+ run_command(["docker", "images", "-a"])
+
+
def clean_docker_context_files():
"""
Cleans up docker context files folder - leaving only .README.md there.
@@ -705,6 +779,4 @@ def run_build_production_image(
text=True,
output=output,
)
- if build_command_result.returncode == 0 and prod_image_params.tag_as_latest:
- build_command_result = tag_image_as_latest(image_params=prod_image_params, output=output)
return build_command_result.returncode, f"Image build: {param_description}"
diff --git a/dev/breeze/src/airflow_breeze/commands/production_image_commands_config.py b/dev/breeze/src/airflow_breeze/commands/production_image_commands_config.py
index 020aa9326a1..870655e637c 100644
--- a/dev/breeze/src/airflow_breeze/commands/production_image_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/production_image_commands_config.py
@@ -22,6 +22,8 @@ PRODUCTION_IMAGE_TOOLS_COMMANDS: dict[str, str | list[str]] = {
"build",
"pull",
"verify",
+ "save",
+ "load",
],
}
PRODUCTION_IMAGE_TOOLS_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
@@ -32,10 +34,8 @@ PRODUCTION_IMAGE_TOOLS_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] =
"--build-progress",
"--docker-cache",
"--docker-host",
- "--image-tag",
"--install-airflow-version",
"--python",
- "--tag-as-latest",
"--version-suffix-for-pypi",
],
},
@@ -123,11 +123,9 @@ PRODUCTION_IMAGE_TOOLS_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] =
{
"name": "Pull image flags",
"options": [
- "--image-tag",
"--python",
"--verify",
"--wait-for-image",
- "--tag-as-latest",
],
},
{
@@ -156,7 +154,6 @@ PRODUCTION_IMAGE_TOOLS_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] =
"--image-name",
"--python",
"--slim-image",
- "--image-tag",
"--pull",
],
},
@@ -179,4 +176,26 @@ PRODUCTION_IMAGE_TOOLS_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] =
],
},
],
+ "breeze prod-image save": [
+ {
+ "name": "Save image flags",
+ "options": [
+ "--python",
+ "--platform",
+ "--github-repository",
+ "--image-file",
+ ],
+ },
+ ],
+ "breeze prod-image load": [
+ {
+ "name": "Load image flags",
+ "options": [
+ "--python",
+ "--platform",
+ "--image-file",
+ "--skip-image-file-deletion",
+ ],
+ },
+ ],
}
diff --git a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
index 9c20478f933..52ed3ceb247 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -52,7 +52,6 @@ from airflow_breeze.commands.common_options import (
option_dry_run,
option_github_repository,
option_historical_python_version,
- option_image_tag_for_running,
option_include_not_ready_providers,
option_include_removed_providers,
option_include_success_outputs,
@@ -1180,7 +1179,6 @@ def tag_providers(
@option_skip_cleanup
@option_debug_resources
@option_python_versions
-@option_image_tag_for_running
@option_airflow_constraints_mode_ci
@option_chicken_egg_providers
@option_github_repository
@@ -1193,7 +1191,6 @@ def generate_constraints(
chicken_egg_providers: str,
debug_resources: bool,
github_repository: str,
- image_tag: str | None,
parallelism: int,
python: str,
python_versions: str,
@@ -1222,7 +1219,6 @@ def generate_constraints(
)
else:
shell_params = ShellParams(
- image_tag=image_tag,
python=python,
github_repository=github_repository,
)
@@ -1239,7 +1235,6 @@ def generate_constraints(
airflow_constraints_mode=airflow_constraints_mode,
chicken_egg_providers=chicken_egg_providers,
github_repository=github_repository,
- image_tag=image_tag,
python=python,
use_uv=use_uv,
)
@@ -1259,7 +1254,6 @@ def generate_constraints(
airflow_constraints_mode=airflow_constraints_mode,
chicken_egg_providers=chicken_egg_providers,
github_repository=github_repository,
- image_tag=image_tag,
python=python,
use_uv=use_uv,
)
diff --git a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
index 9cd77b823eb..488eec6a364 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
@@ -262,7 +262,6 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"--airflow-constraints-mode",
"--chicken-egg-providers",
"--github-repository",
- "--image-tag",
"--python",
"--use-uv",
],
diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands.py b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
index a9297cb6132..52a3bc8fbfa 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
@@ -41,7 +41,6 @@ from airflow_breeze.commands.common_options import (
option_forward_credentials,
option_github_repository,
option_image_name,
- option_image_tag_for_running,
option_include_success_outputs,
option_keep_env_variables,
option_mount_sources,
@@ -117,7 +116,6 @@ def group_for_testing():
),
)
@option_python
-@option_image_tag_for_running
@option_image_name
@click.option(
"--skip-docker-compose-deletion",
@@ -132,7 +130,6 @@ def group_for_testing():
def docker_compose_tests(
python: str,
image_name: str,
- image_tag: str | None,
skip_docker_compose_deletion: bool,
github_repository: str,
extra_pytest_args: tuple,
@@ -140,10 +137,8 @@ def docker_compose_tests(
"""Run docker-compose tests."""
perform_environment_checks()
if image_name is None:
- build_params = BuildProdParams(
- python=python, image_tag=image_tag, github_repository=github_repository
- )
- image_name = build_params.airflow_image_name_with_tag
+ build_params = BuildProdParams(python=python, github_repository=github_repository)
+ image_name = build_params.airflow_image_name
get_console().print(f"[info]Running docker-compose with PROD image: {image_name}[/]")
return_code, info = run_docker_compose_tests(
image_name=image_name,
@@ -565,7 +560,6 @@ option_total_test_timeout = click.option(
@option_force_lowest_dependencies
@option_forward_credentials
@option_github_repository
-@option_image_tag_for_running
@option_include_success_outputs
@option_install_airflow_with_constraints
@option_keep_env_variables
@@ -628,7 +622,6 @@ def core_tests(**kwargs):
@option_force_lowest_dependencies
@option_forward_credentials
@option_github_repository
-@option_image_tag_for_running
@option_include_success_outputs
@option_install_airflow_with_constraints
@option_keep_env_variables
@@ -676,7 +669,6 @@ def providers_tests(**kwargs):
@option_force_sa_warnings
@option_forward_credentials
@option_github_repository
-@option_image_tag_for_running
@option_keep_env_variables
@option_mount_sources
@option_python
@@ -738,7 +730,6 @@ def task_sdk_tests(**kwargs):
@option_force_sa_warnings
@option_forward_credentials
@option_github_repository
-@option_image_tag_for_running
@option_core_integration
@option_keep_env_variables
@option_mount_sources
@@ -759,7 +750,6 @@ def core_integration_tests(
force_sa_warnings: bool,
forward_credentials: bool,
github_repository: str,
- image_tag: str | None,
keep_env_variables: bool,
integration: tuple,
mount_sources: str,
@@ -778,7 +768,6 @@ def core_integration_tests(
forward_credentials=forward_credentials,
forward_ports=False,
github_repository=github_repository,
- image_tag=image_tag,
integration=integration,
keep_env_variables=keep_env_variables,
mount_sources=mount_sources,
@@ -822,7 +811,6 @@ def core_integration_tests(
@option_force_sa_warnings
@option_forward_credentials
@option_github_repository
-@option_image_tag_for_running
@option_providers_integration
@option_keep_env_variables
@option_mount_sources
@@ -843,7 +831,6 @@ def integration_providers_tests(
force_sa_warnings: bool,
forward_credentials: bool,
github_repository: str,
- image_tag: str | None,
integration: tuple,
keep_env_variables: bool,
mount_sources: str,
@@ -862,7 +849,6 @@ def integration_providers_tests(
forward_credentials=forward_credentials,
forward_ports=False,
github_repository=github_repository,
- image_tag=image_tag,
integration=integration,
keep_env_variables=keep_env_variables,
mount_sources=mount_sources,
@@ -906,7 +892,6 @@ def integration_providers_tests(
@option_force_sa_warnings
@option_forward_credentials
@option_github_repository
-@option_image_tag_for_running
@option_keep_env_variables
@option_mount_sources
@option_mysql_version
@@ -926,7 +911,6 @@ def system_tests(
force_sa_warnings: bool,
forward_credentials: bool,
github_repository: str,
- image_tag: str | None,
keep_env_variables: bool,
mount_sources: str,
mysql_version: str,
@@ -944,7 +928,6 @@ def system_tests(
forward_credentials=forward_credentials,
forward_ports=False,
github_repository=github_repository,
- image_tag=image_tag,
integration=(),
keep_env_variables=keep_env_variables,
mount_sources=mount_sources,
@@ -980,7 +963,6 @@ def system_tests(
allow_extra_args=True,
),
)
-@option_image_tag_for_running
@option_mount_sources
@option_github_repository
@option_test_timeout
@@ -992,7 +974,6 @@ def system_tests(
@click.argument("extra_pytest_args", nargs=-1, type=click.Path(path_type=str))
def helm_tests(
extra_pytest_args: tuple,
- image_tag: str | None,
mount_sources: str,
github_repository: str,
test_timeout: int,
@@ -1001,7 +982,6 @@ def helm_tests(
use_xdist: bool,
):
shell_params = ShellParams(
- image_tag=image_tag,
mount_sources=mount_sources,
github_repository=github_repository,
run_tests=True,
@@ -1049,7 +1029,6 @@ def helm_tests(
@option_force_sa_warnings
@option_forward_credentials
@option_github_repository
-@option_image_tag_for_running
@option_keep_env_variables
@option_mysql_version
@option_postgres_version
@@ -1068,7 +1047,6 @@ def python_api_client_tests(
force_sa_warnings: bool,
forward_credentials: bool,
github_repository: str,
- image_tag: str | None,
keep_env_variables: bool,
mysql_version: str,
postgres_version: str,
@@ -1085,7 +1063,6 @@ def python_api_client_tests(
forward_credentials=forward_credentials,
forward_ports=False,
github_repository=github_repository,
- image_tag=image_tag,
integration=(),
keep_env_variables=keep_env_variables,
mysql_version=mysql_version,
@@ -1159,7 +1136,6 @@ def _run_test_command(
forward_credentials: bool,
force_lowest_dependencies: bool,
github_repository: str,
- image_tag: str | None,
include_success_outputs: bool,
install_airflow_with_constraints: bool,
integration: tuple[str, ...],
@@ -1210,7 +1186,6 @@ def _run_test_command(
forward_credentials=forward_credentials,
forward_ports=False,
github_repository=github_repository,
- image_tag=image_tag,
integration=integration,
install_airflow_with_constraints=install_airflow_with_constraints,
keep_env_variables=keep_env_variables,
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 9e1c391a9ca..7e19a75d483 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
@@ -75,7 +75,6 @@ TEST_ADVANCED_FLAGS: dict[str, str | list[str]] = {
"name": "Advanced flag for tests command",
"options": [
"--github-repository",
- "--image-tag",
"--mount-sources",
"--skip-docker-compose-down",
"--keep-env-variables",
@@ -211,7 +210,6 @@ TESTING_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"name": "Advanced flag for helm-test command",
"options": [
"--github-repository",
- "--image-tag",
"--mount-sources",
],
},
@@ -221,7 +219,6 @@ TESTING_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"name": "Docker-compose tests flag",
"options": [
"--image-name",
- "--image-tag",
"--python",
"--skip-docker-compose-deletion",
"--github-repository",
@@ -233,7 +230,6 @@ TESTING_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"name": "Advanced flag for tests command",
"options": [
"--github-repository",
- "--image-tag",
"--skip-docker-compose-down",
"--keep-env-variables",
],
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py b/dev/breeze/src/airflow_breeze/global_constants.py
index 9fccc368c79..6e0686e160f 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -545,7 +545,6 @@ FILES_FOR_REBUILD_CHECK = [
"scripts/docker/common.sh",
"scripts/docker/install_additional_dependencies.sh",
"scripts/docker/install_airflow.sh",
- "scripts/docker/install_airflow_dependencies_from_branch_tip.sh",
"scripts/docker/install_from_docker_context_files.sh",
"scripts/docker/install_mysql.sh",
]
diff --git a/dev/breeze/src/airflow_breeze/params/build_ci_params.py b/dev/breeze/src/airflow_breeze/params/build_ci_params.py
index c38776a3f61..e330ec29d56 100644
--- a/dev/breeze/src/airflow_breeze/params/build_ci_params.py
+++ b/dev/breeze/src/airflow_breeze/params/build_ci_params.py
@@ -64,7 +64,6 @@ class BuildCiParams(CommonBuildParams):
self._req_arg("AIRFLOW_EXTRAS", self.airflow_extras)
self._req_arg("AIRFLOW_IMAGE_DATE_CREATED", self.airflow_image_date_created)
self._req_arg("AIRFLOW_IMAGE_REPOSITORY", self.airflow_image_repository)
- self._req_arg("AIRFLOW_PRE_CACHED_PIP_PACKAGES", self.airflow_pre_cached_pip_packages)
self._req_arg("AIRFLOW_USE_UV", self.use_uv)
if self.use_uv:
from airflow_breeze.utils.uv_utils import get_uv_timeout
diff --git a/dev/breeze/src/airflow_breeze/params/build_prod_params.py b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
index 71405680db8..01f2bb8fa4a 100644
--- a/dev/breeze/src/airflow_breeze/params/build_prod_params.py
+++ b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
@@ -226,7 +226,6 @@ class BuildProdParams(CommonBuildParams):
self._req_arg("AIRFLOW_IMAGE_DATE_CREATED", self.airflow_image_date_created)
self._req_arg("AIRFLOW_IMAGE_README_URL", self.airflow_image_readme_url)
self._req_arg("AIRFLOW_IMAGE_REPOSITORY", self.airflow_image_repository)
- self._req_arg("AIRFLOW_PRE_CACHED_PIP_PACKAGES", self.airflow_pre_cached_pip_packages)
self._opt_arg("AIRFLOW_USE_UV", self.use_uv)
if self.use_uv:
from airflow_breeze.utils.uv_utils import get_uv_timeout
diff --git a/dev/breeze/src/airflow_breeze/params/common_build_params.py b/dev/breeze/src/airflow_breeze/params/common_build_params.py
index 535ba964805..4fd3d8f92e5 100644
--- a/dev/breeze/src/airflow_breeze/params/common_build_params.py
+++ b/dev/breeze/src/airflow_breeze/params/common_build_params.py
@@ -62,14 +62,12 @@ class CommonBuildParams:
github_actions: str = os.environ.get("GITHUB_ACTIONS", "false")
github_repository: str = APACHE_AIRFLOW_GITHUB_REPOSITORY
github_token: str = os.environ.get("GITHUB_TOKEN", "")
- image_tag: str | None = None
install_mysql_client_type: str = ALLOWED_INSTALL_MYSQL_CLIENT_TYPES[0]
platform: str = DOCKER_DEFAULT_PLATFORM
prepare_buildx_cache: bool = False
python_image: str | None = None
push: bool = False
python: str = "3.9"
- tag_as_latest: bool = False
uv_http_timeout: int = DEFAULT_UV_HTTP_TIMEOUT
dry_run: bool = False
version_suffix_for_pypi: str | None = None
@@ -89,10 +87,6 @@ class CommonBuildParams:
def image_type(self) -> str:
raise NotImplementedError()
- @property
- def airflow_pre_cached_pip_packages(self) -> str:
- return "false" if self.disable_airflow_repo_cache else "true"
-
@property
def airflow_base_image_name(self):
image = f"ghcr.io/{self.github_repository.lower()}"
@@ -137,15 +131,6 @@ class CommonBuildParams:
def airflow_image_readme_url(self):
return "https://raw.githubusercontent.com/apache/airflow/main/docs/docker-stack/README.md"
- @property
- def airflow_image_name_with_tag(self):
- """Construct image link"""
- image = (
- f"{self.airflow_base_image_name}/{self.airflow_branch}/"
- f"{self.image_type.lower()}/python{self.python}"
- )
- return image if self.image_tag is None else image + f":{self.image_tag}"
-
def get_cache(self, single_platform: str) -> str:
if "," in single_platform:
get_console().print(
@@ -158,13 +143,6 @@ class CommonBuildParams:
def is_multi_platform(self) -> bool:
return "," in self.platform
- def preparing_latest_image(self) -> bool:
- return (
- self.tag_as_latest
- or self.airflow_image_name == self.airflow_image_name_with_tag
- or self.airflow_image_name_with_tag.endswith("latest")
- )
-
@property
def platforms(self) -> list[str]:
return self.platform.split(",")
diff --git a/dev/breeze/src/airflow_breeze/params/shell_params.py b/dev/breeze/src/airflow_breeze/params/shell_params.py
index 7a3dbc1690a..68bd75692ee 100644
--- a/dev/breeze/src/airflow_breeze/params/shell_params.py
+++ b/dev/breeze/src/airflow_breeze/params/shell_params.py
@@ -164,7 +164,6 @@ class ShellParams:
github_actions: str = os.environ.get("GITHUB_ACTIONS", "false")
github_repository: str = APACHE_AIRFLOW_GITHUB_REPOSITORY
github_token: str = os.environ.get("GITHUB_TOKEN", "")
- image_tag: str | None = None
include_mypy_volume: bool = False
install_airflow_version: str = ""
install_airflow_python_client: bool = False
@@ -258,11 +257,6 @@ class ShellParams:
image = f"{self.airflow_base_image_name}/{self.airflow_branch}/ci/python{self.python}"
return image
- @cached_property
- def airflow_image_name_with_tag(self) -> str:
- image = self.airflow_image_name
- return image if not self.image_tag else image + f":{self.image_tag}"
-
@cached_property
def airflow_image_kubernetes(self) -> str:
image = f"{self.airflow_base_image_name}/{self.airflow_branch}/kubernetes/python{self.python}"
@@ -298,7 +292,7 @@ class ShellParams:
if get_verbose():
get_console().print(f"[info]Use {self.image_type} image[/]")
get_console().print(f"[info]Branch Name: {self.airflow_branch}[/]")
- get_console().print(f"[info]Docker Image: {self.airflow_image_name_with_tag}[/]")
+ get_console().print(f"[info]Docker Image: {self.airflow_image_name}[/]")
get_console().print(f"[info]Airflow source version:{self.airflow_version}[/]")
get_console().print(f"[info]Python Version: {self.python}[/]")
get_console().print(f"[info]Backend: {self.backend} {self.backend_version}[/]")
@@ -503,7 +497,6 @@ class ShellParams:
_env: dict[str, str] = {}
_set_var(_env, "AIRFLOW_CI_IMAGE", self.airflow_image_name)
- _set_var(_env, "AIRFLOW_CI_IMAGE_WITH_TAG", self.airflow_image_name_with_tag)
_set_var(_env, "AIRFLOW_CONSTRAINTS_LOCATION", self.airflow_constraints_location)
_set_var(_env, "AIRFLOW_CONSTRAINTS_MODE", self.airflow_constraints_mode)
_set_var(_env, "AIRFLOW_CONSTRAINTS_REFERENCE", self.airflow_constraints_reference)
diff --git a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
index 7a95b6cb118..7ded329580b 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -417,7 +417,7 @@ def prepare_docker_build_command(
final_command.extend(image_params.common_docker_build_flags)
final_command.extend(["--pull"])
final_command.extend(image_params.prepare_arguments_for_docker_build_command())
- final_command.extend(["-t", image_params.airflow_image_name_with_tag, "--target", "main", "."])
+ final_command.extend(["-t", image_params.airflow_image_name, "--target", "main", "."])
final_command.extend(
["-f", "Dockerfile" if isinstance(image_params, BuildProdParams) else "Dockerfile.ci"]
)
@@ -433,7 +433,7 @@ def construct_docker_push_command(
:param image_params: parameters of the image
:return: Command to run as list of string
"""
- return ["docker", "push", image_params.airflow_image_name_with_tag]
+ return ["docker", "push", image_params.airflow_image_name]
def build_cache(image_params: CommonBuildParams, output: Output | None) -> RunCommandResult:
@@ -534,7 +534,6 @@ def warm_up_docker_builder(image_params_list: list[CommonBuildParams]):
docker_syntax = get_docker_syntax_version()
get_console().print(f"[info]Warming up the {docker_context} builder for syntax: {docker_syntax}")
warm_up_image_param = copy.deepcopy(image_params_list[0])
- warm_up_image_param.image_tag = "warmup"
warm_up_image_param.push = False
warm_up_image_param.platform = platform
build_command = prepare_base_build_command(image_params=warm_up_image_param)
diff --git a/dev/breeze/src/airflow_breeze/utils/image.py b/dev/breeze/src/airflow_breeze/utils/image.py
index 3adc920a4c9..631e5dfcdf2 100644
--- a/dev/breeze/src/airflow_breeze/utils/image.py
+++ b/dev/breeze/src/airflow_breeze/utils/image.py
@@ -53,7 +53,6 @@ def run_pull_in_parallel(
python_version_list: list[str],
verify: bool,
include_success_outputs: bool,
- tag_as_latest: bool,
wait_for_image: bool,
extra_pytest_args: tuple,
):
@@ -77,7 +76,6 @@ def run_pull_in_parallel(
d = {
"image_params": image_param,
"wait_for_image": wait_for_image,
- "tag_as_latest": tag_as_latest,
"poll_time_seconds": 10.0,
"output": outputs[index],
}
@@ -101,7 +99,6 @@ def run_pull_in_parallel(
def run_pull_image(
image_params: CommonBuildParams,
wait_for_image: bool,
- tag_as_latest: bool,
output: Output | None,
poll_time_seconds: float = 10.0,
max_time_minutes: float = 70,
@@ -113,24 +110,23 @@ def run_pull_image(
:param output: output to write to
:param wait_for_image: whether we should wait for the image to be available
- :param tag_as_latest: tag the image as latest
:param poll_time_seconds: what's the polling time between checks if images are there (default 10 s)
:param max_time_minutes: what's the maximum time to wait for the image to be pulled (default 70 minutes)
:return: Tuple of return code and description of the image pulled
"""
get_console(output=output).print(
f"\n[info]Pulling {image_params.image_type} image of airflow python version: "
- f"{image_params.python} image: {image_params.airflow_image_name_with_tag} "
+ f"{image_params.python} image: {image_params.airflow_image_name} "
f"with wait for image: {wait_for_image} and max time to poll {max_time_minutes} minutes[/]\n"
)
current_loop = 1
start_time = time.time()
while True:
- command_to_run = ["docker", "pull", image_params.airflow_image_name_with_tag]
+ command_to_run = ["docker", "pull", image_params.airflow_image_name]
command_result = run_command(command_to_run, check=False, output=output)
if command_result.returncode == 0:
command_result = run_command(
- ["docker", "inspect", image_params.airflow_image_name_with_tag, "-f", "{{.Size}}"],
+ ["docker", "inspect", image_params.airflow_image_name, "-f", "{{.Size}}"],
capture_output=True,
output=output,
text=True,
@@ -152,22 +148,20 @@ def run_pull_image(
command_result.returncode,
f"Image Python {image_params.python}",
)
- if tag_as_latest:
- command_result = tag_image_as_latest(image_params=image_params, output=output)
- if command_result.returncode == 0 and isinstance(image_params, BuildCiParams):
+ if isinstance(image_params, BuildCiParams):
mark_image_as_refreshed(image_params)
return command_result.returncode, f"Image Python {image_params.python}"
if wait_for_image:
if get_verbose() or get_dry_run():
get_console(output=output).print(
- f"\n[info]Waiting: #{current_loop} {image_params.airflow_image_name_with_tag}.[/]\n"
+ f"\n[info]Waiting: #{current_loop} {image_params.airflow_image_name}.[/]\n"
)
time.sleep(poll_time_seconds)
current_loop += 1
current_time = time.time()
if (current_time - start_time) / 60 > max_time_minutes:
get_console(output=output).print(
- f"\n[error]The image {image_params.airflow_image_name_with_tag} "
+ f"\n[error]The image {image_params.airflow_image_name} "
f"did not appear in {max_time_minutes} minutes. Failing.[/]\n"
)
return 1, f"Image Python {image_params.python}"
@@ -179,33 +173,9 @@ def run_pull_image(
return command_result.returncode, f"Image Python {image_params.python}"
-def tag_image_as_latest(image_params: CommonBuildParams, output: Output | None) -> RunCommandResult:
- if image_params.airflow_image_name_with_tag == image_params.airflow_image_name:
- get_console(output=output).print(
- f"[info]Skip tagging {image_params.airflow_image_name} as latest as it is already 'latest'[/]"
- )
- return subprocess.CompletedProcess(returncode=0, args=[])
- command = run_command(
- [
- "docker",
- "tag",
- image_params.airflow_image_name_with_tag,
- image_params.airflow_image_name + ":latest",
- ],
- output=output,
- capture_output=True,
- check=False,
- )
- if command.returncode != 0:
- get_console(output=output).print(command.stdout)
- get_console(output=output).print(command.stderr)
- return command
-
-
def run_pull_and_verify_image(
image_params: CommonBuildParams,
wait_for_image: bool,
- tag_as_latest: bool,
poll_time_seconds: float,
extra_pytest_args: tuple,
output: Output | None,
@@ -213,7 +183,6 @@ def run_pull_and_verify_image(
return_code, info = run_pull_image(
image_params=image_params,
wait_for_image=wait_for_image,
- tag_as_latest=tag_as_latest,
output=output,
poll_time_seconds=poll_time_seconds,
)
@@ -222,7 +191,7 @@ def run_pull_and_verify_image(
f"\n[error]Not running verification for {image_params.python} as pulling failed.[/]\n"
)
return verify_an_image(
- image_name=image_params.airflow_image_name_with_tag,
+ image_name=image_params.airflow_image_name,
image_type=image_params.image_type,
output=output,
slim_image=False,
@@ -239,9 +208,9 @@ def just_pull_ci_image(github_repository, python_version: str) -> tuple[ShellPar
skip_image_upgrade_check=True,
quiet=True,
)
- get_console().print(f"[info]Pulling {shell_params.airflow_image_name_with_tag}.[/]")
+ get_console().print(f"[info]Pulling {shell_params.airflow_image_name}.[/]")
pull_command_result = run_command(
- ["docker", "pull", shell_params.airflow_image_name_with_tag],
+ ["docker", "pull", shell_params.airflow_image_name],
check=True,
)
return shell_params, pull_command_result
@@ -259,7 +228,7 @@ def check_if_ci_image_available(
quiet=True,
)
inspect_command_result = run_command(
- ["docker", "inspect", shell_params.airflow_image_name_with_tag],
+ ["docker", "inspect", shell_params.airflow_image_name],
stdout=subprocess.DEVNULL,
check=False,
)
@@ -273,9 +242,7 @@ def find_available_ci_image(github_repository: str) -> ShellParams:
for python_version in ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS:
shell_params, inspect_command_result = check_if_ci_image_available(github_repository, python_version)
if inspect_command_result.returncode == 0:
- get_console().print(
- f"[info]Running fix_ownership with {shell_params.airflow_image_name_with_tag}.[/]"
- )
+ get_console().print(f"[info]Running fix_ownership with {shell_params.airflow_image_name}.[/]")
return shell_params
shell_params, _ = just_pull_ci_image(github_repository, DEFAULT_PYTHON_MAJOR_MINOR_VERSION)
return shell_params
diff --git a/dev/breeze/src/airflow_breeze/utils/platforms.py b/dev/breeze/src/airflow_breeze/utils/platforms.py
index f32ccd20a64..d617ffc0a3a 100644
--- a/dev/breeze/src/airflow_breeze/utils/platforms.py
+++ b/dev/breeze/src/airflow_breeze/utils/platforms.py
@@ -24,9 +24,9 @@ from pathlib import Path
def get_real_platform(single_platform: str) -> str:
"""
Replace different platform variants of the platform provided platforms with the two canonical ones we
- are using: amd64 and arm64.
+ are using: linux/amd64 and linux/arm64.
"""
- return single_platform.replace("x86_64", "amd64").replace("aarch64", "arm64").replace("/", "-")
+ return single_platform.replace("x86_64", "amd64").replace("aarch64", "arm64")
def _exists_no_permission_error(p: str) -> bool:
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index 1a7b2f1d2d5..5bae932f23f 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -616,13 +616,17 @@ class SelectiveChecks:
return " ".join(self.kubernetes_versions)
@cached_property
- def kubernetes_combos_list_as_string(self) -> str:
+ def kubernetes_combos(self) -> list[str]:
python_version_array: list[str] = self.python_versions_list_as_string.split(" ")
kubernetes_version_array: list[str] = self.kubernetes_versions_list_as_string.split(" ")
combo_titles, short_combo_titles, combos = get_kubernetes_python_combos(
kubernetes_version_array, python_version_array
)
- return " ".join(short_combo_titles)
+ return short_combo_titles
+
+ @cached_property
+ def kubernetes_combos_list_as_string(self) -> str:
+ return " ".join(self.kubernetes_combos)
def _matching_files(
self, match_group: FileGroupForCi, match_dict: HashableDict, exclude_dict: HashableDict
diff --git a/dev/breeze/tests/test_shell_params.py b/dev/breeze/tests/test_shell_params.py
index 7fd6ae18390..e4eeb409d4f 100644
--- a/dev/breeze/tests/test_shell_params.py
+++ b/dev/breeze/tests/test_shell_params.py
@@ -37,7 +37,6 @@ console = Console(width=400, color_system="standard")
{
"DEFAULT_BRANCH": AIRFLOW_BRANCH,
"AIRFLOW_CI_IMAGE": f"ghcr.io/apache/airflow/{AIRFLOW_BRANCH}/ci/python3.12",
- "AIRFLOW_CI_IMAGE_WITH_TAG": f"ghcr.io/apache/airflow/{AIRFLOW_BRANCH}/ci/python3.12",
"PYTHON_MAJOR_MINOR_VERSION": "3.12",
},
id="python3.12",
@@ -47,21 +46,10 @@ console = Console(width=400, color_system="standard")
{"python": 3.9},
{
"AIRFLOW_CI_IMAGE": f"ghcr.io/apache/airflow/{AIRFLOW_BRANCH}/ci/python3.9",
- "AIRFLOW_CI_IMAGE_WITH_TAG": f"ghcr.io/apache/airflow/{AIRFLOW_BRANCH}/ci/python3.9",
"PYTHON_MAJOR_MINOR_VERSION": "3.9",
},
id="python3.9",
),
- pytest.param(
- {},
- {"python": 3.9, "image_tag": "a_tag"},
- {
- "AIRFLOW_CI_IMAGE": f"ghcr.io/apache/airflow/{AIRFLOW_BRANCH}/ci/python3.9",
- "AIRFLOW_CI_IMAGE_WITH_TAG": f"ghcr.io/apache/airflow/{AIRFLOW_BRANCH}/ci/python3.9:a_tag",
- "PYTHON_MAJOR_MINOR_VERSION": "3.9",
- },
- id="With tag",
- ),
pytest.param(
{},
{"airflow_branch": "v2-7-test"},
diff --git a/docs/docker-stack/build-arg-ref.rst b/docs/docker-stack/build-arg-ref.rst
index b665f35b7c4..a738489bf97 100644
--- a/docs/docker-stack/build-arg-ref.rst
+++ b/docs/docker-stack/build-arg-ref.rst
@@ -258,29 +258,18 @@ You can see some examples of those in:
| | | ``docker-context-files``. |
+------------------------------------+------------------------------------------+------------------------------------------+
-Pre-caching PIP dependencies
-............................
+Caching dependencies
+....................
-When image is build from PIP, by default pre-caching of PIP dependencies is used. This is in order to speed-up incremental
-builds during development. When pre-cached PIP dependencies are used and ``pyproject.toml`` changes, the
-PIP dependencies are already pre-installed, thus resulting in much faster image rebuild. This is purely an optimization
-of time needed to build the images and should be disabled if you want to install Airflow from
-Docker context files.
+We are using ``--mount-type=cache`` volumes to speed up installation of dependencies for Airflow images. Combined with uv
+speed and extensive use of caching, as well as quick restoring of the cache in CI environment, this allows us to build images
+quickly - for both CI and local development purposes. The cache can be easily invalidated by providing a new value of
+``DEPENDENCY_CACHE_EPOCH`` build argument or changing it inside the Dockerfile.
-+------------------------------------------+------------------------------------------+------------------------------------------+
-| Build argument | Default value | Description |
-+==========================================+==========================================+==========================================+
-| ``AIRFLOW_BRANCH`` | ``main`` | the branch from which PIP dependencies |
-| | | are pre-installed initially. |
-+------------------------------------------+------------------------------------------+------------------------------------------+
-| ``AIRFLOW_REPO`` | ``apache/airflow`` | the repository from which PIP |
-| | | dependencies are pre-installed. |
-+------------------------------------------+------------------------------------------+------------------------------------------+
-| ``AIRFLOW_PRE_CACHED_PIP_PACKAGES`` | ``false`` | Allows to pre-cache airflow PIP packages |
-| | | from the GitHub of Apache Airflow |
-| | | This allows to optimize iterations for |
-| | | Image builds and speeds up CI builds. |
-+------------------------------------------+------------------------------------------+------------------------------------------+
-| ``PIP_CACHE_EPOCH`` | ``"0"`` | Allow to invalidate cache by passing a |
-| | | new argument. |
-+------------------------------------------+------------------------------------------+------------------------------------------+
++------------------------------------+------------------------------------------+------------------------------------------+
+| Build argument | Default value | Description |
++====================================+==========================================+==========================================+
++------------------------------------+------------------------------------------+------------------------------------------+
+| ``DEPENDENCY_CACHE_EPOCH`` | ``"0"`` | Allow to invalidate cache by passing a |
+| | | new argument. |
++------------------------------------+------------------------------------------+------------------------------------------+
diff --git a/docs/docker-stack/build.rst b/docs/docker-stack/build.rst
index 4b2bcab5b2e..fe147870690 100644
--- a/docs/docker-stack/build.rst
+++ b/docs/docker-stack/build.rst
@@ -946,7 +946,6 @@ On a separate (air-gaped) system, all the PyPI packages can be copied to ``docke
where you can build the image using the packages downloaded by passing those build args:
* ``INSTALL_PACKAGES_FROM_CONTEXT="true"`` - to use packages present in ``docker-context-files``
-* ``AIRFLOW_PRE_CACHED_PIP_PACKAGES="false"`` - to not pre-cache packages from PyPI when building image
* ``AIRFLOW_CONSTRAINTS_LOCATION=/docker-context-files/YOUR_CONSTRAINT_FILE.txt`` - to downloaded constraint files
* (Optional) ``INSTALL_MYSQL_CLIENT="false"`` if you do not want to install ``MySQL``
client from the Oracle repositories.
@@ -1027,13 +1026,11 @@ You can read more details about the images - the context, their parameters and i
`Images documentation <https://github.com/apache/airflow/blob/main/dev/breeze/doc/ci/02_images.md>`_.
-Pip packages caching
+Dependencies caching
....................
To enable faster iteration when building the image locally (especially if you are testing different combination of
python packages), pip caching has been enabled. The caching id is based on four different parameters:
-1. ``PYTHON_BASE_IMAGE``: Avoid sharing same cache based on python version and target os
-2. ``AIRFLOW_PIP_VERSION``
-3. ``TARGETARCH``: Avoid sharing architecture specific cached package
-4. ``PIP_CACHE_EPOCH``: Enable changing cache id by passing ``PIP_CACHE_EPOCH`` as ``--build-arg``
+1. ``TARGETARCH``: Avoid sharing architecture specific cached package
+2. ``DEPENDENCY_CACHE_EPOCH``: Enable invalidating cache by passing ``DEPENDENCY_CACHE_EPOCH`` as ``--build-arg``
diff --git a/docs/docker-stack/docker-examples/restricted/restricted_environments.sh b/docs/docker-stack/docker-examples/restricted/restricted_environments.sh
index 2f2b91d2b7a..5c36a42ec2b 100755
--- a/docs/docker-stack/docker-examples/restricted/restricted_environments.sh
+++ b/docs/docker-stack/docker-examples/restricted/restricted_environments.sh
@@ -53,7 +53,6 @@ docker build . \
--build-arg INSTALL_MYSQL_CLIENT="false" \
--build-arg INSTALL_MSSQL_CLIENT="false" \
--build-arg INSTALL_POSTGRES_CLIENT="true" \
- --build-arg AIRFLOW_PRE_CACHED_PIP_PACKAGES="false" \
--build-arg DOCKER_CONTEXT_FILES="docker-context-files" \
--build-arg INSTALL_PACKAGES_FROM_CONTEXT="true" \
--build-arg AIRFLOW_CONSTRAINTS_LOCATION="/docker-context-files/constraints-3.9.txt" \
diff --git a/hatch_build.py b/hatch_build.py
index c3aef3defe3..c174673b9d2 100644
--- a/hatch_build.py
+++ b/hatch_build.py
@@ -346,10 +346,6 @@ BUNDLE_EXTRAS: dict[str, list[str]] = {
],
}
-# When you remove a dependency from the list, you should also make sure to add the dependency to be removed
-# in the scripts/docker/install_airflow_dependencies_from_branch_tip.sh script DEPENDENCIES_TO_REMOVE
-# in order to make sure the dependency is not installed in the CI image build process from the main
-# of Airflow branch. After your PR is merged, you should remove it from the list there.
DEPENDENCIES = [
# Alembic is important to handle our migrations in predictable and performant way. It is developed
# together with SQLAlchemy. Our experience with Alembic is that it very stable in minor version
diff --git a/scripts/ci/cleanup_docker.sh b/scripts/ci/cleanup_docker.sh
index a61a77fd45f..400cc501541 100755
--- a/scripts/ci/cleanup_docker.sh
+++ b/scripts/ci/cleanup_docker.sh
@@ -16,7 +16,10 @@
# specific language governing permissions and limitations
# under the License.
function cleanup_docker {
- docker system prune --all --force --volumes || true
+ # This is faster than docker prune
+ sudo systemctl stop docker
+ sudo rm -rf /var/lib/docker
+ sudo systemctl start docker
}
cleanup_docker
diff --git a/scripts/ci/constraints/ci_commit_constraints.sh b/scripts/ci/constraints/ci_commit_constraints.sh
index 727ddcf6257..c452d7a4a8e 100755
--- a/scripts/ci/constraints/ci_commit_constraints.sh
+++ b/scripts/ci/constraints/ci_commit_constraints.sh
@@ -26,9 +26,6 @@ This update in constraints is automatically committed by the CI 'constraints-pus
The action that build those constraints can be found at https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}/
-The image tag used for that build was: ${IMAGE_TAG}. You can enter Breeze environment
-with this image by running 'breeze shell --image-tag ${IMAGE_TAG}'
-
All tests passed in this build so we determined we can push the updated constraints.
See https://github.com/apache/airflow/blob/main/README.md#installing-from-pypi for details.
diff --git a/scripts/ci/docker-compose/base.yml b/scripts/ci/docker-compose/base.yml
index 5450a4af8c0..da448652e4b 100644
--- a/scripts/ci/docker-compose/base.yml
+++ b/scripts/ci/docker-compose/base.yml
@@ -17,7 +17,7 @@
---
services:
airflow:
- image: ${AIRFLOW_CI_IMAGE_WITH_TAG}
+ image: ${AIRFLOW_CI_IMAGE}
pull_policy: never
environment:
- USER=root
diff --git a/scripts/ci/images/ci_start_arm_instance_and_connect_to_docker.sh b/scripts/ci/images/ci_start_arm_instance_and_connect_to_docker.sh
deleted file mode 100755
index fb02a9d2ef7..00000000000
--- a/scripts/ci/images/ci_start_arm_instance_and_connect_to_docker.sh
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/env bash
-# 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.
-SCRIPTS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)"
-# This is an AMI that is based on Basic Amazon Linux AMI with installed and configured docker service
-WORKING_DIR="/tmp/armdocker"
-INSTANCE_INFO="${WORKING_DIR}/instance_info.json"
-ARM_AMI="ami-0e43196369d299715" # AMI ID of latest arm-docker-ami-v*
-INSTANCE_TYPE="m7g.medium" # m7g.medium -> 1 vCPUS 4 GB RAM
-MARKET_OPTIONS="MarketType=spot,SpotOptions={MaxPrice=0.25,SpotInstanceType=one-time}"
-REGION="us-east-2"
-EC2_USER="ec2-user"
-USER_DATA_FILE="${SCRIPTS_DIR}/initialize.sh"
-METADATA_ADDRESS="http://169.254.169.254/latest/meta-data"
-MAC_ADDRESS=$(curl -s "${METADATA_ADDRESS}/network/interfaces/macs/" | head -n1 | tr -d '/')
-CIDR=$(curl -s "${METADATA_ADDRESS}/network/interfaces/macs/${MAC_ADDRESS}/vpc-ipv4-cidr-block/")
-
-: "${GITHUB_TOKEN:?Should be set}"
-
-function start_arm_instance() {
- set -x
- mkdir -p "${WORKING_DIR}"
- cd "${WORKING_DIR}" || exit 1
- aws ec2 run-instances \
- --region "${REGION}" \
- --image-id "${ARM_AMI}" \
- --count 1 \
- --block-device-mappings "[{\"DeviceName\":\"/dev/xvda\",\"Ebs\":{\"VolumeSize\":16}}]" \
- --instance-type "${INSTANCE_TYPE}" \
- --user-data "file://${USER_DATA_FILE}" \
- --instance-market-options "${MARKET_OPTIONS}" \
- --instance-initiated-shutdown-behavior terminate \
- --output json \
- > "${INSTANCE_INFO}"
-
- INSTANCE_ID=$(jq < "${INSTANCE_INFO}" ".Instances[0].InstanceId" -r)
- if [[ ${INSTANCE_ID} == "" ]]; then
- echo "ERROR!!!! Failed to start ARM instance. Likely because it could not be allocated on spot market."
- exit 1
- fi
- AVAILABILITY_ZONE=$(jq < "${INSTANCE_INFO}" ".Instances[0].Placement.AvailabilityZone" -r)
- aws ec2 wait instance-status-ok --instance-ids "${INSTANCE_ID}"
- INSTANCE_PRIVATE_DNS_NAME=$(aws ec2 describe-instances \
- --filters "Name=instance-state-name,Values=running" "Name=instance-id,Values=${INSTANCE_ID}" \
- --query 'Reservations[*].Instances[*].PrivateDnsName' --output text)
- SECURITY_GROUP=$(jq < "${INSTANCE_INFO}" ".Instances[0].NetworkInterfaces[0].Groups[0].GroupId" -r)
- rm -f my_key
- ssh-keygen -t rsa -f my_key -N ""
- aws ec2-instance-connect send-ssh-public-key --instance-id "${INSTANCE_ID}" \
- --availability-zone "${AVAILABILITY_ZONE}" \
- --instance-os-user "${EC2_USER}" \
- --ssh-public-key "file://${WORKING_DIR}/my_key.pub"
- aws ec2 authorize-security-group-ingress --region "${REGION}" --group-id "${SECURITY_GROUP}" \
- --protocol tcp --port 22 --cidr "${CIDR}" || true
- export AUTOSSH_LOGFILE="${WORKING_DIR}/autossh.log"
- autossh -f "-L12357:/var/run/docker.sock" \
- -N -o "IdentitiesOnly=yes" -o "StrictHostKeyChecking=no" \
- -i "${WORKING_DIR}/my_key" "${EC2_USER}@${INSTANCE_PRIVATE_DNS_NAME}"
-
- bash -c 'echo -n "Waiting port 12357 .."; for _ in `seq 1 40`; do echo -n .; sleep 0.25; nc -z localhost 12357 && echo " Open." && exit ; done; echo " Timeout!" >&2; exit 1'
-}
-
-function create_context() {
- echo
- echo "Creating buildx context: airflow_cache"
- echo
- docker buildx rm --force airflow_cache || true
- docker buildx create --name airflow_cache
- docker buildx create --name airflow_cache --append localhost:12357
- docker buildx ls
- echo
- echo "Context created"
- echo
-}
-
-start_arm_instance
-create_context
diff --git a/scripts/ci/images/ci_stop_arm_instance.sh b/scripts/ci/images/ci_stop_arm_instance.sh
deleted file mode 100755
index 57a42c80a32..00000000000
--- a/scripts/ci/images/ci_stop_arm_instance.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/env bash
-# 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.
-# This is an AMI that is based on Basic Amazon Linux AMI with installed and configured docker service
-WORKING_DIR="/tmp/armdocker"
-INSTANCE_INFO="${WORKING_DIR}/instance_info.json"
-AUTOSSH_LOGFILE="${WORKING_DIR}/autossh.log"
-
-function stop_arm_instance() {
- INSTANCE_ID=$(jq < "${INSTANCE_INFO}" ".Instances[0].InstanceId" -r)
- docker buildx rm --force airflow_cache || true
- aws ec2 terminate-instances --instance-ids "${INSTANCE_ID}"
- cat ${AUTOSSH_LOGFILE} || true
-}
-
-stop_arm_instance
diff --git a/scripts/docker/common.sh b/scripts/docker/common.sh
index 33ab0587321..98b3e6d5f51 100644
--- a/scripts/docker/common.sh
+++ b/scripts/docker/common.sh
@@ -36,8 +36,6 @@ function common::get_packaging_tool() {
## IMPORTANT: IF YOU MODIFY THIS FUNCTION YOU SHOULD ALSO MODIFY CORRESPONDING FUNCTION IN
## `scripts/in_container/_in_container_utils.sh`
- local PYTHON_BIN
- PYTHON_BIN=$(which python)
if [[ ${AIRFLOW_USE_UV} == "true" ]]; then
echo
echo "${COLOR_BLUE}Using 'uv' to install Airflow${COLOR_RESET}"
@@ -45,8 +43,8 @@ function common::get_packaging_tool() {
export PACKAGING_TOOL="uv"
export PACKAGING_TOOL_CMD="uv pip"
if [[ -z ${VIRTUAL_ENV=} ]]; then
- export EXTRA_INSTALL_FLAGS="--python ${PYTHON_BIN}"
- export EXTRA_UNINSTALL_FLAGS="--python ${PYTHON_BIN}"
+ export EXTRA_INSTALL_FLAGS="--system"
+ export EXTRA_UNINSTALL_FLAGS="--system"
else
export EXTRA_INSTALL_FLAGS=""
export EXTRA_UNINSTALL_FLAGS=""
diff --git a/scripts/docker/install_airflow.sh b/scripts/docker/install_airflow.sh
index 27dd25ba260..8ba7671db28 100644
--- a/scripts/docker/install_airflow.sh
+++ b/scripts/docker/install_airflow.sh
@@ -48,18 +48,12 @@ function install_airflow() {
# Determine the installation_command_flags based on AIRFLOW_INSTALLATION_METHOD method
local installation_command_flags
if [[ ${AIRFLOW_INSTALLATION_METHOD} == "." ]]; then
- # We need _a_ file in there otherwise the editable install doesn't include anything in the .pth file
- mkdir -p ./providers/src/airflow/providers/
- touch ./providers/src/airflow/providers/__init__.py
-
- # Similarly we need _a_ file for task_sdk too
- mkdir -p ./task_sdk/src/airflow/sdk/
- echo '__version__ = "0.0.0dev0"' > ./task_sdk/src/airflow/sdk/__init__.py
-
- trap 'rm -f ./providers/src/airflow/providers/__init__.py ./task_sdk/src/airflow/__init__.py 2>/dev/null' EXIT
-
# When installing from sources - we always use `--editable` mode
- installation_command_flags="--editable .[${AIRFLOW_EXTRAS}]${AIRFLOW_VERSION_SPECIFICATION} --editable ./providers --editable ./task_sdk"
+ installation_command_flags="--editable .[${AIRFLOW_EXTRAS}]${AIRFLOW_VERSION_SPECIFICATION} --editable ./task_sdk"
+ while IFS= read -r -d '' pyproject_toml_file; do
+ project_folder=$(dirname ${pyproject_toml_file})
+ installation_command_flags="${installation_command_flags} --editable ${project_folder}"
+ done < <(find "providers" -name "pyproject.toml" -print0)
elif [[ ${AIRFLOW_INSTALLATION_METHOD} == "apache-airflow" ]]; then
installation_command_flags="apache-airflow[${AIRFLOW_EXTRAS}]${AIRFLOW_VERSION_SPECIFICATION}"
elif [[ ${AIRFLOW_INSTALLATION_METHOD} == apache-airflow\ @\ * ]]; then
diff --git a/scripts/docker/install_airflow_dependencies_from_branch_tip.sh b/scripts/docker/install_airflow_dependencies_from_branch_tip.sh
deleted file mode 100644
index 44d1b7b6b45..00000000000
--- a/scripts/docker/install_airflow_dependencies_from_branch_tip.sh
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/env bash
-# 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.
-# shellcheck shell=bash disable=SC2086
-
-# Installs Airflow from $AIRFLOW_BRANCH tip. This is pure optimisation. It is done because we do not want
-# to reinstall all dependencies from scratch when pyproject.toml changes. Problem with Docker caching is that
-# when a file is changed, when added to docker context, it invalidates the cache and it causes Docker
-# build to reinstall all dependencies from scratch. This can take a loooooot of time. Therefore we install
-# the dependencies first from main (and uninstall airflow right after) so that we can start installing
-# deps from those pre-installed dependencies. It saves few minutes of build time when pyproject.toml changes.
-#
-# If INSTALL_MYSQL_CLIENT is set to false, mysql extra is removed
-# If INSTALL_POSTGRES_CLIENT is set to false, postgres extra is removed
-#
-# shellcheck source=scripts/docker/common.sh
-. "$( dirname "${BASH_SOURCE[0]}" )/common.sh"
-
-: "${AIRFLOW_REPO:?Should be set}"
-: "${AIRFLOW_BRANCH:?Should be set}"
-: "${INSTALL_MYSQL_CLIENT:?Should be true or false}"
-: "${INSTALL_POSTGRES_CLIENT:?Should be true or false}"
-
-function install_airflow_dependencies_from_branch_tip() {
- echo
- echo "${COLOR_BLUE}Installing airflow from ${AIRFLOW_BRANCH}. It is used to cache dependencies${COLOR_RESET}"
- echo
- if [[ ${INSTALL_MYSQL_CLIENT} != "true" ]]; then
- AIRFLOW_EXTRAS=${AIRFLOW_EXTRAS/mysql,}
- fi
- if [[ ${INSTALL_POSTGRES_CLIENT} != "true" ]]; then
- AIRFLOW_EXTRAS=${AIRFLOW_EXTRAS/postgres,}
- fi
- local TEMP_AIRFLOW_DIR
- TEMP_AIRFLOW_DIR=$(mktemp -d)
- # Install latest set of dependencies - without constraints. This is to download a "base" set of
- # dependencies that we can cache and reuse when installing airflow using constraints and latest
- # pyproject.toml in the next step (when we install regular airflow).
- set -x
- curl -fsSL "https://github.com/${AIRFLOW_REPO}/archive/${AIRFLOW_BRANCH}.tar.gz" | \
- tar xz -C "${TEMP_AIRFLOW_DIR}" --strip 1
- # Make sure editable dependencies are calculated when devel-ci dependencies are installed
- ${PACKAGING_TOOL_CMD} install ${EXTRA_INSTALL_FLAGS} ${ADDITIONAL_PIP_INSTALL_FLAGS} \
- --editable "${TEMP_AIRFLOW_DIR}[${AIRFLOW_EXTRAS}]"
- set +x
- common::install_packaging_tools
- set -x
- echo "${COLOR_BLUE}Uninstalling providers. Dependencies remain${COLOR_RESET}"
- # Uninstall airflow and providers to keep only the dependencies. In the future when
- # planned https://github.com/pypa/pip/issues/11440 is implemented in pip we might be able to use this
- # flag and skip the remove step.
- pip freeze | grep apache-airflow-providers | xargs ${PACKAGING_TOOL_CMD} uninstall ${EXTRA_UNINSTALL_FLAGS} || true
- set +x
- echo
- echo "${COLOR_BLUE}Uninstalling just airflow. Dependencies remain. Now target airflow can be reinstalled using mostly cached dependencies${COLOR_RESET}"
- echo
- set +x
- ${PACKAGING_TOOL_CMD} uninstall ${EXTRA_UNINSTALL_FLAGS} apache-airflow
- rm -rf "${TEMP_AIRFLOW_DIR}"
- set -x
- # If you want to make sure dependency is removed from cache in your PR when you removed it from
- # pyproject.toml - please add your dependency here as a list of strings
- # for example:
- # DEPENDENCIES_TO_REMOVE=("package_a" "package_b")
- # Once your PR is merged, you should make a follow-up PR to remove it from this list
- # and increase the AIRFLOW_CI_BUILD_EPOCH in Dockerfile.ci to make sure your cache is rebuilt.
- local DEPENDENCIES_TO_REMOVE
- # IMPORTANT!! Make sure to increase AIRFLOW_CI_BUILD_EPOCH in Dockerfile.ci when you remove a dependency from that list
- DEPENDENCIES_TO_REMOVE=()
- if [[ "${DEPENDENCIES_TO_REMOVE[*]}" != "" ]]; then
- echo
- echo "${COLOR_BLUE}Uninstalling just removed dependencies (temporary until cache refreshes)${COLOR_RESET}"
- echo "${COLOR_BLUE}Dependencies to uninstall: ${DEPENDENCIES_TO_REMOVE[*]}${COLOR_RESET}"
- echo
- set +x
- ${PACKAGING_TOOL_CMD} uninstall "${DEPENDENCIES_TO_REMOVE[@]}" || true
- set -x
- # make sure that the dependency is not needed by something else
- pip check
- fi
-}
-
-common::get_colors
-common::get_packaging_tool
-common::get_airflow_version_specification
-common::get_constraints_location
-common::show_packaging_tool_version_and_location
-
-install_airflow_dependencies_from_branch_tip
diff --git a/scripts/in_container/_in_container_utils.sh b/scripts/in_container/_in_container_utils.sh
index ae94331d95c..cca1f1ba087 100644
--- a/scripts/in_container/_in_container_utils.sh
+++ b/scripts/in_container/_in_container_utils.sh
@@ -63,17 +63,15 @@ function in_container_go_to_airflow_sources() {
function in_container_get_packaging_tool() {
## IMPORTANT: IF YOU MODIFY THIS FUNCTION YOU SHOULD ALSO MODIFY CORRESPONDING FUNCTION IN
## `scripts/docker/common.sh`
- local PYTHON_BIN
- PYTHON_BIN=$(which python)
if [[ ${AIRFLOW_USE_UV} == "true" ]]; then
echo
echo "${COLOR_BLUE}Using 'uv' to install Airflow${COLOR_RESET}"
echo
- export PACKAGING_TOOL=""
+ export PACKAGING_TOOL="uv"
export PACKAGING_TOOL_CMD="uv pip"
if [[ -z ${VIRTUAL_ENV=} ]]; then
- export EXTRA_INSTALL_FLAGS="--python ${PYTHON_BIN}"
- export EXTRA_UNINSTALL_FLAGS="--python ${PYTHON_BIN}"
+ export EXTRA_INSTALL_FLAGS="--system"
+ export EXTRA_UNINSTALL_FLAGS="--system"
else
export EXTRA_INSTALL_FLAGS=""
export EXTRA_UNINSTALL_FLAGS=""
@@ -90,7 +88,7 @@ function in_container_get_packaging_tool() {
export PACKAGING_TOOL_CMD="pip"
export EXTRA_INSTALL_FLAGS="--root-user-action ignore"
export EXTRA_UNINSTALL_FLAGS="--yes"
- export UPGRADE_EAGERLY="--upgrade-strategy eager"
+ export UPGRADE_EAGERLY="--upgrade --upgrade-strategy eager"
export UPGRADE_IF_NEEDED="--upgrade --upgrade-strategy only-if-needed"
fi
}