Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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 .github/ISSUE_TEMPLATE/1-airflow_bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ body:
multiple: false
options:
- "3.0.1"
- "2.10.5"
- "2.11.0"
- "main (development)"
- "Other Airflow 2 version (please specify below)"
validations:
Expand Down
4 changes: 2 additions & 2 deletions .github/actions/migration_tests/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ runs:
- name: "Test migration file 2 to 3 migration: ${{env.BACKEND}}"
shell: bash
run: |
breeze shell "${{ env.AIRFLOW_2_CMD }}" --use-airflow-version 2.10.5 --answer y &&
breeze shell "${{ env.AIRFLOW_2_CMD }}" --use-airflow-version 2.11.0 --answer y &&
breeze shell "export AIRFLOW__DATABASE__EXTERNAL_DB_MANAGERS=${{env.DB_MANGERS}}
${{ env.AIRFLOW_3_CMD }}" --no-db-cleanup
env:
Expand All @@ -47,7 +47,7 @@ runs:
- name: "Test ORM migration 2 to 3: ${{env.BACKEND}}"
shell: bash
run: >
breeze shell "${{ env.AIRFLOW_2_CMD }}" --use-airflow-version 2.10.5 --answer y &&
breeze shell "${{ env.AIRFLOW_2_CMD }}" --use-airflow-version 2.11.0 --answer y &&
breeze shell "export AIRFLOW__DATABASE__EXTERNAL_DB_MANAGERS=${{env.DB_MANGERS}}
${{ env.AIRFLOW_3_CMD }}" --no-db-cleanup
env:
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ Apache Airflow version life cycle:
| Version | Current Patch/Minor | State | First Release | Limited Maintenance | EOL/Terminated |
|-----------|-----------------------|-----------|-----------------|-----------------------|------------------|
| 3 | 3.0.1 | Supported | Apr 22, 2025 | TBD | TBD |
| 2 | 2.10.5 | Supported | Dec 17, 2020 | TBD | TBD |
| 2 | 2.11.0 | Supported | Dec 17, 2020 | TBD | TBD |
| 1.10 | 1.10.15 | EOL | Aug 27, 2018 | Dec 17, 2020 | June 17, 2021 |
| 1.9 | 1.9.0 | EOL | Jan 03, 2018 | Aug 27, 2018 | Aug 27, 2018 |
| 1.8 | 1.8.2 | EOL | Mar 19, 2017 | Jan 03, 2018 | Jan 03, 2018 |
Expand Down
93 changes: 93 additions & 0 deletions RELEASE_NOTES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -984,6 +984,99 @@ thank everyone who helped shape this release through design discussions, code co
community feedback. For full details, migration guidance, and upgrade best practices, refer to the official Upgrade
Guide and join the conversation on the Airflow dev and user mailing lists.

Airflow 2.11.0 (2025-05-20)
---------------------------

Significant Changes
^^^^^^^^^^^^^^^^^^^

