You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by pi...@apache.org on 2023/03/06 21:46:47 UTC
[airflow] 03/37: Improving the release process (#27829)
This is an automated email from the ASF dual-hosted git repository.
pierrejeambrun pushed a commit to branch v2-5-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit a0ec6fe9fc755dbf224735edd808e396d8383760
Author: Ephraim Anierobi <sp...@gmail.com>
AuthorDate: Tue Jan 24 09:21:28 2023 +0100
Improving the release process (#27829)
* Improving the release process
This PR aims to automate some parts of the release process.
For RC, we have a command to run the release process:
breeze release-management start-rc-process --version 2.4.3rc1 --previous-version 2.4.2
For release, the below command runs the process:
breeze release-management start-release --release-candidate 2.4.3rc1 --previous-release <PREVIOUS RELEASE>
And there's a command for creating a version branch when releasing a minor version:
breeze release-management create-minor-branch --version-branch ${VERSION_BRANCH}
Use breeze's user_confirm & get_console.print
Skip some steps in CI
Run command in CI
add user_confirm_bool function, a version of user_confirm
Remove retagging of images
simplify console.print calls
Update readme config hash
Use dry-run for commands that shouldn't run in CI
Remove outdated instruction
Remove single quotes on double quote
* fixup! Improving the release process
* fixup! fixup! Improving the release process
* remove hidden arg from commands
* Add check=True to all the run_command to raise when there's a failure
* fixup! Add check=True to all the run_command to raise when there's a failure
* Update minor release command
* Update the ci
(cherry picked from commit 9411e395ecc3bf54ddc341b0f0e227608bd7f972)
---
.github/workflows/ci.yml | 36 ++
dev/README_RELEASE_AIRFLOW.md | 367 ++-------------------
dev/breeze/README.md | 2 +-
dev/breeze/setup.cfg | 5 +
.../commands/minor_release_command.py | 191 +++++++++++
.../commands/release_candidate_command.py | 346 +++++++++++++++++++
.../src/airflow_breeze/commands/release_command.py | 291 ++++++++++++++++
.../commands/release_management_commands.py | 9 +
dev/breeze/src/airflow_breeze/utils/confirm.py | 17 +
dev/breeze/src/airflow_breeze/utils/console.py | 4 +
images/breeze/output-commands-hash.txt | 12 +-
images/breeze/output-commands.svg | 88 ++---
images/breeze/output_ci-image.svg | 40 +--
images/breeze/output_release-management.svg | 30 +-
images/breeze/output_setup.svg | 27 +-
.../output_setup_check-all-params-in-groups.svg | 172 ++++++++++
.../output_setup_regenerate-command-images.svg | 68 ++--
17 files changed, 1232 insertions(+), 473 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d4163671bd..86440754e3 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -756,6 +756,42 @@ jobs:
run: breeze ci fix-ownership
if: always()
+ test-airflow-release-commands:
+ timeout-minutes: 80
+ name: "Test Airflow release commands"
+ runs-on: "${{needs.build-info.outputs.runs-on}}"
+ needs: [build-info, wait-for-ci-images]
+ if: needs.build-info.outputs.runs-on == 'self-hosted'
+ env:
+ RUNS_ON: "${{needs.build-info.outputs.runs-on}}"
+ PYTHON_MAJOR_MINOR_VERSION: "${{needs.build-info.outputs.default-python-version}}"
+ 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@v3
+ with:
+ persist-credentials: false
+ - name: >
+ Prepare breeze & CI image: ${{needs.build-info.outputs.default-python-version}}:${{env.IMAGE_TAG}}
+ uses: ./.github/actions/prepare_breeze_and_image
+ - name: "Cleanup dist files"
+ run: rm -fv ./dist/*
+ - name: "Install required packages"
+ run: python -m pip install --editable ./dev/breeze/
+ - name: "Check Airflow create minor branch command"
+ run: breeze release-management create-minor-branch --version-branch 2-4 -a y
+ - name: "Check Airflow RC process command"
+ run: |
+ breeze release-management start-rc-process --version 2.4.3rc1 --previous-version 2.4.2 -a y
+ - name: "Check Airflow release process command"
+ run: |
+ breeze release-management start-release --release-candidate 2.4.3rc1 --previous-release 2.4.2 -a y
+ - name: "Fix ownership"
+ run: breeze ci fix-ownership
+ if: always()
+
+
tests-helm:
timeout-minutes: 80
name: "Python unit tests for Helm chart"
diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index 0e905cf706..f4eb79a437 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -26,8 +26,6 @@
- [Prepare the Apache Airflow Package RC](#prepare-the-apache-airflow-package-rc)
- [Update the milestone](#update-the-milestone)
- [Build RC artifacts](#build-rc-artifacts)
- - [Prepare new release branches and cache - optional when first minor version is released](#prepare-new-release-branches-and-cache---optional-when-first-minor-version-is-released)
- - [Prepare PyPI convenience "snapshot" packages](#prepare-pypi-convenience-snapshot-packages)
- [Prepare production Docker Image RC](#prepare-production-docker-image-rc)
- [Prepare API clients RC packages](#prepare-api-clients-rc-packages)
- [Prepare issue for testing status of rc](#prepare-issue-for-testing-status-of-rc)
@@ -41,7 +39,6 @@
- [Publish the final Apache Airflow release](#publish-the-final-apache-airflow-release)
- [Summarize the voting for the Apache Airflow release](#summarize-the-voting-for-the-apache-airflow-release)
- [Publish release to SVN](#publish-release-to-svn)
- - [Prepare PyPI "release" packages](#prepare-pypi-release-packages)
- [Manually release API clients](#manually-release-api-clients)
- [Manually prepare production Docker Image](#manually-prepare-production-docker-image)
- [Verify production images](#verify-production-images)
@@ -212,11 +209,19 @@ The Release Candidate artifacts we vote upon should be the exact ones we vote ag
export AIRFLOW_REPO_ROOT=$(pwd)
```
-- Check out the 'test' branch
+- Install `breeze` command:
+
+ ```shell script
+ pipx install -e ./dev/breeze
+ ```
+
+- For major/minor version release,run the following commands to create the 'test' and 'stable' branches.
- For major/minor version release, please follow the instructions at
- [Prepare new release branches and cache](#prepare-new-release-branches-and-cache---optional-when-first-minor-version-is-released)
- to create the 'test' and 'stable' branches.
+ ```shell script
+ breeze release-management create-minor-branch --version-branch ${VERSION_BRANCH}
+ ```
+
+- Check out the 'test' branch
```shell script
git checkout v${VERSION_BRANCH}-test
@@ -240,266 +245,22 @@ The Release Candidate artifacts we vote upon should be the exact ones we vote ag
- Update the `REVISION_HEADS_MAP` at airflow/utils/db.py to include the revision head of the release even if there are no migrations.
- Commit the version change.
-- Check out the 'stable' branch
-
- ```shell script
- git checkout v${VERSION_BRANCH}-stable
- git reset --hard origin/v${VERSION_BRANCH}-stable
- ```
-
-- PR from the 'test' branch to the 'stable' branch, and manually merge it once approved. Here's how to manually merge the PR:
-
- ```shell script
- git merge --ff-only v${VERSION_BRANCH}-test
- git push origin v${VERSION_BRANCH}-stable
- ```
-
-- Tag your release
-
- ```shell script
- git tag -s ${VERSION} -m "Apache Airflow ${VERSION}"
- ```
-
-- Clean the checkout repo
-
- ```shell script
- git clean -fxd
- ```
-
-- Restore breeze installation (The breeze's `.egginfo` is cleared by git-clean)
-
- ```shell script
- pipx install -e ./dev/breeze --force
- ```
-
-- Make sure you have the latest CI image
-
- ```shell script
- breeze ci-image build --python 3.7
- ```
-
-- Tarball the repo
-
- ```shell script
- git archive --format=tar.gz ${VERSION} \
- --prefix=apache-airflow-${VERSION_WITHOUT_RC}/ \
- -o dist/apache-airflow-${VERSION_WITHOUT_RC}-source.tar.gz
- ```
-
- Copy the tarball to a location outside of the repo and verify licences.
-
-- Generate SHA512/ASC (If you have not generated a key yet, generate it by following instructions on http://www.apache.org/dev/openpgp.html#key-gen-generate-key)
-
- ```shell script
- breeze release-management prepare-airflow-package --package-format both
- pushd dist
- ${AIRFLOW_REPO_ROOT}/dev/sign.sh *
- popd
- ```
-
-- If you aren't using Breeze for packaging, build the distribution and wheel files directly
-
- ```shell script
- python setup.py compile_assets sdist bdist_wheel
- pushd dist
- ${AIRFLOW_REPO_ROOT}/dev/sign.sh *
- popd
- ```
-
-- Tag & Push the constraints files. This pushes constraints with rc suffix (this is expected)!
-
- ```shell script
- git checkout origin/constraints-${VERSION_BRANCH}
- git tag -s "constraints-${VERSION}" -m "Constraints for Apache Airflow ${VERSION}"
- git push origin tag "constraints-${VERSION}"
- ```
-
-- Push the artifacts to ASF dev dist repo
-
- ```shell script
- # First clone the repo
-
- [ -d asf-dist ] || svn checkout --depth=immediates https://dist.apache.org/repos/dist asf-dist
- svn update --set-depth=infinity asf-dist/dev/airflow
- cd asf-dist/dev/airflow
-
- # Create new folder for the release
- svn mkdir ${VERSION}
-
- # Move the artifacts to svn folder & commit
- mv ${AIRFLOW_REPO_ROOT}/dist/* ${VERSION}/
- cd ${VERSION}
- svn add *
- svn commit -m "Add artifacts for Airflow ${VERSION}"
- cd ${AIRFLOW_REPO_ROOT}
- rm -rf asf-dist
- ```
-
-## Prepare new release branches and cache - optional when first minor version is released
-
-When you just released the `X.Y.0` version (first release of new minor version) you need to create release
-branches: `vX-Y-test` and `vX-Y-stable` (for example with `2.1.0rc1` release you need to create v2-1-test and
-`v2-1-stable` branches). You also need to configure the branch
-
-### Create test source branch
-
- ```shell script
- # First clone the repo
- export BRANCH_PREFIX=2-1
- git branch v${BRANCH_PREFIX}-test
- ```
-
-### Re-tag images from main
-
-Run script to re-tag images from the ``main`` branch to the ``vX-Y-test`` branch:
-
- ```shell script
- ./dev/retag_docker_images.py --source-branch main --target-branch v${BRANCH_PREFIX}-test
- ```
-
-
-### Update default branches
-
-#### In Breeze
-
-In ``./dev/breeze/src/airflow_breeze/branch_defaults.py`` update branches to reflect the new branch:
-
-```python
-AIRFLOW_BRANCH = "main"
-DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH = "constraints-main"
-```
-
-should become this, where ``X-Y`` is your new branch version:
-
-```python
-AIRFLOW_BRANCH = "vX-Y-test"
-DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH = "constraints-X-Y"
-```
-
-### Commit the changes to the test branch
-
-```bash
-git add -p .
-git commit "Update default branches for ${BRANCH_PREFIX}"
-```
-
-### Create stable branch
-
-```bash
-git branch v${BRANCH_PREFIX}-stable
-````
-### Push test and stable branch
+- PR from the 'test' branch to the 'stable' branch
-```bash
-git checkout v${BRANCH_PREFIX}-test
-git push --set-upstream origin v${BRANCH_PREFIX}-test
-git checkout v${BRANCH_PREFIX}-stable
-git push --set-upstream origin v${BRANCH_PREFIX}-stable
-````
-
-### Add branches in the main branch
-
-You have to do those steps in the `main` branch of the repository:
-
-```bash
-git checkout main
-git pull
-```
-
-Add ``vX-Y-stable`` and ``vX-Y-test`` branches in ``codecov.yml`` (there are 2 places in the file!)
-
-```yaml
- branches:
- - main
- - v2-0-stable
- - v2-0-test
- - v2-1-stable
- - v2-1-test
- - v2-2-stable
- - v2-2-test
-```
-
-Add vX-Y-stable to `.asf.yaml` (X-Y is your new branch)
-
-```yaml
-protected_branches:
- main:
- required_pull_request_reviews:
- required_approving_review_count: 1
- ...
- vX-Y-stable:
- required_pull_request_reviews:
- required_approving_review_count: 1
-
-```
-
-### Create constraints branch out of the constraints-main one
-
- ```shell script
- # First clone the repo
- export BRANCH_PREFIX=2-1
- git checkout constraints-main
- git checkout -b constraints-${BRANCH_PREFIX}
- git push --set-upstream origin constraints-${BRANCH_PREFIX}
- ```
-
-
-## Prepare PyPI convenience "snapshot" packages
-
-At this point we have the artifact that we vote on, but as a convenience to developers we also want to
-publish "snapshots" of the RC builds to PyPI for installing via pip:
-
-To do this we need to
-
-- Checkout the rc tag:
+- When the PR is approved, install `dev/breeze` in a virtualenv:
```shell script
- cd "${AIRFLOW_REPO_ROOT}"
- git checkout ${VERSION}
+ pip install -e ./dev/breeze
```
-- Build the package:
-
- ```shell script
- breeze release-management prepare-airflow-package --version-suffix-for-pypi "${VERSION_SUFFIX}" --package-format both
- ```
-
-- Verify the artifacts that would be uploaded:
-
- ```shell script
- twine check dist/*
- ```
-
-- Upload the package to PyPI's test environment:
-
- ```shell script
- twine upload -r pypitest dist/*
- ```
-
-- Verify that the test package looks good by downloading it and installing it into a virtual environment. The package download link is available at:
-https://test.pypi.org/project/apache-airflow/#files
-
-- Upload the package to PyPI's production environment:
-
- ```shell script
- twine upload -r pypi dist/*
- ```
-
-- Again, confirm that the package is available here:
-https://pypi.python.org/pypi/apache-airflow
-
-It is important to stress that this snapshot should not be named "release", and it
-is not supposed to be used by and advertised to the end-users who do not read the devlist.
-
-- Push Tag for the release candidate
+- Set `GITHUB_TOKEN` environment variable. Needed in patch release for generating issue for testing of the RC
- This step should only be done now and not before, because it triggers an automated build of
- the production docker image, using the packages that are currently released in PyPI
- (both airflow and latest provider packages).
+- Start the release candidate process by running the below command (If you have not generated a key yet, generate it by following instructions on
+ http://www.apache.org/dev/openpgp.html#key-gen-generate-key):
```shell script
- git push origin tag ${VERSION}
+ breeze release-management start-rc-process --version ${VERSION} --previous-version <PREVIOUS_VERSION>
```
## Prepare production Docker Image RC
@@ -908,7 +669,6 @@ Cheers,
<your name>
```
-
## Publish release to SVN
You need to migrate the RC artifacts that passed to this repository:
@@ -918,96 +678,11 @@ https://dist.apache.org/repos/dist/release/airflow/
The best way of doing this is to svn cp between the two repos (this avoids having to upload the binaries again, and gives a clearer history in the svn commit logs):
```shell script
-# GO to Airflow Sources first
-cd <YOUR_AIRFLOW_REPO_ROOT>
-export AIRFLOW_REPO_ROOT="$(pwd)"
-cd ..
-
-[ -d asf-dist ] || svn checkout --depth=immediates https://dist.apache.org/repos/dist asf-dist
-svn update --set-depth=infinity asf-dist/{release,dev}/airflow
-AIRFLOW_DEV_SVN="${PWD}/asf-dist/dev/airflow"
-AIRFLOW_RELEASE_SVN="${PWD}/asf-dist/release/airflow"
-cd "${AIRFLOW_RELEASE_SVN}"
-
export RC=2.0.2rc5
-export VERSION=${RC/rc?/}
-
-# Create new folder for the release
-svn mkdir "${VERSION}"
-cd "${VERSION}"
-
-# Move the artifacts to svn folder & commit
-for f in ${AIRFLOW_DEV_SVN}/$RC/*; do
- svn cp "$f" "${$(basename $f)/}"
-done
-svn commit -m "Release Airflow ${VERSION} from ${RC}"
-
-# Remove old release
-# See http://www.apache.org/legal/release-policy.html#when-to-archive
-cd ..
-export PREVIOUS_VERSION=2.0.2
-svn rm "${PREVIOUS_VERSION}"
-svn commit -m "Remove old release: ${PREVIOUS_VERSION}"
+# start the release process by running the below command
+breeze release-management start-release --release-candidate ${RC} --previous-release <PREVIOUS RELEASE>
```
-Verify that the packages appear in [airflow](https://dist.apache.org/repos/dist/release/airflow/)
-
-## Prepare PyPI "release" packages
-
-At this point we release an official package:
-
-- Verify the artifacts that would be uploaded:
-
- ```shell script
- cd "${AIRFLOW_RELEASE_SVN}/${VERSION}"
- twine check *.whl *${VERSION}.tar.gz
- ```
-
-- Upload the package to PyPI's test environment:
-
- ```shell script
- twine upload -r pypitest *.whl *${VERSION}.tar.gz
- ```
-
-- Verify that the test package looks good by downloading it and installing it into a virtual environment.
- The package download link is available at: https://test.pypi.org/project/apache-airflow/#files
-
-- Upload the package to PyPI's production environment:
-
- ```shell script
- twine upload -r pypi *.whl *${VERSION}.tar.gz
- ```
-
-- Again, confirm that the package is available here: https://pypi.python.org/pypi/apache-airflow
-
-- Re-Tag & Push the constraints files with the final release version.
-
- ```shell script
- cd "${AIRFLOW_REPO_ROOT}"
- git checkout constraints-${RC}
- git tag -s "constraints-${VERSION}" -m "Constraints for Apache Airflow ${VERSION}"
- git push origin tag "constraints-${VERSION}"
- ```
-
-- In case you release "latest stable" version, also update "latest" constraints
-
- ```shell script
- git tag -f -s "constraints-latest" -m "Latest constraints set to Apache Airflow ${VERSION}"
- git push -f origin tag "constraints-latest"
- ```
-
-- Push Tag for the final version
-
- This step should only be done now and not before, because it triggers an automated build of
- the production docker image, using the packages that are currently released in PyPI
- (both airflow and latest provider packages).
-
- ```shell script
- git checkout ${RC}
- git tag -s ${VERSION} -m "Apache Airflow ${VERSION}"
- git push origin tag ${VERSION}
- ```
-
## Manually release API clients
If API clients are part of the release, publish new versions of the clients to PyPI without the rc suffix
diff --git a/dev/breeze/README.md b/dev/breeze/README.md
index 0c86259305..94238f30ef 100644
--- a/dev/breeze/README.md
+++ b/dev/breeze/README.md
@@ -52,6 +52,6 @@ PLEASE DO NOT MODIFY THE HASH BELOW! IT IS AUTOMATICALLY UPDATED BY PRE-COMMIT.
---------------------------------------------------------------------------------------------------------
-Package config hash: f28f0d555b81a0f48d6b29b3cf8bba132b8c6a8f3d290a25ad4fd62019a9adbf86c0dc913c474e23ae110f3f433db0214bf46b21000f0d2bdd0884134923ae91
+Package config hash: a98c6dc9a12523e5aaacaade98c721e869377ab59eead92344006f7fd71fe2978398b87703dfc5efa61fac372a4e798cef9de26d6f4283a47f919cd7e0dc4dfa
---------------------------------------------------------------------------------------------------------
diff --git a/dev/breeze/setup.cfg b/dev/breeze/setup.cfg
index fe4fef0225..7075da8b4c 100644
--- a/dev/breeze/setup.cfg
+++ b/dev/breeze/setup.cfg
@@ -69,6 +69,11 @@ install_requires =
requests
rich>=12.6.0
rich-click>=1.5
+ gitpython
+ twine
+ wheel
+ setuptools
+ jinja2
[options.packages.find]
where=src
diff --git a/dev/breeze/src/airflow_breeze/commands/minor_release_command.py b/dev/breeze/src/airflow_breeze/commands/minor_release_command.py
new file mode 100644
index 0000000000..76ff59c34c
--- /dev/null
+++ b/dev/breeze/src/airflow_breeze/commands/minor_release_command.py
@@ -0,0 +1,191 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import os
+
+import click
+
+from airflow_breeze.utils.common_options import option_answer
+from airflow_breeze.utils.confirm import confirm_action
+from airflow_breeze.utils.console import console_print
+from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
+from airflow_breeze.utils.run_utils import run_command
+
+CI = os.environ.get("CI")
+DRY_RUN = True if CI else False
+
+
+def create_branch(version_branch):
+ if confirm_action(f"Create version branch: {version_branch}?"):
+ run_command(["git", "checkout", "main"], dry_run_override=DRY_RUN, check=True)
+ run_command(
+ ["git", "checkout", "-b", f"v{version_branch}-test"], dry_run_override=DRY_RUN, check=True
+ )
+ console_print(f"Created branch: v{version_branch}-test")
+
+
+def update_default_branch(version_branch):
+ if confirm_action("Update default branches?"):
+ console_print()
+ console_print("You need to update the default branch at:")
+ console_print("./dev/breeze/src/airflow_breeze/branch_defaults.py")
+ console_print("Change the following:")
+ console_print("AIRFLOW_BRANCH = 'main'")
+ console_print("DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH = 'constraints-main'")
+ console_print()
+ console_print("To:")
+ console_print()
+ console_print(f"AIRFLOW_BRANCH = 'v{version_branch}-test'")
+ console_print(f"DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH = 'constraints-{version_branch}'")
+
+
+def commit_changes(version_branch):
+ if confirm_action("Commit the above changes?"):
+ run_command(["git", "add", "-p", "."], dry_run_override=DRY_RUN, check=True)
+ run_command(
+ ["git", "commit", "-m", f"Update default branches for {version_branch}"],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+
+
+def create_stable_branch(version_branch):
+ if confirm_action(f"Create stable branch: v{version_branch}-stable?"):
+ run_command(
+ ["git", "checkout", "-b", f"v{version_branch}-stable"], dry_run_override=DRY_RUN, check=True
+ )
+ console_print(f"Created branch: v{version_branch}-stable")
+ else:
+ run_command(["git", "checkout", f"v{version_branch}-stable"], check=True)
+
+
+def push_test_and_stable_branch(version_branch):
+ if confirm_action("Push test and stable branches?"):
+ run_command(["git", "checkout", f"v{version_branch}-test"], dry_run_override=DRY_RUN, check=True)
+ run_command(
+ ["git", "push", "--set-upstream", "origin", f"v{version_branch}-test"],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+ run_command(["git", "checkout", f"v{version_branch}-stable"], dry_run_override=DRY_RUN, check=True)
+ run_command(
+ ["git", "push", "--set-upstream", "origin", f"v{version_branch}-stable"],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+
+
+def checkout_main():
+ if confirm_action("We now need to checkout main. Continue?"):
+ run_command(["git", "checkout", "main"], dry_run_override=DRY_RUN, check=True)
+ run_command(["git", "pull"])
+
+
+def instruction_update_version_branch(version_branch):
+ if confirm_action("Now, we need to manually update the version branches in main. Continue?"):
+ console_print()
+ console_print(
+ f"Add v{version_branch}-stable and v{version_branch}-test branches "
+ "in codecov.yml (there are 2 places in the file!)"
+ )
+ console_print("Areas to add the branches will look like this:")
+ console_print(
+ """
+ branches:
+ - main
+ - v2-0-stable
+ - v2-0-test
+ - v2-1-stable
+ - v2-1-test
+ - v2-2-stable
+ - v2-2-test
+ """
+ )
+ console_print()
+ console_print(f"Add v{version_branch}-stable to .asf.yaml ({version_branch} is your new branch)")
+ console_print(
+ f"""
+ protected_branches:
+ main:
+ required_pull_request_reviews:
+ required_approving_review_count: 1
+ ...
+ v{version_branch}-stable:
+ required_pull_request_reviews:
+ required_approving_review_count: 1
+ """
+ )
+ console_print("Once you finish with the above. Commit the changes and make a PR against main")
+ confirm_action("I'm done with the changes. Continue?", abort=True)
+
+
+def create_constraints(version_branch):
+ if confirm_action("Do you want to create branches from the constraints main?"):
+ run_command(["git", "checkout", "constraints-main"], dry_run_override=DRY_RUN, check=True)
+ run_command(
+ ["git", "checkout", "-b", f"constraints-{version_branch}"], dry_run_override=DRY_RUN, check=True
+ )
+ if confirm_action("Push the new branch?"):
+ run_command(
+ ["git", "push", "--set-upstream", "origin", f"constraints-{version_branch}"],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+
+
+@click.command(
+ name="create-minor-branch",
+ help="Create a new version branch and update the default branches in main",
+ hidden=True,
+)
+@click.option("--version-branch", help="The version branch you want to create e.g 2-4", required=True)
+@option_answer
+def create_minor_version_branch(version_branch):
+ for obj in version_branch.split("-"):
+ assert isinstance(int(obj), int)
+ os.chdir(AIRFLOW_SOURCES_ROOT)
+ repo_root = os.getcwd()
+ console_print()
+ console_print(f"Repo root: {repo_root}")
+ console_print(f"Version branch: {version_branch}")
+ console_print("Below are your git remotes. We will push to origin:")
+ run_command(["git", "remote", "-v"])
+ console_print()
+ confirm_action("Verify that the above information is correct. Do you want to continue?", abort=True)
+ # Final confirmation
+ confirm_action("Pushes will be made to origin. Do you want to continue?", abort=True)
+ # Create a new branch from main
+ create_branch(version_branch)
+ # Build ci image
+ if confirm_action("Build latest breeze image?"):
+ run_command(["breeze", "ci-image", "build", "--python", "3.7"], dry_run_override=DRY_RUN, check=True)
+ # Update default branches
+ update_default_branch(version_branch)
+ # Commit changes
+ commit_changes(version_branch)
+ # Create stable branch
+ create_stable_branch(version_branch)
+ # Push test and stable branches
+ push_test_and_stable_branch(version_branch)
+ # Checkout main
+ checkout_main()
+ # Update version branches in main
+ instruction_update_version_branch(version_branch)
+ # Create constraints branch
+ create_constraints(version_branch)
+ console_print("Done!")
diff --git a/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py b/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
new file mode 100644
index 0000000000..d1f0ed8fdd
--- /dev/null
+++ b/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
@@ -0,0 +1,346 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import os
+
+import click
+
+from airflow_breeze.utils.common_options import option_answer
+from airflow_breeze.utils.confirm import confirm_action
+from airflow_breeze.utils.console import console_print
+from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
+from airflow_breeze.utils.run_utils import run_command
+
+CI = os.environ.get("CI")
+DRY_RUN = True if CI else False
+
+
+def merge_pr(version_branch):
+ if confirm_action("Do you want to merge the Sync PR?"):
+ run_command(
+ [
+ "git",
+ "checkout",
+ f"v{version_branch}-stable",
+ ],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+ run_command(
+ ["git", "reset", "--hard", f"origin/v{version_branch}-stable"],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+ run_command(
+ ["git", "merge", "--ff-only", f"v{version_branch}-test"], dry_run_override=DRY_RUN, check=True
+ )
+ if confirm_action("Do you want to push the changes? Pushing the changes closes the PR"):
+ run_command(
+ ["git", "push", "origin", f"v{version_branch}-stable"], dry_run_override=DRY_RUN, check=True
+ )
+
+
+def git_tag(version):
+ if confirm_action(f"Tag {version}?"):
+ run_command(["git", "tag", "-s", f"{version}", "-m", f"Apache Airflow {version}"], check=True)
+ console_print("Tagged")
+
+
+def git_clean():
+ if confirm_action("Clean git repo?"):
+ run_command(["git", "clean", "-fxd"], dry_run_override=DRY_RUN, check=True)
+ console_print("Git repo cleaned")
+
+
+def tarball_release(version, version_without_rc):
+ if confirm_action("Create tarball?"):
+ run_command(["rm", "-rf", "dist"], check=True)
+
+ run_command(["mkdir", "dist"], check=True)
+ run_command(
+ [
+ "git",
+ "archive",
+ "--format=tar.gz",
+ f"{version}",
+ f"--prefix=apache-airflow-{version_without_rc}/",
+ "-o",
+ f"dist/apache-airflow-{version_without_rc}-source.tar.gz",
+ ],
+ check=True,
+ )
+ console_print("Tarball created")
+
+
+def create_artifacts_with_sdist():
+ run_command(["python3", "setup.py", "compile_assets", "sdist", "bdist_wheel"], check=True)
+ console_print("Artifacts created")
+
+
+def create_artifacts_with_breeze():
+ run_command(
+ ["breeze", "release-management", "prepare-airflow-package", "--package-format", "both"], check=True
+ )
+ console_print("Artifacts created")
+
+
+def sign_the_release(repo_root):
+ if confirm_action("Do you want to sign the release?"):
+ os.chdir(repo_root)
+ run_command(["pushd", "dist"], dry_run_override=DRY_RUN, check=True)
+ run_command(["./dev/sign.sh", "*"], dry_run_override=DRY_RUN, check=True)
+ run_command(["popd"], dry_run_override=DRY_RUN, check=True)
+ console_print("Release signed")
+
+
+def tag_and_push_constraints(version, version_branch):
+ if confirm_action("Do you want to tag and push constraints?"):
+ run_command(
+ ["git", "checkout", f"origin/constraints-{version_branch}"], dry_run_override=DRY_RUN, check=True
+ )
+ run_command(
+ [
+ "git",
+ "tag",
+ "-s",
+ f"constraints-{version}",
+ "-m",
+ f"Constraints for Apache Airflow {version}",
+ ],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+ run_command(
+ ["git", "push", "origin", "tag", f"constraints-{version}"], dry_run_override=DRY_RUN, check=True
+ )
+ console_print("Constraints tagged and pushed")
+
+
+def clone_asf_repo(version, repo_root):
+ if confirm_action("Do you want to clone asf repo?"):
+ os.chdir(repo_root)
+ run_command(
+ ["svn", "checkout", "--depth=immediates", "https://dist.apache.org/repos/dist", "asf-dist"],
+ check=True,
+ )
+ run_command(["svn", "update", "--set-depth=infinity", "asf-dist/dev/airflow"], check=True)
+ console_print("Cloned ASF repo successfully")
+
+
+def move_artifacts_to_svn(version, repo_root):
+ if confirm_action("Do you want to move artifacts to SVN?"):
+ os.chdir(f"{repo_root}/asf-dist/dev/airflow")
+ run_command(["svn", "mkdir", f"{version}"], dry_run_override=DRY_RUN, check=True)
+ run_command(["mv", f"{repo_root}/dist/*", f"{version}/"], dry_run_override=DRY_RUN, check=True)
+ console_print("Moved artifacts to SVN:")
+ run_command(["ls"], dry_run_override=DRY_RUN)
+
+
+def push_artifacts_to_asf_repo(version, repo_root):
+ if confirm_action("Do you want to push artifacts to ASF repo?"):
+ console_print("Files to push to svn:")
+ if not DRY_RUN:
+ os.chdir(f"{repo_root}/asf-dist/dev/airflow/{version}")
+ run_command(["ls"], dry_run_override=DRY_RUN)
+ confirm_action("Do you want to continue?", abort=True)
+ run_command(["svn", "add", "*"], dry_run_override=DRY_RUN, check=True)
+ run_command(
+ ["svn", "commit", "-m", f"Add artifacts for Airflow {version}"],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+ console_print("Files pushed to svn")
+ os.chdir(repo_root)
+ run_command(["rm", "-rf", "asf-dist"], dry_run_override=DRY_RUN, check=True)
+
+
+def prepare_pypi_packages(version, version_suffix, repo_root):
+ if confirm_action("Prepare pypi packages?"):
+ console_print("Preparing PyPI packages")
+ os.chdir(repo_root)
+ run_command(["git", "checkout", f"{version}"], dry_run_override=DRY_RUN, check=True)
+ run_command(
+ [
+ "breeze",
+ "release-management",
+ "prepare-airflow-package",
+ "--version-suffix-for-pypi",
+ f"{version_suffix}",
+ "--package-format",
+ "both",
+ ],
+ check=True,
+ )
+ run_command(["twine", "check", "dist/*"], check=True)
+ console_print("PyPI packages prepared")
+
+
+def push_packages_to_test_pypi():
+ if confirm_action("Do you want to push packages to test PyPI?"):
+ run_command(["twine", "upload", "-r", "pypitest", "dist/*"], dry_run_override=DRY_RUN, check=True)
+ console_print("Packages pushed to test PyPI")
+ console_print(
+ "Verify that the test package looks good by downloading it and installing it into a virtual "
+ "environment. The package download link is available at: "
+ "https://test.pypi.org/project/apache-airflow/#files"
+ )
+
+
+def push_packages_to_pypi():
+ if confirm_action("Do you want to push packages to production PyPI?"):
+ confirm_action(
+ "I have tested the package I uploaded to test PyPI. "
+ "I installed and ran a DAG with it and there's no issue. Do you agree to the above?",
+ abort=True,
+ )
+ run_command(["twine", "upload", "-r", "pypi", "dist/*"], dry_run_override=DRY_RUN, check=True)
+ console_print("Packages pushed to production PyPI")
+ console_print(
+ "Again, confirm that the package is available here: https://pypi.python.org/pypi/apache-airflow"
+ )
+ console_print(
+ """
+ It is important to stress that this snapshot should not be named "release", and it
+ is not supposed to be used by and advertised to the end-users who do not read the devlist.
+ """
+ )
+
+
+def push_release_candidate_to_github(version):
+ if confirm_action("Do you want to push release candidate to GitHub?"):
+ console_print(
+ """
+ This step should only be done now and not before, because it triggers an automated
+ build of the production docker image, using the packages that are currently released
+ in PyPI (both airflow and latest provider packages).
+ """
+ )
+ confirm_action(f"Confirm that {version} is pushed to PyPI(not PyPI test). Is it pushed?", abort=True)
+ run_command(["git", "push", "origin", "tag", f"{version}"], dry_run_override=DRY_RUN, check=True)
+ console_print("Release candidate pushed to GitHub")
+
+
+def create_issue_for_testing(version, previous_version, github_token):
+ if confirm_action("Do you want to create issue for testing? Only applicable for patch release"):
+ console_print()
+ console_print("Create issue in github for testing the release using this subject:")
+ console_print()
+ console_print(f"Status of testing of Apache Airflow {version}")
+ console_print()
+ if CI:
+ run_command(["git", "fetch"], check=True)
+ if confirm_action("Print the issue body?"):
+ run_command(
+ [
+ "./dev/prepare_release_issue.py",
+ "generate-issue-content",
+ "--previous-release",
+ f"{previous_version}",
+ "--current-release",
+ f"{version}",
+ "--github-token",
+ f"{github_token}",
+ ],
+ check=True,
+ )
+
+
+@click.command(
+ name="start-rc-process",
+ short_help="Start RC process",
+ help="Start the process for releasing a new RC.",
+ hidden=True,
+)
+@click.option("--version", required=True, help="The release candidate version e.g. 2.4.3rc1")
+@click.option("--previous-version", required=True, help="Previous version released e.g. 2.4.2")
+@click.option(
+ "--github-token", help="GitHub token to use in generating issue for testing of release candidate"
+)
+@option_answer
+def publish_release_candidate(version, previous_version, github_token):
+ if "rc" not in version:
+ exit("Version must contain 'rc'")
+ if "rc" in previous_version:
+ exit("Previous version must not contain 'rc'")
+ if not github_token:
+ github_token = os.environ.get("GITHUB_TOKEN")
+ if not github_token:
+ console_print("GITHUB_TOKEN is not set! Issue generation will fail.")
+ confirm_action("Do you want to continue?", abort=True)
+ version_suffix = version[-3:]
+ version_branch = version[:3].replace(".", "-")
+ version_without_rc = version[:-3]
+ os.chdir(AIRFLOW_SOURCES_ROOT)
+ airflow_repo_root = os.getcwd()
+
+ # List the above variables and ask for confirmation
+ console_print()
+ console_print(f"Previous version: {previous_version}")
+ console_print(f"version: {version}")
+ console_print(f"version_suffix: {version_suffix}")
+ console_print(f"version_branch: {version_branch}")
+ console_print(f"version_without_rc: {version_without_rc}")
+ console_print(f"airflow_repo_root: {airflow_repo_root}")
+ console_print()
+ console_print("Below are your git remotes. We will push to origin:")
+ run_command(["git", "remote", "-v"], dry_run_override=DRY_RUN)
+ console_print()
+ confirm_action("Verify that the above information is correct. Do you want to continue?", abort=True)
+ # Final confirmation
+ confirm_action("Pushes will be made to origin. Do you want to continue?", abort=True)
+ # Merge the sync PR
+ merge_pr(version_branch)
+
+ # Tag & clean the repo
+ git_tag(version)
+ git_clean()
+ # Build the latest image
+ if confirm_action("Build latest breeze image?"):
+ run_command(["breeze", "ci-image", "build", "--python", "3.7"], dry_run_override=DRY_RUN, check=True)
+ # Create the tarball
+ tarball_release(version, version_without_rc)
+ # Create the artifacts
+ if confirm_action("Use breeze to create artifacts?"):
+ create_artifacts_with_breeze()
+ elif confirm_action("Use setup.py to create artifacts?"):
+ create_artifacts_with_sdist()
+ # Sign the release
+ sign_the_release(airflow_repo_root)
+ # Tag and push constraints
+ tag_and_push_constraints(version, version_branch)
+ # Clone the asf repo
+ clone_asf_repo(version, airflow_repo_root)
+ # Move artifacts to SVN
+ move_artifacts_to_svn(version, airflow_repo_root)
+ # Push the artifacts to the asf repo
+ push_artifacts_to_asf_repo(version, airflow_repo_root)
+ # Prepare the pypi packages
+ prepare_pypi_packages(version, version_suffix, airflow_repo_root)
+ # Push the packages to test pypi
+ push_packages_to_test_pypi()
+
+ # Push the packages to pypi
+ push_packages_to_pypi()
+ # Push the release candidate to gitHub
+
+ push_release_candidate_to_github(version)
+ # Create issue for testing
+ os.chdir(airflow_repo_root)
+ create_issue_for_testing(version, previous_version, github_token)
+ console_print()
+ console_print("Done!")
diff --git a/dev/breeze/src/airflow_breeze/commands/release_command.py b/dev/breeze/src/airflow_breeze/commands/release_command.py
new file mode 100644
index 0000000000..73af6cae38
--- /dev/null
+++ b/dev/breeze/src/airflow_breeze/commands/release_command.py
@@ -0,0 +1,291 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import os
+
+import click
+
+from airflow_breeze.utils.common_options import option_answer
+from airflow_breeze.utils.confirm import confirm_action
+from airflow_breeze.utils.console import console_print
+from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
+from airflow_breeze.utils.run_utils import run_command
+
+CI = os.environ.get("CI")
+DRY_RUN = True if CI else False
+
+
+def clone_asf_repo(working_dir):
+ if confirm_action("Clone ASF repo?"):
+ run_command(["rm", "-rf", f"{working_dir}/asf-dist"], check=True)
+ run_command(
+ ["svn", "checkout", "--depth=immediates", "https://dist.apache.org/repos/dist", "asf-dist"],
+ check=True,
+ )
+ dev_dir = f"{working_dir}/asf-dist/dev/airflow"
+ release_dir = f"{working_dir}/asf-dist/release/airflow"
+ run_command(["svn", "update", "--set-depth", "infinity", dev_dir], check=True)
+ run_command(["svn", "update", "--set-depth", "infinity", release_dir], check=True)
+
+
+def create_version_dir(version):
+ if confirm_action(f"Create SVN version directory for {version}?"):
+ run_command(["svn", "mkdir", f"{version}"], dry_run_override=DRY_RUN, check=True)
+ console_print(f"{version} directory created")
+
+
+def copy_artifacts_to_svn(rc, svn_dev_repo):
+ if confirm_action(f"Copy artifacts to SVN for {rc}?"):
+ run_command(
+ [
+ "for",
+ "f",
+ "in",
+ f"{svn_dev_repo}/{rc}/*",
+ ";",
+ "do",
+ "svn",
+ "cp",
+ "$f",
+ "${$(basename $f)/}",
+ "done",
+ ],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+ console_print("Artifacts copied to SVN:")
+ run_command(["ls"], dry_run_override=DRY_RUN)
+
+
+def commit_release(version, rc, svn_release_version_dir):
+ if confirm_action(f"Commit release {version} to SVN?"):
+ run_command(
+ ["svn", "commit", "-m", f"Release Airflow {version} from {rc}"],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+
+
+def remove_old_release(previous_release):
+ if confirm_action(f"Remove old release {previous_release}?"):
+ run_command(["svn", "rm", f"{previous_release}"], dry_run_override=DRY_RUN, check=True)
+ run_command(
+ ["svn", "commit", "-m", f"Remove old release: {previous_release}"],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+ confirm_action(
+ "Verify that the packages appear in "
+ "[airflow](https://dist.apache.org/repos/dist/release/airflow/). Continue?",
+ abort=True,
+ )
+
+
+def verify_pypi_package(version):
+ if confirm_action("Verify PyPI package?"):
+ run_command(["twine", "check", "*.whl", f"*{version}.tar.gz"], check=True)
+
+
+def upload_to_pypi_test(version):
+ if confirm_action("Upload to PyPI test?"):
+ run_command(
+ ["twine", "upload", "-r", "pypitest", "*.whl", f"*{version}.tar.gz"],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+ console_print("Packages pushed to test PyPI")
+ console_print(
+ "Verify that the test package looks good by downloading it and installing it into a virtual "
+ "environment. The package download link is available at: "
+ "https://test.pypi.org/project/apache-airflow/#files"
+ )
+
+
+def upload_to_pypi(version):
+ if confirm_action("Upload to PyPI?"):
+ confirm_action(
+ "I have tested the package I uploaded to test PyPI. "
+ "I installed and ran a DAG with it and there's no issue. Do you agree to the above?",
+ abort=True,
+ )
+ run_command(
+ ["twine", "upload", "-r", "pypi", "*.whl", f"*{version}.tar.gz"],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+ console_print("Packages pushed to production PyPI")
+ console_print(
+ "Again, confirm that the package is available here: https://pypi.python.org/pypi/apache-airflow"
+ )
+
+
+def retag_constraints(release_candidate, version):
+ if confirm_action(f"Retag constraints for {release_candidate} as {version}?"):
+ run_command(
+ ["git", "checkout", f"constraints-{release_candidate}"], dry_run_override=DRY_RUN, check=True
+ )
+ run_command(
+ [
+ "git",
+ "tag",
+ "-s",
+ f"constraints-{version}",
+ "-m",
+ f"Constraints for Apache Airflow {version}",
+ ],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+ if confirm_action("Push latest constraints tag to GitHub?"):
+ run_command(
+ ["git", "push", "origin", "tag", f"constraints-{version}"], dry_run_override=DRY_RUN, check=True
+ )
+
+
+def tag_and_push_latest_constraint(version):
+ console_print("In case you release 'latest stable' version, also update 'latest' constraints")
+ if confirm_action("Tag latest constraint?"):
+ run_command(
+ [
+ "git",
+ "tag",
+ "-f",
+ "-s",
+ "constraints-latest",
+ "-m",
+ f"Latest constraints set to Apache Airflow {version}",
+ ],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+ if confirm_action("Push latest constraints tag to GitHub?"):
+ run_command(
+ ["git", "push", "origin", "tag", "constraints-latest"], dry_run_override=DRY_RUN, check=True
+ )
+
+
+def push_tag_for_final_version(version, release_candidate):
+
+ if confirm_action(f"Push tag for final version {version}?"):
+ console_print(
+ """
+ This step should only be done now and not before, because it triggers an automated
+ build of the production docker image, using the packages that are currently released
+ in PyPI (both airflow and latest provider packages).
+ """
+ )
+ confirm_action(f"Confirm that {version} is pushed to PyPI(not PyPI test). Is it pushed?", abort=True)
+
+ run_command(["git", "checkout", f"{release_candidate}"], dry_run_override=DRY_RUN, check=True)
+ run_command(
+ ["git", "tag", "-s", f"{version}", "-m", f"Apache Airflow {version}"],
+ dry_run_override=DRY_RUN,
+ check=True,
+ )
+ run_command(["git", "push", "origin", "tag", f"{version}"], dry_run_override=DRY_RUN, check=True)
+
+
+@click.command(
+ name="start-release",
+ short_help="Start Airflow release process",
+ help="Start the process of releasing an Airflow version. "
+ "This command will guide you through the release process. ",
+ hidden=True,
+)
+@click.option("--release-candidate", required=True)
+@click.option("--previous-release", required=True)
+@option_answer
+def airflow_release(release_candidate, previous_release):
+ if "rc" not in release_candidate:
+ exit("Release candidate must contain 'rc'")
+ if "rc" in previous_release:
+ exit("Previous release must not contain 'rc'")
+ version = release_candidate[:-3]
+ os.chdir(AIRFLOW_SOURCES_ROOT)
+ airflow_repo_root = os.getcwd()
+ console_print()
+ console_print("Release candidate:", release_candidate)
+ console_print("Release Version:", version)
+ console_print("Previous release:", previous_release)
+ console_print("Airflow repo root:", airflow_repo_root)
+ console_print()
+ console_print("Below are your git remotes. We will push to origin:")
+ run_command(["git", "remote", "-v"], check=True)
+ console_print()
+ confirm_action("Verify that the above information is correct. Do you want to continue?", abort=True)
+ # Final confirmation
+ confirm_action("Pushes will be made to origin. Do you want to continue?", abort=True)
+
+ # Clone the asf repo
+ os.chdir("..")
+ working_dir = os.getcwd()
+ clone_asf_repo(working_dir)
+ svn_dev_repo = f"{working_dir}/asf-dist/dev/airflow"
+ svn_release_repo = f"{working_dir}/asf-dist/release/airflow"
+ console_print("SVN dev repo root:", svn_dev_repo)
+ console_print("SVN release repo root:", svn_release_repo)
+
+ # Create the version directory
+ confirm_action("Confirm that the above repo exists. Continue?", abort=True)
+
+ # Change to the svn release repo
+ os.chdir(svn_release_repo)
+
+ # Create the version directory
+ create_version_dir(version)
+ svn_release_version_dir = f"{svn_release_repo}/{version}"
+ console_print("SVN Release version dir:", svn_release_version_dir)
+
+ # Change directory to the version directory
+ if os.path.exists(svn_release_version_dir):
+ os.chdir(svn_release_version_dir)
+ else:
+ confirm_action("Version directory does not exist. Do you want to Continue?", abort=True)
+
+ # Copy artifacts to the version directory
+ copy_artifacts_to_svn(release_candidate, svn_dev_repo)
+
+ # Commit the release to svn
+ commit_release(version, release_candidate, svn_release_version_dir)
+
+ # Remove old release
+ if os.path.exists(svn_release_version_dir):
+ os.chdir("..")
+ remove_old_release(previous_release)
+
+ # Verify pypi package
+ if os.path.exists(svn_release_version_dir):
+ os.chdir(svn_release_version_dir)
+ verify_pypi_package(version)
+
+ # Upload to pypi test
+ upload_to_pypi_test(version)
+ # Upload to pypi
+ upload_to_pypi(version)
+
+ # Change Directory to airflow
+ os.chdir(airflow_repo_root)
+
+ # Retag and push the constraint file
+ retag_constraints(release_candidate, version)
+ tag_and_push_latest_constraint(version)
+
+ # Push tag for final version
+ push_tag_for_final_version(version, release_candidate)
+
+ console_print("Done!")
diff --git a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
index 0534ea8cf1..287ab93a43 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -34,6 +34,9 @@ from rich.progress import Progress
from rich.syntax import Syntax
from airflow_breeze.commands.ci_image_commands import rebuild_or_pull_ci_image_if_needed
+from airflow_breeze.commands.minor_release_command import create_minor_version_branch
+from airflow_breeze.commands.release_candidate_command import publish_release_candidate
+from airflow_breeze.commands.release_command import airflow_release
from airflow_breeze.global_constants import (
ALLOWED_PLATFORMS,
APACHE_AIRFLOW_GITHUB_REPOSITORY,
@@ -887,3 +890,9 @@ def generate_issue_content(
users.add("@" + pr.user.login)
get_console().print("All users involved in the PRs:")
get_console().print(" ".join(users))
+
+
+# AIRFLOW RELEASE COMMANDS
+release_management.add_command(publish_release_candidate)
+release_management.add_command(airflow_release)
+release_management.add_command(create_minor_version_branch)
diff --git a/dev/breeze/src/airflow_breeze/utils/confirm.py b/dev/breeze/src/airflow_breeze/utils/confirm.py
index 1bb95d8080..0b64697c19 100644
--- a/dev/breeze/src/airflow_breeze/utils/confirm.py
+++ b/dev/breeze/src/airflow_breeze/utils/confirm.py
@@ -98,3 +98,20 @@ def user_confirm(
if quit_allowed:
return Answer.QUIT
sys.exit(1)
+
+
+def confirm_action(
+ message: str,
+ timeout: float | None = None,
+ default_answer: Answer | None = Answer.NO,
+ quit_allowed: bool = True,
+ abort: bool = False,
+) -> bool:
+ answer = user_confirm(message, timeout, default_answer, quit_allowed)
+ if answer == Answer.YES:
+ return True
+ elif abort:
+ sys.exit(1)
+ elif answer == Answer.QUIT:
+ sys.exit(1)
+ return False
diff --git a/dev/breeze/src/airflow_breeze/utils/console.py b/dev/breeze/src/airflow_breeze/utils/console.py
index 72d3cd2f30..cf357e48b8 100644
--- a/dev/breeze/src/airflow_breeze/utils/console.py
+++ b/dev/breeze/src/airflow_breeze/utils/console.py
@@ -105,3 +105,7 @@ def get_stderr_console(output: Output | None = None) -> Console:
theme=get_theme(),
record=True if recording_file else False,
)
+
+
+def console_print(*message) -> None:
+ return get_console().print(*message)
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index 219c440000..5fa6522464 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -34,21 +34,25 @@ k8s:456db86a3571397c44f9647d3c06864a
prod-image:build:9cfa194bc24c8636416db1f21b086b1e
prod-image:pull:e3c89dd908fc44adf6e159c2950ebdd0
prod-image:verify:31bc5efada1d70a0a31990025db1a093
-prod-image:a4013428dc7f71a1defc3778d2efe3dc
+prod-image:4f98deab35e53ebddbdc9950a50555a4
+release-management:create-minor-branch:6a01066dce15e09fb269a8385626657c
release-management:generate-constraints:ae30d6ad49a1b2c15b61cb29080fd957
release-management:generate-issue-content:24218438f9e85e7c92258aadebbb19de
release-management:prepare-airflow-package:3ac14ea6d2b09614959c0ec4fd564789
release-management:prepare-provider-documentation:3fe5ead9887c518d1b397d1103dc0025
release-management:prepare-provider-packages:40144cb01afc56f6a4f92d9e117e546e
release-management:release-prod-images:c9bc40938e0efad49e51ef66e83f9527
+release-management:start-rc-process:6aafbaceabd7b67b9a1af4c2f59abc4c
+release-management:start-release:acb384d86e02ff5fde1bf971897be17c
release-management:verify-provider-packages:88bd609aff6d09d52ab8d80d6e055e7b
-release-management:eafd13da512a5a7c0fb1499cf7ff1d63
+release-management:ce37a79b83b964ecf575b5aef0515462
setup:autocomplete:03343478bf1d0cf9c101d454cdb63b68
+setup:check-all-params-in-groups:5b3dc1f6e630510c8f52c3d0687b3b2a
setup:config:3ffcd35dd24b486ddf1d08b797e3d017
-setup:regenerate-command-images:ab2d83c339fa3a42b0c819b6b6cc88ae
+setup:regenerate-command-images:10d5d83f294cd86245cd51d4185504bb
setup:self-upgrade:d02f70c7a230eae3463ceec2056b63fa
setup:version:123b462a421884dc2320ffc5e54b2478
-setup:fbabee281b69f818091d780b24bd815a
+setup:f383b9236f6141f95276136ccd9217f5
shell:76e0f530b7af514a2aad3032b6516c46
start-airflow:06d4aeb5f1b65f6b975f3f915558d0b3
static-checks:f45ad432bdc47a2256fdb0277b19d816
diff --git a/images/breeze/output-commands.svg b/images/breeze/output-commands.svg
index c8763961ad..22001729e6 100644
--- a/images/breeze/output-commands.svg
+++ b/images/breeze/output-commands.svg
@@ -35,8 +35,8 @@
.breeze-help-r1 { fill: #c5c8c6;font-weight: bold }
.breeze-help-r2 { fill: #c5c8c6 }
.breeze-help-r3 { fill: #d0b344;font-weight: bold }
-.breeze-help-r4 { fill: #868887 }
-.breeze-help-r5 { fill: #68a0b3;font-weight: bold }
+.breeze-help-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-help-r5 { fill: #868887 }
.breeze-help-r6 { fill: #98a84b;font-weight: bold }
.breeze-help-r7 { fill: #8d7b39 }
</style>
@@ -187,49 +187,49 @@
<g class="breeze-help-matrix">
<text class="breeze-help-r2" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-help-line-0)">
-</text><text class="breeze-help-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-help-line-1)">Usage: </text><text class="breeze-help-r1" x="97.6" y="44.4" textLength="414.8" clip-path="url(#breeze-help-line-1)">breeze [OPTIONS] COMMAND [ARGS]...</text><text class="breeze-help-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#breeze-help-line-1)">
+</text><text class="breeze-help-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-help-line-1)">Usage: </text><text class="breeze-help-r1" x="97.6" y="44.4" textLength="97.6" clip-path="url(#breeze-help-line-1)">breeze [</text><text class="breeze-help-r4" x="195.2" y="44.4" textLength="85.4" clip-path="url(#breeze-help-line-1)">OPTIONS</text><text class="breeze-help-r1" x="280.6" y="44.4" textLength="24.4" clip-path="url(#breeze-help-line-1)">] </text><text cl [...]
</text><text class="breeze-help-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-help-line-2)">
-</text><text class="breeze-help-r4" x="0" y="93.2" textLength="24.4" clip-path="url(#breeze-help-line-3)">╭─</text><text class="breeze-help-r4" x="24.4" y="93.2" textLength="158.6" clip-path="url(#breeze-help-line-3)"> Basic flags </text><text class="breeze-help-r4" x="183" y="93.2" textLength="1256.6" clip-path="url(#breeze-help-line-3)">───────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-help-r [...]
-</text><text class="breeze-help-r4" x="0" y="117.6" textLength="12.2" clip-path="url(#breeze-help-line-4)">│</text><text class="breeze-help-r5" x="24.4" y="117.6" textLength="12.2" clip-path="url(#breeze-help-line-4)">-</text><text class="breeze-help-r5" x="36.6" y="117.6" textLength="85.4" clip-path="url(#breeze-help-line-4)">-python</text><text class="breeze-help-r6" x="305" y="117.6" textLength="24.4" clip-path="url(#breeze-help-line-4)">-p</text><text class="breeze-help-r2" x="353.8" [...]
-</text><text class="breeze-help-r4" x="0" y="142" textLength="12.2" clip-path="url(#breeze-help-line-5)">│</text><text class="breeze-help-r4" x="353.8" y="142" textLength="732" clip-path="url(#breeze-help-line-5)">[default: 3.7]                                           & [...]
-</text><text class="breeze-help-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-help-line-6)">│</text><text class="breeze-help-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#breeze-help-line-6)">-</text><text class="breeze-help-r5" x="36.6" y="166.4" textLength="97.6" clip-path="url(#breeze-help-line-6)">-backend</text><text class="breeze-help-r6" x="305" y="166.4" textLength="24.4" clip-path="url(#breeze-help-line-6)">-b</text><text class="breeze-help-r2" x="353.8 [...]
-</text><text class="breeze-help-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-help-line-7)">│</text><text class="breeze-help-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#breeze-help-line-7)">-</text><text class="breeze-help-r5" x="36.6" y="190.8" textLength="109.8" clip-path="url(#breeze-help-line-7)">-postgres</text><text class="breeze-help-r5" x="146.4" y="190.8" textLength="97.6" clip-path="url(#breeze-help-line-7)">-version</text><text class="breeze-help-r6 [...]
-</text><text class="breeze-help-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-help-line-8)">│</text><text class="breeze-help-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#breeze-help-line-8)">-</text><text class="breeze-help-r5" x="36.6" y="215.2" textLength="73.2" clip-path="url(#breeze-help-line-8)">-mysql</text><text class="breeze-help-r5" x="109.8" y="215.2" textLength="97.6" clip-path="url(#breeze-help-line-8)">-version</text><text class="breeze-help-r6" x= [...]
-</text><text class="breeze-help-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-help-line-9)">│</text><text class="breeze-help-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#breeze-help-line-9)">-</text><text class="breeze-help-r5" x="36.6" y="239.6" textLength="73.2" clip-path="url(#breeze-help-line-9)">-mssql</text><text class="breeze-help-r5" x="109.8" y="239.6" textLength="97.6" clip-path="url(#breeze-help-line-9)">-version</text><text class="breeze-help-r6" x= [...]
-</text><text class="breeze-help-r4" x="0" y="264" textLength="12.2" clip-path="url(#breeze-help-line-10)">│</text><text class="breeze-help-r5" x="24.4" y="264" textLength="12.2" clip-path="url(#breeze-help-line-10)">-</text><text class="breeze-help-r5" x="36.6" y="264" textLength="146.4" clip-path="url(#breeze-help-line-10)">-integration</text><text class="breeze-help-r2" x="353.8" y="264" textLength="744.2" clip-path="url(#breeze-help-line-10)">Integration(s) to enable wh [...]
-</text><text class="breeze-help-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-help-line-11)">│</text><text class="breeze-help-r7" x="353.8" y="288.4" textLength="744.2" clip-path="url(#breeze-help-line-11)">(cassandra | kerberos | mongo | pinot | celery | trino | all)</text><text class="breeze-help-r4" x="1451.8" y="288.4" textLength="12.2" clip-path="url(#breeze-help-line-11)">│</text><text class="breeze-help-r2" [...]
-</text><text class="breeze-help-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-help-line-12)">│</text><text class="breeze-help-r5" x="24.4" y="312.8" textLength="12.2" clip-path="url(#breeze-help-line-12)">-</text><text class="breeze-help-r5" x="36.6" y="312.8" textLength="97.6" clip-path="url(#breeze-help-line-12)">-forward</text><text class="breeze-help-r5" x="134.2" y="312.8" textLength="146.4" clip-path="url(#breeze-help-line-12)">-credentials</text><text class="breeze- [...]
-</text><text class="breeze-help-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-help-line-13)">│</text><text class="breeze-help-r5" x="24.4" y="337.2" textLength="12.2" clip-path="url(#breeze-help-line-13)">-</text><text class="breeze-help-r5" x="36.6" y="337.2" textLength="36.6" clip-path="url(#breeze-help-line-13)">-db</text><text class="breeze-help-r5" x="73.2" y="337.2" textLength="73.2" clip-path="url(#breeze-help-line-13)">-reset</text><text class="breeze-help-r6" x="3 [...]
-</text><text class="breeze-help-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-help-line-14)">│</text><text class="breeze-help-r5" x="24.4" y="361.6" textLength="12.2" clip-path="url(#breeze-help-line-14)">-</text><text class="breeze-help-r5" x="36.6" y="361.6" textLength="48.8" clip-path="url(#breeze-help-line-14)">-max</text><text class="breeze-help-r5" x="85.4" y="361.6" textLength="61" clip-path="url(#breeze-help-line-14)">-time</text><text class="breeze-help-r2" x="353 [...]
-</text><text class="breeze-help-r4" x="0" y="386" textLength="12.2" clip-path="url(#breeze-help-line-15)">│</text><text class="breeze-help-r7" x="353.8" y="386" textLength="1049.2" clip-path="url(#breeze-help-line-15)">(INTEGER RANGE)                                          & [...]
-</text><text class="breeze-help-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-help-line-16)">│</text><text class="breeze-help-r5" x="24.4" y="410.4" textLength="12.2" clip-path="url(#breeze-help-line-16)">-</text><text class="breeze-help-r5" x="36.6" y="410.4" textLength="85.4" clip-path="url(#breeze-help-line-16)">-github</text><text class="breeze-help-r5" x="122" y="410.4" textLength="134.2" clip-path="url(#breeze-help-line-16)">-repository</text><text class="breeze-help [...]
-</text><text class="breeze-help-r4" x="0" y="434.8" textLength="1464" clip-path="url(#breeze-help-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-help-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-help-line-17)">
-</text><text class="breeze-help-r4" x="0" y="459.2" textLength="24.4" clip-path="url(#breeze-help-line-18)">╭─</text><text class="breeze-help-r4" x="24.4" y="459.2" textLength="195.2" clip-path="url(#breeze-help-line-18)"> Common options </text><text class="breeze-help-r4" x="219.6" y="459.2" textLength="1220" clip-path="url(#breeze-help-line-18)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze- [...]
-</text><text class="breeze-help-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-help-line-19)">│</text><text class="breeze-help-r5" x="24.4" y="483.6" textLength="12.2" clip-path="url(#breeze-help-line-19)">-</text><text class="breeze-help-r5" x="36.6" y="483.6" textLength="97.6" clip-path="url(#breeze-help-line-19)">-verbose</text><text class="breeze-help-r6" x="158.6" y="483.6" textLength="24.4" clip-path="url(#breeze-help-line-19)">-v</text><text class="breeze-help-r2" x= [...]
-</text><text class="breeze-help-r4" x="0" y="508" textLength="12.2" clip-path="url(#breeze-help-line-20)">│</text><text class="breeze-help-r5" x="24.4" y="508" textLength="12.2" clip-path="url(#breeze-help-line-20)">-</text><text class="breeze-help-r5" x="36.6" y="508" textLength="48.8" clip-path="url(#breeze-help-line-20)">-dry</text><text class="breeze-help-r5" x="85.4" y="508" textLength="48.8" clip-path="url(#breeze-help-line-20)">-run</text><text class="breeze-help-r6" x="158.6" y=" [...]
-</text><text class="breeze-help-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-help-line-21)">│</text><text class="breeze-help-r5" x="24.4" y="532.4" textLength="12.2" clip-path="url(#breeze-help-line-21)">-</text><text class="breeze-help-r5" x="36.6" y="532.4" textLength="85.4" clip-path="url(#breeze-help-line-21)">-answer</text><text class="breeze-help-r6" x="158.6" y="532.4" textLength="24.4" clip-path="url(#breeze-help-line-21)">-a</text><text class="breeze-help-r2" x=" [...]
-</text><text class="breeze-help-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-help-line-22)">│</text><text class="breeze-help-r5" x="24.4" y="556.8" textLength="12.2" clip-path="url(#breeze-help-line-22)">-</text><text class="breeze-help-r5" x="36.6" y="556.8" textLength="61" clip-path="url(#breeze-help-line-22)">-help</text><text class="breeze-help-r6" x="158.6" y="556.8" textLength="24.4" clip-path="url(#breeze-help-line-22)">-h</text><text class="breeze-help-r2" x="207. [...]
-</text><text class="breeze-help-r4" x="0" y="581.2" textLength="1464" clip-path="url(#breeze-help-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-help-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-help-line-23)">
-</text><text class="breeze-help-r4" x="0" y="605.6" textLength="24.4" clip-path="url(#breeze-help-line-24)">╭─</text><text class="breeze-help-r4" x="24.4" y="605.6" textLength="317.2" clip-path="url(#breeze-help-line-24)"> Basic developer commands </text><text class="breeze-help-r4" x="341.6" y="605.6" textLength="1098" clip-path="url(#breeze-help-line-24)">──────────────────────────────────────────────────────────────────────────────────────────</text><text class="br [...]
-</text><text class="breeze-help-r4" x="0" y="630" textLength="12.2" clip-path="url(#breeze-help-line-25)">│</text><text class="breeze-help-r5" x="24.4" y="630" textLength="219.6" clip-path="url(#breeze-help-line-25)">start-airflow     </text><text class="breeze-help-r2" x="268.4" y="630" textLength="1171.2" clip-path="url(#breeze-help-line-25)">Enter breeze environment and starts all Airflow components in the tmux [...]
-</text><text class="breeze-help-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-help-line-26)">│</text><text class="breeze-help-r2" x="268.4" y="654.4" textLength="1171.2" clip-path="url(#breeze-help-line-26)">if contents of www directory changed.                                   [...]
-</text><text class="breeze-help-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-help-line-27)">│</text><text class="breeze-help-r5" x="24.4" y="678.8" textLength="219.6" clip-path="url(#breeze-help-line-27)">static-checks     </text><text class="breeze-help-r2" x="268.4" y="678.8" textLength="1171.2" clip-path="url(#breeze-help-line-27)">Run static checks.              &# [...]
-</text><text class="breeze-help-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-help-line-28)">│</text><text class="breeze-help-r5" x="24.4" y="703.2" textLength="219.6" clip-path="url(#breeze-help-line-28)">build-docs        </text><text class="breeze-help-r2" x="268.4" y="703.2" textLength="1171.2" clip-path="url(#breeze-help-line-28)">Build documentation in the container.        [...]
-</text><text class="breeze-help-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-help-line-29)">│</text><text class="breeze-help-r5" x="24.4" y="727.6" textLength="219.6" clip-path="url(#breeze-help-line-29)">stop              </text><text class="breeze-help-r2" x="268.4" y="727.6" textLength="1171.2" clip-path="url(#breeze-help-line-29)">Stop running breeze environment.    [...]
-</text><text class="breeze-help-r4" x="0" y="752" textLength="12.2" clip-path="url(#breeze-help-line-30)">│</text><text class="breeze-help-r5" x="24.4" y="752" textLength="219.6" clip-path="url(#breeze-help-line-30)">shell             </text><text class="breeze-help-r2" x="268.4" y="752" textLength="1171.2" clip-path="url(#breeze-help-line-30)">Enter breeze environment. this is the default  [...]
-</text><text class="breeze-help-r4" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-help-line-31)">│</text><text class="breeze-help-r5" x="24.4" y="776.4" textLength="219.6" clip-path="url(#breeze-help-line-31)">exec              </text><text class="breeze-help-r2" x="268.4" y="776.4" textLength="1171.2" clip-path="url(#breeze-help-line-31)">Joins the interactive shell of running  [...]
-</text><text class="breeze-help-r4" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-help-line-32)">│</text><text class="breeze-help-r5" x="24.4" y="800.8" textLength="219.6" clip-path="url(#breeze-help-line-32)">compile-www-assets</text><text class="breeze-help-r2" x="268.4" y="800.8" textLength="1171.2" clip-path="url(#breeze-help-line-32)">Compiles www assets.                  & [...]
-</text><text class="breeze-help-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-help-line-33)">│</text><text class="breeze-help-r5" x="24.4" y="825.2" textLength="219.6" clip-path="url(#breeze-help-line-33)">cleanup           </text><text class="breeze-help-r2" x="268.4" y="825.2" textLength="1171.2" clip-path="url(#breeze-help-line-33)">Cleans the cache of parameters, docker cache and& [...]
-</text><text class="breeze-help-r4" x="0" y="849.6" textLength="1464" clip-path="url(#breeze-help-line-34)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-help-r2" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-help-line-34)">
-</text><text class="breeze-help-r4" x="0" y="874" textLength="24.4" clip-path="url(#breeze-help-line-35)">╭─</text><text class="breeze-help-r4" x="24.4" y="874" textLength="305" clip-path="url(#breeze-help-line-35)"> Advanced command groups </text><text class="breeze-help-r4" x="329.4" y="874" textLength="1110.2" clip-path="url(#breeze-help-line-35)">───────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-h [...]
-</text><text class="breeze-help-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-help-line-36)">│</text><text class="breeze-help-r5" x="24.4" y="898.4" textLength="280.6" clip-path="url(#breeze-help-line-36)">testing                </text><text class="breeze-help-r2" x="329.4" y="898.4" textLength="1110.2" clip-path="url(#breeze-help-line-36)">Tools that developers can use  [...]
-</text><text class="breeze-help-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-help-line-37)">│</text><text class="breeze-help-r5" x="24.4" y="922.8" textLength="280.6" clip-path="url(#breeze-help-line-37)">ci-image               </text><text class="breeze-help-r2" x="329.4" y="922.8" textLength="1110.2" clip-path="url(#breeze-help-line-37)">Tools that developers can use to&# [...]
-</text><text class="breeze-help-r4" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-help-line-38)">│</text><text class="breeze-help-r5" x="24.4" y="947.2" textLength="280.6" clip-path="url(#breeze-help-line-38)">k8s                    </text><text class="breeze-help-r2" x="329.4" y="947.2" textLength="1110.2" clip-path="url(#breeze-help-line-38)">Tools that developers [...]
-</text><text class="breeze-help-r4" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-help-line-39)">│</text><text class="breeze-help-r5" x="24.4" y="971.6" textLength="280.6" clip-path="url(#breeze-help-line-39)">prod-image             </text><text class="breeze-help-r2" x="329.4" y="971.6" textLength="1110.2" clip-path="url(#breeze-help-line-39)">Tools that developers can use to manual [...]
-</text><text class="breeze-help-r4" x="0" y="996" textLength="12.2" clip-path="url(#breeze-help-line-40)">│</text><text class="breeze-help-r5" x="24.4" y="996" textLength="280.6" clip-path="url(#breeze-help-line-40)">setup                  </text><text class="breeze-help-r2" x="329.4" y="996" textLength="1110.2" clip-path="url(#breeze-help-line-40)">Tools that developers can use& [...]
-</text><text class="breeze-help-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-help-line-41)">│</text><text class="breeze-help-r5" x="24.4" y="1020.4" textLength="280.6" clip-path="url(#breeze-help-line-41)">release-management     </text><text class="breeze-help-r2" x="329.4" y="1020.4" textLength="1110.2" clip-path="url(#breeze-help-line-41)">Tools that release managers can use to prepare and manage [...]
-</text><text class="breeze-help-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-help-line-42)">│</text><text class="breeze-help-r5" x="24.4" y="1044.8" textLength="280.6" clip-path="url(#breeze-help-line-42)">ci                     </text><text class="breeze-help-r2" x="329.4" y="1044.8" textLength="1110.2" clip-path="url(#breeze-help-line-42)">Tools that CI [...]
-</text><text class="breeze-help-r4" x="0" y="1069.2" textLength="1464" clip-path="url(#breeze-help-line-43)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-help-r2" x="1464" y="1069.2" textLength="12.2" clip-path="url(#breeze-help-line-43)">
+</text><text class="breeze-help-r5" x="0" y="93.2" textLength="24.4" clip-path="url(#breeze-help-line-3)">╭─</text><text class="breeze-help-r5" x="24.4" y="93.2" textLength="158.6" clip-path="url(#breeze-help-line-3)"> Basic flags </text><text class="breeze-help-r5" x="183" y="93.2" textLength="1256.6" clip-path="url(#breeze-help-line-3)">───────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-help-r [...]
+</text><text class="breeze-help-r5" x="0" y="117.6" textLength="12.2" clip-path="url(#breeze-help-line-4)">│</text><text class="breeze-help-r4" x="24.4" y="117.6" textLength="12.2" clip-path="url(#breeze-help-line-4)">-</text><text class="breeze-help-r4" x="36.6" y="117.6" textLength="85.4" clip-path="url(#breeze-help-line-4)">-python</text><text class="breeze-help-r6" x="305" y="117.6" textLength="24.4" clip-path="url(#breeze-help-line-4)">-p</text><text class="breeze-help-r2" x="353.8" [...]
+</text><text class="breeze-help-r5" x="0" y="142" textLength="12.2" clip-path="url(#breeze-help-line-5)">│</text><text class="breeze-help-r5" x="353.8" y="142" textLength="732" clip-path="url(#breeze-help-line-5)">[default: 3.7]                                           & [...]
+</text><text class="breeze-help-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-help-line-6)">│</text><text class="breeze-help-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#breeze-help-line-6)">-</text><text class="breeze-help-r4" x="36.6" y="166.4" textLength="97.6" clip-path="url(#breeze-help-line-6)">-backend</text><text class="breeze-help-r6" x="305" y="166.4" textLength="24.4" clip-path="url(#breeze-help-line-6)">-b</text><text class="breeze-help-r2" x="353.8 [...]
+</text><text class="breeze-help-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-help-line-7)">│</text><text class="breeze-help-r4" x="24.4" y="190.8" textLength="12.2" clip-path="url(#breeze-help-line-7)">-</text><text class="breeze-help-r4" x="36.6" y="190.8" textLength="109.8" clip-path="url(#breeze-help-line-7)">-postgres</text><text class="breeze-help-r4" x="146.4" y="190.8" textLength="97.6" clip-path="url(#breeze-help-line-7)">-version</text><text class="breeze-help-r6 [...]
+</text><text class="breeze-help-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-help-line-8)">│</text><text class="breeze-help-r4" x="24.4" y="215.2" textLength="12.2" clip-path="url(#breeze-help-line-8)">-</text><text class="breeze-help-r4" x="36.6" y="215.2" textLength="73.2" clip-path="url(#breeze-help-line-8)">-mysql</text><text class="breeze-help-r4" x="109.8" y="215.2" textLength="97.6" clip-path="url(#breeze-help-line-8)">-version</text><text class="breeze-help-r6" x= [...]
+</text><text class="breeze-help-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-help-line-9)">│</text><text class="breeze-help-r4" x="24.4" y="239.6" textLength="12.2" clip-path="url(#breeze-help-line-9)">-</text><text class="breeze-help-r4" x="36.6" y="239.6" textLength="73.2" clip-path="url(#breeze-help-line-9)">-mssql</text><text class="breeze-help-r4" x="109.8" y="239.6" textLength="97.6" clip-path="url(#breeze-help-line-9)">-version</text><text class="breeze-help-r6" x= [...]
+</text><text class="breeze-help-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-help-line-10)">│</text><text class="breeze-help-r4" x="24.4" y="264" textLength="12.2" clip-path="url(#breeze-help-line-10)">-</text><text class="breeze-help-r4" x="36.6" y="264" textLength="146.4" clip-path="url(#breeze-help-line-10)">-integration</text><text class="breeze-help-r2" x="353.8" y="264" textLength="744.2" clip-path="url(#breeze-help-line-10)">Integration(s) to enable wh [...]
+</text><text class="breeze-help-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-help-line-11)">│</text><text class="breeze-help-r7" x="353.8" y="288.4" textLength="744.2" clip-path="url(#breeze-help-line-11)">(cassandra | kerberos | mongo | pinot | celery | trino | all)</text><text class="breeze-help-r5" x="1451.8" y="288.4" textLength="12.2" clip-path="url(#breeze-help-line-11)">│</text><text class="breeze-help-r2" [...]
+</text><text class="breeze-help-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-help-line-12)">│</text><text class="breeze-help-r4" x="24.4" y="312.8" textLength="12.2" clip-path="url(#breeze-help-line-12)">-</text><text class="breeze-help-r4" x="36.6" y="312.8" textLength="97.6" clip-path="url(#breeze-help-line-12)">-forward</text><text class="breeze-help-r4" x="134.2" y="312.8" textLength="146.4" clip-path="url(#breeze-help-line-12)">-credentials</text><text class="breeze- [...]
+</text><text class="breeze-help-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-help-line-13)">│</text><text class="breeze-help-r4" x="24.4" y="337.2" textLength="12.2" clip-path="url(#breeze-help-line-13)">-</text><text class="breeze-help-r4" x="36.6" y="337.2" textLength="36.6" clip-path="url(#breeze-help-line-13)">-db</text><text class="breeze-help-r4" x="73.2" y="337.2" textLength="73.2" clip-path="url(#breeze-help-line-13)">-reset</text><text class="breeze-help-r6" x="3 [...]
+</text><text class="breeze-help-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-help-line-14)">│</text><text class="breeze-help-r4" x="24.4" y="361.6" textLength="12.2" clip-path="url(#breeze-help-line-14)">-</text><text class="breeze-help-r4" x="36.6" y="361.6" textLength="48.8" clip-path="url(#breeze-help-line-14)">-max</text><text class="breeze-help-r4" x="85.4" y="361.6" textLength="61" clip-path="url(#breeze-help-line-14)">-time</text><text class="breeze-help-r2" x="353 [...]
+</text><text class="breeze-help-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-help-line-15)">│</text><text class="breeze-help-r7" x="353.8" y="386" textLength="1049.2" clip-path="url(#breeze-help-line-15)">(INTEGER RANGE)                                          & [...]
+</text><text class="breeze-help-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-help-line-16)">│</text><text class="breeze-help-r4" x="24.4" y="410.4" textLength="12.2" clip-path="url(#breeze-help-line-16)">-</text><text class="breeze-help-r4" x="36.6" y="410.4" textLength="85.4" clip-path="url(#breeze-help-line-16)">-github</text><text class="breeze-help-r4" x="122" y="410.4" textLength="134.2" clip-path="url(#breeze-help-line-16)">-repository</text><text class="breeze-help [...]
+</text><text class="breeze-help-r5" x="0" y="434.8" textLength="1464" clip-path="url(#breeze-help-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-help-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-help-line-17)">
+</text><text class="breeze-help-r5" x="0" y="459.2" textLength="24.4" clip-path="url(#breeze-help-line-18)">╭─</text><text class="breeze-help-r5" x="24.4" y="459.2" textLength="195.2" clip-path="url(#breeze-help-line-18)"> Common options </text><text class="breeze-help-r5" x="219.6" y="459.2" textLength="1220" clip-path="url(#breeze-help-line-18)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze- [...]
+</text><text class="breeze-help-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-help-line-19)">│</text><text class="breeze-help-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#breeze-help-line-19)">-</text><text class="breeze-help-r4" x="36.6" y="483.6" textLength="97.6" clip-path="url(#breeze-help-line-19)">-verbose</text><text class="breeze-help-r6" x="158.6" y="483.6" textLength="24.4" clip-path="url(#breeze-help-line-19)">-v</text><text class="breeze-help-r2" x= [...]
+</text><text class="breeze-help-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-help-line-20)">│</text><text class="breeze-help-r4" x="24.4" y="508" textLength="12.2" clip-path="url(#breeze-help-line-20)">-</text><text class="breeze-help-r4" x="36.6" y="508" textLength="48.8" clip-path="url(#breeze-help-line-20)">-dry</text><text class="breeze-help-r4" x="85.4" y="508" textLength="48.8" clip-path="url(#breeze-help-line-20)">-run</text><text class="breeze-help-r6" x="158.6" y=" [...]
+</text><text class="breeze-help-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-help-line-21)">│</text><text class="breeze-help-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#breeze-help-line-21)">-</text><text class="breeze-help-r4" x="36.6" y="532.4" textLength="85.4" clip-path="url(#breeze-help-line-21)">-answer</text><text class="breeze-help-r6" x="158.6" y="532.4" textLength="24.4" clip-path="url(#breeze-help-line-21)">-a</text><text class="breeze-help-r2" x=" [...]
+</text><text class="breeze-help-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-help-line-22)">│</text><text class="breeze-help-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#breeze-help-line-22)">-</text><text class="breeze-help-r4" x="36.6" y="556.8" textLength="61" clip-path="url(#breeze-help-line-22)">-help</text><text class="breeze-help-r6" x="158.6" y="556.8" textLength="24.4" clip-path="url(#breeze-help-line-22)">-h</text><text class="breeze-help-r2" x="207. [...]
+</text><text class="breeze-help-r5" x="0" y="581.2" textLength="1464" clip-path="url(#breeze-help-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-help-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-help-line-23)">
+</text><text class="breeze-help-r5" x="0" y="605.6" textLength="24.4" clip-path="url(#breeze-help-line-24)">╭─</text><text class="breeze-help-r5" x="24.4" y="605.6" textLength="317.2" clip-path="url(#breeze-help-line-24)"> Basic developer commands </text><text class="breeze-help-r5" x="341.6" y="605.6" textLength="1098" clip-path="url(#breeze-help-line-24)">──────────────────────────────────────────────────────────────────────────────────────────</text><text class="br [...]
+</text><text class="breeze-help-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-help-line-25)">│</text><text class="breeze-help-r4" x="24.4" y="630" textLength="219.6" clip-path="url(#breeze-help-line-25)">start-airflow     </text><text class="breeze-help-r2" x="268.4" y="630" textLength="1171.2" clip-path="url(#breeze-help-line-25)">Enter breeze environment and starts all Airflow components in the tmux [...]
+</text><text class="breeze-help-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-help-line-26)">│</text><text class="breeze-help-r2" x="268.4" y="654.4" textLength="1171.2" clip-path="url(#breeze-help-line-26)">if contents of www directory changed.                                   [...]
+</text><text class="breeze-help-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-help-line-27)">│</text><text class="breeze-help-r4" x="24.4" y="678.8" textLength="219.6" clip-path="url(#breeze-help-line-27)">static-checks     </text><text class="breeze-help-r2" x="268.4" y="678.8" textLength="1171.2" clip-path="url(#breeze-help-line-27)">Run static checks.              &# [...]
+</text><text class="breeze-help-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-help-line-28)">│</text><text class="breeze-help-r4" x="24.4" y="703.2" textLength="219.6" clip-path="url(#breeze-help-line-28)">build-docs        </text><text class="breeze-help-r2" x="268.4" y="703.2" textLength="1171.2" clip-path="url(#breeze-help-line-28)">Build documentation in the container.        [...]
+</text><text class="breeze-help-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-help-line-29)">│</text><text class="breeze-help-r4" x="24.4" y="727.6" textLength="219.6" clip-path="url(#breeze-help-line-29)">stop              </text><text class="breeze-help-r2" x="268.4" y="727.6" textLength="1171.2" clip-path="url(#breeze-help-line-29)">Stop running breeze environment.    [...]
+</text><text class="breeze-help-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-help-line-30)">│</text><text class="breeze-help-r4" x="24.4" y="752" textLength="219.6" clip-path="url(#breeze-help-line-30)">shell             </text><text class="breeze-help-r2" x="268.4" y="752" textLength="1171.2" clip-path="url(#breeze-help-line-30)">Enter breeze environment. this is the default  [...]
+</text><text class="breeze-help-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-help-line-31)">│</text><text class="breeze-help-r4" x="24.4" y="776.4" textLength="219.6" clip-path="url(#breeze-help-line-31)">exec              </text><text class="breeze-help-r2" x="268.4" y="776.4" textLength="1171.2" clip-path="url(#breeze-help-line-31)">Joins the interactive shell of running  [...]
+</text><text class="breeze-help-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-help-line-32)">│</text><text class="breeze-help-r4" x="24.4" y="800.8" textLength="219.6" clip-path="url(#breeze-help-line-32)">compile-www-assets</text><text class="breeze-help-r2" x="268.4" y="800.8" textLength="1171.2" clip-path="url(#breeze-help-line-32)">Compiles www assets.                  & [...]
+</text><text class="breeze-help-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-help-line-33)">│</text><text class="breeze-help-r4" x="24.4" y="825.2" textLength="219.6" clip-path="url(#breeze-help-line-33)">cleanup           </text><text class="breeze-help-r2" x="268.4" y="825.2" textLength="805.2" clip-path="url(#breeze-help-line-33)">Cleans the cache of parameters, docker cache and&# [...]
+</text><text class="breeze-help-r5" x="0" y="849.6" textLength="1464" clip-path="url(#breeze-help-line-34)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-help-r2" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-help-line-34)">
+</text><text class="breeze-help-r5" x="0" y="874" textLength="24.4" clip-path="url(#breeze-help-line-35)">╭─</text><text class="breeze-help-r5" x="24.4" y="874" textLength="305" clip-path="url(#breeze-help-line-35)"> Advanced command groups </text><text class="breeze-help-r5" x="329.4" y="874" textLength="1110.2" clip-path="url(#breeze-help-line-35)">───────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-h [...]
+</text><text class="breeze-help-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-help-line-36)">│</text><text class="breeze-help-r4" x="24.4" y="898.4" textLength="280.6" clip-path="url(#breeze-help-line-36)">testing                </text><text class="breeze-help-r2" x="329.4" y="898.4" textLength="1110.2" clip-path="url(#breeze-help-line-36)">Tools that developers can use  [...]
+</text><text class="breeze-help-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-help-line-37)">│</text><text class="breeze-help-r4" x="24.4" y="922.8" textLength="280.6" clip-path="url(#breeze-help-line-37)">ci-image               </text><text class="breeze-help-r2" x="329.4" y="922.8" textLength="597.8" clip-path="url(#breeze-help-line-37)">Tools that developers can use to [...]
+</text><text class="breeze-help-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-help-line-38)">│</text><text class="breeze-help-r4" x="24.4" y="947.2" textLength="280.6" clip-path="url(#breeze-help-line-38)">k8s                    </text><text class="breeze-help-r2" x="329.4" y="947.2" textLength="1110.2" clip-path="url(#breeze-help-line-38)">Tools that developers [...]
+</text><text class="breeze-help-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-help-line-39)">│</text><text class="breeze-help-r4" x="24.4" y="971.6" textLength="280.6" clip-path="url(#breeze-help-line-39)">prod-image             </text><text class="breeze-help-r2" x="329.4" y="971.6" textLength="597.8" clip-path="url(#breeze-help-line-39)">Tools that developers can use to manuall [...]
+</text><text class="breeze-help-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-help-line-40)">│</text><text class="breeze-help-r4" x="24.4" y="996" textLength="280.6" clip-path="url(#breeze-help-line-40)">setup                  </text><text class="breeze-help-r2" x="329.4" y="996" textLength="1110.2" clip-path="url(#breeze-help-line-40)">Tools that developers can use& [...]
+</text><text class="breeze-help-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-help-line-41)">│</text><text class="breeze-help-r4" x="24.4" y="1020.4" textLength="280.6" clip-path="url(#breeze-help-line-41)">release-management     </text><text class="breeze-help-r2" x="329.4" y="1020.4" textLength="1110.2" clip-path="url(#breeze-help-line-41)">Tools that release managers can use to prepare and manage [...]
+</text><text class="breeze-help-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-help-line-42)">│</text><text class="breeze-help-r4" x="24.4" y="1044.8" textLength="280.6" clip-path="url(#breeze-help-line-42)">ci                     </text><text class="breeze-help-r2" x="329.4" y="1044.8" textLength="134.2" clip-path="url(#breeze-help-line-42)">Tools that </text [...]
+</text><text class="breeze-help-r5" x="0" y="1069.2" textLength="1464" clip-path="url(#breeze-help-line-43)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-help-r2" x="1464" y="1069.2" textLength="12.2" clip-path="url(#breeze-help-line-43)">
</text>
</g>
</g>
diff --git a/images/breeze/output_ci-image.svg b/images/breeze/output_ci-image.svg
index 53e01649c2..a7efb69b26 100644
--- a/images/breeze/output_ci-image.svg
+++ b/images/breeze/output_ci-image.svg
@@ -32,12 +32,12 @@
font-family: arial;
}
- .terminal-985073313-r1 { fill: #c5c8c6;font-weight: bold }
-.terminal-985073313-r2 { fill: #c5c8c6 }
-.terminal-985073313-r3 { fill: #d0b344;font-weight: bold }
-.terminal-985073313-r4 { fill: #68a0b3;font-weight: bold }
-.terminal-985073313-r5 { fill: #868887 }
-.terminal-985073313-r6 { fill: #98a84b;font-weight: bold }
+ .breeze-ci-image-r1 { fill: #c5c8c6;font-weight: bold }
+.breeze-ci-image-r2 { fill: #c5c8c6 }
+.breeze-ci-image-r3 { fill: #d0b344;font-weight: bold }
+.breeze-ci-image-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-ci-image-r5 { fill: #868887 }
+.breeze-ci-image-r6 { fill: #98a84b;font-weight: bold }
</style>
<defs>
@@ -91,20 +91,20 @@
<g transform="translate(9, 41)" clip-path="url(#terminal-985073313-clip-terminal)">
- <g class="terminal-985073313-matrix">
- <text class="terminal-985073313-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-985073313-line-0)">
-</text><text class="terminal-985073313-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-985073313-line-1)">Usage: </text><text class="terminal-985073313-r1" x="97.6" y="44.4" textLength="207.4" clip-path="url(#terminal-985073313-line-1)">breeze ci-image [</text><text class="terminal-985073313-r4" x="305" y="44.4" textLength="85.4" clip-path="url(#terminal-985073313-line-1)">OPTIONS</text><text class="terminal-985073313-r1" x="390.4" y="44.4" textLength="24. [...]
-</text><text class="terminal-985073313-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-985073313-line-2)">
-</text><text class="terminal-985073313-r2" x="12.2" y="93.2" textLength="597.8" clip-path="url(#terminal-985073313-line-3)">Tools that developers can use to manually manage </text><text class="terminal-985073313-r4" x="610" y="93.2" textLength="24.4" clip-path="url(#terminal-985073313-line-3)">CI</text><text class="terminal-985073313-r2" x="634.4" y="93.2" textLength="85.4" clip-path="url(#terminal-985073313-line-3)"> images</text><text class= [...]
-</text><text class="terminal-985073313-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-985073313-line-4)">
-</text><text class="terminal-985073313-r5" x="0" y="142" textLength="24.4" clip-path="url(#terminal-985073313-line-5)">╭─</text><text class="terminal-985073313-r5" x="24.4" y="142" textLength="195.2" clip-path="url(#terminal-985073313-line-5)"> Common options </text><text class="terminal-985073313-r5" x="219.6" y="142" textLength="1220" clip-path="url(#terminal-985073313-line-5)">────────────────────────────────────────────────────────────────────────────────────────────── [...]
-</text><text class="terminal-985073313-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-985073313-line-6)">│</text><text class="terminal-985073313-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-985073313-line-6)">-</text><text class="terminal-985073313-r4" x="36.6" y="166.4" textLength="61" clip-path="url(#terminal-985073313-line-6)">-help</text><text class="terminal-985073313-r6" x="122" y="166.4" textLength="24.4" clip-path="url(#terminal-985073313-line [...]
-</text><text class="terminal-985073313-r5" x="0" y="190.8" textLength="1464" clip-path="url(#terminal-985073313-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-985073313-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#terminal-985073313-line-7)">
-</text><text class="terminal-985073313-r5" x="0" y="215.2" textLength="24.4" clip-path="url(#terminal-985073313-line-8)">╭─</text><text class="terminal-985073313-r5" x="24.4" y="215.2" textLength="195.2" clip-path="url(#terminal-985073313-line-8)"> CI Image tools </text><text class="terminal-985073313-r5" x="219.6" y="215.2" textLength="1220" clip-path="url(#terminal-985073313-line-8)">─────────────────────────────────────────────────────────────────────────────────── [...]
-</text><text class="terminal-985073313-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-985073313-line-9)">│</text><text class="terminal-985073313-r4" x="24.4" y="239.6" textLength="97.6" clip-path="url(#terminal-985073313-line-9)">build   </text><text class="terminal-985073313-r2" x="146.4" y="239.6" textLength="73.2" clip-path="url(#terminal-985073313-line-9)">Build </text><text class="terminal-985073313-r4" x="219.6" y="239.6" textLength="24.4" clip-p [...]
-</text><text class="terminal-985073313-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-985073313-line-10)">│</text><text class="terminal-985073313-r4" x="24.4" y="264" textLength="97.6" clip-path="url(#terminal-985073313-line-10)">pull    </text><text class="terminal-985073313-r2" x="146.4" y="264" textLength="329.4" clip-path="url(#terminal-985073313-line-10)">Pull and optionally verify </text><text class="terminal-985073313-r4" x="47 [...]
-</text><text class="terminal-985073313-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-985073313-line-11)">│</text><text class="terminal-985073313-r4" x="24.4" y="288.4" textLength="97.6" clip-path="url(#terminal-985073313-line-11)">verify  </text><text class="terminal-985073313-r2" x="146.4" y="288.4" textLength="85.4" clip-path="url(#terminal-985073313-line-11)">Verify </text><text class="terminal-985073313-r4" x="231.8" y="288.4" textLength="24.4" clip-pa [...]
-</text><text class="terminal-985073313-r5" x="0" y="312.8" textLength="1464" clip-path="url(#terminal-985073313-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-985073313-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#terminal-985073313-line-12)">
+ <g class="breeze-ci-image-matrix">
+ <text class="breeze-ci-image-r2" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-ci-image-line-0)">
+</text><text class="breeze-ci-image-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-ci-image-line-1)">Usage: </text><text class="breeze-ci-image-r1" x="97.6" y="44.4" textLength="207.4" clip-path="url(#breeze-ci-image-line-1)">breeze ci-image [</text><text class="breeze-ci-image-r4" x="305" y="44.4" textLength="85.4" clip-path="url(#breeze-ci-image-line-1)">OPTIONS</text><text class="breeze-ci-image-r1" x="390.4" y="44.4" textLength="24.4" clip-path="url(#br [...]
+</text><text class="breeze-ci-image-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-ci-image-line-2)">
+</text><text class="breeze-ci-image-r2" x="12.2" y="93.2" textLength="597.8" clip-path="url(#breeze-ci-image-line-3)">Tools that developers can use to manually manage </text><text class="breeze-ci-image-r4" x="610" y="93.2" textLength="24.4" clip-path="url(#breeze-ci-image-line-3)">CI</text><text class="breeze-ci-image-r2" x="634.4" y="93.2" textLength="85.4" clip-path="url(#breeze-ci-image-line-3)"> images</text><text class="breeze-ci-image-r [...]
+</text><text class="breeze-ci-image-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-ci-image-line-4)">
+</text><text class="breeze-ci-image-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-ci-image-line-5)">╭─</text><text class="breeze-ci-image-r5" x="24.4" y="142" textLength="195.2" clip-path="url(#breeze-ci-image-line-5)"> Common options </text><text class="breeze-ci-image-r5" x="219.6" y="142" textLength="1220" clip-path="url(#breeze-ci-image-line-5)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text [...]
+</text><text class="breeze-ci-image-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-ci-image-line-6)">│</text><text class="breeze-ci-image-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#breeze-ci-image-line-6)">-</text><text class="breeze-ci-image-r4" x="36.6" y="166.4" textLength="61" clip-path="url(#breeze-ci-image-line-6)">-help</text><text class="breeze-ci-image-r6" x="122" y="166.4" textLength="24.4" clip-path="url(#breeze-ci-image-line-6)">-h</text><text clas [...]
+</text><text class="breeze-ci-image-r5" x="0" y="190.8" textLength="1464" clip-path="url(#breeze-ci-image-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-ci-image-line-7)">
+</text><text class="breeze-ci-image-r5" x="0" y="215.2" textLength="24.4" clip-path="url(#breeze-ci-image-line-8)">╭─</text><text class="breeze-ci-image-r5" x="24.4" y="215.2" textLength="195.2" clip-path="url(#breeze-ci-image-line-8)"> CI Image tools </text><text class="breeze-ci-image-r5" x="219.6" y="215.2" textLength="1220" clip-path="url(#breeze-ci-image-line-8)">────────────────────────────────────────────────────────────────────────────────────────────────────< [...]
+</text><text class="breeze-ci-image-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-ci-image-line-9)">│</text><text class="breeze-ci-image-r4" x="24.4" y="239.6" textLength="97.6" clip-path="url(#breeze-ci-image-line-9)">build   </text><text class="breeze-ci-image-r2" x="146.4" y="239.6" textLength="73.2" clip-path="url(#breeze-ci-image-line-9)">Build </text><text class="breeze-ci-image-r4" x="219.6" y="239.6" textLength="24.4" clip-path="url(#breeze-ci-i [...]
+</text><text class="breeze-ci-image-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-ci-image-line-10)">│</text><text class="breeze-ci-image-r4" x="24.4" y="264" textLength="97.6" clip-path="url(#breeze-ci-image-line-10)">pull    </text><text class="breeze-ci-image-r2" x="146.4" y="264" textLength="329.4" clip-path="url(#breeze-ci-image-line-10)">Pull and optionally verify </text><text class="breeze-ci-image-r4" x="475.8" y="264" textLeng [...]
+</text><text class="breeze-ci-image-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-ci-image-line-11)">│</text><text class="breeze-ci-image-r4" x="24.4" y="288.4" textLength="97.6" clip-path="url(#breeze-ci-image-line-11)">verify  </text><text class="breeze-ci-image-r2" x="146.4" y="288.4" textLength="85.4" clip-path="url(#breeze-ci-image-line-11)">Verify </text><text class="breeze-ci-image-r4" x="231.8" y="288.4" textLength="24.4" clip-path="url(#breeze-ci-im [...]
+</text><text class="breeze-ci-image-r5" x="0" y="312.8" textLength="1464" clip-path="url(#breeze-ci-image-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-ci-image-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-ci-image-line-12)">
</text>
</g>
</g>
diff --git a/images/breeze/output_release-management.svg b/images/breeze/output_release-management.svg
index 1a70516162..b1119c5deb 100644
--- a/images/breeze/output_release-management.svg
+++ b/images/breeze/output_release-management.svg
@@ -35,8 +35,8 @@
.breeze-release-management-r1 { fill: #c5c8c6;font-weight: bold }
.breeze-release-management-r2 { fill: #c5c8c6 }
.breeze-release-management-r3 { fill: #d0b344;font-weight: bold }
-.breeze-release-management-r4 { fill: #868887 }
-.breeze-release-management-r5 { fill: #68a0b3;font-weight: bold }
+.breeze-release-management-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-release-management-r5 { fill: #868887 }
.breeze-release-management-r6 { fill: #98a84b;font-weight: bold }
</style>
@@ -105,22 +105,22 @@
<g class="breeze-release-management-matrix">
<text class="breeze-release-management-r2" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-release-management-line-0)">
-</text><text class="breeze-release-management-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-line-1)">Usage: </text><text class="breeze-release-management-r1" x="97.6" y="44.4" textLength="646.6" clip-path="url(#breeze-release-management-line-1)">breeze release-management [OPTIONS] COMMAND [ARGS]...</text><text class="breeze-release-management-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#breeze-release-management-line-1)">
+</text><text class="breeze-release-management-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-line-1)">Usage: </text><text class="breeze-release-management-r1" x="97.6" y="44.4" textLength="329.4" clip-path="url(#breeze-release-management-line-1)">breeze release-management [</text><text class="breeze-release-management-r4" x="427" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-line-1)">OPTIONS</text><text class="breez [...]
</text><text class="breeze-release-management-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-release-management-line-2)">
</text><text class="breeze-release-management-r2" x="12.2" y="93.2" textLength="902.8" clip-path="url(#breeze-release-management-line-3)">Tools that release managers can use to prepare and manage Airflow releases</text><text class="breeze-release-management-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-release-management-line-3)">
</text><text class="breeze-release-management-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-release-management-line-4)">
-</text><text class="breeze-release-management-r4" x="0" y="142" textLength="24.4" clip-path="url(#breeze-release-management-line-5)">╭─</text><text class="breeze-release-management-r4" x="24.4" y="142" textLength="195.2" clip-path="url(#breeze-release-management-line-5)"> Common options </text><text class="breeze-release-management-r4" x="219.6" y="142" textLength="1220" clip-path="url(#breeze-release-management-line-5)">──────────────────────────────────────────────────── [...]
-</text><text class="breeze-release-management-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-line-6)">│</text><text class="breeze-release-management-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-line-6)">-</text><text class="breeze-release-management-r5" x="36.6" y="166.4" textLength="61" clip-path="url(#breeze-release-management-line-6)">-help</text><text class="breeze-release-management-r6" x="122" y="166.4" textLeng [...]
-</text><text class="breeze-release-management-r4" x="0" y="190.8" textLength="1464" clip-path="url(#breeze-release-management-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-line-7)">
-</text><text class="breeze-release-management-r4" x="0" y="215.2" textLength="24.4" clip-path="url(#breeze-release-management-line-8)">╭─</text><text class="breeze-release-management-r4" x="24.4" y="215.2" textLength="122" clip-path="url(#breeze-release-management-line-8)"> Commands </text><text class="breeze-release-management-r4" x="146.4" y="215.2" textLength="1293.2" clip-path="url(#breeze-release-management-line-8)">───────────────────────────────────────────────────────── [...]
-</text><text class="breeze-release-management-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-line-9)">│</text><text class="breeze-release-management-r5" x="24.4" y="239.6" textLength="402.6" clip-path="url(#breeze-release-management-line-9)">generate-constraints             </text><text class="breeze-release-management-r2" x="451.4" y="239.6" textLength="988.2" clip-path="url(#breeze-release [...]
-</text><text class="breeze-release-management-r4" x="0" y="264" textLength="12.2" clip-path="url(#breeze-release-management-line-10)">│</text><text class="breeze-release-management-r5" x="24.4" y="264" textLength="402.6" clip-path="url(#breeze-release-management-line-10)">generate-issue-content           </text><text class="breeze-release-management-r2" x="451.4" y="264" textLength="988.2" clip-path="url(#breeze-release-management-li [...]
-</text><text class="breeze-release-management-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-line-11)">│</text><text class="breeze-release-management-r5" x="24.4" y="288.4" textLength="402.6" clip-path="url(#breeze-release-management-line-11)">prepare-airflow-package          </text><text class="breeze-release-management-r2" x="451.4" y="288.4" textLength="988.2" clip-path="url(#breeze-release-management-l [...]
-</text><text class="breeze-release-management-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-line-12)">│</text><text class="breeze-release-management-r5" x="24.4" y="312.8" textLength="402.6" clip-path="url(#breeze-release-management-line-12)">prepare-provider-documentation   </text><text class="breeze-release-management-r2" x="451.4" y="312.8" textLength="988.2" clip-path="url(#breeze-release-management-line-12)">Prepare CHANGELOG, [...]
-</text><text class="breeze-release-management-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-line-13)">│</text><text class="breeze-release-management-r5" x="24.4" y="337.2" textLength="402.6" clip-path="url(#breeze-release-management-line-13)">prepare-provider-packages        </text><text class="breeze-release-management-r2" x="451.4" y="337.2" textLength="988.2" clip-path="url(#breeze-release-management-line-13)">P [...]
-</text><text class="breeze-release-management-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-line-14)">│</text><text class="breeze-release-management-r5" x="24.4" y="361.6" textLength="402.6" clip-path="url(#breeze-release-management-line-14)">release-prod-images              </text><text class="breeze-release-management-r2" x="451.4" y="361.6" textLength="988.2" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-r4" x="0" y="386" textLength="12.2" clip-path="url(#breeze-release-management-line-15)">│</text><text class="breeze-release-management-r5" x="24.4" y="386" textLength="402.6" clip-path="url(#breeze-release-management-line-15)">verify-provider-packages         </text><text class="breeze-release-management-r2" x="451.4" y="386" textLength="988.2" clip-path="url(#breeze-release-management-line-15)">Ve [...]
-</text><text class="breeze-release-management-r4" x="0" y="410.4" textLength="1464" clip-path="url(#breeze-release-management-line-16)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-line-16)">
+</text><text class="breeze-release-management-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-release-management-line-5)">╭─</text><text class="breeze-release-management-r5" x="24.4" y="142" textLength="195.2" clip-path="url(#breeze-release-management-line-5)"> Common options </text><text class="breeze-release-management-r5" x="219.6" y="142" textLength="1220" clip-path="url(#breeze-release-management-line-5)">──────────────────────────────────────────────────── [...]
+</text><text class="breeze-release-management-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-line-6)">│</text><text class="breeze-release-management-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-line-6)">-</text><text class="breeze-release-management-r4" x="36.6" y="166.4" textLength="61" clip-path="url(#breeze-release-management-line-6)">-help</text><text class="breeze-release-management-r6" x="122" y="166.4" textLeng [...]
+</text><text class="breeze-release-management-r5" x="0" y="190.8" textLength="1464" clip-path="url(#breeze-release-management-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-line-7)">
+</text><text class="breeze-release-management-r5" x="0" y="215.2" textLength="24.4" clip-path="url(#breeze-release-management-line-8)">╭─</text><text class="breeze-release-management-r5" x="24.4" y="215.2" textLength="122" clip-path="url(#breeze-release-management-line-8)"> Commands </text><text class="breeze-release-management-r5" x="146.4" y="215.2" textLength="1293.2" clip-path="url(#breeze-release-management-line-8)">───────────────────────────────────────────────────────── [...]
+</text><text class="breeze-release-management-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-line-9)">│</text><text class="breeze-release-management-r4" x="24.4" y="239.6" textLength="402.6" clip-path="url(#breeze-release-management-line-9)">generate-constraints             </text><text class="breeze-release-management-r2" x="451.4" y="239.6" textLength="988.2" clip-path="url(#breeze-release [...]
+</text><text class="breeze-release-management-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-release-management-line-10)">│</text><text class="breeze-release-management-r4" x="24.4" y="264" textLength="402.6" clip-path="url(#breeze-release-management-line-10)">generate-issue-content           </text><text class="breeze-release-management-r2" x="451.4" y="264" textLength="988.2" clip-path="url(#breeze-release-management-li [...]
+</text><text class="breeze-release-management-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-line-11)">│</text><text class="breeze-release-management-r4" x="24.4" y="288.4" textLength="402.6" clip-path="url(#breeze-release-management-line-11)">prepare-airflow-package          </text><text class="breeze-release-management-r2" x="451.4" y="288.4" textLength="988.2" clip-path="url(#breeze-release-management-l [...]
+</text><text class="breeze-release-management-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-line-12)">│</text><text class="breeze-release-management-r4" x="24.4" y="312.8" textLength="402.6" clip-path="url(#breeze-release-management-line-12)">prepare-provider-documentation   </text><text class="breeze-release-management-r2" x="451.4" y="312.8" textLength="97.6" clip-path="url(#breeze-release-management-line-12)">Prepare </text><text c [...]
+</text><text class="breeze-release-management-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-line-13)">│</text><text class="breeze-release-management-r4" x="24.4" y="337.2" textLength="402.6" clip-path="url(#breeze-release-management-line-13)">prepare-provider-packages        </text><text class="breeze-release-management-r2" x="451.4" y="337.2" textLength="988.2" clip-path="url(#breeze-release-management-line-13)">P [...]
+</text><text class="breeze-release-management-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-line-14)">│</text><text class="breeze-release-management-r4" x="24.4" y="361.6" textLength="402.6" clip-path="url(#breeze-release-management-line-14)">release-prod-images              </text><text class="breeze-release-management-r2" x="451.4" y="361.6" textLength="988.2" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-release-management-line-15)">│</text><text class="breeze-release-management-r4" x="24.4" y="386" textLength="402.6" clip-path="url(#breeze-release-management-line-15)">verify-provider-packages         </text><text class="breeze-release-management-r2" x="451.4" y="386" textLength="988.2" clip-path="url(#breeze-release-management-line-15)">Ve [...]
+</text><text class="breeze-release-management-r5" x="0" y="410.4" textLength="1464" clip-path="url(#breeze-release-management-line-16)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-line-16)">
</text>
</g>
</g>
diff --git a/images/breeze/output_setup.svg b/images/breeze/output_setup.svg
index 91df1eb737..9a0d176ddb 100644
--- a/images/breeze/output_setup.svg
+++ b/images/breeze/output_setup.svg
@@ -35,8 +35,8 @@
.breeze-setup-r1 { fill: #c5c8c6;font-weight: bold }
.breeze-setup-r2 { fill: #c5c8c6 }
.breeze-setup-r3 { fill: #d0b344;font-weight: bold }
-.breeze-setup-r4 { fill: #868887 }
-.breeze-setup-r5 { fill: #68a0b3;font-weight: bold }
+.breeze-setup-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-setup-r5 { fill: #868887 }
.breeze-setup-r6 { fill: #98a84b;font-weight: bold }
</style>
@@ -99,20 +99,21 @@
<g class="breeze-setup-matrix">
<text class="breeze-setup-r2" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-setup-line-0)">
-</text><text class="breeze-setup-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-setup-line-1)">Usage: </text><text class="breeze-setup-r1" x="97.6" y="44.4" textLength="488" clip-path="url(#breeze-setup-line-1)">breeze setup [OPTIONS] COMMAND [ARGS]...</text><text class="breeze-setup-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#breeze-setup-line-1)">
+</text><text class="breeze-setup-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-setup-line-1)">Usage: </text><text class="breeze-setup-r1" x="97.6" y="44.4" textLength="170.8" clip-path="url(#breeze-setup-line-1)">breeze setup [</text><text class="breeze-setup-r4" x="268.4" y="44.4" textLength="85.4" clip-path="url(#breeze-setup-line-1)">OPTIONS</text><text class="breeze-setup-r1" x="353.8" y="44.4" textLength="24.4" clip-path="url(#breeze-setup-line-1)">]& [...]
</text><text class="breeze-setup-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-setup-line-2)">
</text><text class="breeze-setup-r2" x="12.2" y="93.2" textLength="597.8" clip-path="url(#breeze-setup-line-3)">Tools that developers can use to configure Breeze</text><text class="breeze-setup-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-setup-line-3)">
</text><text class="breeze-setup-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-setup-line-4)">
-</text><text class="breeze-setup-r4" x="0" y="142" textLength="24.4" clip-path="url(#breeze-setup-line-5)">╭─</text><text class="breeze-setup-r4" x="24.4" y="142" textLength="195.2" clip-path="url(#breeze-setup-line-5)"> Common options </text><text class="breeze-setup-r4" x="219.6" y="142" textLength="1220" clip-path="url(#breeze-setup-line-5)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-set [...]
-</text><text class="breeze-setup-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-setup-line-6)">│</text><text class="breeze-setup-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#breeze-setup-line-6)">-</text><text class="breeze-setup-r5" x="36.6" y="166.4" textLength="61" clip-path="url(#breeze-setup-line-6)">-help</text><text class="breeze-setup-r6" x="122" y="166.4" textLength="24.4" clip-path="url(#breeze-setup-line-6)">-h</text><text class="breeze-setup-r2" x="1 [...]
-</text><text class="breeze-setup-r4" x="0" y="190.8" textLength="1464" clip-path="url(#breeze-setup-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-setup-line-7)">
-</text><text class="breeze-setup-r4" x="0" y="215.2" textLength="24.4" clip-path="url(#breeze-setup-line-8)">╭─</text><text class="breeze-setup-r4" x="24.4" y="215.2" textLength="122" clip-path="url(#breeze-setup-line-8)"> Commands </text><text class="breeze-setup-r4" x="146.4" y="215.2" textLength="1293.2" clip-path="url(#breeze-setup-line-8)">──────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-se [...]
-</text><text class="breeze-setup-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-setup-line-9)">│</text><text class="breeze-setup-r5" x="24.4" y="239.6" textLength="390.4" clip-path="url(#breeze-setup-line-9)">autocomplete                    </text><text class="breeze-setup-r2" x="439.2" y="239.6" textLength="1000.4" clip-path="url(#breeze-setup-line-9)">Enables autocompl [...]
-</text><text class="breeze-setup-r4" x="0" y="264" textLength="12.2" clip-path="url(#breeze-setup-line-10)">│</text><text class="breeze-setup-r5" x="24.4" y="264" textLength="390.4" clip-path="url(#breeze-setup-line-10)">config                          </text><text class="breeze-setup-r2" x="439.2" y="264" textLength="1000.4" clip-path="url(#breeze-setup-line- [...]
-</text><text class="breeze-setup-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-line-11)">│</text><text class="breeze-setup-r5" x="24.4" y="288.4" textLength="390.4" clip-path="url(#breeze-setup-line-11)">regenerate-command-images       </text><text class="breeze-setup-r2" x="439.2" y="288.4" textLength="1000.4" clip-path="url(#breeze-setup-line-11)">Regenerate breeze command images.       [...]
-</text><text class="breeze-setup-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-line-12)">│</text><text class="breeze-setup-r5" x="24.4" y="312.8" textLength="390.4" clip-path="url(#breeze-setup-line-12)">self-upgrade                    </text><text class="breeze-setup-r2" x="439.2" y="312.8" textLength="1000.4" clip-path="url(#breeze-setup-line-12)">Self upgrade&# [...]
-</text><text class="breeze-setup-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-line-13)">│</text><text class="breeze-setup-r5" x="24.4" y="337.2" textLength="390.4" clip-path="url(#breeze-setup-line-13)">version                         </text><text class="breeze-setup-r2" x="439.2" y="337.2" textLength="1000.4" clip-path="url(#breeze-setup-line [...]
-</text><text class="breeze-setup-r4" x="0" y="361.6" textLength="1464" clip-path="url(#breeze-setup-line-14)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-line-14)">
+</text><text class="breeze-setup-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-setup-line-5)">╭─</text><text class="breeze-setup-r5" x="24.4" y="142" textLength="195.2" clip-path="url(#breeze-setup-line-5)"> Common options </text><text class="breeze-setup-r5" x="219.6" y="142" textLength="1220" clip-path="url(#breeze-setup-line-5)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-set [...]
+</text><text class="breeze-setup-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-setup-line-6)">│</text><text class="breeze-setup-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#breeze-setup-line-6)">-</text><text class="breeze-setup-r4" x="36.6" y="166.4" textLength="61" clip-path="url(#breeze-setup-line-6)">-help</text><text class="breeze-setup-r6" x="122" y="166.4" textLength="24.4" clip-path="url(#breeze-setup-line-6)">-h</text><text class="breeze-setup-r2" x="1 [...]
+</text><text class="breeze-setup-r5" x="0" y="190.8" textLength="1464" clip-path="url(#breeze-setup-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-setup-line-7)">
+</text><text class="breeze-setup-r5" x="0" y="215.2" textLength="24.4" clip-path="url(#breeze-setup-line-8)">╭─</text><text class="breeze-setup-r5" x="24.4" y="215.2" textLength="122" clip-path="url(#breeze-setup-line-8)"> Commands </text><text class="breeze-setup-r5" x="146.4" y="215.2" textLength="1293.2" clip-path="url(#breeze-setup-line-8)">──────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-se [...]
+</text><text class="breeze-setup-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-setup-line-9)">│</text><text class="breeze-setup-r4" x="24.4" y="239.6" textLength="402.6" clip-path="url(#breeze-setup-line-9)">autocomplete                     </text><text class="breeze-setup-r2" x="451.4" y="239.6" textLength="988.2" clip-path="url(#breeze-setup-line-9)">Enables auto [...]
+</text><text class="breeze-setup-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-setup-line-10)">│</text><text class="breeze-setup-r4" x="24.4" y="264" textLength="402.6" clip-path="url(#breeze-setup-line-10)">check-all-params-in-groups       </text><text class="breeze-setup-r2" x="451.4" y="264" textLength="988.2" clip-path="url(#breeze-setup-line-10)">Check that all parameters are put in groups.   [...]
+</text><text class="breeze-setup-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-line-11)">│</text><text class="breeze-setup-r4" x="24.4" y="288.4" textLength="402.6" clip-path="url(#breeze-setup-line-11)">config                           </text><text class="breeze-setup-r2" x="451.4" y="288.4" textLength="683.2" clip-path="url(#breeze- [...]
+</text><text class="breeze-setup-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-line-12)">│</text><text class="breeze-setup-r4" x="24.4" y="312.8" textLength="402.6" clip-path="url(#breeze-setup-line-12)">regenerate-command-images        </text><text class="breeze-setup-r2" x="451.4" y="312.8" textLength="988.2" clip-path="url(#breeze-setup-line-12)">Regenerate breeze command images.     & [...]
+</text><text class="breeze-setup-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-line-13)">│</text><text class="breeze-setup-r4" x="24.4" y="337.2" textLength="402.6" clip-path="url(#breeze-setup-line-13)">self-upgrade                     </text><text class="breeze-setup-r2" x="451.4" y="337.2" textLength="988.2" clip-path="url(#breeze-setup-line-13)">Self upgr [...]
+</text><text class="breeze-setup-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-line-14)">│</text><text class="breeze-setup-r4" x="24.4" y="361.6" textLength="402.6" clip-path="url(#breeze-setup-line-14)">version                          </text><text class="breeze-setup-r2" x="451.4" y="361.6" textLength="988.2" clip-path="url(#breeze-setup [...]
+</text><text class="breeze-setup-r5" x="0" y="386" textLength="1464" clip-path="url(#breeze-setup-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-r2" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-setup-line-15)">
</text>
</g>
</g>
diff --git a/images/breeze/output_setup_check-all-params-in-groups.svg b/images/breeze/output_setup_check-all-params-in-groups.svg
new file mode 100644
index 0000000000..85c23ac5e3
--- /dev/null
+++ b/images/breeze/output_setup_check-all-params-in-groups.svg
@@ -0,0 +1,172 @@
+<svg class="rich-terminal" viewBox="0 0 1482 733.1999999999999" xmlns="http://www.w3.org/2000/svg">
+ <!-- Generated with Rich https://www.textualize.io -->
+ <style>
+
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Regular"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
+ font-style: normal;
+ font-weight: 400;
+ }
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Bold"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
+ url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
+ font-style: bold;
+ font-weight: 700;
+ }
+
+ .breeze-setup-check-all-params-in-groups-matrix {
+ font-family: Fira Code, monospace;
+ font-size: 20px;
+ line-height: 24.4px;
+ font-variant-east-asian: full-width;
+ }
+
+ .breeze-setup-check-all-params-in-groups-title {
+ font-size: 18px;
+ font-weight: bold;
+ font-family: arial;
+ }
+
+ .breeze-setup-check-all-params-in-groups-r1 { fill: #c5c8c6;font-weight: bold }
+.breeze-setup-check-all-params-in-groups-r2 { fill: #c5c8c6 }
+.breeze-setup-check-all-params-in-groups-r3 { fill: #d0b344;font-weight: bold }
+.breeze-setup-check-all-params-in-groups-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-setup-check-all-params-in-groups-r5 { fill: #868887 }
+.breeze-setup-check-all-params-in-groups-r6 { fill: #8d7b39 }
+.breeze-setup-check-all-params-in-groups-r7 { fill: #98a84b;font-weight: bold }
+ </style>
+
+ <defs>
+ <clipPath id="breeze-setup-check-all-params-in-groups-clip-terminal">
+ <rect x="0" y="0" width="1463.0" height="682.1999999999999" />
+ </clipPath>
+ <clipPath id="breeze-setup-check-all-params-in-groups-line-0">
+ <rect x="0" y="1.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-1">
+ <rect x="0" y="25.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-2">
+ <rect x="0" y="50.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-3">
+ <rect x="0" y="74.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-4">
+ <rect x="0" y="99.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-5">
+ <rect x="0" y="123.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-6">
+ <rect x="0" y="147.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-7">
+ <rect x="0" y="172.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-8">
+ <rect x="0" y="196.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-9">
+ <rect x="0" y="221.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-10">
+ <rect x="0" y="245.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-11">
+ <rect x="0" y="269.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-12">
+ <rect x="0" y="294.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-13">
+ <rect x="0" y="318.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-14">
+ <rect x="0" y="343.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-15">
+ <rect x="0" y="367.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-16">
+ <rect x="0" y="391.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-17">
+ <rect x="0" y="416.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-18">
+ <rect x="0" y="440.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-19">
+ <rect x="0" y="465.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-20">
+ <rect x="0" y="489.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-21">
+ <rect x="0" y="513.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-22">
+ <rect x="0" y="538.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-23">
+ <rect x="0" y="562.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-24">
+ <rect x="0" y="587.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-25">
+ <rect x="0" y="611.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-check-all-params-in-groups-line-26">
+ <rect x="0" y="635.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="731.2" rx="8"/><text class="breeze-setup-check-all-params-in-groups-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: setup check-all-params-in-groups</text>
+ <g transform="translate(26,22)">
+ <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
+ <circle cx="22" cy="0" r="7" fill="#febc2e"/>
+ <circle cx="44" cy="0" r="7" fill="#28c840"/>
+ </g>
+
+ <g transform="translate(9, 41)" clip-path="url(#breeze-setup-check-all-params-in-groups-clip-terminal)">
+
+ <g class="breeze-setup-check-all-params-in-groups-matrix">
+ <text class="breeze-setup-check-all-params-in-groups-r2" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-0)">
+</text><text class="breeze-setup-check-all-params-in-groups-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-setup-check-all-params-in-groups-line-1)">Usage: </text><text class="breeze-setup-check-all-params-in-groups-r1" x="97.6" y="44.4" textLength="500.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-1)">breeze setup check-all-params-in-groups [</text><text class="breeze-setup-check-all-params-in-groups-r4" x="597.8" y="44.4" textLength [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-2)">
+</text><text class="breeze-setup-check-all-params-in-groups-r2" x="12.2" y="93.2" textLength="536.8" clip-path="url(#breeze-setup-check-all-params-in-groups-line-3)">Check that all parameters are put in groups.</text><text class="breeze-setup-check-all-params-in-groups-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-3)">
+</text><text class="breeze-setup-check-all-params-in-groups-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-4)">
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-setup-check-all-params-in-groups-line-5)">╭─</text><text class="breeze-setup-check-all-params-in-groups-r5" x="24.4" y="142" textLength="414.8" clip-path="url(#breeze-setup-check-all-params-in-groups-line-5)"> Check all params in groups flags </text><text class="breeze-setup-check-all-params-in-groups-r5" x="439.2" y="142" textLength="1 [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-6)">│</text><text class="breeze-setup-check-all-params-in-groups-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-6)">-</text><text class="breeze-setup-check-all-params-in-groups-r4" x="36.6" y="166.4" textLength="97.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-7)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="190.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-7)">(main | build-docs | ci:find-newer-dependencies | ci:fix-ownership | ci:free-space |     &# [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-8)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="215.2" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-8)">ci:get-workflow-info | ci:resource-check | ci:selective-check | ci | ci-image:build | ci-image:pull |  [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-9)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="239.6" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-9)">ci-image:verify | ci-image | cleanup | compile-www-assets | exec | k8s:build-k8s-image |    [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-10)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="264" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-10)">k8s:configure-cluster | k8s:create-cluster | k8s:delete-cluster | k8s:deploy-airflow | k8s:k9s |    [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-11)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="288.4" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-11)">k8s:logs | k8s:run-complete-tests | k8s:setup-env | k8s:shell | k8s:status | k8s:tests |   [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="312.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">k8s:upload-k8s-image | k8s | prod-image:build | prod-image:pull | prod-image:verify | prod-image |  [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="337.2" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">release-management:create-minor-branch | release-management:generate-constraints |          &# [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="361.6" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">release-management:generate-issue-content | release-management:prepare-airflow-package |         &# [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="386" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">release-management:prepare-provider-documentation | release-management:prepare-provider-packages |     </text><text class=" [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="410.4" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">release-management:release-prod-images | release-management:start-rc-process |            [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="434.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">release-management:start-release | release-management:verify-provider-packages | release-management |  </text><text class="b [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="459.2" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">setup:autocomplete | setup:check-all-params-in-groups | setup:config | setup:regenerate-command-images </text><text class="b [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="483.6" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">| setup:self-upgrade | setup:version | setup | shell | start-airflow | static-checks | stop [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="508" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">testing:docker-compose-tests | testing:helm-tests | testing:integration-tests | testing:tests |      [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="183" y="532.4" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">testing)                         & [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="556.8" textLength="1464" clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-check-all-params-in-groups-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="581.2" textLength="24.4" clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">╭─</text><text class="breeze-setup-check-all-params-in-groups-r5" x="24.4" y="581.2" textLength="195.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)"> Common options </text><text class="breeze-setup-check-all-params-in-groups-r5" x="219.6" y="581.2" textLength="1220" clip-path="url(#breeze-se [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-24)">│</text><text class="breeze-setup-check-all-params-in-groups-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-24)">-</text><text class="breeze-setup-check-all-params-in-groups-r4" x="36.6" y="605.6" textLength="97.6" clip-path="url(#breeze-setup-check-all-params-in-groups-li [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">│</text><text class="breeze-setup-check-all-params-in-groups-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">-</text><text class="breeze-setup-check-all-params-in-groups-r4" x="36.6" y="630" textLength="48.8" clip-path="url(#breeze-setup-check-all-params-in-groups-line-25) [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">│</text><text class="breeze-setup-check-all-params-in-groups-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">-</text><text class="breeze-setup-check-all-params-in-groups-r4" x="36.6" y="654.4" textLength="61" clip-path="url(#breeze-setup-check-all-params-in-groups-line [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="678.8" textLength="1464" clip-path="url(#breeze-setup-check-all-params-in-groups-line-27)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-check-all-params-in-groups-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-27)">
+</text>
+ </g>
+ </g>
+</svg>
diff --git a/images/breeze/output_setup_regenerate-command-images.svg b/images/breeze/output_setup_regenerate-command-images.svg
index 3ecbb459e5..c0f2199538 100644
--- a/images/breeze/output_setup_regenerate-command-images.svg
+++ b/images/breeze/output_setup_regenerate-command-images.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 757.5999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 806.4" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -35,15 +35,15 @@
.breeze-setup-regenerate-command-images-r1 { fill: #c5c8c6;font-weight: bold }
.breeze-setup-regenerate-command-images-r2 { fill: #c5c8c6 }
.breeze-setup-regenerate-command-images-r3 { fill: #d0b344;font-weight: bold }
-.breeze-setup-regenerate-command-images-r4 { fill: #868887 }
-.breeze-setup-regenerate-command-images-r5 { fill: #68a0b3;font-weight: bold }
+.breeze-setup-regenerate-command-images-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-setup-regenerate-command-images-r5 { fill: #868887 }
.breeze-setup-regenerate-command-images-r6 { fill: #8d7b39 }
.breeze-setup-regenerate-command-images-r7 { fill: #98a84b;font-weight: bold }
</style>
<defs>
<clipPath id="breeze-setup-regenerate-command-images-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="706.5999999999999" />
+ <rect x="0" y="0" width="1463.0" height="755.4" />
</clipPath>
<clipPath id="breeze-setup-regenerate-command-images-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -129,9 +129,15 @@
<clipPath id="breeze-setup-regenerate-command-images-line-27">
<rect x="0" y="660.3" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-setup-regenerate-command-images-line-28">
+ <rect x="0" y="684.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-setup-regenerate-command-images-line-29">
+ <rect x="0" y="709.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="755.6" rx="8"/><text class="breeze-setup-regenerate-command-images-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: setup regenerate-command-images</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="804.4" rx="8"/><text class="breeze-setup-regenerate-command-images-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: setup regenerate-command-images</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -142,34 +148,36 @@
<g class="breeze-setup-regenerate-command-images-matrix">
<text class="breeze-setup-regenerate-command-images-r2" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-0)">
-</text><text class="breeze-setup-regenerate-command-images-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-setup-regenerate-command-images-line-1)">Usage: </text><text class="breeze-setup-regenerate-command-images-r1" x="97.6" y="44.4" textLength="585.6" clip-path="url(#breeze-setup-regenerate-command-images-line-1)">breeze setup regenerate-command-images [OPTIONS]</text><text class="breeze-setup-regenerate-command-images-r2" x="1464" y="44.4" textLengt [...]
+</text><text class="breeze-setup-regenerate-command-images-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-setup-regenerate-command-images-line-1)">Usage: </text><text class="breeze-setup-regenerate-command-images-r1" x="97.6" y="44.4" textLength="488" clip-path="url(#breeze-setup-regenerate-command-images-line-1)">breeze setup regenerate-command-images [</text><text class="breeze-setup-regenerate-command-images-r4" x="585.6" y="44.4" textLength="85.4" [...]
</text><text class="breeze-setup-regenerate-command-images-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-2)">
</text><text class="breeze-setup-regenerate-command-images-r2" x="12.2" y="93.2" textLength="402.6" clip-path="url(#breeze-setup-regenerate-command-images-line-3)">Regenerate breeze command images.</text><text class="breeze-setup-regenerate-command-images-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-3)">
</text><text class="breeze-setup-regenerate-command-images-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-4)">
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="142" textLength="24.4" clip-path="url(#breeze-setup-regenerate-command-images-line-5)">╭─</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="142" textLength="329.4" clip-path="url(#breeze-setup-regenerate-command-images-line-5)"> Image regeneration option </text><text class="breeze-setup-regenerate-command-images-r4" x="353.8" y="142" textLength="1085.8" clip-path="url(#bree [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-6)">│</text><text class="breeze-setup-regenerate-command-images-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-6)">-</text><text class="breeze-setup-regenerate-command-images-r5" x="36.6" y="166.4" textLength="73.2" clip-path="url(#breeze-setup-regenerate-command-images-line-6)">- [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-7)">│</text><text class="breeze-setup-regenerate-command-images-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-7)">-</text><text class="breeze-setup-regenerate-command-images-r5" x="36.6" y="190.8" textLength="97.6" clip-path="url(#breeze-setup-regenerate-command-images-line-7)">- [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-8)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="215.2" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-8)">(main | build-docs | ci:find-newer-dependencies | ci:fix-ownership | ci:free-space |       [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-9)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="239.6" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-9)">ci:get-workflow-info | ci:resource-check | ci:selective-check | ci | ci-image:build | ci-image:pull </text><te [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="264" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-10)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="264" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-10)">| ci-image:verify | ci-image | cleanup | compile-www-assets | exec | k8s:build-k8s-image |    [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-11)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="288.4" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-11)">k8s:configure-cluster | k8s:create-cluster | k8s:delete-cluster | k8s:deploy-airflow | k8s:k9s |    [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-12)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="312.8" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-12)">k8s:logs | k8s:run-complete-tests | k8s:setup-env | k8s:shell | k8s:status | k8s:tests |   &# [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="337.2" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">k8s:upload-k8s-image | k8s | prod-image:build | prod-image:pull | prod-image:verify | prod-image |  [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="361.6" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">release-management:generate-constraints | release-management:generate-issue-content |           [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="386" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="386" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">release-management:prepare-airflow-package | release-management:prepare-provider-documentation |    </text><text class="breeze-setup [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="410.4" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">release-management:prepare-provider-packages | release-management:release-prod-images |          & [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="434.8" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">release-management:verify-provider-packages | release-management | setup:autocomplete | setup:config</text><text class="breeze-setup- [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-18)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="459.2" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-18)">| setup:regenerate-command-images | setup:self-upgrade | setup:version | setup | shell |    & [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-19)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="483.6" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-19)">start-airflow | static-checks | stop | testing:docker-compose-tests | testing:helm-tests |     [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="508" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-20)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="508" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-20)">testing:integration-tests | testing:tests | testing)                 [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-21)">│</text><text class="breeze-setup-regenerate-command-images-r5" x="24.4" y="532.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-21)">-</text><text class="breeze-setup-regenerate-command-images-r5" x="36.6" y="532.4" textLength="73.2" clip-path="url(#breeze-setup-regenerate-command-images-line-21) [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-22)">│</text><text class="breeze-setup-regenerate-command-images-r2" x="219.6" y="556.8" textLength="170.8" clip-path="url(#breeze-setup-regenerate-command-images-line-22)">together with </text><text class="breeze-setup-regenerate-command-images-r5" x="390.4" y="556.8" textLength="12.2" clip-path="url(#breeze-setup-regenera [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="581.2" textLength="1464" clip-path="url(#breeze-setup-regenerate-command-images-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-regenerate-command-images-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-23)">
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="605.6" textLength="24.4" clip-path="url(#breeze-setup-regenerate-command-images-line-24)">╭─</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="605.6" textLength="195.2" clip-path="url(#breeze-setup-regenerate-command-images-line-24)"> Common options </text><text class="breeze-setup-regenerate-command-images-r4" x="219.6" y="605.6" textLength="1220" clip-path="url(#breeze-setup-r [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="630" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-25)">│</text><text class="breeze-setup-regenerate-command-images-r5" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-25)">-</text><text class="breeze-setup-regenerate-command-images-r5" x="36.6" y="630" textLength="97.6" clip-path="url(#breeze-setup-regenerate-command-images-line-25)">-ver [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-26)">│</text><text class="breeze-setup-regenerate-command-images-r5" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-26)">-</text><text class="breeze-setup-regenerate-command-images-r5" x="36.6" y="654.4" textLength="48.8" clip-path="url(#breeze-setup-regenerate-command-images-line-26) [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-27)">│</text><text class="breeze-setup-regenerate-command-images-r5" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-27)">-</text><text class="breeze-setup-regenerate-command-images-r5" x="36.6" y="678.8" textLength="61" clip-path="url(#breeze-setup-regenerate-command-images-line-27)"> [...]
-</text><text class="breeze-setup-regenerate-command-images-r4" x="0" y="703.2" textLength="1464" clip-path="url(#breeze-setup-regenerate-command-images-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-regenerate-command-images-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-28)">
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-setup-regenerate-command-images-line-5)">╭─</text><text class="breeze-setup-regenerate-command-images-r5" x="24.4" y="142" textLength="329.4" clip-path="url(#breeze-setup-regenerate-command-images-line-5)"> Image regeneration option </text><text class="breeze-setup-regenerate-command-images-r5" x="353.8" y="142" textLength="1085.8" clip-path="url(#bree [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-6)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-6)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="166.4" textLength="73.2" clip-path="url(#breeze-setup-regenerate-command-images-line-6)">- [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-7)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="190.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-7)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="190.8" textLength="97.6" clip-path="url(#breeze-setup-regenerate-command-images-line-7)">- [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-8)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="215.2" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-8)">(main | build-docs | ci:find-newer-dependencies | ci:fix-ownership | ci:free-space |       [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-9)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="239.6" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-9)">ci:get-workflow-info | ci:resource-check | ci:selective-check | ci | ci-image:build | ci-image:pull </text><te [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-10)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="264" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-10)">| ci-image:verify | ci-image | cleanup | compile-www-assets | exec | k8s:build-k8s-image |    [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-11)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="288.4" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-11)">k8s:configure-cluster | k8s:create-cluster | k8s:delete-cluster | k8s:deploy-airflow | k8s:k9s |    [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-12)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="312.8" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-12)">k8s:logs | k8s:run-complete-tests | k8s:setup-env | k8s:shell | k8s:status | k8s:tests |   &# [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="337.2" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">k8s:upload-k8s-image | k8s | prod-image:build | prod-image:pull | prod-image:verify | prod-image |  [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="361.6" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">release-management:create-minor-branch | release-management:generate-constraints |            [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="386" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">release-management:generate-issue-content | release-management:prepare-airflow-package |           [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="410.4" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">release-management:prepare-provider-documentation | release-management:prepare-provider-packages |  </text><text class="breeze-setup-regen [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="434.8" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">release-management:release-prod-images | release-management:start-rc-process |            [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-18)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="459.2" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-18)">release-management:start-release | release-management:verify-provider-packages | release-management </text><text class="breeze-setup-regen [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-19)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="483.6" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-19)">| setup:autocomplete | setup:check-all-params-in-groups | setup:config |          & [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-20)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="508" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-20)">setup:regenerate-command-images | setup:self-upgrade | setup:version | setup | shell | start-airflow</text><text clas [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-21)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="532.4" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-21)">| static-checks | stop | testing:docker-compose-tests | testing:helm-tests |         [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-22)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="219.6" y="556.8" textLength="1220" clip-path="url(#breeze-setup-regenerate-command-images-line-22)">testing:integration-tests | testing:tests | testing)               & [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-23)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-23)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="581.2" textLength="73.2" clip-path="url(#breeze-setup-regenerate-command-images-line-23) [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-24)">│</text><text class="breeze-setup-regenerate-command-images-r2" x="219.6" y="605.6" textLength="170.8" clip-path="url(#breeze-setup-regenerate-command-images-line-24)">together with </text><text class="breeze-setup-regenerate-command-images-r4" x="390.4" y="605.6" textLength="12.2" clip-path="url(#breeze-setup-regenera [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="630" textLength="1464" clip-path="url(#breeze-setup-regenerate-command-images-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-regenerate-command-images-r2" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-25)">
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="654.4" textLength="24.4" clip-path="url(#breeze-setup-regenerate-command-images-line-26)">╭─</text><text class="breeze-setup-regenerate-command-images-r5" x="24.4" y="654.4" textLength="195.2" clip-path="url(#breeze-setup-regenerate-command-images-line-26)"> Common options </text><text class="breeze-setup-regenerate-command-images-r5" x="219.6" y="654.4" textLength="1220" clip-path="url(#breeze-setup-r [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-27)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-27)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="678.8" textLength="97.6" clip-path="url(#breeze-setup-regenerate-command-images-line-27) [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-28)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-28)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="703.2" textLength="48.8" clip-path="url(#breeze-setup-regenerate-command-images-line-28) [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-29)">│</text><text class="breeze-setup-regenerate-command-images-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-29)">-</text><text class="breeze-setup-regenerate-command-images-r4" x="36.6" y="727.6" textLength="61" clip-path="url(#breeze-setup-regenerate-command-images-line-29)"> [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="752" textLength="1464" clip-path="url(#breeze-setup-regenerate-command-images-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-setup-regenerate-command-images-r2" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-30)">
</text>
</g>
</g>