Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
4753b13
Add breeze verify to show CI-required local verification for changed …
Andrushika Sep 16, 2026
d442e0a
Print the CI reproduction banner on stderr so breeze verify --json st…
Andrushika Sep 16, 2026
851250f
Let a breeze command opt out of the CI reproduction banner instead of…
Andrushika Sep 16, 2026
ec85d6b
List renamed files the way CI does when computing breeze verify chang…
Andrushika Sep 16, 2026
372b6ce
Only list jobs triggered by the change in breeze verify
Andrushika Sep 16, 2026
cafb5e0
Make breeze verify list what to run by default and keep the CI expans…
Andrushika Sep 16, 2026
46ac9f4
Fold long commands in the breeze verify table instead of truncating them
Andrushika Sep 16, 2026
ce90ec1
Print breeze verify commands one per line instead of in a table
Andrushika Sep 16, 2026
151c2ce
Keep the table output in breeze verify
Andrushika Sep 16, 2026
b031657
List the jobs CI runs on every PR under breeze verify --full
Andrushika Sep 16, 2026
521f373
Address review: guard hook names, use --from-ref by default, point ag…
Andrushika Sep 23, 2026
af936a4
Classify breeze verify flags from the workflow gates instead of the r…
Andrushika Sep 23, 2026
3b2612b
Scan complete multiline workflow conditions
Andrushika Sep 23, 2026
8a60873
Keep breeze verify classification focused on run flags
Andrushika Sep 23, 2026
d2565fe
Regenerate breeze command images and skill-eval hash after rebase
Andrushika Sep 27, 2026
5365059
Leave static checks to prek in breeze verify
Andrushika Oct 2, 2026
13b7f31
Compare breeze verify with main on the apache/airflow remote by default
Andrushika Oct 2, 2026
0bcbb17
Point breeze verify at the prek hooks a default install does not run
potiuk Oct 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .agents/skills/airflow-publish-changes/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ code review checklist in [`.github/instructions/code-review.instructions.md`](..
and fix any failures. The skipped hooks start long-running local servers or provision the
opt-in Codex environment rather than run checks that complete.
6. Run relevant individual tests and confirm they pass.
7. Find which tests to run for the changes with selective-checks and run those tests in parallel to confirm they pass and check for CI-specific issues.
7. Run `breeze verify` and execute every command it lists. The list comes from the same selective-checks logic CI uses. `breeze verify --full` shows everything CI runs for the default matrix cell, including the full suite CI adds when a change touches CI tooling or dependency files. Static checks are not listed: steps 4 and 5 cover them. Confirm the commands pass and check for CI-specific issues.
8. Check for security issues — no secrets, no injection vulnerabilities, no unsafe patterns.

Before pushing, always rebase your branch onto the latest target branch (usually `main`)
Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ Don't spell out **Directed Acyclic Graph** except for historical context.
- **Run regular (fast) static checks:** `prek run --from-ref <target_branch> --stage pre-commit`
- **Run manual (slower) checks:** `prek run --from-ref <target_branch> --stage manual --skip compile-ui-assets-dev --skip view-skill-eval --skip run-skill-eval-codex` (the skipped hooks start long-running local servers or provision the opt-in Codex environment rather than run checks that complete)
- **Build docs:** `breeze build-docs`
- **List the local verification for your changes:** `breeze verify` (add `--full` for everything CI runs for the default matrix cell except static checks, `--json` for machine-readable output). It uses the same selective-checks logic as CI.
- **Determine which tests to run based on changed files:** `breeze ci selective-check --commit-ref <commit_with_squashed_changes>`
<!-- END generated-commands, please keep comment here to allow auto update -->

Expand Down
1 change: 1 addition & 0 deletions contributing-docs/08_static_code_checks.rst
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ To check other usage types of the pre-commit framework, see `Pre-commit website
- "- **Run regular (fast) static checks:** `prek run --from-ref <target_branch> --stage pre-commit`"
- "- **Run manual (slower) checks:** `prek run --from-ref <target_branch> --stage manual --skip compile-ui-assets-dev --skip view-skill-eval --skip run-skill-eval-codex` (the skipped hooks start long-running local servers or provision the opt-in Codex environment rather than run checks that complete)"
- "- **Build docs:** `breeze build-docs`"
- "- **List the local verification for your changes:** `breeze verify` (add `--full` for everything CI runs for the default matrix cell except static checks, `--json` for machine-readable output). It uses the same selective-checks logic as CI."
- "- **Determine which tests to run based on changed files:** `breeze ci selective-check --commit-ref <commit_with_squashed_changes>`"
.. AGENT-SKILL-END

Expand Down
55 changes: 55 additions & 0 deletions dev/breeze/doc/03_developer_tasks.rst
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,61 @@ If the provider name is ``apache-airflow-providers-cncf-kubernetes``, it will be
Note: For building docs for apache-airflow-providers index, use ``apache-airflow-providers``
as the short hand operator.

Finding out what CI will run for your change
Comment thread
Andrushika marked this conversation as resolved.
--------------------------------------------

``breeze verify`` reads the files changed against the target branch (the merge-base of
``--base-ref`` and ``HEAD``, plus untracked files), runs the same selective-checks logic CI uses
and lists the commands to run locally for the change. Nothing is executed. The only non-zero exit
is a usage error such as a base ref git cannot resolve.

By default ``--base-ref`` is ``main`` on the git remote that points at apache/airflow (``upstream``
if several do), the same base GitHub compares a PR with. A local ``main`` that is behind the
``main`` your branch has merged would count every merged-in commit as your change. Without such a
remote, ``breeze verify`` falls back to the local ``main`` branch and says so. It also warns when
the branch has merged commits the base does not have, for example after GitHub's "Update branch"
when the remote was not fetched since. With ``--json`` the warnings go to stderr.

.. code-block:: bash

breeze verify
breeze verify --json
breeze verify --full
breeze verify --base-ref main

Each row says what kind of check it is, whether it runs on the host or needs Docker and the
CI image (``breeze``), and the exact command. Jobs CI runs on every PR regardless of the change
(breeze's own unit tests, the shared distributions) only show up with ``--full``. The translation
check is never listed: CI runs it with ``|| true``, so it cannot fail a PR.
Static checks are not listed either: ``prek`` already picks the hooks to run for the changed files,
so run it as usual. The exception is the ``mypy-providers`` and ``migration-round-trip`` hooks,
which CI runs but a default ``prek install`` does not (they are ``pre-push`` or ``manual`` stage
hooks). When the change triggers them, ``breeze verify`` prints the
``prek run --stage manual <hook> --from-ref <base>`` command to run each one, and ``--json``
lists them under ``manual_prek_hooks``.
Use ``--json`` for machine-readable output with the same fields.

When a change touches CI tooling or dependency files, selective checks make CI run the full suite.
The default list leaves that expansion out and only shows what the changed files match themselves,
with a note that CI will run more. ``--full`` lists everything CI runs for the default matrix cell
(default Python, sqlite), apart from static checks.

Even ``--full`` is not the full CI matrix. Other Python versions, Postgres and MySQL,
lowest-dependency runs, Kubernetes, Helm, e2e suites, the provider compatibility matrix and ARM
runners only run in CI. Two more caveats. Selective checks compare ``pyproject.toml`` contents
between ``HEAD`` and ``HEAD^`` only, so dependency changes that are uncommitted or in earlier
commits of your branch are not detected as such (test selection is unaffected, only the
dependency-bump checks are). Packaging steps CI runs around some tests (building and
twine-checking the Task SDK and airflow-ctl wheels, regenerating the Python API client from its
own repository) are not listed.

These are all available flags of ``verify`` command:

.. image:: ./images/output_verify.svg
:target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/images/output_verify.svg
:width: 100%
:alt: Breeze verify

Running static checks
---------------------

Expand Down
5 changes: 5 additions & 0 deletions dev/breeze/doc/ci/04_selective_checks.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ contributors in case of simpler changes.
> [`dev/breeze/src/airflow_breeze/utils/selective_checks.py`](../../src/airflow_breeze/utils/selective_checks.py).
> When you change that file, **update this document in the same PR** so the behaviour and the
> documentation stay in sync.
>
> `breeze verify` maps the `run_*` flags to local commands in
> [`dev/breeze/src/airflow_breeze/utils/verification_plan.py`](../../src/airflow_breeze/utils/verification_plan.py).
> Adding a `run_*` flag to `SelectiveChecks` also means classifying it there;
> `dev/breeze/tests/test_verification_plan.py` fails until you do.

## Why selective checks exist (the optimisation goal)

Expand Down
Loading