This is an automated email from the ASF dual-hosted git repository. potiuk pushed a commit to branch v2-8-test in repository https://gitbox.apache.org/repos/asf/airflow.git
commit aef7a8538fed969a5a3bfd1bff4acd69954a8c16 Author: Jarek Potiuk <[email protected]> AuthorDate: Fri Dec 15 19:13:00 2023 +0100 Change default MySQL client to MariaDB (#36243) 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: #36231 The issues in Oracle's MySQL repo: * https://bugs.mysql.com/bug.php?id=113427 * https://bugs.mysql.com/bug.php?id=113428 * https://bugs.mysql.com/bug.php?id=113432 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 (cherry picked from commit 8a7bea2d8a4a059c6adea78039b0a2443d76afff) --- .github/workflows/ci.yml | 176 ++++++++++++++++++--- CI_DIAGRAMS.md | 12 +- Dockerfile | 16 +- Dockerfile.ci | 14 +- .../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 | 11 +- .../airflow_breeze/params/common_build_params.py | 2 + .../test_examples_of_prod_image_building.py | 11 +- docs/docker-stack/build-arg-ref.rst | 8 +- docs/docker-stack/build.rst | 17 ++ docs/docker-stack/changelog.rst | 35 ++-- .../docker-examples/customizing/mysql-client.sh | 37 +++++ .../extending/add-providers/Dockerfile | 4 +- 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 | 14 +- 24 files changed, 430 insertions(+), 174 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1b500e4745..69be39ece8 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" @@ -1721,6 +1695,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_TYPE: "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: > @@ -1827,6 +1858,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_TYPE: "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" @@ -1862,6 +1949,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.prod-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: "Verify PROD image and docker-compose quick start" diff --git a/CI_DIAGRAMS.md b/CI_DIAGRAMS.md index 612fafe34a..cbd1d54d88 100644 --- a/CI_DIAGRAMS.md +++ b/CI_DIAGRAMS.md @@ -60,8 +60,6 @@ sequenceDiagram Note over Tests: OpenAPI client gen and Note over Tests: React WWW tests - and - Note over Tests: Test examples<br>PROD image building and Note over Tests: Test git clone on Windows and @@ -152,6 +150,11 @@ sequenceDiagram end end par + opt + GitHub Registry ->> Tests: Pull PROD Images<br>[COMMIT_SHA] + Note over Tests: Test examples<br>PROD image building + end + and opt GitHub Registry ->> Tests: Pull PROD Images<br>[COMMIT_SHA] Note over Tests: Run Kubernetes <br>tests @@ -343,8 +346,6 @@ sequenceDiagram Note over Tests: OpenAPI client gen and Note over Tests: React WWW tests - and - Note over Tests: Test examples<br>PROD image building and Note over Tests: Test git clone on Windows end @@ -400,6 +401,9 @@ sequenceDiagram Artifacts ->> Tests: Download source,pypi,no-providers constraints Note over Tests: Display constraints diff Tests ->> Airflow Repo: Push constraints if changed to 'constraints-BRANCH' + and + GitHub Registry ->> Tests: Pull PROD Images<br>[COMMIT_SHA] + Note over Tests: Test examples<br>PROD image building and GitHub Registry ->> Tests: Pull PROD Image<br>[COMMIT_SHA] Note over Tests: Run Kubernetes <br>tests diff --git a/Dockerfile b/Dockerfile index ce845cef8b..30d867506a 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,7 @@ install_mysql_client() { exit 1 fi - export_key "467B942D3A79BD29" "mysql" + export_key "B7B3B788A8D3785C" "mysql" echo echo "${COLOR_BLUE}Installing Oracle MySQL client version ${MYSQL_LTS_VERSION}: ${1}${COLOR_RESET}" @@ -283,6 +283,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 +334,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 +1239,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..7991df99ac 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,7 @@ install_mysql_client() { exit 1 fi - export_key "467B942D3A79BD29" "mysql" + export_key "B7B3B788A8D3785C" "mysql" echo echo "${COLOR_BLUE}Installing Oracle MySQL client version ${MYSQL_LTS_VERSION}: ${1}${COLOR_RESET}" @@ -243,6 +243,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 +294,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..981124540f 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_type, 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_type @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_type: 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_type=install_mysql_client_type, 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..d790ae33a1 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-type", "--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..dd94ffd499 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_CLIENT_TYPES, 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_type = click.option( + "--install-mysql-client-type", + help="Which client to choose when installing.", + type=BetterChoice(ALLOWED_INSTALL_MYSQL_CLIENT_TYPES), + default=ALLOWED_INSTALL_MYSQL_CLIENT_TYPES[0], + envvar="INSTALL_MYSQL_CLIENT_TYPE", +) 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..9c2cb3a57c 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_type, 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_type @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_type: 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_type=install_mysql_client_type, 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..69c7d23c96 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-type", "--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 f336900d04..35a8237f25 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_CLIENT_TYPES = ["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..e5322309c5 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_TYPE", self.install_mysql_client_type) + 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..8a534cc425 100644 --- a/dev/breeze/src/airflow_breeze/params/build_prod_params.py +++ b/dev/breeze/src/airflow_breeze/params/build_prod_params.py @@ -211,8 +211,6 @@ class BuildProdParams(CommonBuildParams): self._req_arg("BUILD_ID", self.build_id) self._req_arg("CONSTRAINTS_GITHUB_REPOSITORY", self.constraints_github_repository) self._req_arg("DOCKER_CONTEXT_FILES", self.docker_context_files) - self._req_arg("INSTALL_MSSQL_CLIENT", self.install_mssql_client) - self._req_arg("INSTALL_MYSQL_CLIENT", self.install_mysql_client) self._req_arg("INSTALL_PACKAGES_FROM_CONTEXT", self.install_packages_from_context) self._req_arg("INSTALL_POSTGRES_CLIENT", self.install_postgres_client) self._req_arg("INSTALL_PROVIDERS_FROM_SOURCES", self.install_providers_from_sources) @@ -228,15 +226,18 @@ 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._req_arg("INSTALL_MSSQL_CLIENT", self.install_mssql_client) + self._opt_arg("INSTALL_MYSQL_CLIENT", self.install_mysql_client) + self._req_arg("INSTALL_MYSQL_CLIENT_TYPE", self.install_mysql_client_type) 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..d9bd3d3a1f 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_CLIENT_TYPES, 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_type: str = ALLOWED_INSTALL_MYSQL_CLIENT_TYPES[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-arg-ref.rst b/docs/docker-stack/build-arg-ref.rst index 3e492e00f9..aae9772be8 100644 --- a/docs/docker-stack/build-arg-ref.rst +++ b/docs/docker-stack/build-arg-ref.rst @@ -170,10 +170,10 @@ for examples of using those arguments. | | | The mysql extra is removed from extras | | | | if the client is not installed. | +------------------------------------------+------------------------------------------+------------------------------------------+ -| ``INSTALL_MYSQL_CLIENT_TYPE`` | ``mysql`` | (*Experimental*) Type of MySQL client | -| | | library. This can be ``mysql`` or | -| | | ``mariadb``. Regardless of the parameter | -| | | will always be used ``mariadb`` on ARM. | +| ``INSTALL_MYSQL_CLIENT_TYPE`` | ``mariadb`` | Type of MySQL client library. This | +| | | can be ``mariadb`` or ``mysql`` | +| | | Regardless of the parameter, ``mariadb`` | +| | | will always be used on ARM. | +------------------------------------------+------------------------------------------+------------------------------------------+ | ``INSTALL_MSSQL_CLIENT`` | ``true`` | Whether MsSQL client should be installed | +------------------------------------------+------------------------------------------+------------------------------------------+ 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/docs/docker-stack/docker-examples/extending/add-providers/Dockerfile b/docs/docker-stack/docker-examples/extending/add-providers/Dockerfile index f1496652f3..69dc96f7cf 100644 --- a/docs/docker-stack/docker-examples/extending/add-providers/Dockerfile +++ b/docs/docker-stack/docker-examples/extending/add-providers/Dockerfile @@ -19,11 +19,11 @@ FROM apache/airflow:2.8.0 USER root RUN apt-get update \ && apt-get install -y --no-install-recommends \ - openjdk-11-jre-headless \ + openjdk-17-jre-headless \ && apt-get autoremove -yqq --purge \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* USER airflow -ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 +ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 RUN pip install --no-cache-dir "apache-airflow==${AIRFLOW_VERSION}" apache-airflow-providers-apache-spark==2.1.3 # [END Dockerfile] diff --git a/images/breeze/output_ci-image_build.svg b/images/breeze/output_ci-image_build.svg index c76c91005e..70960aa673 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: ci-image 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: ci-image build</text> <g transform="translate(26,22)"> <circle cx="0" cy="0" r="7" fill="#ff5f57"/> <circle cx="22" cy="0" r="7" fill="#febc2e"/> @@ -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)                                     &# [...] </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)"> Building images in parallel </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 RANGE)                                   &# [...] -</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: 4; 1<=x<=8]                                 [...] -</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: 3.8 3.9 3.10 3.11]                                [...] -</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 RANGE)                                   &# [...] +</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: 4; 1<=x<=8]                                 [...] +</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: 3.8 3.9 3.10 3.11]                              &# [...] +</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)"> Advanced build options (for power users) </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 | bullseye)                                  [...] -</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: bookworm]                                   [...] -</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 like: python:VERSION-slim-bookworm.                              & [...] -</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)                                     &# [...] -</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).                                      [...] -</text><text class="breeze-ci-image-build-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-45)">│</text><text class="breeze-ci-image-build-r7" x="463.6" y="1118" textLength="976" clip-path="url(#breeze-ci-image-build-line-45)">(TEXT)                                       [...] -</text><text class="breeze-ci-image-build-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-46)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1142.4" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-46)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="1142.4" textLength="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)"> Selecting constraint location (for power users) </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 | constraints | 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: constraints-source-providers]                               [...] -</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)"> Choosing dependencies and extras (for power users) </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)"> Backtracking options </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 problems.                                   [...] -</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)                                      [...] -</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 `breeze ci find-backtracking-candidates`).                          </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)                                       [...] -</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)"> Preparing cache and push (for maintainers and CI) </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: autodetect]                                  [...] -</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).                                      [...] -</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)"> Github authentication </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)"> Common options </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).                                     &# [...] +</text><text class="breeze-ci-image-build-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-38)">│</text><text class="breeze-ci-image-build-r7" x="463.6" y="947.2" textLength="976" clip-path="url(#breeze-ci-image-build-line-38)">(TEXT)                                      [...] +</text><text class="breeze-ci-image-build-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-39)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="971.6" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-39)">-</text><text class="breeze-ci-image-build-r4" x="36.6" y="971.6" textLength="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 | bullseye)                                 & [...] +</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: bookworm]                                  &# [...] +</text><text class="breeze-ci-image-build-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-43)">│</text><text class="breeze-ci-image-build-r4" x="24.4" y="1069.2" textLength="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="219.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 like: python:VERSION-slim-bookworm.                             & [...] +</text><text class="breeze-ci-image-build-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-ci-image-build-line-47)">│</text><text class="breeze-ci-image-build-r7" x="463.6" y="1166.8" textLength="976" clip-path="url(#breeze-ci-image-build-line-47)">(TEXT)                                     &# [...] +</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)"> Selecting constraint location (for power users) </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 | constraints | 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: constraints-source-providers]                               [...] +</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)"> Choosing dependencies and extras (for power users) </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)"> Backtracking options </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 problems.                                   [...] +</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)                                      [...] +</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 `breeze ci find-backtracking-candidates`).                          </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)                                     &# [...] +</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)"> Preparing cache and push (for maintainers and CI) </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: autodetect]                                  &# [...] +</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).                                      [...] +</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)"> Github authentication </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)"> Common options </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 e3df365cb4..efab651ef7 100644 --- a/images/breeze/output_ci-image_build.txt +++ b/images/breeze/output_ci-image_build.txt @@ -1 +1 @@ -fd70dd26b3009e8c5d2afa843084ecc1 +9bc9d889340bf7fc3b30ccad2c231257 diff --git a/images/breeze/output_prod-image_build.svg b/images/breeze/output_prod-image_build.svg index 213e56bd2e..be1e4a9a93 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: prod-image 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: prod-image build</text> <g transform="translate(26,22)"> <circle cx="0" cy="0" r="7" fill="#ff5f57"/> <circle cx="22" cy="0" r="7" fill="#febc2e"/> @@ -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 </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 with </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 store in docker-context-files or from github.                 </text><text class="breeze-prod [...] -</text><text class="breeze-prod-image-build-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-79)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="1947.6" textLength="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)"> Preparing cache and push (for maintainers and CI) </text><text class="breeze-prod-image-build-r5" x="646.6" y="2069.6" textLength="793" clip-path="url(#breeze-prod-image-buil [...] -</text><text class="breeze-prod-image-build-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-85)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2094" textLength="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: autodetect]                                &# [...] -</text><text class="breeze-prod-image-build-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-87)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2142.8" textLength="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).                                    &# [...] -</text><text class="breeze-prod-image-build-r5" x="0" y="2240.4" textLength="1464" clip-path="url(#breeze-prod-image-build-line-91)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-prod-image-build-r1" x="1464" y="2240.4" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-91)"> -</text><text class="breeze-prod-image-build-r5" x="0" y="2264.8" textLength="24.4" clip-path="url(#breeze-prod-image-build-line-92)">╭─</text><text class="breeze-prod-image-build-r5" x="24.4" y="2264.8" textLength="280.6" clip-path="url(#breeze-prod-image-build-line-92)"> Github authentication </text><text class="breeze-prod-image-build-r5" x="305" y="2264.8" textLength="1134.6" clip-path="url(#breeze-prod-image-build-line-92)">───────────────────────────────────────────── [...] -</text><text class="breeze-prod-image-build-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-93)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2289.2" textLength="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)"> Common options </text><text class="breeze-prod-image-build-r5" x="219.6" y="2362.4" textLength="1220" clip-path="url(#breeze-prod-image-build-line-96)">──────────────────────────────────────────────────── [...] -</text><text class="breeze-prod-image-build-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-prod-image-build-line-97)">│</text><text class="breeze-prod-image-build-r4" x="24.4" y="2386.8" textLength="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="219. [...] +</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 with </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 store in docker-context-files or from github.                 </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)"> Preparing cache and push (for maintainers and CI) </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: autodetect]                                &# [...] +</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).                                    [...] +</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)"> Github authentication </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)"> Common options </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 726e3487a8..31e337c7a4 100644 --- a/images/breeze/output_prod-image_build.txt +++ b/images/breeze/output_prod-image_build.txt @@ -1 +1 @@ -43490a03007cb452ee5780d39149bbfb +7702f83f3baddede5ba32efa1bef86ac diff --git a/scripts/docker/install_mysql.sh b/scripts/docker/install_mysql.sh index 3dbb2280c9..8721a4263c 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,7 @@ install_mysql_client() { exit 1 fi - export_key "467B942D3A79BD29" "mysql" + export_key "B7B3B788A8D3785C" "mysql" echo echo "${COLOR_BLUE}Installing Oracle MySQL client version ${MYSQL_LTS_VERSION}: ${1}${COLOR_RESET}" @@ -87,6 +87,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 +143,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
