This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch switch-to-mariadb-by-default
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 35390c1afcfb16dd92a985f145be6caef9af5f19
Author: Jarek Potiuk <[email protected]>
AuthorDate: Fri Dec 15 14:38:40 2023 +0100

    Change default MySQL client to MariaDB
    
    This PR is a response to pretty catastrophic issue caused by expiring
    key on MySQL repository on 14th of December. Oracle does not follow the
    best practices for signing their packages (while all others do) and
    their packages and repositories are signed with a key with short
    expiry date. This basically puts an expiry on their repository, and
    anyone who releases images following best practices of installation,
    while keeping the repository after installing mysql libraries has to
    rebuild their past released images every 2 years or so.
    
    This is the last straw for our MySQL client installation problems (we
    had a few, especially for ARM images) and we decided that we will
    switch to MariaDB client libraries by default (while allowing our
    users to build custom images with MySQL libraries).
    
    The issue tracked in Airflow repository is
    
    This PR implements a number of changes:
    
    * MariaDB client is now default client used for both ARM and X86
    * both pre-2023 and 2023 keys for MySQL are now added to be trusted
      when custom image with MySQL client is built
    * MySQL repository is removed after installing MySQL (to avoid
      repeating similar fiasco for MySQL users in 2025
    * changelog added and instructions on how to build custom image
      with MySQL client
    * one of our test suites is converted to use "current" image not
      latest released image (that was bug in our CI).
    * test was added in `canary` and `release` builds in CI to also test
      build of custom image with MySQL client
---
 .github/workflows/ci.yml                           | 176 ++++++++++++++++++---
 Dockerfile                                         |  17 +-
 Dockerfile.ci                                      |  15 +-
 .../airflow_breeze/commands/ci_image_commands.py   |   4 +
 .../commands/ci_image_commands_config.py           |  13 +-
 .../commands/common_image_options.py               |   8 +
 .../commands/production_image_commands.py          |   4 +
 .../commands/production_image_commands_config.py   |   1 +
 dev/breeze/src/airflow_breeze/global_constants.py  |   2 +
 .../src/airflow_breeze/params/build_ci_params.py   |  11 +-
 .../src/airflow_breeze/params/build_prod_params.py |   7 +-
 .../airflow_breeze/params/common_build_params.py   |   2 +
 .../test_examples_of_prod_image_building.py        |  11 +-
 docs/docker-stack/build.rst                        |  17 ++
 docs/docker-stack/changelog.rst                    |  35 ++--
 .../docker-examples/customizing/mysql-client.sh    |  37 +++++
 images/breeze/output_ci-image_build.svg            | 136 ++++++++--------
 images/breeze/output_ci-image_build.txt            |   2 +-
 images/breeze/output_prod-image_build.svg          |  64 ++++----
 images/breeze/output_prod-image_build.txt          |   2 +-
 scripts/docker/install_mysql.sh                    |  15 +-
 21 files changed, 417 insertions(+), 162 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index ad765ee5cf..df6b742c87 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -395,32 +395,6 @@ jobs:
       - name: "Generate client codegen diff"
         run: ./scripts/ci/openapi/client_codegen_diff.sh
 
-  test-examples-of-prod-image-building:
-    timeout-minutes: 60
-    name: "Test examples of production image building"
-    runs-on: ${{fromJSON(needs.build-info.outputs.runs-on)}}
-    needs: [build-info]
-    if: needs.build-info.outputs.ci-image-build == 'true'
-    steps:
-      - name: Cleanup repo
-        run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm 
-rf /workspace/*"
-      - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
-        uses: actions/checkout@v4
-        with:
-          fetch-depth: 2
-          persist-credentials: false
-      - name: "Setup python"
-        uses: actions/setup-python@v4
-        with:
-          python-version: 
"${{needs.build-info.outputs.default-python-version}}"
-          cache: 'pip'
-          cache-dependency-path: ./dev/requirements.txt
-      - name: "Test examples of PROD image building"
-        run: >
-          cd ./docker_tests &&
-          python -m pip install -r requirements.txt &&
-          python -m pytest test_examples_of_prod_image_building.py -n auto 
--color=yes
-
   test-git-clone-on-windows:
     timeout-minutes: 5
     name: "Test git clone on Windows"
@@ -1734,6 +1708,63 @@ jobs:
           # TODO: improve caching for that build
           IMAGE_TAG: "bullseye-${{ github.event.pull_request.head.sha || 
github.sha }}"
 
+  build-prod-images-mysql-client:
+    timeout-minutes: 80
+    name: >
+      Build MysQL Client PROD images (main)
+      ${{needs.build-info.outputs.all-python-versions-list-as-string}}
+    runs-on: ${{fromJSON(needs.build-info.outputs.runs-on)}}
+    needs: [build-info, build-ci-images]
+    if: needs.build-info.outputs.canary-run == 'true'
+    env:
+      DEFAULT_BRANCH: ${{ needs.build-info.outputs.default-branch }}
+      DEFAULT_CONSTRAINTS_BRANCH: ${{ 
needs.build-info.outputs.default-constraints-branch }}
+      RUNS_ON: "${{needs.build-info.outputs.runs-on}}"
+      BACKEND: sqlite
+      VERSION_SUFFIX_FOR_PYPI: "dev0"
+      DEBUG_RESOURCES: ${{needs.build-info.outputs.debug-resources}}
+      # Force more parallelism for build even on public images
+      PARALLELISM: 6
+    steps:
+      - name: Cleanup repo
+        run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm 
-rf /workspace/*"
+        if: >
+          needs.build-info.outputs.in-workflow-build == 'true' &&
+          needs.build-info.outputs.default-branch == 'main'
+      - uses: actions/checkout@v3
+        with:
+          ref: ${{ needs.build-info.outputs.targetCommitSha }}
+          persist-credentials: false
+          submodules: recursive
+        if: >
+          needs.build-info.outputs.in-workflow-build == 'true' &&
+          needs.build-info.outputs.default-branch == 'main'
+      - name: "Install Breeze"
+        uses: ./.github/actions/breeze
+        if: >
+          needs.build-info.outputs.in-workflow-build == 'true' &&
+          needs.build-info.outputs.default-branch == 'main'
+      - name: >
+          Build Bullseye PROD Images
+          
${{needs.build-info.outputs.all-python-versions-list-as-string}}:${{env.IMAGE_TAG}}
+        uses: ./.github/actions/build-prod-images
+        if: >
+          needs.build-info.outputs.in-workflow-build == 'true' &&
+          needs.build-info.outputs.default-branch == 'main'
+        with:
+          build-provider-packages: ${{ needs.build-info.outputs.default-branch 
== 'main' }}
+          chicken-egg-providers: ${{ 
needs.build-info.outputs.chicken-egg-providers }}
+        env:
+          UPGRADE_TO_NEWER_DEPENDENCIES: ${{ 
needs.build-info.outputs.upgrade-to-newer-dependencies }}
+          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 }}
+          INSTALL_MYSQL_CLIENT: "mysql"
+          # Do not override the "mariadb" (original) image - just push a new 
mysql image
+          # TODO: improve caching for that build
+          IMAGE_TAG: "bullseye-${{ github.event.pull_request.head.sha || 
github.sha }}"
+
+
   build-prod-images-release-branch:
     timeout-minutes: 80
     name: >
@@ -1840,6 +1871,62 @@ jobs:
           # TODO: improve caching for that build
           IMAGE_TAG: "bullseye-${{ github.event.pull_request.head.sha || 
github.sha }}"
 
+  build-prod-images-mysql-release-branch:
+    timeout-minutes: 80
+    name: >
+      Build MySQL PROD images (v2_*_test)
+      ${{needs.build-info.outputs.all-python-versions-list-as-string}}
+    runs-on: ${{fromJSON(needs.build-info.outputs.runs-on)}}
+    needs: [build-info, generate-constraints]
+    if: needs.build-info.outputs.canary-run == 'true'
+    env:
+      DEFAULT_BRANCH: ${{ needs.build-info.outputs.default-branch }}
+      DEFAULT_CONSTRAINTS_BRANCH: ${{ 
needs.build-info.outputs.default-constraints-branch }}
+      RUNS_ON: "${{needs.build-info.outputs.runs-on}}"
+      BACKEND: sqlite
+      VERSION_SUFFIX_FOR_PYPI: "dev0"
+      DEBUG_RESOURCES: ${{needs.build-info.outputs.debug-resources}}
+      # Force more parallelism for build even on public images
+      PARALLELISM: 6
+    steps:
+      - name: Cleanup repo
+        run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm 
-rf /workspace/*"
+        if: >
+          needs.build-info.outputs.in-workflow-build == 'true' &&
+          needs.build-info.outputs.default-branch != 'main'
+      - uses: actions/checkout@v3
+        with:
+          ref: ${{ needs.build-info.outputs.targetCommitSha }}
+          persist-credentials: false
+          submodules: recursive
+        if: >
+          needs.build-info.outputs.in-workflow-build == 'true' &&
+          needs.build-info.outputs.default-branch != 'main'
+      - name: "Install Breeze"
+        uses: ./.github/actions/breeze
+        if: >
+          needs.build-info.outputs.in-workflow-build == 'true' &&
+          needs.build-info.outputs.default-branch != 'main'
+      - name: >
+          Build Bullseye PROD Images
+          
${{needs.build-info.outputs.all-python-versions-list-as-string}}:${{env.IMAGE_TAG}}
+        uses: ./.github/actions/build-prod-images
+        if: >
+          needs.build-info.outputs.in-workflow-build == 'true' &&
+          needs.build-info.outputs.default-branch != 'main'
+        with:
+          build-provider-packages: ${{ needs.build-info.outputs.default-branch 
== 'main' }}
+          chicken-egg-providers: ${{ 
needs.build-info.outputs.chicken-egg-providers }}
+        env:
+          UPGRADE_TO_NEWER_DEPENDENCIES: ${{ 
needs.build-info.outputs.upgrade-to-newer-dependencies }}
+          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 }}
+          INSTALL_MYSQL_CLIENT: "mysql"
+          # Do not override the "mariadb" image - just push a new mysql image
+          # TODO: improve caching for that build
+          IMAGE_TAG: "mysql-${{ github.event.pull_request.head.sha || 
github.sha }}"
+
   wait-for-prod-images:
     timeout-minutes: 80
     name: "Wait for PROD images"
@@ -1875,6 +1962,43 @@ jobs:
           DEBUG_RESOURCES: ${{needs.build-info.outputs.debug-resources}}
         if: needs.build-info.outputs.in-workflow-build == 'false'
 
+  test-examples-of-prod-image-building:
+    timeout-minutes: 60
+    name: "Test examples of production image building"
+    runs-on: ${{fromJSON(needs.build-info.outputs.runs-on)}}
+    needs: [build-info, wait-for-prod-images]
+    if: needs.build-info.outputs.ci-image-build == 'true'
+    steps:
+      - name: Cleanup repo
+        run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm 
-rf /workspace/*"
+      - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 2
+          persist-credentials: false
+      - name: "Install Breeze"
+        uses: ./.github/actions/breeze
+      - name: Pull PROD image 
"${{needs.build-info.outputs.default-python-version}}":${{ env.IMAGE_TAG }}
+        run: breeze prod-image pull --tag-as-latest
+        env:
+          PYTHON_MAJOR_MINOR_VERSION: 
"${{needs.build-info.outputs.default-python-version}}"
+      - name: "Setup python"
+        uses: actions/setup-python@v4
+        with:
+          python-version: ${{needs.build-info.outputs.default-python-version}}
+          cache: 'pip'
+          cache-dependency-path: ./dev/requirements.txt
+      - name: "Test examples of PROD image building"
+        # yamllint disable-line rule:line-length
+        run: >
+          cd ./docker_tests &&
+          python -m pip install -r requirements.txt &&
+          
TEST_IMAGE="ghcr.io/${GITHUB_REPOSITORY}/main/prod/python${{env.PYTHON_MAJOR_MINOR_VERSION}}:${{env.IMAGE_TAG}}"
+          python -m pytest test_examples_of_prod_image_building.py -n auto 
--color=yes
+        env:
+          PYTHON_MAJOR_MINOR_VERSION: 
"${{needs.build-info.outputs.default-python-version}}"
+
+
   test-docker-compose-quick-start:
     timeout-minutes: 60
     name: "Docker-compose quick start with PROD image verifying"
diff --git a/Dockerfile b/Dockerfile
index ce845cef8b..e9241de43c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -232,7 +232,7 @@ COLOR_RESET=$'\e[0m'
 readonly COLOR_RESET
 
 : "${INSTALL_MYSQL_CLIENT:?Should be true or false}"
-: "${INSTALL_MYSQL_CLIENT_TYPE:-mysql}"
+: "${INSTALL_MYSQL_CLIENT_TYPE:-mariadb}"
 
 export_key() {
     local key="${1}"
@@ -271,7 +271,8 @@ install_mysql_client() {
         exit 1
     fi
 
-    export_key "467B942D3A79BD29" "mysql"
+    export_key "467B942D3A79BD29" "mysql-2022"
+    export_key "B7B3B788A8D3785C" "mysql-2023"
 
     echo
     echo "${COLOR_BLUE}Installing Oracle MySQL client version 
${MYSQL_LTS_VERSION}: ${1}${COLOR_RESET}"
@@ -283,6 +284,13 @@ install_mysql_client() {
     apt-get install --no-install-recommends -y "${packages[@]}"
     apt-get autoremove -yqq --purge
     apt-get clean && rm -rf /var/lib/apt/lists/*
+
+    # Remove mysql repository from sources.list.d as MySQL repos have a basic 
flaw that they put expiry
+    # date on their GPG signing keys and they sign their repo with those keys. 
This means that after a
+    # certain date, the GPG key becomes invalid and if you have the repository 
added in your sources.list
+    # then you will not be able to install anything from any other repository. 
This id unlike any other
+    # repository we have seen (for example Postgres, MariaDB, MsSQL - all have 
non-expiring signing keys)
+    rm /etc/apt/sources.list.d/mysql.list
 }
 
 install_mariadb_client() {
@@ -327,6 +335,9 @@ install_mariadb_client() {
 if [[ ${INSTALL_MYSQL_CLIENT:="true"} == "true" ]]; then
     if [[ $(uname -m) == "arm64" || $(uname -m) == "aarch64" ]]; then
         INSTALL_MYSQL_CLIENT_TYPE="mariadb"
+        echo
+        echo "${COLOR_YELLOW}Client forced to mariadb for ARM${COLOR_RESET}"
+        echo
     fi
 
     if [[ "${INSTALL_MYSQL_CLIENT_TYPE}" == "mysql" ]]; then
@@ -1229,7 +1240,7 @@ COPY --from=scripts install_os_dependencies.sh 
/scripts/docker/
 RUN bash /scripts/docker/install_os_dependencies.sh dev
 
 ARG INSTALL_MYSQL_CLIENT="true"
-ARG INSTALL_MYSQL_CLIENT_TYPE="mysql"
+ARG INSTALL_MYSQL_CLIENT_TYPE="mariadb"
 ARG INSTALL_MSSQL_CLIENT="true"
 ARG INSTALL_POSTGRES_CLIENT="true"
 ARG AIRFLOW_PIP_VERSION
diff --git a/Dockerfile.ci b/Dockerfile.ci
index 845a1c8f44..50c64b80e6 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -192,7 +192,7 @@ COLOR_RESET=$'\e[0m'
 readonly COLOR_RESET
 
 : "${INSTALL_MYSQL_CLIENT:?Should be true or false}"
-: "${INSTALL_MYSQL_CLIENT_TYPE:-mysql}"
+: "${INSTALL_MYSQL_CLIENT_TYPE:-mariadb}"
 
 export_key() {
     local key="${1}"
@@ -231,7 +231,8 @@ install_mysql_client() {
         exit 1
     fi
 
-    export_key "467B942D3A79BD29" "mysql"
+    export_key "467B942D3A79BD29" "mysql-2022"
+    export_key "B7B3B788A8D3785C" "mysql-2023"
 
     echo
     echo "${COLOR_BLUE}Installing Oracle MySQL client version 
${MYSQL_LTS_VERSION}: ${1}${COLOR_RESET}"
@@ -243,6 +244,13 @@ install_mysql_client() {
     apt-get install --no-install-recommends -y "${packages[@]}"
     apt-get autoremove -yqq --purge
     apt-get clean && rm -rf /var/lib/apt/lists/*
+
+    # Remove mysql repository from sources.list.d as MySQL repos have a basic 
flaw that they put expiry
+    # date on their GPG signing keys and they sign their repo with those keys. 
This means that after a
+    # certain date, the GPG key becomes invalid and if you have the repository 
added in your sources.list
+    # then you will not be able to install anything from any other repository. 
This id unlike any other
+    # repository we have seen (for example Postgres, MariaDB, MsSQL - all have 
non-expiring signing keys)
+    rm /etc/apt/sources.list.d/mysql.list
 }
 
 install_mariadb_client() {
@@ -287,6 +295,9 @@ install_mariadb_client() {
 if [[ ${INSTALL_MYSQL_CLIENT:="true"} == "true" ]]; then
     if [[ $(uname -m) == "arm64" || $(uname -m) == "aarch64" ]]; then
         INSTALL_MYSQL_CLIENT_TYPE="mariadb"
+        echo
+        echo "${COLOR_YELLOW}Client forced to mariadb for ARM${COLOR_RESET}"
+        echo
     fi
 
     if [[ "${INSTALL_MYSQL_CLIENT_TYPE}" == "mysql" ]]; then
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 b0a6d12447..52d49455e3 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
@@ -45,6 +45,7 @@ from airflow_breeze.commands.common_image_options import (
     option_image_tag_for_building,
     option_image_tag_for_pulling,
     option_image_tag_for_verifying,
+    option_install_mysql_client,
     option_install_providers_from_sources,
     option_platform_multiple,
     option_prepare_buildx_cache,
@@ -300,6 +301,7 @@ option_version_suffix_for_pypi_ci = click.option(
 @option_eager_upgrade_additional_requirements
 @option_github_repository
 @option_github_token
+@option_install_mysql_client
 @option_image_tag_for_building
 @option_include_success_outputs
 @option_install_providers_from_sources
@@ -342,6 +344,7 @@ def build(
     github_token: str | None,
     image_tag: str,
     include_success_outputs,
+    install_mysql_client: str,
     install_providers_from_sources: bool,
     parallelism: int,
     platform: str | None,
@@ -413,6 +416,7 @@ def build(
         github_repository=github_repository,
         github_token=github_token,
         image_tag=image_tag,
+        install_mysql_client=install_mysql_client,
         install_providers_from_sources=install_providers_from_sources,
         prepare_buildx_cache=prepare_buildx_cache,
         push=push,
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 6f6feb900a..11dd232b16 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
@@ -43,22 +43,23 @@ CI_IMAGE_TOOLS_PARAMETERS: dict[str, list[dict[str, str | 
list[str]]]] = {
         {
             "name": "Building images in parallel",
             "options": [
-                "--run-in-parallel",
+                "--debug-resources",
+                "--include-success-outputs",
                 "--parallelism",
                 "--python-versions",
+                "--run-in-parallel",
                 "--skip-cleanup",
-                "--debug-resources",
-                "--include-success-outputs",
             ],
         },
         {
             "name": "Advanced build options (for power users)",
             "options": [
-                "--debian-version",
-                "--python-image",
-                "--commit-sha",
                 "--additional-pip-install-flags",
+                "--commit-sha",
+                "--debian-version",
+                "--install-mysql-client",
                 "--install-providers-from-sources",
+                "--python-image",
             ],
         },
         {
diff --git a/dev/breeze/src/airflow_breeze/commands/common_image_options.py 
b/dev/breeze/src/airflow_breeze/commands/common_image_options.py
index a86e2a4431..b9cc7c7e42 100644
--- a/dev/breeze/src/airflow_breeze/commands/common_image_options.py
+++ b/dev/breeze/src/airflow_breeze/commands/common_image_options.py
@@ -24,6 +24,7 @@ from airflow_breeze.global_constants import (
     ALLOWED_BUILD_CACHE,
     ALLOWED_BUILD_PROGRESS,
     ALLOWED_DEBIAN_VERSIONS,
+    ALLOWED_INSTALL_MYSQL_CLIENTS,
     ALLOWED_PLATFORMS,
     DOCKER_DEFAULT_PLATFORM,
 )
@@ -138,6 +139,13 @@ option_image_tag_for_verifying = click.option(
     default="latest",
     envvar="IMAGE_TAG",
 )
+option_install_mysql_client = click.option(
+    "--install-mysql-client",
+    help="Which client to choose when installing.",
+    type=BetterChoice(ALLOWED_INSTALL_MYSQL_CLIENTS),
+    default=ALLOWED_INSTALL_MYSQL_CLIENTS[0],
+    envvar="INSTALL_MYSQL_CLIENT",
+)
 option_install_providers_from_sources = click.option(
     "--install-providers-from-sources",
     help="Install providers from sources when installing.",
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 b9bb0f8de8..e4ef6a68cd 100644
--- a/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
@@ -40,6 +40,7 @@ from airflow_breeze.commands.common_image_options import (
     option_image_tag_for_building,
     option_image_tag_for_pulling,
     option_image_tag_for_verifying,
+    option_install_mysql_client,
     option_install_providers_from_sources,
     option_platform_multiple,
     option_prepare_buildx_cache,
@@ -231,6 +232,7 @@ def prod_image():
 @option_github_token
 @option_image_tag_for_building
 @option_include_success_outputs
+@option_install_mysql_client
 @option_install_providers_from_sources
 @option_parallelism
 @option_platform_multiple
@@ -280,6 +282,7 @@ def build(
     include_success_outputs,
     install_airflow_reference: str | None,
     install_airflow_version: str | None,
+    install_mysql_client: str,
     install_packages_from_context: bool,
     install_providers_from_sources: bool,
     installation_method: str,
@@ -343,6 +346,7 @@ def build(
         image_tag=image_tag,
         install_airflow_reference=install_airflow_reference,
         install_airflow_version=install_airflow_version,
+        install_mysql_client=install_mysql_client,
         install_packages_from_context=install_packages_from_context,
         install_providers_from_sources=install_providers_from_sources,
         installation_method=installation_method,
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 2115a05183..a276931397 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
@@ -92,6 +92,7 @@ PRODUCTION_IMAGE_TOOLS_PARAMETERS: dict[str, list[dict[str, 
str | list[str]]]] =
                 "--installation-method",
                 "--install-airflow-reference",
                 "--install-packages-from-context",
+                "--install-mysql-client",
                 "--cleanup-context",
                 "--use-constraints-for-context-packages",
                 "--disable-airflow-repo-cache",
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py 
b/dev/breeze/src/airflow_breeze/global_constants.py
index c90b73f358..db136b2be1 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -116,6 +116,8 @@ ALLOWED_MYSQL_VERSIONS = [*MYSQL_OLD_RELEASES, 
*MYSQL_LTS_RELEASES]
 if MYSQL_INNOVATION_RELEASE:
     ALLOWED_MYSQL_VERSIONS.append(MYSQL_INNOVATION_RELEASE)
 
+ALLOWED_INSTALL_MYSQL_CLIENTS = ["mariadb", "mysql"]
+
 ALLOWED_MSSQL_VERSIONS = ["2017-latest", "2019-latest"]
 
 PIP_VERSION = "23.3.1"
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 1b94f1ec16..6e504a37da 100644
--- a/dev/breeze/src/airflow_breeze/params/build_ci_params.py
+++ b/dev/breeze/src/airflow_breeze/params/build_ci_params.py
@@ -86,18 +86,19 @@ class BuildCiParams(CommonBuildParams):
         self._opt_arg("ADDITIONAL_DEV_APT_ENV", self.additional_dev_apt_env)
         self._opt_arg("ADDITIONAL_PIP_INSTALL_FLAGS", 
self.additional_pip_install_flags)
         self._opt_arg("ADDITIONAL_PYTHON_DEPS", self.additional_python_deps)
-        self._opt_arg("DEV_APT_COMMAND", self.dev_apt_command)
-        self._opt_arg("DEV_APT_DEPS", self.dev_apt_deps)
-        self._opt_arg("DOCKER_HOST", self.docker_host)
         self._opt_arg("ADDITIONAL_DEV_APT_COMMAND", 
self.additional_dev_apt_command)
         self._opt_arg("ADDITIONAL_DEV_APT_DEPS", self.additional_dev_apt_deps)
         self._opt_arg("ADDITIONAL_DEV_APT_ENV", self.additional_dev_apt_env)
         self._opt_arg("ADDITIONAL_AIRFLOW_EXTRAS", 
self.additional_airflow_extras)
         self._opt_arg("ADDITIONAL_PIP_INSTALL_FLAGS", 
self.additional_pip_install_flags)
         self._opt_arg("ADDITIONAL_PYTHON_DEPS", self.additional_python_deps)
-        self._opt_arg("VERSION_SUFFIX_FOR_PYPI", self.version_suffix_for_pypi)
-        self._opt_arg("COMMIT_SHA", self.commit_sha)
         self._opt_arg("BUILD_PROGRESS", self.build_progress)
+        self._opt_arg("COMMIT_SHA", self.commit_sha)
+        self._opt_arg("DEV_APT_COMMAND", self.dev_apt_command)
+        self._opt_arg("DEV_APT_DEPS", self.dev_apt_deps)
+        self._opt_arg("DOCKER_HOST", self.docker_host)
+        self._opt_arg("INSTALL_MYSQL_CLIENT", self.install_mysql_client)
+        self._opt_arg("VERSION_SUFFIX_FOR_PYPI", self.version_suffix_for_pypi)
         # Convert to build args
         build_args = self._to_build_args()
         # Add cache directive
diff --git a/dev/breeze/src/airflow_breeze/params/build_prod_params.py 
b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
index abd4498881..62f3bda8fe 100644
--- a/dev/breeze/src/airflow_breeze/params/build_prod_params.py
+++ b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
@@ -228,15 +228,16 @@ class BuildProdParams(CommonBuildParams):
         self._opt_arg("ADDITIONAL_RUNTIME_APT_COMMAND", 
self.additional_runtime_apt_command)
         self._opt_arg("ADDITIONAL_RUNTIME_APT_DEPS", 
self.additional_runtime_apt_deps)
         self._opt_arg("ADDITIONAL_RUNTIME_APT_ENV", 
self.additional_runtime_apt_env)
+        self._opt_arg("BUILD_PROGRESS", self.build_progress)
+        self._opt_arg("COMMIT_SHA", self.commit_sha)
         self._opt_arg("DEV_APT_COMMAND", self.dev_apt_command)
         self._opt_arg("DEV_APT_DEPS", self.dev_apt_deps)
         self._opt_arg("DOCKER_HOST", self.docker_host)
+        self._opt_arg("INSTALL_MYSQL_CLIENT", self.install_mysql_client)
         self._opt_arg("RUNTIME_APT_COMMAND", self.runtime_apt_command)
         self._opt_arg("RUNTIME_APT_DEPS", self.runtime_apt_deps)
-        self._opt_arg("VERSION_SUFFIX_FOR_PYPI", self.version_suffix_for_pypi)
-        self._opt_arg("COMMIT_SHA", self.commit_sha)
-        self._opt_arg("BUILD_PROGRESS", self.build_progress)
         self._opt_arg("USE_CONSTRAINTS_FOR_CONTEXT_PACKAGES", 
self.use_constraints_for_context_packages)
+        self._opt_arg("VERSION_SUFFIX_FOR_PYPI", self.version_suffix_for_pypi)
         build_args = self._to_build_args()
         build_args.extend(self._extra_prod_docker_build_flags())
         return build_args
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 4f01345fc8..1e7197c9ea 100644
--- a/dev/breeze/src/airflow_breeze/params/common_build_params.py
+++ b/dev/breeze/src/airflow_breeze/params/common_build_params.py
@@ -25,6 +25,7 @@ from typing import Any
 from airflow_breeze.branch_defaults import AIRFLOW_BRANCH, 
DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
 from airflow_breeze.global_constants import (
     ALLOWED_BUILD_PROGRESS,
+    ALLOWED_INSTALL_MYSQL_CLIENTS,
     APACHE_AIRFLOW_GITHUB_REPOSITORY,
     DOCKER_DEFAULT_PLATFORM,
 )
@@ -62,6 +63,7 @@ class CommonBuildParams:
     github_token: str = os.environ.get("GITHUB_TOKEN", "")
     image_tag: str | None = None
     install_providers_from_sources: bool = False
+    install_mysql_client: str = ALLOWED_INSTALL_MYSQL_CLIENTS[0]
     platform: str = DOCKER_DEFAULT_PLATFORM
     prepare_buildx_cache: bool = False
     python_image: str | None = None
diff --git a/docker_tests/test_examples_of_prod_image_building.py 
b/docker_tests/test_examples_of_prod_image_building.py
index f67efcd067..991f9c8e2b 100644
--- a/docker_tests/test_examples_of_prod_image_building.py
+++ b/docker_tests/test_examples_of_prod_image_building.py
@@ -35,10 +35,11 @@ DOCKER_EXAMPLES_DIR = SOURCE_ROOT / "docs" / "docker-stack" 
/ "docker-examples"
 
 
 @lru_cache(maxsize=None)
-def get_latest_airflow_version_released():
+def get_latest_airflow_image():
     response = requests.get("https://pypi.org/pypi/apache-airflow/json";)
     response.raise_for_status()
-    return response.json()["info"]["version"]
+    latest_released_version = response.json()["info"]["version"]
+    return f"apache/airflow:{latest_released_version}"
 
 
 @pytest.mark.skipif(
@@ -55,10 +56,8 @@ def test_dockerfile_example(dockerfile):
     rel_dockerfile_path = Path(dockerfile).relative_to(DOCKER_EXAMPLES_DIR)
     image_name = str(rel_dockerfile_path).lower().replace("/", "-")
     content = Path(dockerfile).read_text()
-    latest_released_version: str = get_latest_airflow_version_released()
-    new_content = re.sub(
-        r"FROM apache/airflow:.*", rf"FROM 
apache/airflow:{latest_released_version}", content
-    )
+    test_image = os.environ.get("TEST_IMAGE", get_latest_airflow_image())
+    new_content = re.sub(r"FROM apache/airflow:.*", rf"FROM {test_image}", 
content)
     try:
         run_command(
             ["docker", "build", ".", "--tag", image_name, "-f", "-"],
diff --git a/docs/docker-stack/build.rst b/docs/docker-stack/build.rst
index 8cfd948979..eac84cbd57 100644
--- a/docs/docker-stack/build.rst
+++ b/docs/docker-stack/build.rst
@@ -775,6 +775,23 @@ The following example builds the production image in 
version ``3.8`` based on ``
     :end-before: [END build]
 
 
+.. _image-build-mysql:
+
+Building images with MySQL client
+.................................
+
+.. warning::
+
+  By default Airflow images as of Airflow 2.8.0 use "MariaDB" client by 
default on both "X86_64" and "ARM64"
+  platforms. However, you can also build images with MySQL client. The 
following example builds the
+  production image in default Python version with "MySQL" client.
+
+.. exampleinclude:: docker-examples/customizing/mysql-client.sh
+    :language: bash
+    :start-after: [START build]
+    :end-before: [END build]
+
+
 .. _image-build-github:
 
 
diff --git a/docs/docker-stack/changelog.rst b/docs/docker-stack/changelog.rst
index 6e77799779..509f7b64c0 100644
--- a/docs/docker-stack/changelog.rst
+++ b/docs/docker-stack/changelog.rst
@@ -55,6 +55,15 @@ Airflow 2.8
      ``apache/airflow:slim-2.8.0-python-3.8`` images respectively so while the 
change is potentially
      breaking, it is very easy to switch to the previous behaviour.
 
+   * By default the images now have "MariaDB" client installed. Previous 
images had "MySQL" client installed.
+     The MariaDB client is a drop-in replacement for "MySQL" one and is 
compatible with MySQL. This might
+     be a breaking change for users who used MySQL client in their images, 
however those should be very
+     specific cases and vast majority of users should not see any difference. 
Users can still use
+     MySQL client by setting ``INSTALL_MYSQL_CLIENT_TYPE=mysql`` build arg and 
build the custom X86 image.
+     The ARM image always uses MariaDB client, this argument is ignored. The 
"mysql" apt repository is
+     removed from the /etc/apt/sources.list.d/ and if you want to install 
anything from this repository when
+     extending the images, you need to manually add the right key and 
repository in your Dockerfile,
+     following the instructions in `A Quick Guide to Using the MySQL APT 
repository <https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/>`_.
 
 Airflow 2.7
 ~~~~~~~~~~~
@@ -260,14 +269,18 @@ that invalidates the already released image, and 
regenerating the image makes it
 While we cannot assure 100% backwards compatibility when it happens, we at 
least document it
 here so that users affected can find the reason for the changes.
 
-+--------------+---------------------+-----------------------------------------+------------------------+----------------------------------------------+
-| Date         | Affected images     | Potentially breaking change             
| Reason                 | Link to Pull Request                         |
-+==============+=====================+=========================================+========================+==============================================+
-| 17 June 2022 | 2.2.5               | * The ``Authlib`` library downgraded    
| Flask App Builder      | https://github.com/apache/airflow/pull/24516 |
-|              |                     |   from 1.0.1 to 0.15.5 version          
| not compatible with    |                                              |
-|              | 2.3.0-2.3.2         |                                         
| Authlib >= 1.0.0       |                                              |
-+--------------+---------------------+-----------------------------------------+------------------------+----------------------------------------------+
-| 18 Jan 2022  | All 2.2.\*, 2.1.\*  | * The AIRFLOW_GID 500 was removed       
| MySQL changed keys     | https://github.com/apache/airflow/pull/20912 |
-|              |                     | * MySQL ``apt`` repository key changed. 
| to sign their packages |                                              |
-|              |                     |                                         
| on 17 Jan 2022         |                                              |
-+--------------+---------------------+-----------------------------------------+------------------------+----------------------------------------------+
++--------------+---------------------+-----------------------------------------+------------------------+------------------------------------------------+
+| Date         | Affected images     | Potentially breaking change             
| Reason                 | Link to Pull Request / Issue                   |
++==============+=====================+=========================================+========================+================================================+
+| 17 June 2022 | 2.2.5               | * The ``Authlib`` library downgraded    
| Flask App Builder      | https://github.com/apache/airflow/pull/24516   |
+|              |                     |   from 1.0.1 to 0.15.5 version          
| not compatible with    |                                                |
+|              | 2.3.0-2.3.2         |                                         
| Authlib >= 1.0.0       |                                                |
++--------------+---------------------+-----------------------------------------+------------------------+------------------------------------------------+
+| 18 Jan 2022  | All 2.2.\*, 2.1.\*  | * The AIRFLOW_GID 500 was removed       
| MySQL changed keys     | https://github.com/apache/airflow/pull/20912   |
+|              |                     | * MySQL ``apt`` repository key changed. 
| to sign their packages |                                                |
+|              |                     |                                         
| on 17 Jan 2022         |                                                |
++--------------+---------------------+-----------------------------------------+------------------------+------------------------------------------------+
+| 16 Dec 2023  | All 2..\*           | * The AIRFLOW_GID 500 was removed       
| MySQL repository is    | https://github.com/apache/airflow/issues/36231 |
+|              |                     | * MySQL ``apt`` repository key changed. 
| removed after the      |                                                |
+|              |                     |                                         
| key expiry fiasco      |                                                |
++--------------+---------------------+-----------------------------------------+------------------------+------------------------------------------------+
diff --git a/docs/docker-stack/docker-examples/customizing/mysql-client.sh 
b/docs/docker-stack/docker-examples/customizing/mysql-client.sh
new file mode 100755
index 0000000000..1835e7688d
--- /dev/null
+++ b/docs/docker-stack/docker-examples/customizing/mysql-client.sh
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# This is an example docker build script. It is not intended for PRODUCTION use
+set -euo pipefail
+AIRFLOW_SOURCES="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../../" && pwd)"
+
+TEMP_DOCKER_DIR=$(mktemp -d)
+pushd "${TEMP_DOCKER_DIR}"
+
+cp "${AIRFLOW_SOURCES}/Dockerfile" "${TEMP_DOCKER_DIR}"
+
+# [START build]
+export DOCKER_BUILDKIT=1
+
+docker build . \
+    --build-arg INSTALL_MYSQL_CLIENT_TYPE="mysql" \
+    --tag "my-mysql-airflow:0.0.1"
+# [END build]
+docker rmi --force "my-mysql-airflow:0.0.1"
+popd
+rm -rf "${TEMP_DOCKER_DIR}"
diff --git a/images/breeze/output_ci-image_build.svg 
b/images/breeze/output_ci-image_build.svg
index c76c91005e..c684c1221b 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 2246.0" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 2270.4" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-ci-image-build-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="2195.0" />
+      <rect x="0" y="0" width="1463.0" height="2219.4" />
     </clipPath>
     <clipPath id="breeze-ci-image-build-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -312,9 +312,12 @@
 <clipPath id="breeze-ci-image-build-line-88">
     <rect x="0" y="2148.7" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-ci-image-build-line-89">
+    <rect x="0" y="2173.1" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="2244" rx="8"/><text 
class="breeze-ci-image-build-title" fill="#c5c8c6" text-anchor="middle" x="740" 
y="27">Command:&#160;ci-image&#160;build</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="2268.4" rx="8"/><text 
class="breeze-ci-image-build-title" fill="#c5c8c6" text-anchor="middle" x="740" 
y="27">Command:&#160;ci-image&#160;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"/>
@@ -349,71 +352,72 @@
 </text><text class="breeze-ci-image-build-r5" x="0" y="556.8" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-22)">│</text><text 
class="breeze-ci-image-build-r7" x="475.8" y="556.8" textLength="963.8" 
clip-path="url(#breeze-ci-image-build-line-22)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
 </text><text class="breeze-ci-image-build-r5" x="0" y="581.2" 
textLength="1464" 
clip-path="url(#breeze-ci-image-build-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-image-build-r1" x="1464" y="581.2" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-23)">
 </text><text class="breeze-ci-image-build-r5" x="0" y="605.6" 
textLength="24.4" 
clip-path="url(#breeze-ci-image-build-line-24)">╭─</text><text 
class="breeze-ci-image-build-r5" x="24.4" y="605.6" textLength="353.8" 
clip-path="url(#breeze-ci-image-build-line-24)">&#160;Building&#160;images&#160;in&#160;parallel&#160;</text><text
 class="breeze-ci-image-build-r5" x="378.2" y="605.6" textLength="1061.4" 
clip-path="url(#breeze-ci-image-build-line-24)">──────────────────────────────────────────
 [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="630" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-25)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="630" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-25)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="630" textLength="48.8" 
clip-path="url(#breeze-ci-image-build-line-25)">-run</text><text 
class="breeze-ci-image-build-r4" x="85.4" y="630" textLength="146.4" 
clip-path="url(#bree [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="654.4" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-26)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="654.4" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-26)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="654.4" textLength="146.4" 
clip-path="url(#breeze-ci-image-build-line-26)">-parallelism</text><text 
class="breeze-ci-image-build-r1" x="378.2" y="654.4" textLength="915" clip [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="678.8" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-27)">│</text><text 
class="breeze-ci-image-build-r7" x="378.2" y="678.8" textLength="915" 
clip-path="url(#breeze-ci-image-build-line-27)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</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-r5" x="378.2" y="703.2" textLength="915" 
clip-path="url(#breeze-ci-image-build-line-28)">[default:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="727.6" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-29)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="727.6" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-29)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="727.6" textLength="85.4" 
clip-path="url(#breeze-ci-image-build-line-29)">-python</text><text 
class="breeze-ci-image-build-r4" x="122" y="727.6" textLength="109.8" 
clip-path= [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="752" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-30)">│</text><text 
class="breeze-ci-image-build-r5" x="378.2" y="752" textLength="951.6" 
clip-path="url(#breeze-ci-image-build-line-30)">[default:&#160;3.8&#160;3.9&#160;3.10&#160;3.11]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</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="61" 
clip-path="url(#breeze-ci-image-build-line-31)">-skip</text><text 
class="breeze-ci-image-build-r4" x="97.6" y="776.4" textLength="97.6" 
clip-path="url [...]
-</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="73.2" 
clip-path="url(#breeze-ci-image-build-line-32)">-debug</text><text 
class="breeze-ci-image-build-r4" x="109.8" y="800.8" textLength="122" 
clip-path=" [...]
-</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)">-include</text><text 
class="breeze-ci-image-build-r4" x="134.2" y="825.2" textLength="195.2" clip-pa 
[...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="630" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-25)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="630" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-25)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="630" textLength="73.2" 
clip-path="url(#breeze-ci-image-build-line-25)">-debug</text><text 
class="breeze-ci-image-build-r4" x="109.8" y="630" textLength="122" 
clip-path="url(#bre [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="654.4" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-26)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="654.4" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-26)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="654.4" textLength="97.6" 
clip-path="url(#breeze-ci-image-build-line-26)">-include</text><text 
class="breeze-ci-image-build-r4" x="134.2" y="654.4" textLength="195.2" clip-pa 
[...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="678.8" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-27)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="678.8" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-27)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="678.8" textLength="146.4" 
clip-path="url(#breeze-ci-image-build-line-27)">-parallelism</text><text 
class="breeze-ci-image-build-r1" x="378.2" y="678.8" textLength="915" clip [...]
+</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-r7" x="378.2" y="703.2" textLength="915" 
clip-path="url(#breeze-ci-image-build-line-28)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="727.6" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-29)">│</text><text 
class="breeze-ci-image-build-r5" x="378.2" y="727.6" textLength="915" 
clip-path="url(#breeze-ci-image-build-line-29)">[default:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="752" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-30)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="752" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-30)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="752" textLength="85.4" 
clip-path="url(#breeze-ci-image-build-line-30)">-python</text><text 
class="breeze-ci-image-build-r4" x="122" y="752" textLength="109.8" 
clip-path="url(#br [...]
+</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-r5" x="378.2" y="776.4" textLength="951.6" 
clip-path="url(#breeze-ci-image-build-line-31)">[default:&#160;3.8&#160;3.9&#160;3.10&#160;3.11]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
+</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="48.8" 
clip-path="url(#breeze-ci-image-build-line-32)">-run</text><text 
class="breeze-ci-image-build-r4" x="85.4" y="800.8" textLength="146.4" 
clip-path="u [...]
+</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="61" 
clip-path="url(#breeze-ci-image-build-line-33)">-skip</text><text 
class="breeze-ci-image-build-r4" x="97.6" y="825.2" textLength="97.6" 
clip-path="url [...]
 </text><text class="breeze-ci-image-build-r5" x="0" y="849.6" 
textLength="1464" 
clip-path="url(#breeze-ci-image-build-line-34)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-image-build-r1" x="1464" y="849.6" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-34)">
 </text><text class="breeze-ci-image-build-r5" x="0" y="874" textLength="24.4" 
clip-path="url(#breeze-ci-image-build-line-35)">╭─</text><text 
class="breeze-ci-image-build-r5" x="24.4" y="874" textLength="512.4" 
clip-path="url(#breeze-ci-image-build-line-35)">&#160;Advanced&#160;build&#160;options&#160;(for&#160;power&#160;users)&#160;</text><text
 class="breeze-ci-image-build-r5" x="536.8" y="874" textLength="902.8" 
clip-path="url(#breeze-ci-image-build-line-35)">────────────────────────── [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="898.4" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-36)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="898.4" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-36)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="898.4" textLength="85.4" 
clip-path="url(#breeze-ci-image-build-line-36)">-debian</text><text 
class="breeze-ci-image-build-r4" x="122" y="898.4" textLength="97.6" 
clip-path=" [...]
-</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-r7" x="463.6" y="922.8" textLength="793" 
clip-path="url(#breeze-ci-image-build-line-37)">(bookworm&#160;|&#160;bullseye)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
-</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-r5" x="463.6" y="947.2" textLength="793" 
clip-path="url(#breeze-ci-image-build-line-38)">[default:&#160;bookworm]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
-</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="85.4" 
clip-path="url(#breeze-ci-image-build-line-39)">-python</text><text 
class="breeze-ci-image-build-r4" x="122" y="971.6" textLength="73.2" 
clip-path=" [...]
-</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-r1" x="463.6" y="996" textLength="976" 
clip-path="url(#breeze-ci-image-build-line-40)">something&#160;like:&#160;python:VERSION-slim-bookworm.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</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-r7" x="463.6" y="1020.4" textLength="976" 
clip-path="url(#breeze-ci-image-build-line-41)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</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="85.4" 
clip-path="url(#breeze-ci-image-build-line-42)">-commit</text><text 
class="breeze-ci-image-build-r4" x="122" y="1044.8" textLength="48.8" clip-pa 
[...]
-</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="134.2" 
clip-path="url(#breeze-ci-image-build-line-43)">-additional</text><text 
class="breeze-ci-image-build-r4" x="170.8" y="1069.2" textLength="219.6" [...]
-</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-r1" x="463.6" y="1093.6" textLength="976" 
clip-path="url(#breeze-ci-image-build-line-44)">itself).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</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)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</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="97.6" 
clip-path="url(#breeze-ci-image-build-line-46)">-install</text><text 
class="breeze-ci-image-build-r4" x="134.2" y="1142.4" textLength="280.6" cli 
[...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1166.8" 
textLength="1464" 
clip-path="url(#breeze-ci-image-build-line-47)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-image-build-r1" x="1464" y="1166.8" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-47)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="1191.2" 
textLength="24.4" 
clip-path="url(#breeze-ci-image-build-line-48)">╭─</text><text 
class="breeze-ci-image-build-r5" x="24.4" y="1191.2" textLength="597.8" 
clip-path="url(#breeze-ci-image-build-line-48)">&#160;Selecting&#160;constraint&#160;location&#160;(for&#160;power&#160;users)&#160;</text><text
 class="breeze-ci-image-build-r5" x="622.2" y="1191.2" textLength="817.4" 
clip-path="url(#breeze-ci-image-build-line-48)">────────── [...]
-</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="97.6" 
clip-path="url(#breeze-ci-image-build-line-49)">-airflow</text><text 
class="breeze-ci-image-build-r4" x="134.2" y="1215.6" textLength="256.2" cli 
[...]
-</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="97.6" 
clip-path="url(#breeze-ci-image-build-line-50)">-airflow</text><text 
class="breeze-ci-image-build-r4" x="134.2" y="1240" textLength="207.4" 
clip-path=" [...]
-</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-r7" x="451.4" y="1264.4" textLength="866.2" 
clip-path="url(#breeze-ci-image-build-line-51)">(constraints-source-providers&#160;|&#160;constraints&#160;|&#160;constraints-no-providers)</text><text
 class="breeze-ci-image-build-r5" x="1451.8" y="1264.4" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-51)">│</ [...]
-</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-r5" x="451.4" y="1288.8" textLength="866.2" 
clip-path="url(#breeze-ci-image-build-line-52)">[default:&#160;constraints-source-providers]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
-</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="97.6" 
clip-path="url(#breeze-ci-image-build-line-53)">-airflow</text><text 
class="breeze-ci-image-build-r4" x="134.2" y="1313.2" textLength="268.4" cli 
[...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1337.6" 
textLength="1464" 
clip-path="url(#breeze-ci-image-build-line-54)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-image-build-r1" x="1464" y="1337.6" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-54)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="1362" textLength="24.4" 
clip-path="url(#breeze-ci-image-build-line-55)">╭─</text><text 
class="breeze-ci-image-build-r5" x="24.4" y="1362" textLength="634.4" 
clip-path="url(#breeze-ci-image-build-line-55)">&#160;Choosing&#160;dependencies&#160;and&#160;extras&#160;(for&#160;power&#160;users)&#160;</text><text
 class="breeze-ci-image-build-r5" x="658.8" y="1362" textLength="780.8" 
clip-path="url(#breeze-ci-image-build-line-55)">──────── [...]
-</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="134.2" 
clip-path="url(#breeze-ci-image-build-line-56)">-additional</text><text 
class="breeze-ci-image-build-r4" x="170.8" y="1386.4" textLength="183" c [...]
-</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="134.2" 
clip-path="url(#breeze-ci-image-build-line-57)">-additional</text><text 
class="breeze-ci-image-build-r4" x="170.8" y="1410.8" textLength="146.4" [...]
-</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="48.8" 
clip-path="url(#breeze-ci-image-build-line-58)">-dev</text><text 
class="breeze-ci-image-build-r4" x="85.4" y="1435.2" textLength="109.8" 
clip-pat [...]
-</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-r4" x="24.4" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-59)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="1459.6" textLength="134.2" 
clip-path="url(#breeze-ci-image-build-line-59)">-additional</text><text 
class="breeze-ci-image-build-r4" x="170.8" y="1459.6" textLength="158.6" [...]
-</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="48.8" 
clip-path="url(#breeze-ci-image-build-line-60)">-dev</text><text 
class="breeze-ci-image-build-r4" x="85.4" y="1484" textLength="146.4" 
clip-path="url(# [...]
-</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="134.2" 
clip-path="url(#breeze-ci-image-build-line-61)">-additional</text><text 
class="breeze-ci-image-build-r4" x="170.8" y="1508.4" textLength="195.2" [...]
-</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="134.2" 
clip-path="url(#breeze-ci-image-build-line-62)">-additional</text><text 
class="breeze-ci-image-build-r4" x="170.8" y="1532.8" textLength="146.4" [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1557.2" 
textLength="1464" 
clip-path="url(#breeze-ci-image-build-line-63)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-image-build-r1" x="1464" y="1557.2" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-63)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="1581.6" 
textLength="24.4" 
clip-path="url(#breeze-ci-image-build-line-64)">╭─</text><text 
class="breeze-ci-image-build-r5" x="24.4" y="1581.6" textLength="268.4" 
clip-path="url(#breeze-ci-image-build-line-64)">&#160;Backtracking&#160;options&#160;</text><text
 class="breeze-ci-image-build-r5" x="292.8" y="1581.6" textLength="1146.8" 
clip-path="url(#breeze-ci-image-build-line-64)">────────────────────────────────────────────────────────
 [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1606" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-65)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="1606" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-65)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="1606" textLength="73.2" 
clip-path="url(#breeze-ci-image-build-line-65)">-build</text><text 
class="breeze-ci-image-build-r4" x="109.8" y="1606" textLength="195.2" 
clip-path="ur [...]
-</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-r1" x="549" y="1630.4" textLength="890.6" 
clip-path="url(#breeze-ci-image-build-line-66)">backtracking&#160;problems.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
-</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-r7" x="549" y="1654.8" textLength="890.6" 
clip-path="url(#breeze-ci-image-build-line-67)">(INTEGER)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
-</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="73.2" 
clip-path="url(#breeze-ci-image-build-line-68)">-eager</text><text 
class="breeze-ci-image-build-r4" x="109.8" y="1679.2" textLength="390.4" clip- 
[...]
-</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-r1" x="549" y="1703.6" textLength="890.6" 
clip-path="url(#breeze-ci-image-build-line-69)">(see&#160;`breeze&#160;ci&#160;find-backtracking-candidates`).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1728" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-70)">│</text><text 
class="breeze-ci-image-build-r7" x="549" y="1728" textLength="890.6" 
clip-path="url(#breeze-ci-image-build-line-70)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1752.4" 
textLength="1464" 
clip-path="url(#breeze-ci-image-build-line-71)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-image-build-r1" x="1464" y="1752.4" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-71)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="1776.8" 
textLength="24.4" 
clip-path="url(#breeze-ci-image-build-line-72)">╭─</text><text 
class="breeze-ci-image-build-r5" x="24.4" y="1776.8" textLength="622.2" 
clip-path="url(#breeze-ci-image-build-line-72)">&#160;Preparing&#160;cache&#160;and&#160;push&#160;(for&#160;maintainers&#160;and&#160;CI)&#160;</text><text
 class="breeze-ci-image-build-r5" x="646.6" y="1776.8" textLength="793" 
clip-path="url(#breeze-ci-image-build-line-72)"> [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1801.2" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-73)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="1801.2" textLength="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="97.6" 
clip-path="url(#breeze-ci-image-build-line-73)">-builder</text><text 
class="breeze-ci-image-build-r1" x="341.6" y="1801.2" textLength="756.4" cli 
[...]
-</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-r5" x="341.6" y="1825.6" textLength="756.4" 
clip-path="url(#breeze-ci-image-build-line-74)">[default:&#160;autodetect]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1850" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-75)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="1850" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-75)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="1850" textLength="109.8" 
clip-path="url(#breeze-ci-image-build-line-75)">-platform</text><text 
class="breeze-ci-image-build-r1" x="341.6" y="1850" textLength="329.4" 
clip-path [...]
-</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="61" 
clip-path="url(#breeze-ci-image-build-line-76)">-push</text><text 
class="breeze-ci-image-build-r1" x="341.6" y="1874.4" textLength="353.8" 
clip-pat [...]
-</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="97.6" 
clip-path="url(#breeze-ci-image-build-line-77)">-prepare</text><text 
class="breeze-ci-image-build-r4" x="134.2" y="1898.8" textLength="158.6" cli 
[...]
-</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-r1" x="341.6" y="1923.2" textLength="1098" 
clip-path="url(#breeze-ci-image-build-line-78)">image).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1947.6" 
textLength="1464" 
clip-path="url(#breeze-ci-image-build-line-79)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-image-build-r1" x="1464" y="1947.6" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-79)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="1972" textLength="24.4" 
clip-path="url(#breeze-ci-image-build-line-80)">╭─</text><text 
class="breeze-ci-image-build-r5" x="24.4" y="1972" textLength="280.6" 
clip-path="url(#breeze-ci-image-build-line-80)">&#160;Github&#160;authentication&#160;</text><text
 class="breeze-ci-image-build-r5" x="305" y="1972" textLength="1134.6" 
clip-path="url(#breeze-ci-image-build-line-80)">───────────────────────────────────────────────────────────────
 [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="1996.4" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-81)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="1996.4" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-81)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="1996.4" textLength="85.4" 
clip-path="url(#breeze-ci-image-build-line-81)">-github</text><text 
class="breeze-ci-image-build-r4" x="122" y="1996.4" textLength="134.2" clip-p 
[...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2020.8" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-82)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="2020.8" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-82)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="2020.8" textLength="85.4" 
clip-path="url(#breeze-ci-image-build-line-82)">-github</text><text 
class="breeze-ci-image-build-r4" x="122" y="2020.8" textLength="73.2" clip-pa 
[...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2045.2" 
textLength="1464" 
clip-path="url(#breeze-ci-image-build-line-83)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-image-build-r1" x="1464" y="2045.2" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-83)">
-</text><text class="breeze-ci-image-build-r5" x="0" y="2069.6" 
textLength="24.4" 
clip-path="url(#breeze-ci-image-build-line-84)">╭─</text><text 
class="breeze-ci-image-build-r5" x="24.4" y="2069.6" textLength="195.2" 
clip-path="url(#breeze-ci-image-build-line-84)">&#160;Common&#160;options&#160;</text><text
 class="breeze-ci-image-build-r5" x="219.6" y="2069.6" textLength="1220" 
clip-path="url(#breeze-ci-image-build-line-84)">────────────────────────────────────────────────────────────────
 [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2094" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-85)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="2094" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-85)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="2094" textLength="85.4" 
clip-path="url(#breeze-ci-image-build-line-85)">-answer</text><text 
class="breeze-ci-image-build-r6" x="158.6" y="2094" textLength="24.4" 
clip-path="ur [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2118.4" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-86)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="2118.4" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-86)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="2118.4" textLength="48.8" 
clip-path="url(#breeze-ci-image-build-line-86)">-dry</text><text 
class="breeze-ci-image-build-r4" x="85.4" y="2118.4" textLength="48.8" 
clip-path [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2142.8" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-87)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="2142.8" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-87)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="2142.8" textLength="97.6" 
clip-path="url(#breeze-ci-image-build-line-87)">-verbose</text><text 
class="breeze-ci-image-build-r6" x="158.6" y="2142.8" textLength="24.4" clip 
[...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2167.2" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-88)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="2167.2" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-88)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="2167.2" textLength="61" 
clip-path="url(#breeze-ci-image-build-line-88)">-help</text><text 
class="breeze-ci-image-build-r6" x="158.6" y="2167.2" textLength="24.4" 
clip-path [...]
-</text><text class="breeze-ci-image-build-r5" x="0" y="2191.6" 
textLength="1464" 
clip-path="url(#breeze-ci-image-build-line-89)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-image-build-r1" x="1464" y="2191.6" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-89)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="898.4" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-36)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="898.4" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-36)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="898.4" textLength="134.2" 
clip-path="url(#breeze-ci-image-build-line-36)">-additional</text><text 
class="breeze-ci-image-build-r4" x="170.8" y="898.4" textLength="219.6" cli 
[...]
+</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-r1" x="463.6" y="922.8" textLength="976" 
clip-path="url(#breeze-ci-image-build-line-37)">itself).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
+</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)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</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="85.4" 
clip-path="url(#breeze-ci-image-build-line-39)">-commit</text><text 
class="breeze-ci-image-build-r4" x="122" y="971.6" textLength="48.8" 
clip-path=" [...]
+</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="85.4" 
clip-path="url(#breeze-ci-image-build-line-40)">-debian</text><text 
class="breeze-ci-image-build-r4" x="122" y="996" textLength="97.6" 
clip-path="url(#bre [...]
+</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-r7" x="463.6" y="1020.4" textLength="793" 
clip-path="url(#breeze-ci-image-build-line-41)">(bookworm&#160;|&#160;bullseye)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1044.8" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-42)">│</text><text 
class="breeze-ci-image-build-r5" x="463.6" y="1044.8" textLength="793" 
clip-path="url(#breeze-ci-image-build-line-42)">[default:&#160;bookworm]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
+</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="97.6" 
clip-path="url(#breeze-ci-image-build-line-43)">-install</text><text 
class="breeze-ci-image-build-r4" x="134.2" y="1069.2" textLength="158.6" cli 
[...]
+</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="97.6" 
clip-path="url(#breeze-ci-image-build-line-44)">-install</text><text 
class="breeze-ci-image-build-r4" x="134.2" y="1093.6" textLength="280.6" cli 
[...]
+</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="85.4" 
clip-path="url(#breeze-ci-image-build-line-45)">-python</text><text 
class="breeze-ci-image-build-r4" x="122" y="1118" textLength="73.2" 
clip-path="url( [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1142.4" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-46)">│</text><text 
class="breeze-ci-image-build-r1" x="463.6" y="1142.4" textLength="976" 
clip-path="url(#breeze-ci-image-build-line-46)">something&#160;like:&#160;python:VERSION-slim-bookworm.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1166.8" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-47)">│</text><text 
class="breeze-ci-image-build-r7" x="463.6" y="1166.8" textLength="976" 
clip-path="url(#breeze-ci-image-build-line-47)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1191.2" 
textLength="1464" 
clip-path="url(#breeze-ci-image-build-line-48)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-image-build-r1" x="1464" y="1191.2" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-48)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="1215.6" 
textLength="24.4" 
clip-path="url(#breeze-ci-image-build-line-49)">╭─</text><text 
class="breeze-ci-image-build-r5" x="24.4" y="1215.6" textLength="597.8" 
clip-path="url(#breeze-ci-image-build-line-49)">&#160;Selecting&#160;constraint&#160;location&#160;(for&#160;power&#160;users)&#160;</text><text
 class="breeze-ci-image-build-r5" x="622.2" y="1215.6" textLength="817.4" 
clip-path="url(#breeze-ci-image-build-line-49)">────────── [...]
+</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="97.6" 
clip-path="url(#breeze-ci-image-build-line-50)">-airflow</text><text 
class="breeze-ci-image-build-r4" x="134.2" y="1240" textLength="256.2" 
clip-path=" [...]
+</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="97.6" 
clip-path="url(#breeze-ci-image-build-line-51)">-airflow</text><text 
class="breeze-ci-image-build-r4" x="134.2" y="1264.4" textLength="207.4" cli 
[...]
+</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-r7" x="451.4" y="1288.8" textLength="866.2" 
clip-path="url(#breeze-ci-image-build-line-52)">(constraints-source-providers&#160;|&#160;constraints&#160;|&#160;constraints-no-providers)</text><text
 class="breeze-ci-image-build-r5" x="1451.8" y="1288.8" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-52)">│</ [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1313.2" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-53)">│</text><text 
class="breeze-ci-image-build-r5" x="451.4" y="1313.2" textLength="866.2" 
clip-path="url(#breeze-ci-image-build-line-53)">[default:&#160;constraints-source-providers]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</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)">-airflow</text><text 
class="breeze-ci-image-build-r4" x="134.2" y="1337.6" textLength="268.4" cli 
[...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1362" textLength="1464" 
clip-path="url(#breeze-ci-image-build-line-55)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-image-build-r1" x="1464" y="1362" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-55)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="1386.4" 
textLength="24.4" 
clip-path="url(#breeze-ci-image-build-line-56)">╭─</text><text 
class="breeze-ci-image-build-r5" x="24.4" y="1386.4" textLength="634.4" 
clip-path="url(#breeze-ci-image-build-line-56)">&#160;Choosing&#160;dependencies&#160;and&#160;extras&#160;(for&#160;power&#160;users)&#160;</text><text
 class="breeze-ci-image-build-r5" x="658.8" y="1386.4" textLength="780.8" 
clip-path="url(#breeze-ci-image-build-line-56)">── [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1410.8" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-57)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="1410.8" textLength="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="134.2" 
clip-path="url(#breeze-ci-image-build-line-57)">-additional</text><text 
class="breeze-ci-image-build-r4" x="170.8" y="1410.8" textLength="183" c [...]
+</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="134.2" 
clip-path="url(#breeze-ci-image-build-line-58)">-additional</text><text 
class="breeze-ci-image-build-r4" x="170.8" y="1435.2" textLength="146.4" [...]
+</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-r4" x="24.4" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-59)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="1459.6" textLength="48.8" 
clip-path="url(#breeze-ci-image-build-line-59)">-dev</text><text 
class="breeze-ci-image-build-r4" x="85.4" y="1459.6" textLength="109.8" 
clip-pat [...]
+</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="134.2" 
clip-path="url(#breeze-ci-image-build-line-60)">-additional</text><text 
class="breeze-ci-image-build-r4" x="170.8" y="1484" textLength="158.6" clip-pa 
[...]
+</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="48.8" 
clip-path="url(#breeze-ci-image-build-line-61)">-dev</text><text 
class="breeze-ci-image-build-r4" x="85.4" y="1508.4" textLength="146.4" 
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="134.2" 
clip-path="url(#breeze-ci-image-build-line-62)">-additional</text><text 
class="breeze-ci-image-build-r4" x="170.8" y="1532.8" textLength="195.2" [...]
+</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="134.2" 
clip-path="url(#breeze-ci-image-build-line-63)">-additional</text><text 
class="breeze-ci-image-build-r4" x="170.8" y="1557.2" textLength="146.4" [...]
+</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-r1" 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="268.4" 
clip-path="url(#breeze-ci-image-build-line-65)">&#160;Backtracking&#160;options&#160;</text><text
 class="breeze-ci-image-build-r5" x="292.8" y="1606" textLength="1146.8" 
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="73.2" 
clip-path="url(#breeze-ci-image-build-line-66)">-build</text><text 
class="breeze-ci-image-build-r4" x="109.8" y="1630.4" textLength="195.2" clip- 
[...]
+</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-r1" x="549" y="1654.8" textLength="890.6" 
clip-path="url(#breeze-ci-image-build-line-67)">backtracking&#160;problems.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</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-r7" x="549" y="1679.2" textLength="890.6" 
clip-path="url(#breeze-ci-image-build-line-68)">(INTEGER)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1703.6" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-69)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="1703.6" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-69)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="1703.6" textLength="73.2" 
clip-path="url(#breeze-ci-image-build-line-69)">-eager</text><text 
class="breeze-ci-image-build-r4" x="109.8" y="1703.6" textLength="390.4" clip- 
[...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1728" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-70)">│</text><text 
class="breeze-ci-image-build-r1" x="549" y="1728" textLength="890.6" 
clip-path="url(#breeze-ci-image-build-line-70)">(see&#160;`breeze&#160;ci&#160;find-backtracking-candidates`).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 cla [...]
+</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-r7" x="549" y="1752.4" textLength="890.6" 
clip-path="url(#breeze-ci-image-build-line-71)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1776.8" 
textLength="1464" 
clip-path="url(#breeze-ci-image-build-line-72)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-image-build-r1" x="1464" y="1776.8" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-72)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="1801.2" 
textLength="24.4" 
clip-path="url(#breeze-ci-image-build-line-73)">╭─</text><text 
class="breeze-ci-image-build-r5" x="24.4" y="1801.2" textLength="622.2" 
clip-path="url(#breeze-ci-image-build-line-73)">&#160;Preparing&#160;cache&#160;and&#160;push&#160;(for&#160;maintainers&#160;and&#160;CI)&#160;</text><text
 class="breeze-ci-image-build-r5" x="646.6" y="1801.2" textLength="793" 
clip-path="url(#breeze-ci-image-build-line-73)"> [...]
+</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="97.6" 
clip-path="url(#breeze-ci-image-build-line-74)">-builder</text><text 
class="breeze-ci-image-build-r1" x="341.6" y="1825.6" textLength="756.4" cli 
[...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="1850" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-75)">│</text><text 
class="breeze-ci-image-build-r5" x="341.6" y="1850" textLength="756.4" 
clip-path="url(#breeze-ci-image-build-line-75)">[default:&#160;autodetect]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
+</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="109.8" 
clip-path="url(#breeze-ci-image-build-line-76)">-platform</text><text 
class="breeze-ci-image-build-r1" x="341.6" y="1874.4" textLength="329.4" c [...]
+</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="61" 
clip-path="url(#breeze-ci-image-build-line-77)">-push</text><text 
class="breeze-ci-image-build-r1" x="341.6" y="1898.8" textLength="353.8" 
clip-pat [...]
+</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="97.6" 
clip-path="url(#breeze-ci-image-build-line-78)">-prepare</text><text 
class="breeze-ci-image-build-r4" x="134.2" y="1923.2" textLength="158.6" cli 
[...]
+</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-r1" x="341.6" y="1947.6" textLength="1098" 
clip-path="url(#breeze-ci-image-build-line-79)">image).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
+</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-r1" x="1464" y="1972" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-80)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="1996.4" 
textLength="24.4" 
clip-path="url(#breeze-ci-image-build-line-81)">╭─</text><text 
class="breeze-ci-image-build-r5" x="24.4" y="1996.4" textLength="280.6" 
clip-path="url(#breeze-ci-image-build-line-81)">&#160;Github&#160;authentication&#160;</text><text
 class="breeze-ci-image-build-r5" x="305" y="1996.4" textLength="1134.6" 
clip-path="url(#breeze-ci-image-build-line-81)">─────────────────────────────────────────────────────────
 [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2020.8" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-82)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="2020.8" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-82)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="2020.8" textLength="85.4" 
clip-path="url(#breeze-ci-image-build-line-82)">-github</text><text 
class="breeze-ci-image-build-r4" x="122" y="2020.8" textLength="134.2" clip-p 
[...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2045.2" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-83)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="2045.2" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-83)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="2045.2" textLength="85.4" 
clip-path="url(#breeze-ci-image-build-line-83)">-github</text><text 
class="breeze-ci-image-build-r4" x="122" y="2045.2" textLength="73.2" clip-pa 
[...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2069.6" 
textLength="1464" 
clip-path="url(#breeze-ci-image-build-line-84)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-image-build-r1" x="1464" y="2069.6" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-84)">
+</text><text class="breeze-ci-image-build-r5" x="0" y="2094" textLength="24.4" 
clip-path="url(#breeze-ci-image-build-line-85)">╭─</text><text 
class="breeze-ci-image-build-r5" x="24.4" y="2094" textLength="195.2" 
clip-path="url(#breeze-ci-image-build-line-85)">&#160;Common&#160;options&#160;</text><text
 class="breeze-ci-image-build-r5" x="219.6" y="2094" textLength="1220" 
clip-path="url(#breeze-ci-image-build-line-85)">──────────────────────────────────────────────────────────────────────
 [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2118.4" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-86)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="2118.4" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-86)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="2118.4" textLength="85.4" 
clip-path="url(#breeze-ci-image-build-line-86)">-answer</text><text 
class="breeze-ci-image-build-r6" x="158.6" y="2118.4" textLength="24.4" clip- 
[...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2142.8" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-87)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="2142.8" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-87)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="2142.8" textLength="48.8" 
clip-path="url(#breeze-ci-image-build-line-87)">-dry</text><text 
class="breeze-ci-image-build-r4" x="85.4" y="2142.8" textLength="48.8" 
clip-path [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2167.2" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-88)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="2167.2" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-88)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="2167.2" textLength="97.6" 
clip-path="url(#breeze-ci-image-build-line-88)">-verbose</text><text 
class="breeze-ci-image-build-r6" x="158.6" y="2167.2" textLength="24.4" clip 
[...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2191.6" 
textLength="12.2" clip-path="url(#breeze-ci-image-build-line-89)">│</text><text 
class="breeze-ci-image-build-r4" x="24.4" y="2191.6" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-89)">-</text><text 
class="breeze-ci-image-build-r4" x="36.6" y="2191.6" textLength="61" 
clip-path="url(#breeze-ci-image-build-line-89)">-help</text><text 
class="breeze-ci-image-build-r6" x="158.6" y="2191.6" textLength="24.4" 
clip-path [...]
+</text><text class="breeze-ci-image-build-r5" x="0" y="2216" textLength="1464" 
clip-path="url(#breeze-ci-image-build-line-90)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-image-build-r1" x="1464" y="2216" textLength="12.2" 
clip-path="url(#breeze-ci-image-build-line-90)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_ci-image_build.txt 
b/images/breeze/output_ci-image_build.txt
index ef0bd73071..434cf76f33 100644
--- a/images/breeze/output_ci-image_build.txt
+++ b/images/breeze/output_ci-image_build.txt
@@ -1 +1 @@
-6a130b347fa7137782ee7e0c6287c6a1
+c087bd6775a33b9caea7efeb48fcbe37
diff --git a/images/breeze/output_prod-image_build.svg 
b/images/breeze/output_prod-image_build.svg
index 213e56bd2e..33c4ca7239 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 2538.7999999999997" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 2563.2" 
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="2487.7999999999997" />
+      <rect x="0" y="0" width="1463.0" height="2512.2" />
     </clipPath>
     <clipPath id="breeze-prod-image-build-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -348,9 +348,12 @@
 <clipPath id="breeze-prod-image-build-line-100">
     <rect x="0" y="2441.5" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-prod-image-build-line-101">
+    <rect x="0" y="2465.9" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="2536.8" rx="8"/><text 
class="breeze-prod-image-build-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;prod-image&#160;build</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="2561.2" rx="8"/><text 
class="breeze-prod-image-build-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;prod-image&#160;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"/>
@@ -435,33 +438,34 @@
 </text><text class="breeze-prod-image-build-r5" x="0" y="1776.8" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-72)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="1776.8" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-72)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="1776.8" textLength="97.6" 
clip-path="url(#breeze-prod-image-build-line-72)">-install</text><text 
class="breeze-prod-image-build-r4" x="134.2" y="1776.8" textLeng [...]
 </text><text class="breeze-prod-image-build-r5" x="0" y="1801.2" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-73)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="1801.2" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-73)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="1801.2" textLength="97.6" 
clip-path="url(#breeze-prod-image-build-line-73)">-install</text><text 
class="breeze-prod-image-build-r4" x="134.2" y="1801.2" textLeng [...]
 </text><text class="breeze-prod-image-build-r5" x="0" y="1825.6" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-74)">│</text><text 
class="breeze-prod-image-build-r1" x="536.8" y="1825.6" textLength="97.6" 
clip-path="url(#breeze-prod-image-build-line-74)">Implies&#160;</text><text 
class="breeze-prod-image-build-r4" x="634.4" y="1825.6" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-74)">-</text><text 
class="breeze-prod-image-build-r4" x="646.6" y="1825.6" t [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1850" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-75)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="1850" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-75)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="1850" textLength="97.6" 
clip-path="url(#breeze-prod-image-build-line-75)">-cleanup</text><text 
class="breeze-prod-image-build-r4" x="134.2" y="1850" textLength="97.6 [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1874.4" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-76)">│</text><text 
class="breeze-prod-image-build-r1" x="536.8" y="1874.4" textLength="170.8" 
clip-path="url(#breeze-prod-image-build-line-76)">together&#160;with&#160;</text><text
 class="breeze-prod-image-build-r4" x="707.6" y="1874.4" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-76)">-</text><text 
class="breeze-prod-image-build-r4" x="719.8"  [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1898.8" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-77)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="1898.8" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-77)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="1898.8" textLength="48.8" 
clip-path="url(#breeze-prod-image-build-line-77)">-use</text><text 
class="breeze-prod-image-build-r4" x="85.4" y="1898.8" textLength="4 [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1923.2" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-78)">│</text><text 
class="breeze-prod-image-build-r1" x="536.8" y="1923.2" textLength="902.8" 
clip-path="url(#breeze-prod-image-build-line-78)">constraints&#160;store&#160;in&#160;docker-context-files&#160;or&#160;from&#160;github.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-prod [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1947.6" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-79)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="1947.6" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-79)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="1947.6" textLength="97.6" 
clip-path="url(#breeze-prod-image-build-line-79)">-disable</text><text 
class="breeze-prod-image-build-r4" x="134.2" y="1947.6" textLeng [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="1972" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-80)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="1972" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-80)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="1972" textLength="97.6" 
clip-path="url(#breeze-prod-image-build-line-80)">-disable</text><text 
class="breeze-prod-image-build-r4" x="134.2" y="1972" textLength="317. [...]
-</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="97.6" 
clip-path="url(#breeze-prod-image-build-line-81)">-disable</text><text 
class="breeze-prod-image-build-r4" x="134.2" y="1996.4" textLeng [...]
-</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="97.6" 
clip-path="url(#breeze-prod-image-build-line-82)">-disable</text><text 
class="breeze-prod-image-build-r4" x="134.2" y="2020.8" textLeng [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2045.2" 
textLength="1464" 
clip-path="url(#breeze-prod-image-build-line-83)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-prod-image-build-r1" x="1464" y="2045.2" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-83)">
-</text><text class="breeze-prod-image-build-r5" x="0" y="2069.6" 
textLength="24.4" 
clip-path="url(#breeze-prod-image-build-line-84)">╭─</text><text 
class="breeze-prod-image-build-r5" x="24.4" y="2069.6" textLength="622.2" 
clip-path="url(#breeze-prod-image-build-line-84)">&#160;Preparing&#160;cache&#160;and&#160;push&#160;(for&#160;maintainers&#160;and&#160;CI)&#160;</text><text
 class="breeze-prod-image-build-r5" x="646.6" y="2069.6" textLength="793" 
clip-path="url(#breeze-prod-image-buil [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2094" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-85)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="2094" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-85)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="2094" textLength="97.6" 
clip-path="url(#breeze-prod-image-build-line-85)">-builder</text><text 
class="breeze-prod-image-build-r1" x="341.6" y="2094" textLength="756. [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2118.4" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-86)">│</text><text 
class="breeze-prod-image-build-r5" x="341.6" y="2118.4" textLength="756.4" 
clip-path="url(#breeze-prod-image-build-line-86)">[default:&#160;autodetect]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</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="109.8" 
clip-path="url(#breeze-prod-image-build-line-87)">-platform</text><text 
class="breeze-prod-image-build-r1" x="341.6" y="2142.8" textLe [...]
-</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="61" 
clip-path="url(#breeze-prod-image-build-line-88)">-push</text><text 
class="breeze-prod-image-build-r1" x="341.6" y="2167.2" textLength="3 [...]
-</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="97.6" 
clip-path="url(#breeze-prod-image-build-line-89)">-prepare</text><text 
class="breeze-prod-image-build-r4" x="134.2" y="2191.6" textLeng [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2216" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-90)">│</text><text 
class="breeze-prod-image-build-r1" x="341.6" y="2216" textLength="1098" 
clip-path="url(#breeze-prod-image-build-line-90)">image).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2240.4" 
textLength="1464" 
clip-path="url(#breeze-prod-image-build-line-91)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-prod-image-build-r1" x="1464" y="2240.4" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-91)">
-</text><text class="breeze-prod-image-build-r5" x="0" y="2264.8" 
textLength="24.4" 
clip-path="url(#breeze-prod-image-build-line-92)">╭─</text><text 
class="breeze-prod-image-build-r5" x="24.4" y="2264.8" textLength="280.6" 
clip-path="url(#breeze-prod-image-build-line-92)">&#160;Github&#160;authentication&#160;</text><text
 class="breeze-prod-image-build-r5" x="305" y="2264.8" textLength="1134.6" 
clip-path="url(#breeze-prod-image-build-line-92)">─────────────────────────────────────────────
 [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2289.2" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-93)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="2289.2" textLength="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="85.4" 
clip-path="url(#breeze-prod-image-build-line-93)">-github</text><text 
class="breeze-prod-image-build-r4" x="122" y="2289.2" textLength= [...]
-</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="85.4" 
clip-path="url(#breeze-prod-image-build-line-94)">-github</text><text 
class="breeze-prod-image-build-r4" x="122" y="2313.6" textLength= [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2338" 
textLength="1464" 
clip-path="url(#breeze-prod-image-build-line-95)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-prod-image-build-r1" x="1464" y="2338" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-95)">
-</text><text class="breeze-prod-image-build-r5" x="0" y="2362.4" 
textLength="24.4" 
clip-path="url(#breeze-prod-image-build-line-96)">╭─</text><text 
class="breeze-prod-image-build-r5" x="24.4" y="2362.4" textLength="195.2" 
clip-path="url(#breeze-prod-image-build-line-96)">&#160;Common&#160;options&#160;</text><text
 class="breeze-prod-image-build-r5" x="219.6" y="2362.4" textLength="1220" 
clip-path="url(#breeze-prod-image-build-line-96)">────────────────────────────────────────────────────
 [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2386.8" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-97)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="2386.8" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-97)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="2386.8" textLength="85.4" 
clip-path="url(#breeze-prod-image-build-line-97)">-answer</text><text 
class="breeze-prod-image-build-r6" x="158.6" y="2386.8" textLengt [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2411.2" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-98)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="2411.2" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-98)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="2411.2" textLength="48.8" 
clip-path="url(#breeze-prod-image-build-line-98)">-dry</text><text 
class="breeze-prod-image-build-r4" x="85.4" y="2411.2" textLength="4 [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2435.6" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-99)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="2435.6" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-99)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="2435.6" textLength="97.6" 
clip-path="url(#breeze-prod-image-build-line-99)">-verbose</text><text 
class="breeze-prod-image-build-r6" x="158.6" y="2435.6" textLeng [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2460" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-100)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="2460" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-100)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="2460" textLength="61" 
clip-path="url(#breeze-prod-image-build-line-100)">-help</text><text 
class="breeze-prod-image-build-r6" x="158.6" y="2460" textLength="24.4"  [...]
-</text><text class="breeze-prod-image-build-r5" x="0" y="2484.4" 
textLength="1464" 
clip-path="url(#breeze-prod-image-build-line-101)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-prod-image-build-r1" x="1464" y="2484.4" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-101)">
+</text><text class="breeze-prod-image-build-r5" x="0" y="1850" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-75)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="1850" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-75)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="1850" textLength="97.6" 
clip-path="url(#breeze-prod-image-build-line-75)">-install</text><text 
class="breeze-prod-image-build-r4" x="134.2" y="1850" textLength="158. [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1874.4" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-76)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="1874.4" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-76)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="1874.4" textLength="97.6" 
clip-path="url(#breeze-prod-image-build-line-76)">-cleanup</text><text 
class="breeze-prod-image-build-r4" x="134.2" y="1874.4" textLeng [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1898.8" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-77)">│</text><text 
class="breeze-prod-image-build-r1" x="536.8" y="1898.8" textLength="170.8" 
clip-path="url(#breeze-prod-image-build-line-77)">together&#160;with&#160;</text><text
 class="breeze-prod-image-build-r4" x="707.6" y="1898.8" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-77)">-</text><text 
class="breeze-prod-image-build-r4" x="719.8"  [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1923.2" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-78)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="1923.2" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-78)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="1923.2" textLength="48.8" 
clip-path="url(#breeze-prod-image-build-line-78)">-use</text><text 
class="breeze-prod-image-build-r4" x="85.4" y="1923.2" textLength="4 [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1947.6" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-79)">│</text><text 
class="breeze-prod-image-build-r1" x="536.8" y="1947.6" textLength="902.8" 
clip-path="url(#breeze-prod-image-build-line-79)">constraints&#160;store&#160;in&#160;docker-context-files&#160;or&#160;from&#160;github.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-prod [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="1972" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-80)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="1972" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-80)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="1972" textLength="97.6" 
clip-path="url(#breeze-prod-image-build-line-80)">-disable</text><text 
class="breeze-prod-image-build-r4" x="134.2" y="1972" textLength="231. [...]
+</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="97.6" 
clip-path="url(#breeze-prod-image-build-line-81)">-disable</text><text 
class="breeze-prod-image-build-r4" x="134.2" y="1996.4" textLeng [...]
+</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="97.6" 
clip-path="url(#breeze-prod-image-build-line-82)">-disable</text><text 
class="breeze-prod-image-build-r4" x="134.2" y="2020.8" textLeng [...]
+</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)">-disable</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="1464" 
clip-path="url(#breeze-prod-image-build-line-84)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-prod-image-build-r1" x="1464" y="2069.6" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-84)">
+</text><text class="breeze-prod-image-build-r5" x="0" y="2094" 
textLength="24.4" 
clip-path="url(#breeze-prod-image-build-line-85)">╭─</text><text 
class="breeze-prod-image-build-r5" x="24.4" y="2094" textLength="622.2" 
clip-path="url(#breeze-prod-image-build-line-85)">&#160;Preparing&#160;cache&#160;and&#160;push&#160;(for&#160;maintainers&#160;and&#160;CI)&#160;</text><text
 class="breeze-prod-image-build-r5" x="646.6" y="2094" textLength="793" 
clip-path="url(#breeze-prod-image-build-line [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2118.4" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-86)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="2118.4" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-86)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="2118.4" textLength="97.6" 
clip-path="url(#breeze-prod-image-build-line-86)">-builder</text><text 
class="breeze-prod-image-build-r1" x="341.6" y="2118.4" textLeng [...]
+</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-r5" x="341.6" y="2142.8" textLength="756.4" 
clip-path="url(#breeze-prod-image-build-line-87)">[default:&#160;autodetect]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
+</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="109.8" 
clip-path="url(#breeze-prod-image-build-line-88)">-platform</text><text 
class="breeze-prod-image-build-r1" x="341.6" y="2167.2" textLe [...]
+</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="61" 
clip-path="url(#breeze-prod-image-build-line-89)">-push</text><text 
class="breeze-prod-image-build-r1" x="341.6" y="2191.6" textLength="3 [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2216" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-90)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="2216" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-90)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="2216" textLength="97.6" 
clip-path="url(#breeze-prod-image-build-line-90)">-prepare</text><text 
class="breeze-prod-image-build-r4" x="134.2" y="2216" textLength="158. [...]
+</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-r1" x="341.6" y="2240.4" textLength="1098" 
clip-path="url(#breeze-prod-image-build-line-91)">image).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2264.8" 
textLength="1464" 
clip-path="url(#breeze-prod-image-build-line-92)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-prod-image-build-r1" x="1464" y="2264.8" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-92)">
+</text><text class="breeze-prod-image-build-r5" x="0" y="2289.2" 
textLength="24.4" 
clip-path="url(#breeze-prod-image-build-line-93)">╭─</text><text 
class="breeze-prod-image-build-r5" x="24.4" y="2289.2" textLength="280.6" 
clip-path="url(#breeze-prod-image-build-line-93)">&#160;Github&#160;authentication&#160;</text><text
 class="breeze-prod-image-build-r5" x="305" y="2289.2" textLength="1134.6" 
clip-path="url(#breeze-prod-image-build-line-93)">─────────────────────────────────────────────
 [...]
+</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="85.4" 
clip-path="url(#breeze-prod-image-build-line-94)">-github</text><text 
class="breeze-prod-image-build-r4" x="122" y="2313.6" textLength= [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2338" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-95)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="2338" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-95)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="2338" textLength="85.4" 
clip-path="url(#breeze-prod-image-build-line-95)">-github</text><text 
class="breeze-prod-image-build-r4" x="122" y="2338" textLength="73.2" c [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2362.4" 
textLength="1464" 
clip-path="url(#breeze-prod-image-build-line-96)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-prod-image-build-r1" x="1464" y="2362.4" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-96)">
+</text><text class="breeze-prod-image-build-r5" x="0" y="2386.8" 
textLength="24.4" 
clip-path="url(#breeze-prod-image-build-line-97)">╭─</text><text 
class="breeze-prod-image-build-r5" x="24.4" y="2386.8" textLength="195.2" 
clip-path="url(#breeze-prod-image-build-line-97)">&#160;Common&#160;options&#160;</text><text
 class="breeze-prod-image-build-r5" x="219.6" y="2386.8" textLength="1220" 
clip-path="url(#breeze-prod-image-build-line-97)">────────────────────────────────────────────────────
 [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2411.2" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-98)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="2411.2" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-98)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="2411.2" textLength="85.4" 
clip-path="url(#breeze-prod-image-build-line-98)">-answer</text><text 
class="breeze-prod-image-build-r6" x="158.6" y="2411.2" textLengt [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2435.6" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-99)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="2435.6" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-99)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="2435.6" textLength="48.8" 
clip-path="url(#breeze-prod-image-build-line-99)">-dry</text><text 
class="breeze-prod-image-build-r4" x="85.4" y="2435.6" textLength="4 [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2460" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-100)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="2460" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-100)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="2460" textLength="97.6" 
clip-path="url(#breeze-prod-image-build-line-100)">-verbose</text><text 
class="breeze-prod-image-build-r6" x="158.6" y="2460" textLength="2 [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2484.4" 
textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-101)">│</text><text 
class="breeze-prod-image-build-r4" x="24.4" y="2484.4" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-101)">-</text><text 
class="breeze-prod-image-build-r4" x="36.6" y="2484.4" textLength="61" 
clip-path="url(#breeze-prod-image-build-line-101)">-help</text><text 
class="breeze-prod-image-build-r6" x="158.6" y="2484.4" textLength [...]
+</text><text class="breeze-prod-image-build-r5" x="0" y="2508.8" 
textLength="1464" 
clip-path="url(#breeze-prod-image-build-line-102)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-prod-image-build-r1" x="1464" y="2508.8" textLength="12.2" 
clip-path="url(#breeze-prod-image-build-line-102)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_prod-image_build.txt 
b/images/breeze/output_prod-image_build.txt
index f78db4ceba..56016c2943 100644
--- a/images/breeze/output_prod-image_build.txt
+++ b/images/breeze/output_prod-image_build.txt
@@ -1 +1 @@
-9590fde87467c3a97ef5a0bc37fae8bb
+5b3ef58f74144833e4c230fea6db05ca
diff --git a/scripts/docker/install_mysql.sh b/scripts/docker/install_mysql.sh
index 3dbb2280c9..5bef17f4dc 100644
--- a/scripts/docker/install_mysql.sh
+++ b/scripts/docker/install_mysql.sh
@@ -36,7 +36,7 @@ COLOR_RESET=$'\e[0m'
 readonly COLOR_RESET
 
 : "${INSTALL_MYSQL_CLIENT:?Should be true or false}"
-: "${INSTALL_MYSQL_CLIENT_TYPE:-mysql}"
+: "${INSTALL_MYSQL_CLIENT_TYPE:-mariadb}"
 
 export_key() {
     local key="${1}"
@@ -75,7 +75,8 @@ install_mysql_client() {
         exit 1
     fi
 
-    export_key "467B942D3A79BD29" "mysql"
+    export_key "467B942D3A79BD29" "mysql-2022"
+    export_key "B7B3B788A8D3785C" "mysql-2023"
 
     echo
     echo "${COLOR_BLUE}Installing Oracle MySQL client version 
${MYSQL_LTS_VERSION}: ${1}${COLOR_RESET}"
@@ -87,6 +88,13 @@ install_mysql_client() {
     apt-get install --no-install-recommends -y "${packages[@]}"
     apt-get autoremove -yqq --purge
     apt-get clean && rm -rf /var/lib/apt/lists/*
+
+    # Remove mysql repository from sources.list.d as MySQL repos have a basic 
flaw that they put expiry
+    # date on their GPG signing keys and they sign their repo with those keys. 
This means that after a
+    # certain date, the GPG key becomes invalid and if you have the repository 
added in your sources.list
+    # then you will not be able to install anything from any other repository. 
This id unlike any other
+    # repository we have seen (for example Postgres, MariaDB, MsSQL - all have 
non-expiring signing keys)
+    rm /etc/apt/sources.list.d/mysql.list
 }
 
 install_mariadb_client() {
@@ -136,6 +144,9 @@ install_mariadb_client() {
 if [[ ${INSTALL_MYSQL_CLIENT:="true"} == "true" ]]; then
     if [[ $(uname -m) == "arm64" || $(uname -m) == "aarch64" ]]; then
         INSTALL_MYSQL_CLIENT_TYPE="mariadb"
+        echo
+        echo "${COLOR_YELLOW}Client forced to mariadb for ARM${COLOR_RESET}"
+        echo
     fi
 
     if [[ "${INSTALL_MYSQL_CLIENT_TYPE}" == "mysql" ]]; then


Reply via email to