You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by ep...@apache.org on 2023/03/07 20:05:19 UTC

[airflow] branch v2-5-test updated (c0cd3397f7 -> 8ab8ac84b5)

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

ephraimanierobi pushed a change to branch v2-5-test
in repository https://gitbox.apache.org/repos/asf/airflow.git


    from c0cd3397f7 Update min version of python-deamon to fix containerd file limits (#29916)
     new 5abaf5d265 Require explicit flag to remove MyPy cache when running breeze stop (#29493)
     new 8ab8ac84b5 Make skipping provider tests part of selective-checks (#29216)

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .github/workflows/ci.yml                           |  5 +++--
 CI.rst                                             |  2 ++
 STATIC_CODE_CHECKS.rst                             |  8 ++++++++
 .../airflow_breeze/commands/developer_commands.py  | 13 ++++++++++--
 .../commands/developer_commands_config.py          |  1 +
 .../airflow_breeze/utils/docker_command_utils.py   |  2 ++
 .../src/airflow_breeze/utils/selective_checks.py   |  4 ++++
 dev/breeze/tests/test_selective_checks.py          |  7 +++++++
 images/breeze/output-commands-hash.txt             |  2 +-
 images/breeze/output_stop.svg                      | 24 +++++++++++++---------
 scripts/ci/docker-compose/devcontainer.env         |  1 +
 scripts/ci/pre_commit/pre_commit_mypy.py           |  3 ++-
 12 files changed, 56 insertions(+), 16 deletions(-)


[airflow] 02/02: Make skipping provider tests part of selective-checks (#29216)

Posted by ep...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ephraimanierobi pushed a commit to branch v2-5-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 8ab8ac84b5065ff921e6ff9f7c73abc3236ee376
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Sun Jan 29 14:45:25 2023 +0100

    Make skipping provider tests part of selective-checks (#29216)
    
    The "SKIP_PROVIDER_TESTS" was added as quick-fix when releasing
    2.5.0 release, now we can make it a bit more consistent with
    all other selective checks. It has now unit tests covering it
    and it is produced as selective-checks output so that we do not
    have to encode the logic in conditions in the ci.yml.
    
    (cherry picked from commit e5d51fc50f6aad0f35f775367bc700708fe6d62b)
---
 .github/workflows/ci.yml                                    | 5 +++--
 CI.rst                                                      | 2 ++
 dev/breeze/src/airflow_breeze/utils/docker_command_utils.py | 2 ++
 dev/breeze/src/airflow_breeze/utils/selective_checks.py     | 4 ++++
 dev/breeze/tests/test_selective_checks.py                   | 7 +++++++
 scripts/ci/docker-compose/devcontainer.env                  | 1 +
 6 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f6b1e82442..63138de93f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -149,6 +149,7 @@ jobs:
       mssql-exclude: ${{ steps.selective-checks.outputs.mssql-exclude }}
       sqlite-exclude: ${{ steps.selective-checks.outputs.sqlite-exclude }}
       providers-package-format-exclude: ${{ steps.selective-checks.outputs.providers-package-format-exclude }}
+      skip-provider-tests: ${{ steps.source-run-info.outputs.skip-provider-tests }}
       run-tests: ${{ steps.selective-checks.outputs.run-tests }}
       run-www-tests: ${{ steps.selective-checks.outputs.run-www-tests }}
       run-kubernetes-tests: ${{ steps.selective-checks.outputs.run-kubernetes-tests }}
@@ -1008,7 +1009,7 @@ jobs:
       BACKEND_VERSION: "${{needs.build-info.outputs.default-python-version}}"
       JOB_ID: "integration"
       COVERAGE: "${{needs.build-info.outputs.run-coverage}}"
-      SKIP_PROVIDER_TESTS: "${{needs.build-info.outputs.default-branch != 'main'}}"
+      SKIP_PROVIDER_TESTS: "${{needs.build-info.outputs.skip-provider-tests}}"
     if: needs.build-info.outputs.run-tests == 'true'
     steps:
       - name: Cleanup repo
@@ -1068,7 +1069,7 @@ jobs:
       BACKEND_VERSION: "${{needs.build-info.outputs.default-python-version}}"
       JOB_ID: "integration"
       COVERAGE: "${{needs.build-info.outputs.run-coverage}}"
-      SKIP_PROVIDER_TESTS: "${{needs.build-info.outputs.default-branch != 'main'}}"
+      SKIP_PROVIDER_TESTS: "${{needs.build-info.outputs.skip-provider-tests}}"
     if: needs.build-info.outputs.run-tests == 'true'
     steps:
       - name: Cleanup repo
diff --git a/CI.rst b/CI.rst
index 5c937e5794..178e536376 100644
--- a/CI.rst
+++ b/CI.rst
@@ -535,6 +535,8 @@ those via command line flags passed to ``breeze`` command.
 |                                         |             |              |            |                                                 |
 |                                         |             |              |            | \* set to true in pre-commits                   |
 +-----------------------------------------+-------------+--------------+------------+-------------------------------------------------+
+| ``SKIP_PROVIDER_TESTS``                 |   false\*   |    false\*   |   false\*  | Skip running provider integration tests         |
++-----------------------------------------+-------------+--------------+------------+-------------------------------------------------+
 | ``SKIP_SSH_SETUP``                      |   false\*   |    false\*   |   false\*  | Skip setting up SSH server for tests.           |
 |                                         |             |              |            |                                                 |
 |                                         |             |              |            | \* set to true in GitHub CodeSpaces             |
diff --git a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
index 7670b5bbdd..b990e44169 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -614,6 +614,7 @@ def update_expected_environment_variables(env: dict[str, str]) -> None:
     set_value_to_default_if_not_set(env, "RUN_SYSTEM_TESTS", "false")
     set_value_to_default_if_not_set(env, "RUN_TESTS", "false")
     set_value_to_default_if_not_set(env, "SKIP_ENVIRONMENT_INITIALIZATION", "false")
+    set_value_to_default_if_not_set(env, "SKIP_PROVIDER_TESTS", "false")
     set_value_to_default_if_not_set(env, "SKIP_SSH_SETUP", "false")
     set_value_to_default_if_not_set(env, "TEST_TYPE", "")
     set_value_to_default_if_not_set(env, "TEST_TIMEOUT", "60")
@@ -656,6 +657,7 @@ DERIVE_ENV_VARIABLES_FROM_ATTRIBUTES = {
     "PYTHON_MAJOR_MINOR_VERSION": "python",
     "SKIP_CONSTRAINTS": "skip_constraints",
     "SKIP_ENVIRONMENT_INITIALIZATION": "skip_environment_initialization",
+    "SKIP_PROVIDER_TESS": "skip_provider_tests",
     "SQLITE_URL": "sqlite_url",
     "START_AIRFLOW": "start_airflow",
     "USE_AIRFLOW_VERSION": "use_airflow_version",
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index eeaf65150e..2aee00491b 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -590,6 +590,10 @@ class SelectiveChecks:
     def skip_pre_commits(self) -> str:
         return "identity" if self._default_branch == "main" else "identity,check-airflow-2-2-compatibility"
 
+    @cached_property
+    def skip_provider_tests(self) -> bool:
+        return self._default_branch != "main"
+
     @cached_property
     def cache_directive(self) -> str:
         return "disabled" if self._github_event == GithubEvents.SCHEDULE else "registry"
diff --git a/dev/breeze/tests/test_selective_checks.py b/dev/breeze/tests/test_selective_checks.py
index 27333dd5c0..5bf2ac41c3 100644
--- a/dev/breeze/tests/test_selective_checks.py
+++ b/dev/breeze/tests/test_selective_checks.py
@@ -398,6 +398,7 @@ def test_expected_output_full_tests_needed(
                 "full-tests-needed": "false",
                 "providers-package-format-exclude": "[{'package-format': 'sdist'}]",
                 "upgrade-to-newer-dependencies": "false",
+                "skip-provider-tests": "true",
                 "test-types": "",
             },
             id="Nothing should run if only non-important files changed",
@@ -418,6 +419,7 @@ def test_expected_output_full_tests_needed(
                 "providers-package-format-exclude": "[{'package-format': 'sdist'}]",
                 "run-kubernetes-tests": "true",
                 "upgrade-to-newer-dependencies": "false",
+                "skip-provider-tests": "true",
                 "test-types": "Always",
             },
             id="No Helm tests, No providers should run if only chart/providers changed in non-main",
@@ -439,6 +441,7 @@ def test_expected_output_full_tests_needed(
                 "providers-package-format-exclude": "[{'package-format': 'sdist'}]",
                 "run-kubernetes-tests": "true",
                 "upgrade-to-newer-dependencies": "false",
+                "skip-provider-tests": "true",
                 "test-types": "Always CLI",
             },
             id="Only CLI tests and Kubernetes tests should run if cli/chart files changed in non-main branch",
@@ -459,6 +462,7 @@ def test_expected_output_full_tests_needed(
                 "providers-package-format-exclude": "[{'package-format': 'sdist'}]",
                 "run-kubernetes-tests": "false",
                 "upgrade-to-newer-dependencies": "false",
+                "skip-provider-tests": "true",
                 "test-types": "API Always CLI Core Other WWW",
             },
             id="All tests except Providers and should run if core file changed in non-main branch",
@@ -492,6 +496,7 @@ def test_expected_output_pull_request_v2_3(
                 "run-tests": "false",
                 "docs-build": "false",
                 "upgrade-to-newer-dependencies": "false",
+                "skip-provider-tests": "false",
                 "test-types": "",
             },
             id="Nothing should run if only non-important files changed",
@@ -511,6 +516,7 @@ def test_expected_output_pull_request_v2_3(
                 "docs-build": "true",
                 "run-kubernetes-tests": "true",
                 "upgrade-to-newer-dependencies": "false",
+                "skip-provider-tests": "false",
                 "test-types": "Always CLI",
             },
             id="CLI tests and Kubernetes tests should run if cli/chart files changed",
@@ -529,6 +535,7 @@ def test_expected_output_pull_request_v2_3(
                 "docs-build": "true",
                 "run-kubernetes-tests": "false",
                 "upgrade-to-newer-dependencies": "false",
+                "skip-provider-tests": "false",
                 "test-types": "API Always CLI Core Other Providers WWW",
             },
             id="All tests except should run if core file changed",
diff --git a/scripts/ci/docker-compose/devcontainer.env b/scripts/ci/docker-compose/devcontainer.env
index e0f326612b..c3ca6e8420 100644
--- a/scripts/ci/docker-compose/devcontainer.env
+++ b/scripts/ci/docker-compose/devcontainer.env
@@ -59,6 +59,7 @@ START_AIRFLOW="false"
 SKIP_CONSTRAINTS="false"
 SKIP_SSH_SETUP="true"
 SKIP_ENVIRONMENT_INITIALIZATION="false"
+SKIP_PROVIDER_TESTS="false"
 TEST_TYPE=
 UPGRADE_TO_NEWER_DEPENDENCIES="false"
 VERBOSE="false"


[airflow] 01/02: Require explicit flag to remove MyPy cache when running breeze stop (#29493)

Posted by ep...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ephraimanierobi pushed a commit to branch v2-5-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 5abaf5d265e6a658bbce98bb5ea27adbe643884e
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Sun Feb 12 18:01:00 2023 +0100

    Require explicit flag to remove MyPy cache when running breeze stop (#29493)
    
    The change #29184 added cleanup of MyPy cache when `breeze stop`
    was called, but this is a bit too agressive. It will remove
    the cache always when breeze stop is run and it will prolong
    (on MacOS by 10s of seconds) the MyPy static checks when it happens.
    
    Since cleaning the cache is only really needed when MyPy cache
    gets broken (for example when we upgrade MyPy), cleaning it
    explicitly when you encounter such problem is a better idea.
    
    This PR:
    
    * adds flag to breeze stop to clean the mypy cache (disabled by
      default)
    * adds documentation about that feature in STATIC_CHECKS
    * adds hint displayed to the user when mypy check fails
    
    (cherry picked from commit 8841537e58b864bbfb162692b12cf84f7df29001)
---
 STATIC_CODE_CHECKS.rst                             |  8 ++++++++
 .../airflow_breeze/commands/developer_commands.py  | 13 ++++++++++--
 .../commands/developer_commands_config.py          |  1 +
 images/breeze/output-commands-hash.txt             |  2 +-
 images/breeze/output_stop.svg                      | 24 +++++++++++++---------
 scripts/ci/pre_commit/pre_commit_mypy.py           |  3 ++-
 6 files changed, 37 insertions(+), 14 deletions(-)

diff --git a/STATIC_CODE_CHECKS.rst b/STATIC_CODE_CHECKS.rst
index b27d170d1c..8433fa3395 100644
--- a/STATIC_CODE_CHECKS.rst
+++ b/STATIC_CODE_CHECKS.rst
@@ -127,6 +127,14 @@ require Breeze Docker image to be build locally.
   the image by setting ``SKIP_IMAGE_PRE_COMMITS`` to "true". This will mark the tests as "green" automatically
   when run locally (note that those checks will anyway run in CI).
 
+.. note:: Mypy volume cache
+
+  MyPy uses a separate docker-volume (called ``mypy-cache-volume``) that keeps the cache of last MyPy
+  execution in order to speed MyPy checks up (sometimes by order of magnitude). While in most cases MyPy
+  will handle refreshing the cache when and if needed, there are some cases when it won't (cache invalidation
+  is the hard problem in computer science). This might happen for example when we upgrade MyPY. In such
+  cases you might need to manually remove the cache volume by running ``breeze stop --cleanup-mypy-cache``.
+
   .. BEGIN AUTO-GENERATED STATIC CHECK LIST
 
 +-----------------------------------------------------------+------------------------------------------------------------------+---------+
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index c9562ca12b..9db96edff7 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -472,12 +472,18 @@ def compile_www_assets(dev: bool):
 @click.option(
     "-p",
     "--preserve-volumes",
-    help="Skip removing volumes when stopping Breeze.",
+    help="Skip removing database volumes when stopping Breeze.",
+    is_flag=True,
+)
+@click.option(
+    "-c",
+    "--cleanup-mypy-cache",
+    help="Additionally cleanup MyPy cache.",
     is_flag=True,
 )
 @option_verbose
 @option_dry_run
-def stop(preserve_volumes: bool):
+def stop(preserve_volumes: bool, cleanup_mypy_cache: bool):
     perform_environment_checks()
     command_to_execute = [*DOCKER_COMPOSE_COMMAND, "down", "--remove-orphans"]
     if not preserve_volumes:
@@ -485,6 +491,9 @@ def stop(preserve_volumes: bool):
     shell_params = ShellParams(backend="all", include_mypy_volume=True)
     env_variables = get_env_variables_for_docker_commands(shell_params)
     run_command(command_to_execute, env=env_variables)
+    if cleanup_mypy_cache:
+        command_to_execute = ["docker", "volume", "rm", "--force", "mypy-cache-volume"]
+        run_command(command_to_execute, env=env_variables)
 
 
 @main.command(name="exec", help="Joins the interactive shell of running airflow container.")
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py b/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
index 073cc953c7..4265ab286c 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
@@ -134,6 +134,7 @@ DEVELOPER_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
             "name": "Stop flags",
             "options": [
                 "--preserve-volumes",
+                "--cleanup-mypy-cache",
             ],
         },
     ],
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index 4078b82244..b721a519c5 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -56,7 +56,7 @@ setup:f383b9236f6141f95276136ccd9217f5
 shell:affbf6f7f469408d0af47f75c6a38f6c
 start-airflow:109728919a0dd5c5ff5640ae86ba9e90
 static-checks:7a39e28c87fbca0a9fae0ebfe1591b71
-stop:8969537ccdd799f692ccb8600a7bbed6
+stop:e5aa686b4e53707ced4039d8414d5cd6
 testing:docker-compose-tests:b86c044b24138af0659a05ed6331576c
 testing:helm-tests:94a442e7f3f63b34c4831a84d165690a
 testing:integration-tests:585da1e636f710be9c9de36a71586963
diff --git a/images/breeze/output_stop.svg b/images/breeze/output_stop.svg
index 3ed01097cf..81e2abb315 100644
--- a/images/breeze/output_stop.svg
+++ b/images/breeze/output_stop.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 367.2" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 391.59999999999997" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -42,7 +42,7 @@
 
     <defs>
     <clipPath id="breeze-stop-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="316.2" />
+      <rect x="0" y="0" width="1463.0" height="340.59999999999997" />
     </clipPath>
     <clipPath id="breeze-stop-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -80,9 +80,12 @@
 <clipPath id="breeze-stop-line-11">
     <rect x="0" y="269.9" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-stop-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="365.2" rx="8"/><text class="breeze-stop-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;stop</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="389.6" rx="8"/><text class="breeze-stop-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;stop</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -98,13 +101,14 @@
 </text><text class="breeze-stop-r2" x="12.2" y="93.2" textLength="390.4" clip-path="url(#breeze-stop-line-3)">Stop&#160;running&#160;breeze&#160;environment.</text><text class="breeze-stop-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-stop-line-3)">
 </text><text class="breeze-stop-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-stop-line-4)">
 </text><text class="breeze-stop-r4" x="0" y="142" textLength="24.4" clip-path="url(#breeze-stop-line-5)">╭─</text><text class="breeze-stop-r4" x="24.4" y="142" textLength="146.4" clip-path="url(#breeze-stop-line-5)">&#160;Stop&#160;flags&#160;</text><text class="breeze-stop-r4" x="170.8" y="142" textLength="1268.8" clip-path="url(#breeze-stop-line-5)">────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-stop-r4 [...]
-</text><text class="breeze-stop-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-stop-line-6)">│</text><text class="breeze-stop-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#breeze-stop-line-6)">-</text><text class="breeze-stop-r5" x="36.6" y="166.4" textLength="109.8" clip-path="url(#breeze-stop-line-6)">-preserve</text><text class="breeze-stop-r5" x="146.4" y="166.4" textLength="97.6" clip-path="url(#breeze-stop-line-6)">-volumes</text><text class="breeze-stop-r6 [...]
-</text><text class="breeze-stop-r4" x="0" y="190.8" textLength="1464" clip-path="url(#breeze-stop-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-stop-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-stop-line-7)">
-</text><text class="breeze-stop-r4" x="0" y="215.2" textLength="24.4" clip-path="url(#breeze-stop-line-8)">╭─</text><text class="breeze-stop-r4" x="24.4" y="215.2" textLength="195.2" clip-path="url(#breeze-stop-line-8)">&#160;Common&#160;options&#160;</text><text class="breeze-stop-r4" x="219.6" y="215.2" textLength="1220" clip-path="url(#breeze-stop-line-8)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-sto [...]
-</text><text class="breeze-stop-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-stop-line-9)">│</text><text class="breeze-stop-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#breeze-stop-line-9)">-</text><text class="breeze-stop-r5" x="36.6" y="239.6" textLength="97.6" clip-path="url(#breeze-stop-line-9)">-verbose</text><text class="breeze-stop-r6" x="158.6" y="239.6" textLength="24.4" clip-path="url(#breeze-stop-line-9)">-v</text><text class="breeze-stop-r2" x="207 [...]
-</text><text class="breeze-stop-r4" x="0" y="264" textLength="12.2" clip-path="url(#breeze-stop-line-10)">│</text><text class="breeze-stop-r5" x="24.4" y="264" textLength="12.2" clip-path="url(#breeze-stop-line-10)">-</text><text class="breeze-stop-r5" x="36.6" y="264" textLength="48.8" clip-path="url(#breeze-stop-line-10)">-dry</text><text class="breeze-stop-r5" x="85.4" y="264" textLength="48.8" clip-path="url(#breeze-stop-line-10)">-run</text><text class="breeze-stop-r6" x="158.6" y=" [...]
-</text><text class="breeze-stop-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-stop-line-11)">│</text><text class="breeze-stop-r5" x="24.4" y="288.4" textLength="12.2" clip-path="url(#breeze-stop-line-11)">-</text><text class="breeze-stop-r5" x="36.6" y="288.4" textLength="61" clip-path="url(#breeze-stop-line-11)">-help</text><text class="breeze-stop-r6" x="158.6" y="288.4" textLength="24.4" clip-path="url(#breeze-stop-line-11)">-h</text><text class="breeze-stop-r2" x="207. [...]
-</text><text class="breeze-stop-r4" x="0" y="312.8" textLength="1464" clip-path="url(#breeze-stop-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-stop-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-stop-line-12)">
+</text><text class="breeze-stop-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-stop-line-6)">│</text><text class="breeze-stop-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#breeze-stop-line-6)">-</text><text class="breeze-stop-r5" x="36.6" y="166.4" textLength="109.8" clip-path="url(#breeze-stop-line-6)">-preserve</text><text class="breeze-stop-r5" x="146.4" y="166.4" textLength="97.6" clip-path="url(#breeze-stop-line-6)">-volumes</text><text class="breeze-stop-r6 [...]
+</text><text class="breeze-stop-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-stop-line-7)">│</text><text class="breeze-stop-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#breeze-stop-line-7)">-</text><text class="breeze-stop-r5" x="36.6" y="190.8" textLength="97.6" clip-path="url(#breeze-stop-line-7)">-cleanup</text><text class="breeze-stop-r5" x="134.2" y="190.8" textLength="134.2" clip-path="url(#breeze-stop-line-7)">-mypy-cache</text><text class="breeze-stop- [...]
+</text><text class="breeze-stop-r4" x="0" y="215.2" textLength="1464" clip-path="url(#breeze-stop-line-8)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-stop-r2" x="1464" y="215.2" textLength="12.2" clip-path="url(#breeze-stop-line-8)">
+</text><text class="breeze-stop-r4" x="0" y="239.6" textLength="24.4" clip-path="url(#breeze-stop-line-9)">╭─</text><text class="breeze-stop-r4" x="24.4" y="239.6" textLength="195.2" clip-path="url(#breeze-stop-line-9)">&#160;Common&#160;options&#160;</text><text class="breeze-stop-r4" x="219.6" y="239.6" textLength="1220" clip-path="url(#breeze-stop-line-9)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-sto [...]
+</text><text class="breeze-stop-r4" x="0" y="264" textLength="12.2" clip-path="url(#breeze-stop-line-10)">│</text><text class="breeze-stop-r5" x="24.4" y="264" textLength="12.2" clip-path="url(#breeze-stop-line-10)">-</text><text class="breeze-stop-r5" x="36.6" y="264" textLength="97.6" clip-path="url(#breeze-stop-line-10)">-verbose</text><text class="breeze-stop-r6" x="158.6" y="264" textLength="24.4" clip-path="url(#breeze-stop-line-10)">-v</text><text class="breeze-stop-r2" x="207.4"  [...]
+</text><text class="breeze-stop-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-stop-line-11)">│</text><text class="breeze-stop-r5" x="24.4" y="288.4" textLength="12.2" clip-path="url(#breeze-stop-line-11)">-</text><text class="breeze-stop-r5" x="36.6" y="288.4" textLength="48.8" clip-path="url(#breeze-stop-line-11)">-dry</text><text class="breeze-stop-r5" x="85.4" y="288.4" textLength="48.8" clip-path="url(#breeze-stop-line-11)">-run</text><text class="breeze-stop-r6" x="15 [...]
+</text><text class="breeze-stop-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-stop-line-12)">│</text><text class="breeze-stop-r5" x="24.4" y="312.8" textLength="12.2" clip-path="url(#breeze-stop-line-12)">-</text><text class="breeze-stop-r5" x="36.6" y="312.8" textLength="61" clip-path="url(#breeze-stop-line-12)">-help</text><text class="breeze-stop-r6" x="158.6" y="312.8" textLength="24.4" clip-path="url(#breeze-stop-line-12)">-h</text><text class="breeze-stop-r2" x="207. [...]
+</text><text class="breeze-stop-r4" x="0" y="337.2" textLength="1464" clip-path="url(#breeze-stop-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-stop-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-stop-line-13)">
 </text>
     </g>
     </g>
diff --git a/scripts/ci/pre_commit/pre_commit_mypy.py b/scripts/ci/pre_commit/pre_commit_mypy.py
index 2b99ab68dc..f6a08e8815 100755
--- a/scripts/ci/pre_commit/pre_commit_mypy.py
+++ b/scripts/ci/pre_commit/pre_commit_mypy.py
@@ -70,6 +70,7 @@ if __name__ == "__main__":
     if cmd_result.returncode != 0:
         get_console().print(
             "[warning]If you see strange stacktraces above, "
-            "run `breeze ci-image build --python 3.7` and try again."
+            "run `breeze ci-image build --python 3.7` and try again. "
+            "You can also run `breeze stop --cleanup-mypy-cache` to clean up the cache used."
         )
     sys.exit(cmd_result.returncode)