This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v3-4-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/v3-4-test by this push:
new 6a4d7181389 [v3-4-test] Always build airflow core and task sdk docs
together in CI (#76443) (#76794)
6a4d7181389 is described below
commit 6a4d7181389fec26013aaf5402a8d3f000c29c91
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Nov 10 04:41:16 2026 +0100
[v3-4-test] Always build airflow core and task sdk docs together in CI
(#76443) (#76794)
(cherry picked from commit d23f21fa312b5f39f03dd10d372c0dd779956868)
Co-authored-by: Amogh Desai <[email protected]>
---
dev/breeze/doc/ci/04_selective_checks.md | 4 +++-
.../src/airflow_breeze/utils/selective_checks.py | 12 ++++++++++--
dev/breeze/tests/test_selective_checks.py | 21 ++++++++++++++-------
dev/breeze/tests/test_verification_plan.py | 2 +-
dev/breeze/tests/test_verify_commands.py | 2 +-
5 files changed, 29 insertions(+), 12 deletions(-)
diff --git a/dev/breeze/doc/ci/04_selective_checks.md
b/dev/breeze/doc/ci/04_selective_checks.md
index 54813308355..4c14a33e999 100644
--- a/dev/breeze/doc/ci/04_selective_checks.md
+++ b/dev/breeze/doc/ci/04_selective_checks.md
@@ -598,7 +598,9 @@ together using `pytest-xdist` (pytest-xdist distributes the
tests among parallel
* If docs are build, the `docs-list-as-string` will determine which docs
packages to build. This is based on
several criteria: if any of the airflow core, charts, docker-stack, Apache
Airflow Mypy, providers files or
docs have changed, then corresponding packages are built (including
cross-dependent providers). If any of the core files
- changed, also providers docs are built because all providers depend on
airflow docs. If any of the docs
+ changed, also providers docs are built because all providers depend on
airflow docs. The `apache-airflow`
+ and `task-sdk` packages are always built together, because they release
together and their docs can link
+ to each other's pages before those pages are published. If any of the docs
build python files changed or when build is "canary" type in main - all docs
packages are built.
## Skipping prek hooks (Static checks)
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index 6d235b39713..f8c3524e801 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -2190,7 +2190,15 @@ class SelectiveChecks:
):
return _ALL_DOCS_LIST
packages = []
- if any(file.startswith(("airflow-core/src/airflow/",
"airflow-core/docs/")) for file in self._files):
+ # Core and Task SDK release together, so either side's docs may link
to a page in the
+ # other that is not published yet. Building both resolves those links
locally.
+ core_or_task_sdk_changed = any(
+ file.startswith(
+ ("airflow-core/src/airflow/", "airflow-core/docs/",
"task-sdk/src/", "task-sdk/docs/")
+ )
+ for file in self._files
+ )
+ if core_or_task_sdk_changed:
packages.append("apache-airflow")
if any(file.startswith("providers-summary-docs/") for file in
self._files):
packages.append("apache-airflow-providers")
@@ -2198,7 +2206,7 @@ class SelectiveChecks:
packages.append("helm-chart")
if any(file.startswith("docker-stack-docs") for file in self._files):
packages.append("docker-stack")
- if any(file.startswith("task-sdk/src/") for file in self._files):
+ if core_or_task_sdk_changed:
packages.append("task-sdk")
if any(file.startswith("airflow-ctl/") for file in self._files):
packages.append("apache-airflow-ctl")
diff --git a/dev/breeze/tests/test_selective_checks.py
b/dev/breeze/tests/test_selective_checks.py
index fa31f782b16..8ec11a13d1c 100644
--- a/dev/breeze/tests/test_selective_checks.py
+++ b/dev/breeze/tests/test_selective_checks.py
@@ -3403,7 +3403,7 @@ def test_expected_output_fork_push(
"run-unit-tests": "true",
"skip-providers-tests": "false",
"docs-build": "true",
- "docs-list-as-string": "apache-airflow helm-chart amazon
apache.beam apache.cassandra "
+ "docs-list-as-string": "apache-airflow helm-chart task-sdk
amazon apache.beam apache.cassandra "
"apache.kafka cncf.kubernetes common.ai common.compat
common.messaging common.sql databricks facebook google hashicorp http
microsoft.azure "
"microsoft.mssql mongo mysql openlineage oracle postgres "
"presto salesforce samba sftp ssh standard trino",
@@ -3451,7 +3451,7 @@ def test_expected_output_fork_push(
"run-unit-tests": "true",
"skip-providers-tests": "true",
"docs-build": "true",
- "docs-list-as-string": "apache-airflow",
+ "docs-list-as-string": "apache-airflow task-sdk",
"skip-prek-hooks": (
"check-provider-yaml-valid,check-ts-sdk-supervisor-schema,identity,ktlint,lint-helm-chart,"
"mypy-airflow-ctl,mypy-airflow-ctl-tests,mypy-airflow-e2e-tests,"
@@ -3736,7 +3736,7 @@ def test_upgrade_to_newer_dependencies(
pytest.param(
("providers/airbyte/docs/some_file.rst",
"airflow-core/docs/docs.rst"),
{
- "docs-list-as-string": "apache-airflow airbyte common.compat",
+ "docs-list-as-string": "apache-airflow task-sdk airbyte
common.compat",
},
id="Airbyte provider and airflow core docs changed",
),
@@ -3747,17 +3747,24 @@ def test_upgrade_to_newer_dependencies(
"providers-summary-docs/docs.rst",
),
{
- "docs-list-as-string": "apache-airflow
apache-airflow-providers airbyte common.compat",
+ "docs-list-as-string": "apache-airflow
apache-airflow-providers task-sdk airbyte common.compat",
},
id="Airbyte provider and airflow core and common provider docs
changed",
),
pytest.param(
("airflow-core/docs/docs.rst",),
{
- "docs-list-as-string": "apache-airflow",
+ "docs-list-as-string": "apache-airflow task-sdk",
},
id="Only Airflow docs changed",
),
+ pytest.param(
+ ("task-sdk/docs/index.rst",),
+ {
+ "docs-list-as-string": "apache-airflow task-sdk",
+ },
+ id="Only Task SDK docs changed",
+ ),
pytest.param(
("dev/mypy/docs/index.rst",),
{
@@ -3780,7 +3787,7 @@ def test_upgrade_to_newer_dependencies(
pytest.param(
("airflow-core/src/airflow/test.py",),
{
- "docs-list-as-string": "apache-airflow",
+ "docs-list-as-string": "apache-airflow task-sdk",
},
id="Core files changed. Apache-Airflow docs should also be built",
),
@@ -3792,7 +3799,7 @@ def test_upgrade_to_newer_dependencies(
pytest.param(
("airflow-core/src/airflow/test.py", "chart/airflow/values.yaml"),
{
- "docs-list-as-string": "apache-airflow helm-chart",
+ "docs-list-as-string": "apache-airflow helm-chart task-sdk",
},
id="Core files and helm chart files changed. Apache Airflow and
helm chart docs to build",
),
diff --git a/dev/breeze/tests/test_verification_plan.py
b/dev/breeze/tests/test_verification_plan.py
index 6a5d10250d3..77e1dd92b0f 100644
--- a/dev/breeze/tests/test_verification_plan.py
+++ b/dev/breeze/tests/test_verification_plan.py
@@ -83,7 +83,7 @@ def test_docs_only_change_mirrors_the_ci_cell():
files = ("airflow-core/docs/index.rst",)
sc = _selective_checks(files)
result = build_local_verification_plan(sc, files, "main",
full_tests_needed=False)
- assert [item["command"] for item in result["items"]] == ["breeze
build-docs apache-airflow"]
+ assert [item["command"] for item in result["items"]] == ["breeze
build-docs apache-airflow task-sdk"]
def test_core_change_splits_db_and_non_db_cells():
diff --git a/dev/breeze/tests/test_verify_commands.py
b/dev/breeze/tests/test_verify_commands.py
index 005f9962086..999cf03756d 100644
--- a/dev/breeze/tests/test_verify_commands.py
+++ b/dev/breeze/tests/test_verify_commands.py
@@ -99,7 +99,7 @@ def test_json_output_keeps_stdout_parseable(mock_files,
monkeypatch):
}
assert payload["changed_files"] == ["airflow-core/docs/index.rst"]
assert payload["items"] == [
- {"kind": "docs", "command": "breeze build-docs apache-airflow",
"runs_in": "breeze"}
+ {"kind": "docs", "command": "breeze build-docs apache-airflow
task-sdk", "runs_in": "breeze"}
]