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 2023/08/14 08:41:57 UTC
[airflow] branch main updated: Improve handling of CI image timeout when backtracking (#33364)
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 1cf960d5d5 Improve handling of CI image timeout when backtracking (#33364)
1cf960d5d5 is described below
commit 1cf960d5d5f9179b1167d9e660142612781ddeda
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Mon Aug 14 10:41:48 2023 +0200
Improve handling of CI image timeout when backtracking (#33364)
Even the latest pip can enter into a long loop of backtracking
when trying to find latest "good" set of dependencies with
eager upgrade. This happened on August 10th 2023 with aiobotocore
causing backtracking.
This PR adds a complete set of tools and instructions that can
help in such cases and figure out which newly released dependency
causes backtracking.
The toolset consists of:
* adding timeout on the image build, so that it can fail before
the job timeout and provide useful instructions what to do
* adding `ci find-backtracking-candidates` that allows to identify
the packages released after the last successful constraint update
that could be the reason for backtracking
* running the `find-backtracking-candidates` command in the CI
when timeout occurs - this will help to see the candidates as
early as possible - at the first build that will fail with
timeout. This should help with narrowing down the root cause
much faster
* adding detailed explanation why we have the problem and how to
deal with it step-by-step, including example based on the
August 2023 backtracking issue with aiobotocore
* finally removing `--empty-image` switch and pushing empty images
in CI. This was an attempt to speed up waiting for image in case
the image failed, but what it did, it has hidden the failures
of the images when they failed. It does not really add value
any more, since "image waiting" is now always done using small
public runners, waiting till timeout for those is not a big issue.
---
.github/actions/build-ci-images/action.yml | 7 -
.github/actions/build-prod-images/action.yml | 4 -
.github/workflows/build-images.yml | 1 +
.github/workflows/ci.yml | 1 +
BREEZE.rst | 17 ++
Dockerfile | 12 +-
Dockerfile.ci | 7 +-
...UALLY_GENERATING_IMAGE_CACHE_AND_CONSTRAINTS.md | 197 +++++++++++++++++++++
.../src/airflow_breeze/commands/ci_commands.py | 10 ++
.../airflow_breeze/commands/ci_commands_config.py | 1 +
.../airflow_breeze/commands/ci_image_commands.py | 189 ++++++++++++--------
.../commands/ci_image_commands_config.py | 9 +-
.../commands/production_image_commands.py | 61 +++----
.../commands/production_image_commands_config.py | 1 -
dev/breeze/src/airflow_breeze/global_constants.py | 16 +-
.../src/airflow_breeze/params/build_ci_params.py | 9 +
.../airflow_breeze/params/common_build_params.py | 1 -
.../src/airflow_breeze/utils/backtracking.py | 89 ++++++++++
.../src/airflow_breeze/utils/common_options.py | 21 ++-
.../airflow_breeze/utils/docker_command_utils.py | 11 --
images/breeze/output-commands-hash.txt | 17 +-
images/breeze/output_ci-image_build.svg | 116 +++++++-----
images/breeze/output_ci.svg | 18 +-
.../output_ci_find-backtracking-candidates.svg | 91 ++++++++++
images/breeze/output_prod-image_build.svg | 34 ++--
.../output_setup_check-all-params-in-groups.svg | 36 ++--
.../output_setup_regenerate-command-images.svg | 62 ++++---
scripts/docker/install_additional_dependencies.sh | 2 +-
scripts/docker/install_airflow.sh | 2 +-
.../docker/install_from_docker_context_files.sh | 2 +-
scripts/in_container/_in_container_utils.sh | 4 +-
31 files changed, 752 insertions(+), 296 deletions(-)
diff --git a/.github/actions/build-ci-images/action.yml b/.github/actions/build-ci-images/action.yml
index e23a67222f..ed613c29ce 100644
--- a/.github/actions/build-ci-images/action.yml
+++ b/.github/actions/build-ci-images/action.yml
@@ -48,13 +48,6 @@ runs:
cat "files/constraints-${PYTHON_VERSION}/*.md" >> $GITHUB_STEP_SUMMARY || true
done
if: env.UPGRADE_TO_NEWER_DEPENDENCIES != 'false'
- - name: Push empty CI image ${{ env.PYTHON_MAJOR_MINOR_VERSION }}:${{ env.IMAGE }}
- if: failure() || cancelled()
- shell: bash
- run: breeze ci-image build --push --empty-image --run-in-parallel
- env:
- IMAGE_TAG: ${{ env.IMAGE_TAG }}
- COMMIT_SHA: ${{ github.sha }}
- name: "Fix ownership"
shell: bash
run: breeze ci fix-ownership
diff --git a/.github/actions/build-prod-images/action.yml b/.github/actions/build-prod-images/action.yml
index afbf58445f..0086345b69 100644
--- a/.github/actions/build-prod-images/action.yml
+++ b/.github/actions/build-prod-images/action.yml
@@ -63,10 +63,6 @@ runs:
--install-packages-from-context --upgrade-on-failure
env:
COMMIT_SHA: ${{ github.sha }}
- - name: Push empty PROD images ${{ env.IMAGE_TAG }}
- shell: bash
- run: breeze prod-image build --cleanup-context --push --empty-image --run-in-parallel
- if: failure() || cancelled()
- name: "Fix ownership"
shell: bash
run: breeze ci fix-ownership
diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml
index daa94ab290..96b4108ab7 100644
--- a/.github/workflows/build-images.yml
+++ b/.github/workflows/build-images.yml
@@ -194,6 +194,7 @@ jobs:
DOCKER_CACHE: ${{ needs.build-info.outputs.cache-directive }}
PYTHON_VERSIONS: ${{needs.build-info.outputs.all-python-versions-list-as-string}}
DEBUG_RESOURCES: ${{ needs.build-info.outputs.debug-resources }}
+ BUILD_TIMEOUT_MINUTES: 70
build-prod-images:
permissions:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 0e3b91e33d..e36724d581 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -324,6 +324,7 @@ jobs:
DOCKER_CACHE: ${{ needs.build-info.outputs.cache-directive }}
PYTHON_VERSIONS: ${{needs.build-info.outputs.all-python-versions-list-as-string}}
DEBUG_RESOURCES: ${{needs.build-info.outputs.debug-resources}}
+ BUILD_TIMEOUT_MINUTES: 70
build-prod-images:
timeout-minutes: 80
diff --git a/BREEZE.rst b/BREEZE.rst
index b2694a9fde..5213e08aca 100644
--- a/BREEZE.rst
+++ b/BREEZE.rst
@@ -1741,6 +1741,23 @@ These are all available flags of ``get-workflow-info`` command:
:width: 100%
:alt: Breeze ci get-workflow-info
+Finding backtracking candidates
+...............................
+
+Sometimes the CI build fails because ``pip`` timeouts when trying to resolve the latest set of dependencies
+for that we have the ``find-backtracking-candidates`` command. This command will try to find the
+backtracking candidates that might cause the backtracking.
+
+The details on how to use that command are explained in
+`Figuring out backtracking dependencies <dev/MANUALLY_GENERATING_IMAGE_CACHE_AND_CONSTRAINTS.md#figuring-out-backtracking-dependencies>`_.
+
+These are all available flags of ``find-backtracking-candidates`` command:
+
+.. image:: ./images/breeze/output_ci_find-backtracking-candidates.svg
+ :target: https://raw.githubusercontent.com/apache/airflow/main/images/breeze/output_ci_find-backtracking-candidates.svg
+ :width: 100%
+ :alt: Breeze ci find-backtracking-candidates
+
Release management tasks
------------------------
diff --git a/Dockerfile b/Dockerfile
index b92a5d2849..050b4a2292 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -594,7 +594,7 @@ function install_airflow_and_providers_from_docker_context_files(){
pip install "${pip_flags[@]}" --root-user-action ignore --upgrade --upgrade-strategy eager \
${ADDITIONAL_PIP_INSTALL_FLAGS} \
${reinstalling_apache_airflow_package} ${reinstalling_apache_airflow_providers_packages} \
- ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS}
+ ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=}
set +x
common::install_pip_version
@@ -665,7 +665,7 @@ function install_airflow() {
pip install --root-user-action ignore --upgrade --upgrade-strategy eager \
${ADDITIONAL_PIP_INSTALL_FLAGS} \
"${AIRFLOW_INSTALLATION_METHOD}[${AIRFLOW_EXTRAS}]${AIRFLOW_VERSION_SPECIFICATION}" \
- ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS}
+ ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=}
if [[ -n "${AIRFLOW_INSTALL_EDITABLE_FLAG}" ]]; then
# Remove airflow and reinstall it using editable flag
# We can only do it when we install airflow from sources
@@ -734,7 +734,7 @@ function install_additional_dependencies() {
set -x
pip install --root-user-action ignore --upgrade --upgrade-strategy eager \
${ADDITIONAL_PIP_INSTALL_FLAGS} \
- ${ADDITIONAL_PYTHON_DEPS} ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS}
+ ${ADDITIONAL_PYTHON_DEPS} ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=}
common::install_pip_version
set +x
echo
@@ -1290,17 +1290,11 @@ COPY --chown=airflow:0 ${AIRFLOW_SOURCES_FROM} ${AIRFLOW_SOURCES_TO}
# Add extra python dependencies
ARG ADDITIONAL_PYTHON_DEPS=""
-# 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
-# !!! MAKE SURE YOU SYNCHRONIZE THE LIST BETWEEN: Dockerfile, Dockerfile.ci
-ARG EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=""
ARG VERSION_SUFFIX_FOR_PYPI=""
ENV ADDITIONAL_PYTHON_DEPS=${ADDITIONAL_PYTHON_DEPS} \
INSTALL_PACKAGES_FROM_CONTEXT=${INSTALL_PACKAGES_FROM_CONTEXT} \
- EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS} \
VERSION_SUFFIX_FOR_PYPI=${VERSION_SUFFIX_FOR_PYPI}
WORKDIR ${AIRFLOW_HOME}
diff --git a/Dockerfile.ci b/Dockerfile.ci
index def7c6345b..a7df2f8c11 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -534,7 +534,7 @@ function install_airflow() {
pip install --root-user-action ignore --upgrade --upgrade-strategy eager \
${ADDITIONAL_PIP_INSTALL_FLAGS} \
"${AIRFLOW_INSTALLATION_METHOD}[${AIRFLOW_EXTRAS}]${AIRFLOW_VERSION_SPECIFICATION}" \
- ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS}
+ ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=}
if [[ -n "${AIRFLOW_INSTALL_EDITABLE_FLAG}" ]]; then
# Remove airflow and reinstall it using editable flag
# We can only do it when we install airflow from sources
@@ -603,7 +603,7 @@ function install_additional_dependencies() {
set -x
pip install --root-user-action ignore --upgrade --upgrade-strategy eager \
${ADDITIONAL_PIP_INSTALL_FLAGS} \
- ${ADDITIONAL_PYTHON_DEPS} ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS}
+ ${ADDITIONAL_PYTHON_DEPS} ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=}
common::install_pip_version
set +x
echo
@@ -1334,7 +1334,8 @@ ARG CASS_DRIVER_NO_CYTHON="1"
# Build cassandra driver on multiple CPUs
ARG CASS_DRIVER_BUILD_CONCURRENCY="8"
-ARG AIRFLOW_VERSION="2.5.0.dev0"
+# This value should be set by the CI image build system to the current timestamp
+ARG AIRFLOW_VERSION=""
# Additional PIP flags passed to all pip install commands except reinstalling pip itself
ARG ADDITIONAL_PIP_INSTALL_FLAGS=""
diff --git a/dev/MANUALLY_GENERATING_IMAGE_CACHE_AND_CONSTRAINTS.md b/dev/MANUALLY_GENERATING_IMAGE_CACHE_AND_CONSTRAINTS.md
index 503830d294..d8f8d4c2c6 100644
--- a/dev/MANUALLY_GENERATING_IMAGE_CACHE_AND_CONSTRAINTS.md
+++ b/dev/MANUALLY_GENERATING_IMAGE_CACHE_AND_CONSTRAINTS.md
@@ -23,6 +23,10 @@
- [Purpose of the document](#purpose-of-the-document)
- [Automated image cache and constraints refreshing in CI](#automated-image-cache-and-constraints-refreshing-in-ci)
+- [Figuring out backtracking dependencies](#figuring-out-backtracking-dependencies)
+ - [Why we need to figure out backtracking dependencies](#why-we-need-to-figure-out-backtracking-dependencies)
+ - [How to figure out backtracking dependencies](#how-to-figure-out-backtracking-dependencies)
+ - [Example backtracking session](#example-backtracking-session)
- [Manually refreshing the image cache](#manually-refreshing-the-image-cache)
- [Why we need to update image cache manually](#why-we-need-to-update-image-cache-manually)
- [Prerequisites](#prerequisites)
@@ -80,6 +84,199 @@ rebuilding of [Breeze](../BREEZE.rst) images for development purpose. This is al
step makes sure that constraints are committed and pushed just before the cache is refreshed, so
there is no problem with conflicting dependencies.
+
+# Figuring out backtracking dependencies
+
+## Why we need to figure out backtracking dependencies
+
+Sometimes, very rarely the CI image in `canary` builds take a very long time to build. This is usually
+caused by `pip` trying to figure out the latest set of dependencies (`eager upgrade`) .
+The resolution of dependencies is a very complex problem and sometimes it takes a long time to figure out
+the best set of dependencies. This is especially true when we have a lot of dependencies and they all have
+to be found compatible with each other. In case new dependencies are released, sometimes `pip` enters
+a long loop trying to figure out if the newly released dependency can be used, but due to some other
+dependencies of ours it is impossible, but it will take `pip` a very long time to figure it out.
+
+This is visible in the "build output" as `pip` attempting to continuously backtrack and download many new
+versions of various dependencies, trying to find a good match.
+
+This is why we sometimes we need to help pip to skip newer versions of those dependencies, until the
+condition that caused the backtracking is solved.
+
+We do it by adding `dependency<=version` to the EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS variable in
+`Dockerfile.ci`. The trick is to find the dependency that is causing the backtracking.
+
+Here is how. We use `bisecting` methodology to try out candidates for backtrack triggering among the
+candidates that have been released in PyPI since the last time we successfully run
+``--upgrade-to-newer-dependencies`` and committed the constraints in the `canary` build.
+
+## How to figure out backtracking dependencies
+
+First - we have a breeze command that can help us with that:
+
+```bash
+breeze ci find-backtracking-candidates
+```
+
+This command should be run rather quickly after we notice that the CI build is taking a long time and fail,
+because it is based on the fact that eager upgrade produced valid constraints at some point of time and
+it tries to find out what dependencies have been added since then and limit them to the version that
+was used in the constraints.
+
+You can also - instead of running the command manually rely on the failing CI builds. We run the
+`find-backtracking-candidates` command in the `canary` build when it times out, so the
+easiest way to find backtracking candidates is to find the first build that failed with timeout - it
+will likely have the smallest number of backtracking candidates. The command outputs the limitation
+for those backtracking candidates that are guaranteed to work (because they are taken from the latest
+constraints and they already succeeded in the past when the constraints were updated).
+
+Then we run ``breeze ci-image build --upgrade-to-newer-dependencies --eager-upgrade-additional-requirements "REQUIREMENTS"``
+to check which of the candidates causes the long builds. Initially you put there the whole list of
+candidates that you got from the `find-backtracking-candidates` command. This **should** succeed. Now,
+the next step is to narrow down the list of candidates to the one that is causing the backtracking.
+
+We narrow-down the list by "bisecting" the list. We remove half of the dependency limits and see if it
+still works or not. It it works - we continue. If it does not work, we restore the removed half and remove
+the other half. Rinse and repeat until there is only one dependency left - hopefully
+(sometimes you will need to leave few of them).
+
+This way we can relatively quickly narrow down the dependency that is causing the backtracking. Once we
+figure out which dependency is causing it, we can attempt to figure it out why it is causing the backtracking
+by specifying the latest released version of the dependency as `== <latest released version>` in the
+`--eager-upgrade-additional-requirements`. This should rather quickly fail and `pip` should show us what
+the dependency is conflicting with. There might be multiple reasons for that. Most often it is simply
+a dependency that has a requirement that is limited and we need to wait until new version of that
+dependency is released.
+
+Note that - such build **might** even succeed - surprisingly. Then this is simply a sign that `pip`
+algorithm for `--eager-upgrade` was not perfect and the solution could be found given sufficient time.
+In such case it might also be that removing the limit in the next few days will not cause the backtracking.
+
+Finally, in order to make the change permanent in our CI builds, we should add the limitation to the
+`EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS` arg in `Dockerfile.ci` and commit the change. We usually commit
+the limits with `<VERSION` suffix (where version is the version that causes backtracking - usually that will
+be the latest released version, unless that dependency had quick subsequent releases - you can try it before
+committing by simply adding it to `EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS` in Dockerfile.ci and
+running `breeze ci-image build --upgrade-to-newer-dependencies`. Make sure to add the comment explaining
+when we should remove the limit.
+
+
+Later on - periodically we might attempt to remove the limitation and see if the backtracking is still
+happening. If it is not - we just remove the limitation from `Dockerfile.ci` and commit the change.
+
+## Example backtracking session
+
+This is the example backtracking session run on 13th of August 2023 after the `canary` CI image build
+started to fail with timeout a day before.
+
+1. The `breeze ci-image build --upgrade-to-newer-dependencies` failed on CI after 80 minutes.
+
+2. The output of the `breeze ci find-backtracking-candidates` command:
+
+```
+Last constraint date: 2023-08-09 21:48:23
+Latest version aiobotocore==2.6.0 release date: 2023-08-11 20:43:19. In current constraints: 2.5.4)
+Latest version asana==4.0.5 release date: 2023-08-11 18:56:04. In current constraints: 3.2.1)
+Latest version async-timeout==4.0.3 release date: 2023-08-10 16:35:55. In current constraints: 4.0.2)
+Latest version aws-sam-translator==1.73.0 release date: 2023-08-10 00:01:00. In current constraints: 1.72.0)
+Latest version azure-core==1.29.1 release date: 2023-08-10 05:09:59. In current constraints: 1.29.0)
+Latest version azure-cosmos==4.5.0 release date: 2023-08-09 23:43:07. In current constraints: 4.4.0)
+Latest version boto3==1.28.25 release date: 2023-08-11 19:23:52. In current constraints: 1.28.17)
+Latest version botocore==1.31.25 release date: 2023-08-11 19:23:34. In current constraints: 1.31.17)
+Latest version cfgv==3.4.0 release date: 2023-08-12 20:38:16. In current constraints: 3.3.1)
+Latest version coverage==7.3.0 release date: 2023-08-12 18:34:06. In current constraints: 7.2.7)
+Latest version databricks-sql-connector==2.9.1 release date: 2023-08-11 17:32:12. In current constraints: 2.8.0)
+Latest version google-ads==21.3.0 release date: 2023-08-10 18:10:22. In current constraints: 21.2.0)
+Latest version google-cloud-aiplatform==1.30.1 release date: 2023-08-11 21:19:50. In current constraints: 1.29.0)
+Latest version grpcio-status==1.57.0 release date: 2023-08-10 15:54:17. In current constraints: 1.56.2)
+Latest version grpcio==1.57.0 release date: 2023-08-10 15:51:52. In current constraints: 1.56.2)
+Latest version mypy==1.5.0 release date: 2023-08-10 12:46:43. In current constraints: 1.2.0)
+Latest version pyzmq==25.1.1 release date: 2023-08-10 09:01:18. In current constraints: 25.1.0)
+Latest version tornado==6.3.3 release date: 2023-08-11 15:21:47. In current constraints: 6.3.2)
+Latest version tqdm==4.66.1 release date: 2023-08-10 11:38:57. In current constraints: 4.66.0)
+Latest version virtualenv==20.24.3 release date: 2023-08-11 15:52:32. In current constraints: 20.24.1)
+
+Found 20 candidates for backtracking
+
+Run `breeze ci-image --upgrade-to-newer-dependencies --eager-upgrade-additional-requirements "aiobotocore<=2.5.4 asana<=3.2.1 async-timeout<=4.0.2 aws-sam-translator<=1.72.0 azure-core<=1.29.0
+azure-cosmos<=4.4.0 boto3<=1.28.17 botocore<=1.31.17 cfgv<=3.3.1 coverage<=7.2.7 databricks-sql-connector<=2.8.0 google-ads<=21.2.0 google-cloud-aiplatform<=1.29.0 grpcio-status<=1.56.2 grpcio<=1.56.2
+mypy<=1.2.0 pyzmq<=25.1.0 tornado<=6.3.2 tqdm<=4.66.0 virtualenv<=20.24.1"`. It should succeed.
+```
+
+3. As instructed, run:
+
+```bash
+breeze ci-image build --upgrade-to-newer-dependencies --eager-upgrade-additional-requirements "\
+aiobotocore<=2.5.4 asana<=3.2.1 async-timeout<=4.0.2 aws-sam-translator<=1.72.0 \
+azure-core<=1.29.0 azure-cosmos<=4.4.0 boto3<=1.28.17 botocore<=1.31.17 cfgv<=3.3.1 coverage<=7.2.7 \
+databricks-sql-connector<=2.8.0 google-ads<=21.2.0 google-cloud-aiplatform<=1.29.0 \
+grpcio-status<=1.56.2 grpcio<=1.56.2 mypy<=1.2.0 pyzmq<=25.1.0 tornado<=6.3.2 tqdm<=4.66.0 virtualenv<=20.24.1"
+```
+
+The build succeeded in ~ 8 minutes.
+
+4. Removed the second half:
+
+```
+breeze ci-image build --upgrade-to-newer-dependencies --eager-upgrade-additional-requirements "\
+aiobotocore<=2.5.4 asana<=3.2.1 async-timeout<=4.0.2 aws-sam-translator<=1.72.0 \
+azure-core<=1.29.0 azure-cosmos<=4.4.0 boto3<=1.28.17 botocore<=1.31.17 cfgv<=3.3.1 coverage<=7.2.7"
+```
+
+The build succeeded in ~ 8 minutes.
+
+5. Removed the second half:
+
+```
+breeze ci-image build --upgrade-to-newer-dependencies --eager-upgrade-additional-requirements "\
+aiobotocore<=2.5.4 asana<=3.2.1 async-timeout<=4.0.2 aws-sam-translator<=1.72.0"
+```
+
+The build succeeded in ~ 8 minutes.
+
+6. Removed the second half:
+
+```
+breeze ci-image build --upgrade-to-newer-dependencies \
+--eager-upgrade-additional-requirements "aiobotocore<=2.5.4 asana<=3.2.1"
+```
+
+The build succeeded in ~ 8 minutes.
+
+6. Removed aiobotocore
+
+```
+asana<=3.2.1
+```
+
+The image build continued running way past 10 minutes and downloading many versions of many dependencies.
+
+7. Removed asana and restored aiobotocore
+
+```
+aiobotocore<=2.5.4
+```
+
+The build succeeded. Aiobotocore is our culprit.
+
+8. Check the reason for backtracking (using latest released version of aiobotocore):
+
+```bash
+breeze ci-image build --upgrade-to-newer-dependencies --eager-upgrade-additional-requirements "aiobotocore==2.6.0"
+```
+
+Note. In this case the build succeeded, which means that this was simply a flaw in the `pip` resolution
+algorithm (which is based on some heuristics) and not a real problem with the dependencies. We will
+attempt to remove the limit in the next few days to see if the problem is resolved by other dependencies
+released in the meantime.
+
+9. Updated additional dependencies in `Dockerfile.ci` with appropriate comment:
+
+```
+# aiobotocore is limited temporarily until it stops backtracking pip
+ARG EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS="aiobotocore<2.6.0"
+```
+
# Manually refreshing the image cache
## Why we need to update image cache manually
diff --git a/dev/breeze/src/airflow_breeze/commands/ci_commands.py b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
index 526ef30735..ed9864b4c0 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
@@ -411,3 +411,13 @@ def get_workflow_info(github_context: str, github_context_input: StringIO):
sys.exit(1)
wi = workflow_info(context=context)
wi.print_all_ga_outputs()
+
+
+@ci_group.command(
+ name="find-backtracking-candidates",
+ help="Find new releases of dependencies that could be the reason of backtracking.",
+)
+def find_backtracking_candidates():
+ from airflow_breeze.utils.backtracking import print_backtracking_candidates
+
+ print_backtracking_candidates()
diff --git a/dev/breeze/src/airflow_breeze/commands/ci_commands_config.py b/dev/breeze/src/airflow_breeze/commands/ci_commands_config.py
index a8b50246a3..4122063b23 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_commands_config.py
@@ -66,4 +66,5 @@ CI_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
}
],
"breeze ci resource-check": [],
+ "breeze ci find-backtracking-candidates": [],
}
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 821b64e8ee..f0a5ad621a 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
@@ -16,11 +16,15 @@
# under the License.
from __future__ import annotations
+import atexit
import os
+import signal
import subprocess
import sys
+import time
+from functools import partial
from pathlib import Path
-from typing import Any
+from typing import Any, Callable
import click
@@ -39,14 +43,14 @@ from airflow_breeze.utils.common_options import (
option_airflow_constraints_mode_ci,
option_airflow_constraints_reference_build,
option_answer,
- option_builder,
+ option_build_timeout_minutes,
option_commit_sha,
option_debug_resources,
option_dev_apt_command,
option_dev_apt_deps,
option_docker_cache,
option_dry_run,
- option_empty_image,
+ option_eager_upgrade_additional_requirements,
option_force_build,
option_github_repository,
option_github_token,
@@ -82,7 +86,6 @@ from airflow_breeze.utils.docker_command_utils import (
make_sure_builder_configured,
perform_environment_checks,
prepare_docker_build_command,
- prepare_docker_build_from_input,
warm_up_docker_builder,
)
from airflow_breeze.utils.image import run_pull_image, run_pull_in_parallel, tag_image_as_latest
@@ -163,6 +166,40 @@ def prepare_for_building_ci_image(params: BuildCiParams):
)
+def build_timout_handler(build_process_group_id: int, signum, frame):
+ # Kill the forked process group - it will kill the build even if it is running in parallel
+ # with multiple processes and docker build sessions
+ os.killpg(build_process_group_id, signal.SIGTERM)
+ os.waitpid(build_process_group_id, 0)
+ # give the output a little time to flush so that the helpful error message is not hidden
+ time.sleep(5)
+ get_console().print()
+ get_console().print(
+ "[error]The build timed out. This is likely because `pip` "
+ "started to backtrack dependency resolution.\n"
+ )
+ get_console().print(
+ "[warning]Please follow the instructions in "
+ "`dev/MANUALLY_GENERATING_IMAGE_CACHE_AND_CONSTRAINTS.md"
+ )
+ get_console().print(
+ "[warning]in the `How to figure out backtracking dependencies` "
+ "chapter as soon as possible. The longer it is delayed, "
+ "the more difficult it will be to find the culprit.\n"
+ )
+ from airflow_breeze.utils.backtracking import print_backtracking_candidates
+
+ print_backtracking_candidates()
+ sys.exit(1)
+
+
+def kill_process_group(build_process_group_id: int):
+ try:
+ os.killpg(build_process_group_id, signal.SIGTERM)
+ except OSError:
+ pass
+
+
@ci_image.command(name="build")
@option_python
@option_run_in_parallel
@@ -179,19 +216,19 @@ def prepare_for_building_ci_image(params: BuildCiParams):
@option_image_tag_for_building
@option_prepare_buildx_cache
@option_push
-@option_empty_image
@option_install_providers_from_sources
@option_additional_extras
@option_additional_dev_apt_deps
@option_additional_python_deps
@option_additional_dev_apt_command
@option_additional_dev_apt_env
-@option_builder
+@option_build_timeout_minutes
@option_commit_sha
@option_dev_apt_command
@option_dev_apt_deps
@option_force_build
@option_python_image
+@option_eager_upgrade_additional_requirements
@option_airflow_constraints_location
@option_airflow_constraints_mode_ci
@option_airflow_constraints_reference_build
@@ -209,6 +246,7 @@ def build(
debug_resources: bool,
include_success_outputs,
python_versions: str,
+ build_timeout_minutes: int | None,
**kwargs: dict[str, Any],
):
"""Build CI image. Include building multiple images for all python versions."""
@@ -222,6 +260,21 @@ def build(
get_console().print(f"[error]Error when building image! {info}")
sys.exit(return_code)
+ if build_timeout_minutes:
+ pid = os.fork()
+ if pid:
+ # Parent process - send signal to process group of the child process
+ handler: Callable[..., tuple[Any, Any]] = partial(build_timout_handler, pid)
+ # kill the child process group when we exit before - for example when we are Ctrl-C-ed
+ atexit.register(kill_process_group, pid)
+ signal.signal(signal.SIGALRM, handler)
+ signal.alarm(build_timeout_minutes * 60)
+ os.waitpid(pid, 0)
+ return
+ else:
+ # turn us into a process group leader
+ os.setpgid(0, 0)
+
perform_environment_checks()
check_remote_ghcr_io_commands()
parameters_passed = filter_out_none(**kwargs)
@@ -495,79 +548,63 @@ def run_build_ci_image(
else:
env = os.environ.copy()
env["DOCKER_BUILDKIT"] = "1"
- if ci_image_params.empty_image:
- get_console(output=output).print(
- f"\n[info]Building empty CI Image for Python {ci_image_params.python}\n"
- )
- build_command_result = run_command(
- prepare_docker_build_from_input(image_params=ci_image_params),
- input="FROM scratch\n",
- cwd=AIRFLOW_SOURCES_ROOT,
- text=True,
- env=env,
- output=output,
- )
- else:
- subprocess.run(
- [
- sys.executable,
- os.fspath(
- AIRFLOW_SOURCES_ROOT
- / "scripts"
- / "ci"
- / "pre_commit"
- / "pre_commit_update_providers_dependencies.py"
- ),
- ],
- check=False,
- )
- get_console(output=output).print(
- f"\n[info]Building CI Image for Python {ci_image_params.python}\n"
- )
- build_command_result = run_command(
- prepare_docker_build_command(
- image_params=ci_image_params,
+ subprocess.run(
+ [
+ sys.executable,
+ os.fspath(
+ AIRFLOW_SOURCES_ROOT
+ / "scripts"
+ / "ci"
+ / "pre_commit"
+ / "pre_commit_update_providers_dependencies.py"
),
- cwd=AIRFLOW_SOURCES_ROOT,
- text=True,
- check=False,
- env=env,
- output=output,
- )
- if build_command_result.returncode != 0 and not ci_image_params.upgrade_to_newer_dependencies:
- if ci_image_params.upgrade_on_failure:
- ci_image_params.upgrade_to_newer_dependencies = True
- get_console().print(
- "[warning]Attempting to build with upgrade_to_newer_dependencies on failure"
- )
- build_command_result = run_command(
- prepare_docker_build_command(
- image_params=ci_image_params,
- ),
- cwd=AIRFLOW_SOURCES_ROOT,
- env=env,
- text=True,
- check=False,
- output=output,
+ ],
+ check=False,
+ )
+ get_console(output=output).print(f"\n[info]Building CI Image for Python {ci_image_params.python}\n")
+ build_command_result = run_command(
+ prepare_docker_build_command(
+ image_params=ci_image_params,
+ ),
+ cwd=AIRFLOW_SOURCES_ROOT,
+ text=True,
+ check=False,
+ env=env,
+ output=output,
+ )
+ if build_command_result.returncode != 0 and not ci_image_params.upgrade_to_newer_dependencies:
+ if ci_image_params.upgrade_on_failure:
+ ci_image_params.upgrade_to_newer_dependencies = True
+ get_console().print(
+ "[warning]Attempting to build with upgrade_to_newer_dependencies on failure"
+ )
+ build_command_result = run_command(
+ prepare_docker_build_command(
+ image_params=ci_image_params,
+ ),
+ cwd=AIRFLOW_SOURCES_ROOT,
+ env=env,
+ text=True,
+ check=False,
+ output=output,
+ )
+ else:
+ get_console().print(
+ "[warning]Your image build failed. It could be caused by conflicting dependencies."
+ )
+ 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:
- get_console().print(
- "[warning]Your image build failed. It could be caused by conflicting dependencies."
- )
- 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)
+ mark_image_as_refreshed(ci_image_params)
return build_command_result.returncode, f"Image build: {ci_image_params.python}"
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 52c1d122a6..c97b120dd7 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
@@ -52,7 +52,6 @@ CI_IMAGE_TOOLS_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
{
"name": "Advanced options (for power users)",
"options": [
- "--builder",
"--install-providers-from-sources",
"--airflow-constraints-location",
"--airflow-constraints-mode",
@@ -70,12 +69,18 @@ CI_IMAGE_TOOLS_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"--commit-sha",
],
},
+ {
+ "name": "Backtracking options",
+ "options": [
+ "--build-timeout-minutes",
+ "--eager-upgrade-additional-requirements",
+ ],
+ },
{
"name": "Preparing cache and push (for maintainers and CI)",
"options": [
"--platform",
"--push",
- "--empty-image",
"--prepare-buildx-cache",
],
},
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 158cfdc0de..b9dc45d681 100644
--- a/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
@@ -47,7 +47,6 @@ from airflow_breeze.utils.common_options import (
option_dev_apt_deps,
option_docker_cache,
option_dry_run,
- option_empty_image,
option_github_repository,
option_github_token,
option_image_name,
@@ -84,7 +83,6 @@ from airflow_breeze.utils.docker_command_utils import (
make_sure_builder_configured,
perform_environment_checks,
prepare_docker_build_command,
- prepare_docker_build_from_input,
warm_up_docker_builder,
)
from airflow_breeze.utils.image import run_pull_image, run_pull_in_parallel, tag_image_as_latest
@@ -167,7 +165,6 @@ def prod_image():
@option_image_tag_for_building
@option_prepare_buildx_cache
@option_push
-@option_empty_image
@option_airflow_constraints_location
@option_airflow_constraints_mode_prod
@click.option(
@@ -500,50 +497,34 @@ def run_build_production_image(
else:
env = os.environ.copy()
env["DOCKER_BUILDKIT"] = "1"
- if prod_image_params.empty_image:
- get_console(output=output).print(
- f"\n[info]Building empty PROD Image for Python {prod_image_params.python}\n"
- )
- build_command_result = run_command(
- prepare_docker_build_from_input(image_params=prod_image_params),
- input="FROM scratch\n",
- cwd=AIRFLOW_SOURCES_ROOT,
- check=False,
- text=True,
- env=env,
- output=output,
- )
- else:
+ build_command_result = run_command(
+ prepare_docker_build_command(
+ image_params=prod_image_params,
+ ),
+ cwd=AIRFLOW_SOURCES_ROOT,
+ check=False,
+ env=env,
+ text=True,
+ output=output,
+ )
+ if (
+ build_command_result.returncode != 0
+ and prod_image_params.upgrade_on_failure
+ and not prod_image_params.upgrade_to_newer_dependencies
+ ):
+ prod_image_params.upgrade_to_newer_dependencies = True
+ get_console().print("[warning]Attempting to build with upgrade_to_newer_dependencies on failure")
build_command_result = run_command(
prepare_docker_build_command(
image_params=prod_image_params,
),
cwd=AIRFLOW_SOURCES_ROOT,
check=False,
- env=env,
text=True,
+ env=env,
output=output,
)
- if (
- build_command_result.returncode != 0
- and prod_image_params.upgrade_on_failure
- and not prod_image_params.upgrade_to_newer_dependencies
- ):
- prod_image_params.upgrade_to_newer_dependencies = True
- get_console().print(
- "[warning]Attempting to build with upgrade_to_newer_dependencies on failure"
- )
- build_command_result = run_command(
- prepare_docker_build_command(
- image_params=prod_image_params,
- ),
- cwd=AIRFLOW_SOURCES_ROOT,
- check=False,
- text=True,
- env=env,
- output=output,
- )
- if build_command_result.returncode == 0:
- if prod_image_params.tag_as_latest:
- build_command_result = tag_image_as_latest(image_params=prod_image_params, output=output)
+ if build_command_result.returncode == 0:
+ if 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: {prod_image_params.python}"
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 0329543f7d..266b49e435 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
@@ -94,7 +94,6 @@ PRODUCTION_IMAGE_TOOLS_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] =
"options": [
"--platform",
"--push",
- "--empty-image",
"--prepare-buildx-cache",
],
},
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py b/dev/breeze/src/airflow_breeze/global_constants.py
index 04aca0df16..3a6e3a86b3 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -206,7 +206,6 @@ BREEZE_INIT_COMMAND = ""
DRY_RUN_DOCKER = False
INSTALL_AIRFLOW_VERSION = ""
-
COMMITTERS = [
"BasPH",
"Fokko",
@@ -266,11 +265,16 @@ COMMITTERS = [
def get_airflow_version():
- airflow_setup_file = AIRFLOW_SOURCES_ROOT / "setup.py"
- with open(airflow_setup_file) as setup_file:
- for line in setup_file.readlines():
- if "version =" in line:
- return line.split()[2][1:-1]
+ airflow_init_py_file = AIRFLOW_SOURCES_ROOT / "airflow" / "__init__.py"
+ airflow_version = "unknown"
+ with open(airflow_init_py_file) as init_file:
+ while line := init_file.readline():
+ if "__version__ = " in line:
+ airflow_version = line.split()[2][1:-1]
+ break
+ if airflow_version == "unknown":
+ raise Exception("Unable to determine Airflow version")
+ return airflow_version
def get_airflow_extras():
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 ccba1d79f6..5748ac5a34 100644
--- a/dev/breeze/src/airflow_breeze/params/build_ci_params.py
+++ b/dev/breeze/src/airflow_breeze/params/build_ci_params.py
@@ -36,6 +36,7 @@ class BuildCiParams(CommonBuildParams):
airflow_extras: str = "devel_ci"
airflow_pre_cached_pip_packages: bool = True
force_build: bool = False
+ eager_upgrade_additional_requirements: str = ""
@property
def airflow_version(self):
@@ -55,6 +56,14 @@ class BuildCiParams(CommonBuildParams):
extra_ci_flags.extend(
["--build-arg", f"AIRFLOW_CONSTRAINTS_LOCATION={self.airflow_constraints_location}"]
)
+ if self.upgrade_to_newer_dependencies:
+ eager_upgrade_arg = self.eager_upgrade_additional_requirements.strip().replace("\n", "")
+ extra_ci_flags.extend(
+ [
+ "--build-arg",
+ f"EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS={eager_upgrade_arg}",
+ ]
+ )
return extra_ci_flags
@property
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 dc9fa47e90..90874f67b3 100644
--- a/dev/breeze/src/airflow_breeze/params/common_build_params.py
+++ b/dev/breeze/src/airflow_breeze/params/common_build_params.py
@@ -51,7 +51,6 @@ class CommonBuildParams:
dev_apt_command: str = ""
dev_apt_deps: str = ""
docker_cache: str = "registry"
- empty_image: bool = False
github_actions: str = os.environ.get("GITHUB_ACTIONS", "false")
github_repository: str = APACHE_AIRFLOW_GITHUB_REPOSITORY
github_token: str = os.environ.get("GITHUB_TOKEN", "")
diff --git a/dev/breeze/src/airflow_breeze/utils/backtracking.py b/dev/breeze/src/airflow_breeze/utils/backtracking.py
new file mode 100644
index 0000000000..9125d1da0a
--- /dev/null
+++ b/dev/breeze/src/airflow_breeze/utils/backtracking.py
@@ -0,0 +1,89 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import datetime
+import json
+import re
+
+from airflow_breeze.utils.console import get_console
+
+DATE_MATCHER = re.compile(r"automatically generated on (\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})Z")
+
+
+def match_generated_date(string: str) -> datetime.datetime:
+ match = DATE_MATCHER.search(string)
+ if match:
+ return datetime.datetime.fromisoformat(match.group(1))
+ else:
+ raise RuntimeError("Could not find date in constraints file")
+
+
+def print_backtracking_candidates():
+ import requests
+
+ all_latest_dependencies_response = requests.get(
+ "https://raw.githubusercontent.com/apache/airflow/"
+ "constraints-main/constraints-source-providers-3.8.txt"
+ )
+ all_latest_dependencies_response.raise_for_status()
+ constraints_text = all_latest_dependencies_response.text
+ last_constraint_date = match_generated_date(constraints_text)
+ get_console().print(f"Last constraint date: {last_constraint_date}")
+ dependency_array = [
+ dep for dep in constraints_text.split("\n") if not dep.startswith("#") and not dep.strip() == ""
+ ]
+ candidates_for_backtracking = []
+ for x in dependency_array:
+ dep, version = x.split("==")
+ response = requests.get(f"https://pypi.org/pypi/{dep}/json")
+ info = json.loads(response.text)
+ latest_version = info["info"]["version"]
+ release_date_str = info["releases"][latest_version][0]["upload_time"]
+ release_date = datetime.datetime.fromisoformat(release_date_str)
+ if latest_version != version and release_date > last_constraint_date:
+ get_console().print(
+ f"Latest version {dep}=={latest_version} release date: {release_date}. "
+ f"In current constraints: {version})"
+ )
+ candidates_for_backtracking.append(f"{dep}<={version}")
+ get_console().print(f"\nFound {len(candidates_for_backtracking)} candidates for backtracking")
+ get_console().print("")
+ formatted_candidates = " ".join(candidates_for_backtracking)
+ get_console().print(
+ "1. Run `breeze ci-image build --upgrade-to-newer-dependencies "
+ "--eager-upgrade-additional-requirements "
+ f'"{formatted_candidates}"`. It should succeed.\n'
+ )
+ get_console().print(
+ "2. Bisect the candidate list. Remove half of the backtracking candidates. Run. If it fails switch "
+ "to the other half. Continue bisecting the list until there is one candidate (ideally) left.\n"
+ )
+ get_console().print(
+ "3. When it still succeeds but you have one candidate only, you found the culprit. "
+ "Attempt to figure out the root cause. Use `dependency==<latest released version>` "
+ "from the list above as `--eager-upgrade-additional-requirements` flag value.\n"
+ )
+ get_console().print(
+ "4. Check the minimum version of the dependency that causes backtracking by using "
+ '`--eager-upgrade-additional-requirements "dependency<latest version"` - usually it is '
+ "the latest version released unless there were few releases. .\n"
+ )
+ get_console().print(
+ "5. Add and commit the dependency<version to `Dockerfile.ci` in "
+ "EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS ARG definition.\n"
+ )
diff --git a/dev/breeze/src/airflow_breeze/utils/common_options.py b/dev/breeze/src/airflow_breeze/utils/common_options.py
index ce6e60b0e0..19dc387c32 100644
--- a/dev/breeze/src/airflow_breeze/utils/common_options.py
+++ b/dev/breeze/src/airflow_breeze/utils/common_options.py
@@ -350,12 +350,6 @@ option_push = click.option(
is_flag=True,
envvar="PUSH",
)
-option_empty_image = click.option(
- "--empty-image",
- help="Prepare empty image tagged with the same name as the Airflow image.",
- is_flag=True,
- envvar="EMPTY_IMAGE",
-)
option_wait_for_image = click.option(
"--wait-for-image",
help="Wait until image is available.",
@@ -588,3 +582,18 @@ option_commit_sha = click.option(
envvar="COMMIT_SHA",
help="Commit SHA that is used to build the images.",
)
+option_build_timeout_minutes = click.option(
+ "--build-timeout-minutes",
+ required=False,
+ type=int,
+ envvar="BUILD_TIMEOUT_MINUTES",
+ help="Optional timeout for the build in minutes. Useful to detect `pip` backtracking problems.",
+)
+option_eager_upgrade_additional_requirements = click.option(
+ "--eager-upgrade-additional-requirements",
+ required=False,
+ type=str,
+ envvar="EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS",
+ help="Optional additional requirements to upgrade eagerly to avoid backtracking "
+ "(see `breeze ci find-backtracking-candidates`).",
+)
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 ca44e9ae58..1fdb96968d 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -507,17 +507,6 @@ def construct_docker_push_command(
return ["docker", "push", image_params.airflow_image_name_with_tag]
-def prepare_docker_build_from_input(
- image_params: CommonBuildParams,
-) -> list[str]:
- """
- Constructs docker build empty image command based on the parameters passed.
- :param image_params: parameters of the image
- :return: Command to run as list of string
- """
- return ["docker", "build", "-t", image_params.airflow_image_name_with_tag, "-"]
-
-
def build_cache(image_params: CommonBuildParams, output: Output | None) -> RunCommandResult:
build_command_result: CompletedProcess | CalledProcessError = CompletedProcess(args=[], returncode=0)
for platform in image_params.platforms:
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index d2a17568bd..403886eccb 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -3,16 +3,17 @@
# This command should fix the conflict and regenerate help images that you have conflict with.
main:344261ca3aa7ff31e098b1d88280566a
build-docs:bfc91db55c595516fe84d56c96a5a8e0
+ci:find-backtracking-candidates:17fe56b867a745e5032a08dfcd3f73ee
ci:fix-ownership:3e5a73533cc96045e72cb258783cfc96
ci:free-space:49af17b032039c05c41a7a8283f365cc
ci:get-workflow-info:8246038093359b9c3c110043419473e2
ci:resource-check:bfcca92f18a403ca630955074eb5e9ad
ci:selective-check:6657ed5d42affb7264b5efcc86f17a2a
-ci:65d145d7746bde5f8dc8f6f484cfc134
-ci-image:build:bab94a847c74d8f23cec4110577bd97e
+ci:5315c29bd9f68725ef92e4db8aff5cda
+ci-image:build:b19182720382dca4da561e52fba7c231
ci-image:pull:7f14482a588f018f76df84719e77723f
ci-image:verify:c90dc7e20fce2351eb89d8d1ebbd35e7
-ci-image:62a9fd1187ba846d60dd57a222e4a535
+ci-image:0ec1757e0b03eb67a38f366f708df3b9
cleanup:8d92d453a6700f6d8cb11fb6a8b50461
compile-www-assets:0963f1409f0aa1e3b137cddd4cc52e87
down:4580f5b3b178ea00182694f134a751f3
@@ -31,10 +32,10 @@ k8s:status:1529ccd444b41c4b0b5f943289957100
k8s:tests:2a1e2928faea2eddafaff94176a46690
k8s:upload-k8s-image:6b3a20cdeb692f3c3d727f6b9e68c901
k8s:8c1e4287deb0533a74f3b302f9c574be
-prod-image:build:85bb45de92e86a55474238c3f04def92
+prod-image:build:ed9542bccd40fbfb75993504d08e7257
prod-image:pull:76f1f27e6119928412abecf153fce4bb
prod-image:verify:bd2b78738a7c388dbad6076c41a9f906
-prod-image:7b3369e182724fc155b3399c95d0fd73
+prod-image:993e54af79b73d7a9e6cfb6fc51a6e34
release-management:add-back-references:919b3bd706acf794e0e5e129fc587f6d
release-management:create-minor-branch:a3834afc4aa5d1e98002c9e9e7a9931d
release-management:generate-constraints:b8fcaf8f0acd35ed5dbd48659bdb6485
@@ -55,12 +56,12 @@ sbom:generate-provider-requirements:9abe53200ea5f40e0bf7c27f6087f27f
sbom:update-sbom-information:0ce56884e5f842e3e80d6619df1ccc64
sbom:935d041028e847d3faf763a95b51063e
setup:autocomplete:fffcd49e102e09ccd69b3841a9e3ea8e
-setup:check-all-params-in-groups:3f8b55d6a6bf68d6859bf1a2fcfa6580
+setup:check-all-params-in-groups:639dfb061b8da02dcaa4a57b567ff42a
setup:config:38ebaaf93ed42bc7b2a3000eeea2631d
-setup:regenerate-command-images:3a4b81e7fcc739471580d80bc102ce96
+setup:regenerate-command-images:d5e29ec6acb1a6af7d83772c2962f89d
setup:self-upgrade:4af905a147fcd6670a0e33d3d369a94b
setup:version:be116d90a21c2afe01087f7609774e1e
-setup:20e9f6c4f2ac0afc32779ae3f8a1cdff
+setup:8de3ed2645928e8f9f89c58f0ccd2a60
shell:87e7bdcebe1180395adfec86b2a065f5
start-airflow:f7216a8126ecf14b033e2ea677e1a105
static-checks:5ded21248cd4f5617779f58ecf6c554c
diff --git a/images/breeze/output_ci-image_build.svg b/images/breeze/output_ci-image_build.svg
index b8a5bfddc4..bbe478cea8 100644
--- a/images/breeze/output_ci-image_build.svg
+++ b/images/breeze/output_ci-image_build.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1904.3999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 2026.3999999999999" 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="1853.3999999999999" />
+ <rect x="0" y="0" width="1463.0" height="1975.3999999999999" />
</clipPath>
<clipPath id="breeze-ci-image-build-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -270,9 +270,24 @@
<clipPath id="breeze-ci-image-build-line-74">
<rect x="0" y="1807.1" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-ci-image-build-line-75">
+ <rect x="0" y="1831.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-build-line-76">
+ <rect x="0" y="1855.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-build-line-77">
+ <rect x="0" y="1880.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-build-line-78">
+ <rect x="0" y="1904.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-image-build-line-79">
+ <rect x="0" y="1929.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="1902.4" 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="2024.4" 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"/>
@@ -313,51 +328,56 @@
</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="12.2" clip-path="url(#breeze-ci-image-build-line-28)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="703.2" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-28)">-include</text><text class="breeze-ci-image-build-r4" x="134.2" y="703.2" textLength="195.2" clip-pa [...]
</text><text class="breeze-ci-image-build-r5" x="0" y="727.6" textLength="1464" clip-path="url(#breeze-ci-image-build-line-29)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-29)">
</text><text class="breeze-ci-image-build-r5" x="0" y="752" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-30)">╭─</text><text class="breeze-ci-image-build-r5" x="24.4" y="752" textLength="439.2" clip-path="url(#breeze-ci-image-build-line-30)"> Advanced options (for power users) </text><text class="breeze-ci-image-build-r5" x="463.6" y="752" textLength="976" clip-path="url(#breeze-ci-image-build-line-30)">─────────────────────────────────────── [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-31)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="776.4" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-31)">-builder</text><text class="breeze-ci-image-build-r2" x="463.6" y="776.4" textLength="756.4" clip-pa [...]
-</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="463.6" y="800.8" textLength="756.4" clip-path="url(#breeze-ci-image-build-line-32)">[default: autodetect]                                   [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-33)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="825.2" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-33)">-install</text><text class="breeze-ci-image-build-r4" x="134.2" y="825.2" textLength="280.6" clip-pa [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-34)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="849.6" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-34)">-airflow</text><text class="breeze-ci-image-build-r4" x="134.2" y="849.6" textLength="256.2" clip-pa [...]
-</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-r2" x="463.6" y="874" textLength="366" clip-path="url(#breeze-ci-image-build-line-35)">file. It could be full remote </text><text class="breeze-ci-image-build-r4" x="829.6" y="874" textLength="36.6" clip-path="url(#breeze-ci-image-build-line-35)">URL</text><text class="breeze-ci-image-build-r [...]
-</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-r2" x="463.6" y="898.4" textLength="976" clip-path="url(#breeze-ci-image-build-line-36)">`docker-context-files` (in this case it has to start with                       [...]
-</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-r2" x="463.6" y="922.8" textLength="976" clip-path="url(#breeze-ci-image-build-line-37)">/opt/airflow/docker-context-files).                                  [...]
-</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-r7" x="463.6" y="947.2" textLength="976" clip-path="url(#breeze-ci-image-build-line-38)">(TEXT)                                      [...]
-</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-r4" x="24.4" y="971.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-39)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="971.6" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-39)">-airflow</text><text class="breeze-ci-image-build-r4" x="134.2" y="971.6" textLength="207.4" clip-pa [...]
-</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-r7" x="463.6" y="996" textLength="866.2" clip-path="url(#breeze-ci-image-build-line-40)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-ci-image-build-r5" x="1451.8" y="996" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-40)">│</text><tex [...]
-</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-r5" x="463.6" y="1020.4" textLength="866.2" clip-path="url(#breeze-ci-image-build-line-41)">[default: constraints-source-providers]                               [...]
-</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-r4" x="24.4" y="1044.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-42)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1044.8" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-42)">-airflow</text><text class="breeze-ci-image-build-r4" x="134.2" y="1044.8" textLength="268.4" cli [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-43)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1069.2" textLength="85.4" clip-path="url(#breeze-ci-image-build-line-43)">-python</text><text class="breeze-ci-image-build-r4" x="122" y="1069.2" textLength="73.2" clip-pa [...]
-</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-r2" x="463.6" y="1093.6" textLength="280.6" clip-path="url(#breeze-ci-image-build-line-44)">something like: python:</text><text class="breeze-ci-image-build-r4" x="744.2" y="1093.6" textLength="85.4" clip-path="url(#breeze-ci-image-build-line-44)">VERSION</text><text class="breeze-ci-image-build-r2" x="829.6" [...]
-</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-r7" x="463.6" y="1118" textLength="976" clip-path="url(#breeze-ci-image-build-line-45)">(TEXT)                                       [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-46)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1142.4" textLength="134.2" clip-path="url(#breeze-ci-image-build-line-46)">-additional</text><text class="breeze-ci-image-build-r4" x="170.8" y="1142.4" textLength="146.4" [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-47)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1166.8" textLength="134.2" clip-path="url(#breeze-ci-image-build-line-47)">-additional</text><text class="breeze-ci-image-build-r4" x="170.8" y="1166.8" textLength="85.4" [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-48)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1191.2" textLength="134.2" clip-path="url(#breeze-ci-image-build-line-48)">-additional</text><text class="breeze-ci-image-build-r4" x="170.8" y="1191.2" textLength="219.6" [...]
-</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-r2" x="463.6" y="1215.6" textLength="976" clip-path="url(#breeze-ci-image-build-line-49)">itself).                                      [...]
-</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="463.6" y="1240" textLength="976" 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="12.2" clip-path="url(#breeze-ci-image-build-line-51)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1264.4" textLength="134.2" clip-path="url(#breeze-ci-image-build-line-51)">-additional</text><text class="breeze-ci-image-build-r4" x="170.8" y="1264.4" textLength="158.6" [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-52)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1288.8" textLength="134.2" clip-path="url(#breeze-ci-image-build-line-52)">-additional</text><text class="breeze-ci-image-build-r4" x="170.8" y="1288.8" textLength="146.4" [...]
-</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-r4" x="24.4" y="1313.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-53)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1313.2" textLength="134.2" clip-path="url(#breeze-ci-image-build-line-53)">-additional</text><text class="breeze-ci-image-build-r4" x="170.8" y="1313.2" textLength="195.2" [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-54)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1337.6" textLength="48.8" clip-path="url(#breeze-ci-image-build-line-54)">-dev</text><text class="breeze-ci-image-build-r4" x="85.4" y="1337.6" textLength="109.8" clip-pat [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-55)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1362" textLength="48.8" clip-path="url(#breeze-ci-image-build-line-55)">-dev</text><text class="breeze-ci-image-build-r4" x="85.4" y="1362" textLength="146.4" clip-path="url(# [...]
-</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-r4" x="24.4" y="1386.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-56)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1386.4" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-56)">-version</text><text class="breeze-ci-image-build-r4" x="134.2" y="1386.4" textLength="195.2" cli [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-57)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1410.8" textLength="85.4" clip-path="url(#breeze-ci-image-build-line-57)">-commit</text><text class="breeze-ci-image-build-r4" x="122" y="1410.8" textLength="48.8" clip-pa [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1435.2" textLength="1464" clip-path="url(#breeze-ci-image-build-line-58)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r2" x="1464" y="1435.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-58)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="1459.6" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-59)">╭─</text><text class="breeze-ci-image-build-r5" x="24.4" y="1459.6" textLength="622.2" clip-path="url(#breeze-ci-image-build-line-59)"> Preparing cache and push (for maintainers and CI) </text><text class="breeze-ci-image-build-r5" x="646.6" y="1459.6" textLength="793" 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-r4" x="24.4" y="1484" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-60)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1484" textLength="109.8" clip-path="url(#breeze-ci-image-build-line-60)">-platform</text><text class="breeze-ci-image-build-r2" x="341.6" y="1484" textLength="329.4" clip-path [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-61)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1508.4" textLength="61" clip-path="url(#breeze-ci-image-build-line-61)">-push</text><text class="breeze-ci-image-build-r2" x="341.6" y="1508.4" textLength="353.8" clip-pat [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-62)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1532.8" textLength="73.2" clip-path="url(#breeze-ci-image-build-line-62)">-empty</text><text class="breeze-ci-image-build-r4" x="109.8" y="1532.8" textLength="73.2" clip-p [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-63)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1557.2" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-63)">-prepare</text><text class="breeze-ci-image-build-r4" x="134.2" y="1557.2" textLength="158.6" cli [...]
-</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-r2" x="341.6" y="1581.6" textLength="1098" clip-path="url(#breeze-ci-image-build-line-64)">image).                                      [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1606" textLength="1464" clip-path="url(#breeze-ci-image-build-line-65)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r2" x="1464" y="1606" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-65)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="1630.4" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-66)">╭─</text><text class="breeze-ci-image-build-r5" x="24.4" y="1630.4" textLength="280.6" clip-path="url(#breeze-ci-image-build-line-66)"> Github authentication </text><text class="breeze-ci-image-build-r5" x="305" y="1630.4" textLength="1134.6" clip-path="url(#breeze-ci-image-build-line-66)">───────────────────────────────────────────────────────── [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-67)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1654.8" textLength="85.4" clip-path="url(#breeze-ci-image-build-line-67)">-github</text><text class="breeze-ci-image-build-r4" x="122" y="1654.8" textLength="134.2" clip-p [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-68)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1679.2" textLength="85.4" clip-path="url(#breeze-ci-image-build-line-68)">-github</text><text class="breeze-ci-image-build-r4" x="122" y="1679.2" textLength="73.2" clip-pa [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1703.6" textLength="1464" clip-path="url(#breeze-ci-image-build-line-69)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r2" x="1464" y="1703.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-69)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="1728" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-70)">╭─</text><text class="breeze-ci-image-build-r5" x="24.4" y="1728" textLength="195.2" clip-path="url(#breeze-ci-image-build-line-70)"> Common options </text><text class="breeze-ci-image-build-r5" x="219.6" y="1728" textLength="1220" clip-path="url(#breeze-ci-image-build-line-70)">────────────────────────────────────────────────────────────────────── [...]
-</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-r4" x="24.4" y="1752.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-71)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1752.4" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-71)">-verbose</text><text class="breeze-ci-image-build-r6" x="158.6" y="1752.4" textLength="24.4" clip [...]
-</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-r4" x="24.4" y="1776.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-72)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1776.8" textLength="48.8" clip-path="url(#breeze-ci-image-build-line-72)">-dry</text><text class="breeze-ci-image-build-r4" x="85.4" y="1776.8" textLength="48.8" clip-path [...]
-</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="12.2" clip-path="url(#breeze-ci-image-build-line-73)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1801.2" textLength="85.4" clip-path="url(#breeze-ci-image-build-line-73)">-answer</text><text class="breeze-ci-image-build-r6" x="158.6" y="1801.2" textLength="24.4" clip- [...]
-</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-r4" x="24.4" y="1825.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-74)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1825.6" textLength="61" clip-path="url(#breeze-ci-image-build-line-74)">-help</text><text class="breeze-ci-image-build-r6" x="158.6" y="1825.6" textLength="24.4" clip-path [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1850" textLength="1464" clip-path="url(#breeze-ci-image-build-line-75)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r2" x="1464" y="1850" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-75)">
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-31)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="776.4" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-31)">-install</text><text class="breeze-ci-image-build-r4" x="134.2" y="776.4" textLength="280.6" clip-pa [...]
+</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-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-32)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="800.8" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-32)">-airflow</text><text class="breeze-ci-image-build-r4" x="134.2" y="800.8" textLength="256.2" clip-pa [...]
+</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-r2" x="463.6" y="825.2" textLength="366" clip-path="url(#breeze-ci-image-build-line-33)">file. It could be full remote </text><text class="breeze-ci-image-build-r4" x="829.6" y="825.2" textLength="36.6" clip-path="url(#breeze-ci-image-build-line-33)">URL</text><text class="breeze-ci-image-b [...]
+</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-r2" x="463.6" y="849.6" textLength="976" clip-path="url(#breeze-ci-image-build-line-34)">`docker-context-files` (in this case it has to start with                       [...]
+</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-r2" x="463.6" y="874" textLength="976" clip-path="url(#breeze-ci-image-build-line-35)">/opt/airflow/docker-context-files).                                  [...]
+</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-r7" x="463.6" y="898.4" textLength="976" clip-path="url(#breeze-ci-image-build-line-36)">(TEXT)                                      [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-37)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="922.8" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-37)">-airflow</text><text class="breeze-ci-image-build-r4" x="134.2" y="922.8" textLength="207.4" clip-pa [...]
+</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-r7" x="463.6" y="947.2" textLength="866.2" clip-path="url(#breeze-ci-image-build-line-38)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-ci-image-build-r5" x="1451.8" y="947.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-38)">│</tex [...]
+</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-r5" x="463.6" y="971.6" textLength="866.2" clip-path="url(#breeze-ci-image-build-line-39)">[default: constraints-source-providers]                                [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-40)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="996" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-40)">-airflow</text><text class="breeze-ci-image-build-r4" x="134.2" y="996" textLength="268.4" clip-path="url( [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-41)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1020.4" textLength="85.4" clip-path="url(#breeze-ci-image-build-line-41)">-python</text><text class="breeze-ci-image-build-r4" x="122" y="1020.4" textLength="73.2" clip-pa [...]
+</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-r2" x="463.6" y="1044.8" textLength="280.6" clip-path="url(#breeze-ci-image-build-line-42)">something like: python:</text><text class="breeze-ci-image-build-r4" x="744.2" y="1044.8" textLength="85.4" clip-path="url(#breeze-ci-image-build-line-42)">VERSION</text><text class="breeze-ci-image-build-r2" x="829.6" [...]
+</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-r7" x="463.6" y="1069.2" textLength="976" clip-path="url(#breeze-ci-image-build-line-43)">(TEXT)                                     &# [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-44)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1093.6" textLength="134.2" clip-path="url(#breeze-ci-image-build-line-44)">-additional</text><text class="breeze-ci-image-build-r4" x="170.8" y="1093.6" textLength="146.4" [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-45)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1118" textLength="134.2" clip-path="url(#breeze-ci-image-build-line-45)">-additional</text><text class="breeze-ci-image-build-r4" x="170.8" y="1118" textLength="85.4" clip-pat [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-46)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1142.4" textLength="134.2" clip-path="url(#breeze-ci-image-build-line-46)">-additional</text><text class="breeze-ci-image-build-r4" x="170.8" y="1142.4" textLength="219.6" [...]
+</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-r2" x="463.6" y="1166.8" textLength="976" clip-path="url(#breeze-ci-image-build-line-47)">itself).                                      [...]
+</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-r7" x="463.6" y="1191.2" textLength="976" clip-path="url(#breeze-ci-image-build-line-48)">(TEXT)                                     &# [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-49)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1215.6" textLength="134.2" clip-path="url(#breeze-ci-image-build-line-49)">-additional</text><text class="breeze-ci-image-build-r4" x="170.8" y="1215.6" textLength="158.6" [...]
+</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-r4" x="24.4" y="1240" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-50)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1240" textLength="134.2" clip-path="url(#breeze-ci-image-build-line-50)">-additional</text><text class="breeze-ci-image-build-r4" x="170.8" y="1240" textLength="146.4" clip-pa [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-51)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1264.4" textLength="134.2" clip-path="url(#breeze-ci-image-build-line-51)">-additional</text><text class="breeze-ci-image-build-r4" x="170.8" y="1264.4" textLength="195.2" [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-52)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1288.8" textLength="48.8" clip-path="url(#breeze-ci-image-build-line-52)">-dev</text><text class="breeze-ci-image-build-r4" x="85.4" y="1288.8" textLength="109.8" clip-pat [...]
+</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-r4" x="24.4" y="1313.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-53)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1313.2" textLength="48.8" clip-path="url(#breeze-ci-image-build-line-53)">-dev</text><text class="breeze-ci-image-build-r4" x="85.4" y="1313.2" textLength="146.4" clip-pat [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-54)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1337.6" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-54)">-version</text><text class="breeze-ci-image-build-r4" x="134.2" y="1337.6" textLength="195.2" cli [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-55)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1362" textLength="85.4" clip-path="url(#breeze-ci-image-build-line-55)">-commit</text><text class="breeze-ci-image-build-r4" x="122" y="1362" textLength="48.8" clip-path="url( [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1386.4" textLength="1464" clip-path="url(#breeze-ci-image-build-line-56)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r2" x="1464" 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="24.4" clip-path="url(#breeze-ci-image-build-line-57)">╭─</text><text class="breeze-ci-image-build-r5" x="24.4" y="1410.8" textLength="268.4" clip-path="url(#breeze-ci-image-build-line-57)"> Backtracking options </text><text class="breeze-ci-image-build-r5" x="292.8" y="1410.8" textLength="1146.8" clip-path="url(#breeze-ci-image-build-line-57)">──────────────────────────────────────────────────────── [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-58)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1435.2" textLength="73.2" clip-path="url(#breeze-ci-image-build-line-58)">-build</text><text class="breeze-ci-image-build-r4" x="109.8" y="1435.2" textLength="195.2" clip- [...]
+</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-r2" x="549" y="1459.6" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-59)">backtracking problems.                                   [...]
+</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-r7" x="549" y="1484" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-60)">(INTEGER)                                      [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-61)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1508.4" textLength="73.2" clip-path="url(#breeze-ci-image-build-line-61)">-eager</text><text class="breeze-ci-image-build-r4" x="109.8" y="1508.4" textLength="390.4" clip- [...]
+</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-r2" x="549" y="1532.8" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-62)">(see `breeze ci find-backtracking-candidates`).                          </text><text [...]
+</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-r7" x="549" y="1557.2" textLength="890.6" clip-path="url(#breeze-ci-image-build-line-63)">(TEXT)                                     &# [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1581.6" textLength="1464" clip-path="url(#breeze-ci-image-build-line-64)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r2" x="1464" y="1581.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-64)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="1606" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-65)">╭─</text><text class="breeze-ci-image-build-r5" x="24.4" y="1606" textLength="622.2" clip-path="url(#breeze-ci-image-build-line-65)"> Preparing cache and push (for maintainers and CI) </text><text class="breeze-ci-image-build-r5" x="646.6" y="1606" textLength="793" clip-path="url(#breeze-ci-image-build-line-65)">────── [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-66)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1630.4" textLength="109.8" clip-path="url(#breeze-ci-image-build-line-66)">-platform</text><text class="breeze-ci-image-build-r2" x="341.6" y="1630.4" textLength="329.4" c [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-67)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1654.8" textLength="61" clip-path="url(#breeze-ci-image-build-line-67)">-push</text><text class="breeze-ci-image-build-r2" x="341.6" y="1654.8" textLength="353.8" clip-pat [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-68)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1679.2" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-68)">-prepare</text><text class="breeze-ci-image-build-r4" x="134.2" y="1679.2" textLength="158.6" cli [...]
+</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-r2" x="341.6" y="1703.6" textLength="1098" clip-path="url(#breeze-ci-image-build-line-69)">image).                                      [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1728" textLength="1464" clip-path="url(#breeze-ci-image-build-line-70)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r2" x="1464" y="1728" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-70)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="1752.4" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-71)">╭─</text><text class="breeze-ci-image-build-r5" x="24.4" y="1752.4" textLength="280.6" clip-path="url(#breeze-ci-image-build-line-71)"> Github authentication </text><text class="breeze-ci-image-build-r5" x="305" y="1752.4" textLength="1134.6" clip-path="url(#breeze-ci-image-build-line-71)">───────────────────────────────────────────────────────── [...]
+</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-r4" x="24.4" y="1776.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-72)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1776.8" textLength="85.4" clip-path="url(#breeze-ci-image-build-line-72)">-github</text><text class="breeze-ci-image-build-r4" x="122" y="1776.8" textLength="134.2" clip-p [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-73)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1801.2" textLength="85.4" clip-path="url(#breeze-ci-image-build-line-73)">-github</text><text class="breeze-ci-image-build-r4" x="122" y="1801.2" textLength="73.2" clip-pa [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1825.6" textLength="1464" clip-path="url(#breeze-ci-image-build-line-74)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r2" x="1464" y="1825.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-74)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="1850" textLength="24.4" clip-path="url(#breeze-ci-image-build-line-75)">╭─</text><text class="breeze-ci-image-build-r5" x="24.4" y="1850" textLength="195.2" clip-path="url(#breeze-ci-image-build-line-75)"> Common options </text><text class="breeze-ci-image-build-r5" x="219.6" y="1850" textLength="1220" clip-path="url(#breeze-ci-image-build-line-75)">────────────────────────────────────────────────────────────────────── [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-76)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1874.4" textLength="97.6" clip-path="url(#breeze-ci-image-build-line-76)">-verbose</text><text class="breeze-ci-image-build-r6" x="158.6" y="1874.4" textLength="24.4" clip [...]
+</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-r4" x="24.4" y="1898.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-77)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1898.8" textLength="48.8" clip-path="url(#breeze-ci-image-build-line-77)">-dry</text><text class="breeze-ci-image-build-r4" x="85.4" y="1898.8" textLength="48.8" clip-path [...]
+</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="12.2" clip-path="url(#breeze-ci-image-build-line-78)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1923.2" textLength="85.4" clip-path="url(#breeze-ci-image-build-line-78)">-answer</text><text class="breeze-ci-image-build-r6" x="158.6" y="1923.2" textLength="24.4" clip- [...]
+</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-r4" x="24.4" y="1947.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-79)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1947.6" textLength="61" clip-path="url(#breeze-ci-image-build-line-79)">-help</text><text class="breeze-ci-image-build-r6" x="158.6" y="1947.6" textLength="24.4" clip-path [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1972" textLength="1464" clip-path="url(#breeze-ci-image-build-line-80)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-build-r2" x="1464" y="1972" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-80)">
</text>
</g>
</g>
diff --git a/images/breeze/output_ci.svg b/images/breeze/output_ci.svg
index 6eb2c20d88..20b703bcc8 100644
--- a/images/breeze/output_ci.svg
+++ b/images/breeze/output_ci.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 440.4" 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>
@@ -42,7 +42,7 @@
<defs>
<clipPath id="breeze-ci-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="389.4" />
+ <rect x="0" y="0" width="1463.0" height="462.59999999999997" />
</clipPath>
<clipPath id="breeze-ci-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -89,9 +89,18 @@
<clipPath id="breeze-ci-line-14">
<rect x="0" y="343.1" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-ci-line-15">
+ <rect x="0" y="367.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-line-16">
+ <rect x="0" y="391.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-line-17">
+ <rect x="0" y="416.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="438.4" rx="8"/><text class="breeze-ci-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: ci</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-ci-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: ci</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -117,6 +126,9 @@
</text><text class="breeze-ci-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-ci-line-13)">│</text><text class="breeze-ci-r4" x="24.4" y="337.2" textLength="207.4" clip-path="url(#breeze-ci-line-13)">get-workflow-info</text><text class="breeze-ci-r2" x="256.2" y="337.2" textLength="1183.4" clip-path="url(#breeze-ci-line-13)">Retrieve information about current workflow in the CIand produce github actions output extra [...]
</text><text class="breeze-ci-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-ci-line-14)">│</text><text class="breeze-ci-r2" x="256.2" y="361.6" textLength="1183.4" clip-path="url(#breeze-ci-line-14)">from it.                                             [...]
</text><text class="breeze-ci-r5" x="0" y="386" textLength="1464" clip-path="url(#breeze-ci-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-r2" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-ci-line-15)">
+</text><text class="breeze-ci-r5" x="0" y="410.4" textLength="24.4" clip-path="url(#breeze-ci-line-16)">╭─</text><text class="breeze-ci-r5" x="24.4" y="410.4" textLength="122" clip-path="url(#breeze-ci-line-16)"> Commands </text><text class="breeze-ci-r5" x="146.4" y="410.4" textLength="1293.2" clip-path="url(#breeze-ci-line-16)">──────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-ci-r5" x="1439.6" [...]
+</text><text class="breeze-ci-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-ci-line-17)">│</text><text class="breeze-ci-r4" x="24.4" y="434.8" textLength="390.4" clip-path="url(#breeze-ci-line-17)">find-backtracking-candidates    </text><text class="breeze-ci-r2" x="439.2" y="434.8" textLength="1000.4" clip-path="url(#breeze-ci-line-17)">Find new releases of dependencies that could be the reason of  [...]
+</text><text class="breeze-ci-r5" x="0" y="459.2" textLength="1464" clip-path="url(#breeze-ci-line-18)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-ci-line-18)">
</text>
</g>
</g>
diff --git a/images/breeze/output_ci_find-backtracking-candidates.svg b/images/breeze/output_ci_find-backtracking-candidates.svg
new file mode 100644
index 0000000000..e0082b964b
--- /dev/null
+++ b/images/breeze/output_ci_find-backtracking-candidates.svg
@@ -0,0 +1,91 @@
+<svg class="rich-terminal" viewBox="0 0 1482 245.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-ci-find-backtracking-candidates-matrix {
+ font-family: Fira Code, monospace;
+ font-size: 20px;
+ line-height: 24.4px;
+ font-variant-east-asian: full-width;
+ }
+
+ .breeze-ci-find-backtracking-candidates-title {
+ font-size: 18px;
+ font-weight: bold;
+ font-family: arial;
+ }
+
+ .breeze-ci-find-backtracking-candidates-r1 { fill: #c5c8c6;font-weight: bold }
+.breeze-ci-find-backtracking-candidates-r2 { fill: #c5c8c6 }
+.breeze-ci-find-backtracking-candidates-r3 { fill: #d0b344;font-weight: bold }
+.breeze-ci-find-backtracking-candidates-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-ci-find-backtracking-candidates-r5 { fill: #868887 }
+.breeze-ci-find-backtracking-candidates-r6 { fill: #98a84b;font-weight: bold }
+ </style>
+
+ <defs>
+ <clipPath id="breeze-ci-find-backtracking-candidates-clip-terminal">
+ <rect x="0" y="0" width="1463.0" height="194.2" />
+ </clipPath>
+ <clipPath id="breeze-ci-find-backtracking-candidates-line-0">
+ <rect x="0" y="1.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-find-backtracking-candidates-line-1">
+ <rect x="0" y="25.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-find-backtracking-candidates-line-2">
+ <rect x="0" y="50.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-find-backtracking-candidates-line-3">
+ <rect x="0" y="74.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-find-backtracking-candidates-line-4">
+ <rect x="0" y="99.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-find-backtracking-candidates-line-5">
+ <rect x="0" y="123.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-ci-find-backtracking-candidates-line-6">
+ <rect x="0" y="147.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="243.2" rx="8"/><text class="breeze-ci-find-backtracking-candidates-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: ci find-backtracking-candidates</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-find-backtracking-candidates-clip-terminal)">
+
+ <g class="breeze-ci-find-backtracking-candidates-matrix">
+ <text class="breeze-ci-find-backtracking-candidates-r2" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-ci-find-backtracking-candidates-line-0)">
+</text><text class="breeze-ci-find-backtracking-candidates-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-ci-find-backtracking-candidates-line-1)">Usage: </text><text class="breeze-ci-find-backtracking-candidates-r1" x="97.6" y="44.4" textLength="488" clip-path="url(#breeze-ci-find-backtracking-candidates-line-1)">breeze ci find-backtracking-candidates [</text><text class="breeze-ci-find-backtracking-candidates-r4" x="585.6" y="44.4" textLength="85.4" [...]
+</text><text class="breeze-ci-find-backtracking-candidates-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-ci-find-backtracking-candidates-line-2)">
+</text><text class="breeze-ci-find-backtracking-candidates-r2" x="12.2" y="93.2" textLength="915" clip-path="url(#breeze-ci-find-backtracking-candidates-line-3)">Find new releases of dependencies that could be the reason of backtracking.</text><text class="breeze-ci-find-backtracking-candidates-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-ci-find-backtracking-candidates-line-3)">
+</text><text class="breeze-ci-find-backtracking-candidates-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-ci-find-backtracking-candidates-line-4)">
+</text><text class="breeze-ci-find-backtracking-candidates-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-ci-find-backtracking-candidates-line-5)">╭─</text><text class="breeze-ci-find-backtracking-candidates-r5" x="24.4" y="142" textLength="195.2" clip-path="url(#breeze-ci-find-backtracking-candidates-line-5)"> Common options </text><text class="breeze-ci-find-backtracking-candidates-r5" x="219.6" y="142" textLength="1220" clip-path="url(#breeze-ci-find-backtra [...]
+</text><text class="breeze-ci-find-backtracking-candidates-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-ci-find-backtracking-candidates-line-6)">│</text><text class="breeze-ci-find-backtracking-candidates-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#breeze-ci-find-backtracking-candidates-line-6)">-</text><text class="breeze-ci-find-backtracking-candidates-r4" x="36.6" y="166.4" textLength="61" clip-path="url(#breeze-ci-find-backtracking-candidates-line-6)">-he [...]
+</text><text class="breeze-ci-find-backtracking-candidates-r5" x="0" y="190.8" textLength="1464" clip-path="url(#breeze-ci-find-backtracking-candidates-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-find-backtracking-candidates-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-ci-find-backtracking-candidates-line-7)">
+</text>
+ </g>
+ </g>
+</svg>
diff --git a/images/breeze/output_prod-image_build.svg b/images/breeze/output_prod-image_build.svg
index 36a51ee279..0f8732e76e 100644
--- a/images/breeze/output_prod-image_build.svg
+++ b/images/breeze/output_prod-image_build.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 2392.3999999999996" 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-prod-image-build-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="2341.3999999999996" />
+ <rect x="0" y="0" width="1463.0" height="2317.0" />
</clipPath>
<clipPath id="breeze-prod-image-build-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -327,12 +327,9 @@
<clipPath id="breeze-prod-image-build-line-93">
<rect x="0" y="2270.7" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-prod-image-build-line-94">
- <rect x="0" y="2295.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="2390.4" 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="2366" 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"/>
@@ -425,19 +422,18 @@
</text><text class="breeze-prod-image-build-r5" x="0" y="1972" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-80)">╭─</text><text class="breeze-prod-image-build-r5" x="24.4" y="1972" textLength="622.2" clip-path="url(#breeze-prod-image-build-line-80)"> Preparing cache and push (for maintainers and CI) </text><text class="breeze-prod-image-build-r5" x="646.6" y="1972" textLength="793" clip-path="url(#breeze-prod-image-build-line [...]
</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="12.2" clip-path="url(#breeze-prod-image-build-line-81)">-</text><text class="breeze-prod-image-build-r4" x="36.6" y="1996.4" textLength="109.8" clip-path="url(#breeze-prod-image-build-line-81)">-platform</text><text class="breeze-prod-image-build-r2" x="341.6" y="1996.4" textLe [...]
</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="12.2" clip-path="url(#breeze-prod-image-build-line-82)">-</text><text class="breeze-prod-image-build-r4" x="36.6" y="2020.8" textLength="61" clip-path="url(#breeze-prod-image-build-line-82)">-push</text><text class="breeze-prod-image-build-r2" x="341.6" y="2020.8" textLength="3 [...]
-</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="12.2" clip-path="url(#breeze-prod-image-build-line-83)">-</text><text class="breeze-prod-image-build-r4" x="36.6" y="2045.2" textLength="73.2" clip-path="url(#breeze-prod-image-build-line-83)">-empty</text><text class="breeze-prod-image-build-r4" x="109.8" y="2045.2" textLength [...]
-</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="12.2" clip-path="url(#breeze-prod-image-build-line-84)">-</text><text class="breeze-prod-image-build-r4" x="36.6" y="2069.6" textLength="97.6" clip-path="url(#breeze-prod-image-build-line-84)">-prepare</text><text class="breeze-prod-image-build-r4" x="134.2" y="2069.6" textLeng [...]
-</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-r2" x="341.6" y="2094" textLength="1098" clip-path="url(#breeze-prod-image-build-line-85)">image).                                    &# [...]
-</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-r2" 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="280.6" clip-path="url(#breeze-prod-image-build-line-87)"> Github authentication </text><text class="breeze-prod-image-build-r5" x="305" y="2142.8" textLength="1134.6" clip-path="url(#breeze-prod-image-build-line-87)">───────────────────────────────────────────── [...]
-</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="12.2" clip-path="url(#breeze-prod-image-build-line-88)">-</text><text class="breeze-prod-image-build-r4" x="36.6" y="2167.2" textLength="85.4" clip-path="url(#breeze-prod-image-build-line-88)">-github</text><text class="breeze-prod-image-build-r4" x="122" y="2167.2" textLength= [...]
-</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="12.2" clip-path="url(#breeze-prod-image-build-line-89)">-</text><text class="breeze-prod-image-build-r4" x="36.6" y="2191.6" textLength="85.4" clip-path="url(#breeze-prod-image-build-line-89)">-github</text><text class="breeze-prod-image-build-r4" x="122" y="2191.6" textLength= [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2216" textLength="1464" clip-path="url(#breeze-prod-image-build-line-90)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r2" x="1464" y="2216" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-90)">
-</text><text class="breeze-prod-image-build-r5" x="0" y="2240.4" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-91)">╭─</text><text class="breeze-prod-image-build-r5" x="24.4" y="2240.4" textLength="195.2" clip-path="url(#breeze-prod-image-build-line-91)"> Common options </text><text class="breeze-prod-image-build-r5" x="219.6" y="2240.4" textLength="1220" clip-path="url(#breeze-prod-image-build-line-91)">──────────────────────────────────────────────────── [...]
-</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="12.2" clip-path="url(#breeze-prod-image-build-line-92)">-</text><text class="breeze-prod-image-build-r4" x="36.6" y="2264.8" textLength="97.6" clip-path="url(#breeze-prod-image-build-line-92)">-verbose</text><text class="breeze-prod-image-build-r6" x="158.6" y="2264.8" textLeng [...]
-</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="12.2" clip-path="url(#breeze-prod-image-build-line-93)">-</text><text class="breeze-prod-image-build-r4" x="36.6" y="2289.2" textLength="48.8" clip-path="url(#breeze-prod-image-build-line-93)">-dry</text><text class="breeze-prod-image-build-r4" x="85.4" y="2289.2" textLength="4 [...]
-</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="12.2" clip-path="url(#breeze-prod-image-build-line-94)">-</text><text class="breeze-prod-image-build-r4" x="36.6" y="2313.6" textLength="61" clip-path="url(#breeze-prod-image-build-line-94)">-help</text><text class="breeze-prod-image-build-r6" x="158.6" y="2313.6" textLength="2 [...]
-</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-r2" 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="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="12.2" clip-path="url(#breeze-prod-image-build-line-83)">-</text><text class="breeze-prod-image-build-r4" x="36.6" y="2045.2" textLength="97.6" clip-path="url(#breeze-prod-image-build-line-83)">-prepare</text><text class="breeze-prod-image-build-r4" x="134.2" y="2045.2" textLeng [...]
+</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-r2" x="341.6" y="2069.6" textLength="1098" clip-path="url(#breeze-prod-image-build-line-84)">image).                                    [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2094" textLength="1464" clip-path="url(#breeze-prod-image-build-line-85)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r2" x="1464" y="2094" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-85)">
+</text><text class="breeze-prod-image-build-r5" x="0" y="2118.4" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-86)">╭─</text><text class="breeze-prod-image-build-r5" x="24.4" y="2118.4" textLength="280.6" clip-path="url(#breeze-prod-image-build-line-86)"> Github authentication </text><text class="breeze-prod-image-build-r5" x="305" y="2118.4" textLength="1134.6" clip-path="url(#breeze-prod-image-build-line-86)">───────────────────────────────────────────── [...]
+</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="12.2" clip-path="url(#breeze-prod-image-build-line-87)">-</text><text class="breeze-prod-image-build-r4" x="36.6" y="2142.8" textLength="85.4" clip-path="url(#breeze-prod-image-build-line-87)">-github</text><text class="breeze-prod-image-build-r4" x="122" y="2142.8" textLength= [...]
+</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="12.2" clip-path="url(#breeze-prod-image-build-line-88)">-</text><text class="breeze-prod-image-build-r4" x="36.6" y="2167.2" textLength="85.4" clip-path="url(#breeze-prod-image-build-line-88)">-github</text><text class="breeze-prod-image-build-r4" x="122" y="2167.2" textLength= [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2191.6" textLength="1464" clip-path="url(#breeze-prod-image-build-line-89)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r2" x="1464" y="2191.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-89)">
+</text><text class="breeze-prod-image-build-r5" x="0" y="2216" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-90)">╭─</text><text class="breeze-prod-image-build-r5" x="24.4" y="2216" textLength="195.2" clip-path="url(#breeze-prod-image-build-line-90)"> Common options </text><text class="breeze-prod-image-build-r5" x="219.6" y="2216" textLength="1220" clip-path="url(#breeze-prod-image-build-line-90)">────────────────────────────────────────────────────────── [...]
+</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="12.2" clip-path="url(#breeze-prod-image-build-line-91)">-</text><text class="breeze-prod-image-build-r4" x="36.6" y="2240.4" textLength="97.6" clip-path="url(#breeze-prod-image-build-line-91)">-verbose</text><text class="breeze-prod-image-build-r6" x="158.6" y="2240.4" textLeng [...]
+</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="12.2" clip-path="url(#breeze-prod-image-build-line-92)">-</text><text class="breeze-prod-image-build-r4" x="36.6" y="2264.8" textLength="48.8" clip-path="url(#breeze-prod-image-build-line-92)">-dry</text><text class="breeze-prod-image-build-r4" x="85.4" y="2264.8" textLength="4 [...]
+</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="12.2" clip-path="url(#breeze-prod-image-build-line-93)">-</text><text class="breeze-prod-image-build-r4" x="36.6" y="2289.2" textLength="61" clip-path="url(#breeze-prod-image-build-line-93)">-help</text><text class="breeze-prod-image-build-r6" x="158.6" y="2289.2" textLength="2 [...]
+</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-r2" x="1464" y="2313.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-94)">
</text>
</g>
</g>
diff --git a/images/breeze/output_setup_check-all-params-in-groups.svg b/images/breeze/output_setup_check-all-params-in-groups.svg
index 84998f53f1..2e002166e5 100644
--- a/images/breeze/output_setup_check-all-params-in-groups.svg
+++ b/images/breeze/output_setup_check-all-params-in-groups.svg
@@ -154,24 +154,24 @@
</text><text class="breeze-setup-check-all-params-in-groups-r2" 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="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="36.6" y="166.4" textLength="97.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line [...]
-</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)">(main | build-docs | ci:fix-ownership | ci:free-space | ci:get-workflow-info | ci:resource-check | &# [...]
-</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:selective-check | ci | ci-image:build | ci-image:pull | ci-image:verify | ci-image | cleanup  [...]
-</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)">compile-www-assets | down | exec | k8s:build-k8s-image | k8s:configure-cluster | k8s:create-cluster |  [...]
-</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)">k8s:delete-cluster | k8s:deploy-airflow | k8s:k9s | k8s:logs | k8s:run-complete-tests | k8s:setup-env |</tex [...]
-</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:shell | k8s:status | k8s:tests | k8s:upload-k8s-image | k8s | prod-image:build | prod-image:pul [...]
-</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)">prod-image:verify | prod-image | release-management:add-back-references |          & [...]
-</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)">release-management:create-minor-branch | release-management:generate-constraints |          &# [...]
-</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: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="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:install-provider-packages | release-management:prepare-airflow-package |          [...]
-</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:prepare-provider-documentation | release-management:prepare-provider-packages |     </text><text cla [...]
-</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:publish-docs | release-management:release-prod-images |            [...]
-</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:start-rc-process | release-management:start-release |             [...]
-</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:update-constraints | release-management:verify-provider-packages |           [...]
-</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 | sbom:generate-provider-requirements | sbom:update-sbom-information | sbom |     &# [...]
-</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)">setup:autocomplete | setup:check-all-params-in-groups | setup:config | setup:regenerate-command-images </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)">| setup:self-upgrade | setup:version | setup | shell | start-airflow | static-checks |  & [...]
-</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)">testing:docker-compose-tests | testing:helm-tests | testing:integration-tests | testing:tests |      [...]
-</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)">testing)                         & [...]
+</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)">(main | build-docs | ci:find-backtracking-candidates | ci:fix-ownership | ci:free-space |     [...]
+</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:get-workflow-info | ci:resource-check | ci:selective-check | ci | ci-image:build | ci-image:pull |  [...]
+</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-image:verify | ci-image | cleanup | compile-www-assets | down | exec | k8s:build-k8s-image |& [...]
+</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)">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="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: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="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:upload-k8s-image | k8s | prod-image:build | prod-image:pull | prod-image:verify | prod-image |  [...]
+</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)">release-management:add-back-references | release-management:create-minor-branch |           [...]
+</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:generate-constraints | release-management:generate-issue-content-providers |        < [...]
+</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-providers-metadata | release-management:install-provider-packages |        </tex [...]
+</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:prepare-airflow-package | release-management:prepare-provider-documentation |       </text [...]
+</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:prepare-provider-packages | release-management:publish-docs |           [...]
+</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:release-prod-images | release-management:start-rc-process |            [...]
+</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:start-release | release-management:update-constraints |            [...]
+</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:verify-provider-packages | release-management | sbom:generate-provider-requirements </text><text class="breeze-setup-ch [...]
+</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)">| sbom:update-sbom-information | sbom | setup:autocomplete | setup:check-all-params-in-groups |     [...]
+</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)">setup:config | setup:regenerate-command-images | setup:self-upgrade | setup:version | setup | shell | [...]
+</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)">start-airflow | static-checks | testing:docker-compose-tests | testing:helm-tests |        [...]
+</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)">testing:integration-tests | testing:tests | testing)               [...]
</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="630" textLength="1464" clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-check-all-params-in-groups-r2" x="1464" 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-r5" x="0" y="654.4" textLength="24.4" clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">╭─</text><text class="breeze-setup-check-all-params-in-groups-r5" x="24.4" y="654.4" textLength="195.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)"> Common options </text><text class="breeze-setup-check-all-params-in-groups-r5" x="219.6" y="654.4" textLength="1220" clip-path="url(#breeze-se [...]
</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-r4" x="24.4" 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-r4" x="36.6" y="678.8" textLength="97.6" clip-path="url(#breeze-setup-check-all-params-in-groups-li [...]
diff --git a/images/breeze/output_setup_regenerate-command-images.svg b/images/breeze/output_setup_regenerate-command-images.svg
index 610ae7d02f..e8d1e27a5c 100644
--- a/images/breeze/output_setup_regenerate-command-images.svg
+++ b/images/breeze/output_setup_regenerate-command-images.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 904.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-regenerate-command-images-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="828.5999999999999" />
+ <rect x="0" y="0" width="1463.0" height="853.0" />
</clipPath>
<clipPath id="breeze-setup-regenerate-command-images-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -144,9 +144,12 @@
<clipPath id="breeze-setup-regenerate-command-images-line-32">
<rect x="0" y="782.3" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-setup-regenerate-command-images-line-33">
+ <rect x="0" y="806.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="877.6" rx="8"/><text class="breeze-setup-regenerate-command-images-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: setup regenerate-command-images</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="902" rx="8"/><text class="breeze-setup-regenerate-command-images-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: setup regenerate-command-images</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -164,32 +167,33 @@
</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="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-6)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="166.4" textLength="73.2" clip-path="url(#breeze-setup-regenerate-command-images-line-6)">- [...]
</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="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-7)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="190.8" textLength="97.6" clip-path="url(#breeze-setup-regenerate-command-images-line-7)">- [...]
-</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)">(main | build-docs | ci:fix-ownership | ci:free-space | ci:get-workflow-info | ci:resource-check |   [...]
-</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:selective-check | ci | ci-image:build | ci-image:pull | ci-image:verify | ci-image | cleanup | [...]
-</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)">compile-www-assets | down | exec | k8s:build-k8s-image | k8s:configure-cluster | k8s:create-cluster </text><text [...]
-</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)">| k8s:delete-cluster | k8s:deploy-airflow | k8s:k9s | k8s:logs | k8s:run-complete-tests |     [...]
-</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:setup-env | k8s:shell | k8s:status | k8s:tests | k8s:upload-k8s-image | k8s | prod-image:build  [...]
-</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)">prod-image:pull | prod-image:verify | prod-image | release-management:add-back-references |      & [...]
-</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)">release-management:create-minor-branch | release-management:generate-constraints |            [...]
-</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:generate-issue-content-providers | release-management:generate-providers-metadata</text><text class="breeze-setup-regenerate-command-image [...]
-</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:install-provider-packages | release-management:prepare-airflow-package |       </text>< [...]
-</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:prepare-provider-documentation | release-management:prepare-provider-packages |  </text><text class="breeze-setup-regen [...]
-</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:publish-docs | release-management:release-prod-images |            &# [...]
-</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:start-rc-process | release-management:start-release |             [...]
-</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:update-constraints | release-management:verify-provider-packages |           & [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-21)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="532.4" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-21)">release-management | sbom:generate-provider-requirements | sbom:update-sbom-information | sbom |    </text>< [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-22)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="556.8" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-22)">setup:autocomplete | setup:check-all-params-in-groups | setup:config |           &# [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-23)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="581.2" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-23)">setup:regenerate-command-images | setup:self-upgrade | setup:version | setup | shell | start-airflow</text><text [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-24)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="605.6" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-24)">| static-checks | testing:docker-compose-tests | testing:helm-tests | testing:integration-tests |   </text>< [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-25)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="630" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-25)">testing:tests | testing)                      & [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-26)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-26)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="654.4" textLength="73.2" clip-path="url(#breeze-setup-regenerate-command-images-line-26) [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-27)">│</text><text class="breeze-setup-regenerate-command-images-r2" x="219.6" y="678.8" textLength="170.8" clip-path="url(#breeze-setup-regenerate-command-images-line-27)">together with </text><text class="breeze-setup-regenerate-command-images-r4" x="390.4" y="678.8" textLength="12.2" clip-path="url(#breeze-setup-regenera [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="703.2" textLength="1464" clip-path="url(#breeze-setup-regenerate-command-images-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-regenerate-command-images-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-28)">
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="727.6" textLength="24.4" clip-path="url(#breeze-setup-regenerate-command-images-line-29)">╭─</text><text class="breeze-setup-regenerate-command-images-r5" x="24.4" y="727.6" textLength="195.2" clip-path="url(#breeze-setup-regenerate-command-images-line-29)"> Common options </text><text class="breeze-setup-regenerate-command-images-r5" x="219.6" y="727.6" textLength="1220" clip-path="url(#breeze-setup-r [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-30)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-30)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="752" textLength="97.6" clip-path="url(#breeze-setup-regenerate-command-images-line-30)">-ver [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-31)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-31)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="776.4" textLength="48.8" clip-path="url(#breeze-setup-regenerate-command-images-line-31) [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-32)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-32)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="800.8" textLength="61" clip-path="url(#breeze-setup-regenerate-command-images-line-32)"> [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="825.2" textLength="1464" clip-path="url(#breeze-setup-regenerate-command-images-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-regenerate-command-images-r2" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-33)">
+</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)">(main | build-docs | ci:find-backtracking-candidates | ci:fix-ownership | ci:free-space |     & [...]
+</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:get-workflow-info | ci:resource-check | ci:selective-check | ci | ci-image:build | ci-image:pull </text><te [...]
+</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-image:verify | ci-image | cleanup | compile-www-assets | down | exec | k8s:build-k8s-image | [...]
+</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)">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="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: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="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:upload-k8s-image | k8s | prod-image:build | prod-image:pull | prod-image:verify | prod-image |  [...]
+</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)">release-management:add-back-references | release-management:create-minor-branch |           & [...]
+</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:generate-constraints | release-management:generate-issue-content-providers |     </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:generate-providers-metadata | release-management:install-provider-packages |     </text><text class="bre [...]
+</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:prepare-airflow-package | release-management:prepare-provider-documentation |    </text><text class="breeze-s [...]
+</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:prepare-provider-packages | release-management:publish-docs |           &# [...]
+</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:release-prod-images | release-management:start-rc-process |            [...]
+</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:start-release | release-management:update-constraints |              [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-21)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="532.4" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-21)">release-management:verify-provider-packages | release-management |              [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-22)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="556.8" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-22)">sbom:generate-provider-requirements | sbom:update-sbom-information | sbom | setup:autocomplete |    </text>< [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-23)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="581.2" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-23)">setup:check-all-params-in-groups | setup:config | setup:regenerate-command-images |         & [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-24)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="605.6" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-24)">setup:self-upgrade | setup:version | setup | shell | start-airflow | static-checks |     [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-25)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="630" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-25)">testing:docker-compose-tests | testing:helm-tests | testing:integration-tests | testing:tests |     </text> [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-26)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="654.4" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-26)">testing)                           [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-27)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-27)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="678.8" textLength="73.2" clip-path="url(#breeze-setup-regenerate-command-images-line-27) [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-28)">│</text><text class="breeze-setup-regenerate-command-images-r2" x="219.6" y="703.2" textLength="170.8" clip-path="url(#breeze-setup-regenerate-command-images-line-28)">together with </text><text class="breeze-setup-regenerate-command-images-r4" x="390.4" y="703.2" textLength="12.2" clip-path="url(#breeze-setup-regenera [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="727.6" textLength="1464" clip-path="url(#breeze-setup-regenerate-command-images-line-29)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-regenerate-command-images-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-29)">
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="752" textLength="24.4" clip-path="url(#breeze-setup-regenerate-command-images-line-30)">╭─</text><text class="breeze-setup-regenerate-command-images-r5" x="24.4" y="752" textLength="195.2" clip-path="url(#breeze-setup-regenerate-command-images-line-30)"> Common options </text><text class="breeze-setup-regenerate-command-images-r5" x="219.6" y="752" textLength="1220" clip-path="url(#breeze-setup-regener [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-31)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-31)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="776.4" textLength="97.6" clip-path="url(#breeze-setup-regenerate-command-images-line-31) [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-32)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-32)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="800.8" textLength="48.8" clip-path="url(#breeze-setup-regenerate-command-images-line-32) [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-33)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="825.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-33)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="825.2" textLength="61" clip-path="url(#breeze-setup-regenerate-command-images-line-33)"> [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="849.6" textLength="1464" clip-path="url(#breeze-setup-regenerate-command-images-line-34)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-regenerate-command-images-r2" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-34)">
</text>
</g>
</g>
diff --git a/scripts/docker/install_additional_dependencies.sh b/scripts/docker/install_additional_dependencies.sh
index 04cf52df9c..488768cf51 100644
--- a/scripts/docker/install_additional_dependencies.sh
+++ b/scripts/docker/install_additional_dependencies.sh
@@ -33,7 +33,7 @@ function install_additional_dependencies() {
set -x
pip install --root-user-action ignore --upgrade --upgrade-strategy eager \
${ADDITIONAL_PIP_INSTALL_FLAGS} \
- ${ADDITIONAL_PYTHON_DEPS} ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS}
+ ${ADDITIONAL_PYTHON_DEPS} ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=}
common::install_pip_version
set +x
echo
diff --git a/scripts/docker/install_airflow.sh b/scripts/docker/install_airflow.sh
index 265d2089c3..f5bbf638c2 100644
--- a/scripts/docker/install_airflow.sh
+++ b/scripts/docker/install_airflow.sh
@@ -57,7 +57,7 @@ function install_airflow() {
pip install --root-user-action ignore --upgrade --upgrade-strategy eager \
${ADDITIONAL_PIP_INSTALL_FLAGS} \
"${AIRFLOW_INSTALLATION_METHOD}[${AIRFLOW_EXTRAS}]${AIRFLOW_VERSION_SPECIFICATION}" \
- ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS}
+ ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=}
if [[ -n "${AIRFLOW_INSTALL_EDITABLE_FLAG}" ]]; then
# Remove airflow and reinstall it using editable flag
# We can only do it when we install airflow from sources
diff --git a/scripts/docker/install_from_docker_context_files.sh b/scripts/docker/install_from_docker_context_files.sh
index 250bbaed21..fa08f47626 100644
--- a/scripts/docker/install_from_docker_context_files.sh
+++ b/scripts/docker/install_from_docker_context_files.sh
@@ -82,7 +82,7 @@ function install_airflow_and_providers_from_docker_context_files(){
pip install "${pip_flags[@]}" --root-user-action ignore --upgrade --upgrade-strategy eager \
${ADDITIONAL_PIP_INSTALL_FLAGS} \
${reinstalling_apache_airflow_package} ${reinstalling_apache_airflow_providers_packages} \
- ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS}
+ ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=}
set +x
common::install_pip_version
diff --git a/scripts/in_container/_in_container_utils.sh b/scripts/in_container/_in_container_utils.sh
index 92d6ccf250..c6a859e404 100644
--- a/scripts/in_container/_in_container_utils.sh
+++ b/scripts/in_container/_in_container_utils.sh
@@ -284,7 +284,7 @@ function install_local_airflow_with_eager_upgrade() {
# we add eager requirements to make sure to take into account limitations that will allow us to
# install all providers
# shellcheck disable=SC2086
- pip install ".${extras}" ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS} \
+ pip install ".${extras}" ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=} \
--upgrade --upgrade-strategy eager
}
@@ -320,7 +320,7 @@ function install_all_providers_from_pypi_with_eager_upgrade() {
# Installing it with Airflow makes sure that the version of package that matches current
# Airflow requirements will be used.
# shellcheck disable=SC2086
- pip install ".[${NO_PROVIDERS_EXTRAS}]" "${packages_to_install[@]}" ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS} \
+ pip install ".[${NO_PROVIDERS_EXTRAS}]" "${packages_to_install[@]}" ${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=} \
--upgrade --upgrade-strategy eager
}