``DeltaTriggerTimetable`` for trigger-based scheduling (#47074)
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

This change introduces DeltaTriggerTimetable, a new built-in timetable that complements the existing suite of
Airflow timetables by supporting delta-based trigger schedules without relying on data intervals.

Airflow currently has two major types of timetables:
- Data interval-based (e.g., ``CronDataIntervalTimetable``, ``DeltaDataIntervalTimetable``)
- Trigger-based (e.g., ``CronTriggerTimetable``)

However, there was no equivalent trigger-based option for delta intervals like ``timedelta(days=1)``.
As a result, even simple schedules like ``schedule=timedelta(days=1)`` were interpreted through a data interval
lens—adding unnecessary complexity for users who don't care about upstream/downstream data dependencies.

This feature is backported to Airflow 2.11.0 to help users begin transitioning before upgrading to Airflow 3.0.

- In Airflow 2.11, ``schedule=timedelta(...)`` still defaults to ``DeltaDataIntervalTimetable``.
- A new config option ``[scheduler] create_delta_data_intervals`` (default: ``True``) allows opting in to ``DeltaTriggerTimetable``.
- In Airflow 3.0, this config defaults to ``False``, meaning ``DeltaTriggerTimetable`` becomes the default for timedelta schedules.

By flipping this config in 2.11, users can preview and adopt the new scheduling behavior in advance — minimizing surprises during upgrade.


Consistent timing metrics across all backends (#39908, #43966)
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

Previously, Airflow reported timing metrics in milliseconds for ``StatsD`` but in seconds for other backends
such as ``OpenTelemetry`` and ``Datadog``. This inconsistency made it difficult to interpret or compare
timing metrics across systems.

Airflow 2.11 introduces a new config option:

- ``[metrics] timer_unit_consistency`` (default: ``False`` in 2.11, ``True`` and dropped in Airflow 3.0).

When enabled, all timing metrics are consistently reported in milliseconds, regardless of the backend.

This setting has become mandatory and always ``True`` in Airflow 3.0 (the config will be removed), so
enabling it in 2.11 allows users to migrate early and avoid surprises during upgrade.

Ease migration to Airflow 3
"""""""""""""""""""""""""""
This release introduces several changes to help users prepare for upgrading to Airflow 3:

- All models using ``execution_date`` now also include a ``logical_date`` field. Airflow 3 drops ``execution_date`` entirely in favor of ``logical_date`` (#44283)
- Added ``airflow config lint`` and ``airflow config update`` commands in 2.11 to help audit and migrate configs for Airflow 3.0. (#45736, #50353, #46757)

Python 3.8 support removed
""""""""""""""""""""""""""
Support for Python 3.8 has been removed, as it has reached end-of-life.
Airflow 2.11 requires Python 3.9, 3.10, 3.11, or 3.12.

New Features
""""""""""""

- Introduce ``DeltaTriggerTimetable`` (#47074)
- Backport ``airflow config update`` and ``airflow config lint`` changes to ease migration to Airflow 3 (#45736, #50353)
- Add link to show task in a DAG in DAG Dependencies view (#47721)
- Align timers and timing metrics (ms) across all metrics loggers (#39908, #43966)

Bug Fixes
"""""""""

- Don't resolve path for DAGs folder (#46877)
- Fix ``ti.log_url`` timestamp format from ``"%Y-%m-%dT%H:%M:%S%z"`` to ``"%Y-%m-%dT%H:%M:%S.%f%z"`` (#50306)
- Ensure that the generated ``airflow.cfg`` contains a random ``fernet_key`` and ``secret_key`` (#47755)
- Fixed setting ``rendered_map_index`` via internal api (#49057)
- Store rendered_map_index from ``TaskInstancePydantic`` into ``TaskInstance`` (#48571)
- Allow using ``log_url`` property on ``TaskInstancePydantic`` (Internal API) (#50560)
- Fix Trigger Form with Empty Object Default (#46872)
- Fix ``TypeError`` when deserializing task with ``execution_timeout`` set to ``None`` (#46822)
- Always populate mapped tasks (#46790)
- Ensure ``check_query_exists`` returns a bool (#46707)
- UI: ``/xcom/list`` got exception when applying filter on the ``value`` column (#46053)
- Allow to set note field via the experimental internal api (#47769)

Miscellaneous
"""""""""""""

- Add ``logical_date`` to models using ``execution_date`` (#44283)
- Drop support for Python 3.8 (#49980, #50015)
- Emit warning for deprecated ``BaseOperatorLink.get_link`` signature (#46448)

Doc Only Changes
""""""""""""""""
- Unquote executor ``airflow.cfg`` variable (#48084)
- Update ``XCom`` docs to show examples of pushing multiple ``XComs`` (#46284, #47068)

Airflow 2.10.5 (2025-02-10)
---------------------------

Expand Down
2 changes: 1 addition & 1 deletion airflow-core/docs/installation/supported-versions.rst
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Apache Airflow® version life cycle:
Version Current Patch/Minor State First Release Limited Maintenance EOL/Terminated
========= ===================== ========= =============== ===================== ================
3 3.0.1 Supported Apr 22, 2025 TBD TBD
2 2.10.5 Supported Dec 17, 2020 TBD TBD
2 2.11.0 Supported Dec 17, 2020 TBD TBD
1.10 1.10.15 EOL Aug 27, 2018 Dec 17, 2020 June 17, 2021
1.9 1.9.0 EOL Jan 03, 2018 Aug 27, 2018 Aug 27, 2018
1.8 1.8.2 EOL Mar 19, 2017 Jan 03, 2018 Jan 03, 2018
Expand Down
4 changes: 3 additions & 1 deletion dev/breeze/src/airflow_breeze/global_constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,7 @@ def get_default_platform_machine() -> str:
PYTHON_3_7_TO_3_11 = ["3.7", "3.8", "3.9", "3.10", "3.11"]
PYTHON_3_8_TO_3_11 = ["3.8", "3.9", "3.10", "3.11"]
PYTHON_3_8_TO_3_12 = ["3.8", "3.9", "3.10", "3.11", "3.12"]
PYTHON_3_9_TO_3_12 = ["3.9", "3.10", "3.11", "3.12"]


AIRFLOW_PYTHON_COMPATIBILITY_MATRIX = {
Expand Down Expand Up @@ -445,6 +446,7 @@ def get_default_platform_machine() -> str:
"2.10.3": PYTHON_3_8_TO_3_12,
"2.10.4": PYTHON_3_8_TO_3_12,
"2.10.5": PYTHON_3_8_TO_3_12,
"2.11.0": PYTHON_3_9_TO_3_12,
}

DB_RESET = False
Expand Down Expand Up @@ -688,7 +690,7 @@ def generate_provider_dependencies_if_needed():
PROVIDERS_COMPATIBILITY_TESTS_MATRIX: list[dict[str, str | list[str]]] = [
{
"python-version": "3.9",
"airflow-version": "2.10.5",
"airflow-version": "2.11.0",
"remove-providers": "cloudant common.messaging fab git",
"run-tests": "true",
},
Expand Down
4 changes: 2 additions & 2 deletions reproducible_build.yaml
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
release-notes-hash: 6fe23479eea266e109aa8d2ec4785e17
source-date-epoch: 1747079331
release-notes-hash: 603f82f97ea69555820b0ffb6bc1e4e9
source-date-epoch: 1747747019
2 changes: 1 addition & 1 deletion scripts/ci/pre_commit/supported_versions.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@

SUPPORTED_VERSIONS = (
("3", "3.0.1", "Supported", "Apr 22, 2025", "TBD", "TBD"),
("2", "2.10.5", "Supported", "Dec 17, 2020", "TBD", "TBD"),
("2", "2.11.0", "Supported", "Dec 17, 2020", "TBD", "TBD"),
("1.10", "1.10.15", "EOL", "Aug 27, 2018", "Dec 17, 2020", "June 17, 2021"),
("1.9", "1.9.0", "EOL", "Jan 03, 2018", "Aug 27, 2018", "Aug 27, 2018"),
("1.8", "1.8.2", "EOL", "Mar 19, 2017", "Jan 03, 2018", "Jan 03, 2018"),
Expand Down
Loading