Breaking Changes
- Cosmos now keeps the Airflow DAGs folder out of dbt's plugin discovery path during every dbt invocation (
sys.pathunderInvocationMode.DBT_RUNNER,PYTHONPATHunderInvocationMode.SUBPROCESS). If you keep a dbt plugin whose module name starts withdbt_inside the DAGs folder, it will no longer be discovered: move it out of the DAGs folder, or setenable_dags_folder_exclusion_from_dbt=False(env varAIRFLOW__COSMOS__ENABLE_DAGS_FOLDER_EXCLUSION_FROM_DBT) to restore the previous behaviour. This fixes dbt importing DAG files nameddbt_*.pyas plugins, which leaked or duplicated DAGs across unrelated Cosmos DAGs in-process and could crash the dbt command in subprocess mode. See #1673 and #2893. - Bare selectors (no method prefix, such as
martsormarts+) now resolve against each node's fully qualified name (fqn) underLoadMode.DBT_MANIFEST, as dbt does. Review bareselectandexcludeentries before upgrading: anexcludethat was a silent no-op, or that matched too broadly, now removes exactly the dbt-selected nodes and their descendants, so tasks can disappear from an existing DAG. A graph operator on a folder or package root (e.g.post_processing+orfhir_dbt_utils+) now resolves nodes where it previously matched nothing, and a token equal to the model-paths directory (models), a filesystem ancestor, or a single middle folder segment no longer matches, because those are not an fqn prefix. See #2962 and #2978. - Raised the minimum supported dbt Core version to 1.8. dbt Core 1.5, 1.6, and 1.7 have reached End of Life per the dbt Labs support policy and are no longer tested or supported; see the compatibility policy for the current supported range. See #2902.
- Raised the minimum supported Python version to 3.11. Python 3.10 has reached End of Life per the Python release schedule. Users on Python 3.10 can stay on Cosmos 1.15.x or move to Python 3.11 or newer. See #3159.
- Raised the minimum supported Apache Airflow version to 2.11. Apache Airflow 2.9 and 2.10 (Astro Runtime 11 and 12) are past End of Maintenance per the Astronomer Runtime lifecycle policy and are no longer tested or supported. Users who cannot upgrade Airflow should stay on Cosmos 1.15.x; see the compatibility policy for the current supported range. See #3152.
- Starting in Cosmos 1.16.0,
ExecutionMode.AIRFLOW_ASYNCis no longer supported on Apache Airflow 2.x. This change was necessary in order to support this execution mode in Airflow 3.4. Users who rely onAIRFLOW_ASYNCand cannot upgrade to Airflow 3 should stay on an earlier Cosmos release. See more information on #3050. - The Airflow 3 dbt docs plugin now requires authentication. Every
/cosmosroute requires a logged-in Airflow user with read access to theWebsiteview, matching the Airflow 2 plugin; unauthenticated requests receive HTTP 401 and users without that permission receive HTTP 403. Previously these routes were served without authentication, exposing model SQL and schema metadata to anyone who could reach the API server. As a result, opening dbt docs from the Airflow UI now requires Airflow 3.1.1 or later (Astro Runtime 3.1-3 or later): the Airflow 3.1.0 UI discards its session cookie after login, so on Airflow 3.1.0 (including Astro Runtime 3.1-1 and 3.1-2) the docs return HTTP 401 and the plugin logs a warning. The plugin still loads on Airflow 3.1.0, and bearer-token API access to the docs still works. FastAPI's/openapi.json,/docsand/redocunder/cosmosare disabled, and the plugin registers no sub-application or menu entry whendbt_docs_projectsis empty. See #3081.
Behaviour Changes
- Cosmos now passes the
--varsand--argsdbt flags as one-line flow YAML (for example{var: '2'}) instead of block YAML, because dbt OSS rejects block YAML that contains quoted strings, for examplevar: '2'. dbt 1.x parses both forms to the same values, but the flag text in task logs and rendered commands differs. See #3099. RenderConfig.excludeis now resolved against the full project graph instead of against the subsetRenderConfig.selectalready narrowed. Graph operators traverse outwards from the nodes their selector matches, so whenselecthad already dropped those root nodes the traversal had nothing to start from and shared ancestors or descendants were silently kept. For example, given aparenttaggedtestand itschild,select=["+child"], exclude=["+tag:test"]previously rendered bothparentandchild, because+tag:testwas evaluated after+childhad already been applied; it now renders onlychild. This matches dbt, which evaluates both filters against the whole graph and subtracts afterwards. See #2976.ProjectConfignow keeps themodels/seeds/snapshotsrelative paths it was configured with even when it has nodbt_project_pathof its own, andLoadMode.CUSTOMfalls back to them when the project root is supplied throughRenderConfig/ExecutionConfiginstead. Previously those relative paths were discarded in that split configuration andLegacyDbtProjectsilently crawled its defaults, so a project declaring e.g.models_relative_paths="custom/models"rendered no models at all; it now crawlscustom/modelsas configured. Projects that setdbt_project_pathonProjectConfigare unaffected. See #2977.- Under
LoadMode.DBT_MANIFEST,RenderConfig.excludeand a YAML selector'sexcludenow apply to test nodes: tests matched by the exclude (for exampleresource_type:testortag:<x>) are no longer rendered, where previously they were added back next to their model. WithTestBehavior.AFTER_EACH, a model whose tests are all excluded is rendered as a plain task instead of a run and test group, so its task ids change (for examplemodel_a.runbecomesmodel_a_run). The tests of excluded models also leaveDbtGraph.filtered_nodes. Test nodes also keep their own tags in addition to the tags of every parent, soselect tag:<x>matches a test tagged<x>whose parent is not. Anexcludenow also removes every test that depends on an excluded node, as dbt's default indirect selection does, so a multi-parent test goes with any excluded parent while the other parents stay. Selecting by a test's own tag now renders that test where the test behavior allows it: a detached task for a multi-parent test whenshould_detach_multiple_parents_tests=True, or the single test task withTestBehavior.AFTER_ALL; previously nothing was rendered. A source whose tests are all excluded no longer counts as having tests, so withsource_rendering_behavior=WITH_TESTS_OR_FRESHNESSit is rendered only if it has a freshness check. See #2981 and #3080. emit_datasetsis now a template field on the dbt operators, so emission can be decided per DAG run:
operator_args={"emit_datasets": "{{ dag_run.run_type != 'backfill' }}"}stops backfills from triggering downstream
asset-scheduled DAGs.operator_argsnow takes precedence overRenderConfig.emit_datasets(which remains a
parse-time boolean and is not templatable). Previously anoperator_argsvalue was silently discarded, so
operator_args={"emit_datasets": False}now takes effect. See #2996.- When a dbt project cannot be found, Cosmos now raises a clearer error, and on Airflow 3 with an absolute
dbt_project_pathit appends guidance to set the path relative to the DAG file (e.g.(Path(__file__).parent / "dbt/my_dbt_project").absolute().as_posix()). This makes failures caused by versioned DAG bundles (e.g. on Astronomer) relocating the project between DAG parsing and task execution self-explanatory in the logs. The missing-project case increate_symlinksnow raisesCosmosValueErrorinstead of a bareFileNotFoundError. See #2921. - In
ExecutionMode.WATCHER(including the Kubernetes and GKE variants), the aggregated test status that the producer pushes to XCom under<model_unique_id>_tests_statusis now a dict (status,passed_count,failed_count,total_countand up to fivefailed_testsunique_ids) instead of the"pass"or"fail"string, and the test sensors log that summary. The sensors and the trigger still accept the string, so DAG runs in flight during the upgrade are unaffected; anything reading that XCom key directly must now readstatusfrom the dict. See #2750. - Under
SourceRenderingBehavior.WITH_TESTS_OR_FRESHNESS, a source that has tests but no freshness checks now renders its freshness task as anEmptyOperatorinstead of aDbtSourcetask that always ended with "Nothing to do" and failed when warn-error is enabled, matching the existingSourceRenderingBehavior.ALLpath. TheEmptyOperatorkeeps the dbt owner and does not receiveoperator_argsor per-nodeoperator_kwargs. The test tasks are unchanged. See #3044. ExecutionMode.WATCHERconsumers of a node that dbt skipped for an upstream failure now run the node on attempt 1 once the producer has finished, instead of failing and waiting oneretry_delayfor attempt 2. Previously every level of the graph below a failed model added oneretry_delay. Test consumers whose model did not succeed do the same. This applies only when the task hasretriesset, and eitherwatcher_dbt_retry_queueis unset or the consumer already runs on it. Such a node now getsretries + 1real dbt runs instead ofretries. See #3023 and #3047.- On Airflow 3.3 and later, the
ExecutionMode.WATCHERproducer keeps its per-node XCom backup in the Airflow task store instead of an Airflow Variable whenenable_watcher_reliable_retryisTrue, split across keys that roll over at 8 KB so each push rewrites only the open key. Variable writes look the key up in every configured secrets backend first, so with an external backend the producer task ran between about 3 and 6 times faster in our benchmark, depending on how many backends are configured. WithFalsethe Variable flush from the retry callback is unchanged. A producer that finds no backup on a retry logs a warning when the task store was in use. On Airflow 3.4 and later, clearing the producer from the UI or the REST API discards that backup unless "Keep task state" is ticked; see the watcher execution mode guide. See #2771 and #3076. - Under
TestBehavior.BUILD, a rendered dbt source that has tests is now a task group (<source>.sourceand
<source>.test) instead of a single<source>_sourcetask, so references to the old task id need updating.
The source tests, which this mode never executed before, now run and can fail the DAG. See #1683 and #3037. - Like dbt, a bare selector (a folder, a package or a name, for example
stagingor the project name) andfqn:no longer select sources underLoadMode.DBT_MANIFEST. Before, a source matched when the folder of its YAML file or its package matched, so with source rendering on, a bare folder or package selector also rendered the source and the models that only read it. Usesource:to select a source;package:andpath:still select sources. See #3147. - With
dbt-ossinstalled in the Airflow environment andopenlineage-integration-common1.43.0 or older, local operators now emit datasets (assets); before, they emitted none.emit_datasetsis enabled by default, so DAGs scheduled on the assets of dbt models can be triggered by dbt OSS runs; setemit_datasets=Falseto keep the previous behaviour. Withopenlineage-integration-common1.44.0 or later, dbt OSS already emitted datasets and this does not change. On Airflow 2.10.5, a version where registering new datasets is only partially supported, emitting datasets can fail withFlushError: Can't flush None value found in collection DatasetModel.aliases. See #3111. ExecutionMode.WATCHERnow emits the datasets of models, seeds and snapshots when the manifest has no URI for them, as with dbt OSS, which writesmanifest.jsonwhen the run ends, and dbt Fusion. The producer builds the URI from the database, schema and alias in the relation of the node event, and the manifest still wins when it has one. Withemit_datasets=Falsenothing changes, and neither do the Kubernetes and GKE watchers. See #3129.
Features
- Log a per-model test summary (passed and failed counts, and the failing test unique_ids) in the
ExecutionMode.WATCHERtest sensors by @michal-mrazek in #2750 - Add opt-in experimental support for adapter-native semantic metric views (
config.materialized: metric_viewon Databricks,semantic_viewon Snowflake). Whenenable_semantic_metric_view_reclassificationis set (env varAIRFLOW__COSMOS__ENABLE_SEMANTIC_METRIC_VIEW_RECLASSIFICATION), these models are reclassified frommodeltoDbtResourceType.SEMANTIC_METRIC_VIEWand rendered via a dedicatedDbtSemanticMetricView*operator with asemantic_metric_runtask suffix. Disabled by default. See the "Managing semantic metric views" guide by @corsettigyg in #2885 - Add dedicated producer, consumer, and retry queues for
ExecutionMode.WATCHERby @jroachgolf84 in #2844 - Emit per-model outlets in
ExecutionMode.WATCHER_KUBERNETESby @MichaelRBlack in #2595 - Support lists of paths for the relative-path arguments of
ProjectConfigby @pankajastro in #2875 - Add a
retriesparameter to thegcs_uploadcallback by @TTMichaelA in #2871 - Make
emit_datasetstemplatable viaoperator_argsby @tatiana in #2996 - Support
config.groupandgroup:selectors by @biswasbiplob in #2980 - Add
AIConfig(experimental, it may change without a deprecation period), an opt-in diagnosis of failed dbt tasks: on their last attempt, an LLM is asked for the root cause and a fix, which are added after the dbt error. It usesapache-airflow-providers-common-ai(pip install astronomer-cosmos[ai], for Python 3.11+ and Airflow 2.11+), works withExecutionMode.LOCALandExecutionMode.VIRTUALENV, masks secrets, and lets you set what is sent and how much it can spend. See the AI config reference by @corsettigyg in #3018 - Add a
dbt-ossextra (pip install astronomer-cosmos[dbt-oss]) by @pankajastro in #3130 DbtDocsS3Operator,DbtDocsAzureStorageOperatorandDbtDocsGCSOperatornow upload the docs site written by dbt OSS, which has nocatalog.json, with the content type of each file. The files uploaded for dbt 1 are unchanged by @pankajastro in #3119
Enhancements
- Surface failing dbt nodes in the subprocess exception passed to
on_failure_callbackby @pankajastro in #2845 - Use
boto3for Kubernetes dbt docs S3 uploads by @jx2lee in #2957 - Raise the minimum supported dbt Core version to 1.8 by @pankajastro in #2939
- Clean up leftover dbt Core <1.8 references by @pankajastro in #2995
- Drop support for Python 3.10 by @pankajastro in #3159
- Drop support for Apache Airflow 2.9 and 2.10 by @jedcunningham in #3152
- Add a DAG-bundle hint when a dbt project path is missing by @pankajkoti in #2921
- Clarify missing profile field errors by @nightcityblade in #2970
- Improve
ExecutionMode.WATCHERproducer failure performance by keeping the per-node XCom backup in the Airflow task store on Airflow 3.3 and later by @tatiana in #3076
Bug Fixes
- On Airflow 3.0, the Cosmos plugin now logs a warning and skips the dbt docs views instead of raising
RuntimeErroron load. Previously, with[core] lazy_load_plugins = False(as on Astro Runtime), every Airflow CLI command logged a "Failed to import plugin cosmos" traceback, and the plugin's listeners were never registered by @jedcunningham in #3055 LoadMode.DBT_LSnow runsdbt lsthrough a Python subprocess when dbt OSS (dbt-core,dbt-ossordbtat version 2) is installed in the Airflow environment, even under the defaultInvocationMode.DBT_RUNNER. dbt 2'sdbtRunnerreturns only node names fordbt ls --output json, which previously rendered an empty DAG. The fallback runsdbt_executable_pathand is logged at INFO level;dbt depsstill runs throughdbtRunnerby @tatiana in #3060- Fix async operator construction on Airflow 3.4 by @pankajkoti in #3050
- Fix
on_warning_callbacknot being called after deferral in Kubernetes mode by @mathiasgout in #3062 - Fix the
ExecutionMode.WATCHERconsumer never reaching the fallback when its node errors early by @pankajkoti in #3011 - Fix
ExecutionMode.WATCHERdataset emission being silently disabled whenprofiles.ymluses dbt Jinja filters by @goingforstudying-ctrl in #2950 - Fix
AttributeErrormasking the real dbt error onrun-operationfailure by @barking-code in #2983 - Handle dict
env_varsin the Kubernetes operator env merge by @pankajkoti in #3030 - Normalize Databricks OAuth hosts by @nightcityblade in #3025
- Strip the trailing slash from Databricks profile hosts by @tatiana in #3069
- Require authentication on the Airflow 3 dbt docs routes by @tatiana in #3081
- Fix duplicate dbt Docs views in the Airflow 3 plugin by @ieCecchetti in #3071
- Fall back to subprocess in the
ExecutionMode.WATCHERproducer on dbt (oss) 2.0 by @fpiped in #2998 - Parse dbt JSON log output when extracting error and warning messages in subprocess mode by @ieCecchetti in #3072
- Use
EmptyOperatorfor freshness tasks of test-only sources, which now carry the dbt owner when owner inheritance is enabled by @JH0917 in #3044 - Keep the Airflow DAGs folder out of dbt's plugin discovery path by @pankajkoti in #2893
- Resolve bare folder, package, and node-name roots in graph-operator selectors under
LoadMode.DBT_MANIFESTby matching the node's fqn by @pankajkoti in #2978 - Stop rendering tests removed by
excludeunderLoadMode.DBT_MANIFESTby @tatiana and @ege-arhan in #3080 - Resolve
excludegraph selectors against the full project graph by @00yhj22-debug in #2976 - Keep
ProjectConfigrelative paths when the project root comes fromRenderConfigby @00yhj22-debug in #2977 - Fix
ExecutionMode.WATCHERconsumers waiting oneretry_delayper level below a failure by @biswasbiplob in #3047 - Surface the macro error on
run-operationfailure with dbt < 1.12 by @barking-code in #2986 - Skip dbt event callbacks for
run-operationon dbt 2 by @pankajastro in #3089 - Fix a circular import when
cosmos.constantsis imported before Airflow by @tatiana in #3087 - Render source tests as a separate task under
TestBehavior.BUILDby @developer-rpai in #3037 - Compare dbt node statuses case-insensitively in
ExecutionMode.WATCHERand enable the watcher tests on dbt-oss, so a capitalisedWarnorErrorfrom dbt 2 is recognised by the source sensor and the default freshness callback by @pankajastro in #3088 - Serialize the
--varsand--argsdbt flags as one-line flow YAML, because dbt OSS rejects block YAML that contains quoted strings by @pankajkoti in #3099 - Local operators now emit inlets and outlets (datasets) when dbt OSS is installed in the Airflow environment and
openlineage-integration-commonis 1.43.0 or older (Airflow's constraints pin 1.27.0 with Airflow 2.10.5, 1.37.0 with 3.1.0 and 1.43.0 with 3.1.7). dbt 2 leavesargs.profiles_dirout ofrun_results.json. Those library versions read it without a fallback, so parsing the OpenLineage events raised aKeyErrorand the task got no inlets or outlets (1.44.0 and later use the--profiles-dirlookup, and Cosmos does not change their run results). Cosmos now adds the profiles directory (--profiles-dirorDBT_PROFILES_DIR) to the run results of the task's temporary project before parsing, only when dbt did not write it. A dbt 2 executable used with a dbt 1.x environment is not covered. dbt Fusion used with a dbt 2 environment is covered by @pankajastro in #3111 - In
InvocationMode.SUBPROCESS, Cosmos now reads the text output of dbt OSS for dbt tests.DbtTestLocalOperatornow callson_warning_callbackwith the warned tests intest_namesandtest_results, and the exception for a failing dbt test, from any local operator, names the failing tests, with the number of failed rows when dbt 2 reports it. Previously the parsers only knew the dbt 1.x lines (Done. PASS=.. WARN=N .. TOTAL=N,Warning in test <name>,Failure in test <name>), so on dbt 2 the warning count was 0, the callback never fired, and the exception had no test details. The Kubernetes-based test operators (Kubernetes, GKE and EKS) now also read the dbt 2Summary: .. | N warnline, so theiron_warning_callbackfires by @pankajastro in #3108 ExecutionMode.WATCHERnow recognises the nodes that dbt OSS skips because an upstream node failed. dbt 2 does not emitSkippingDetailsorLogSkipBecauseErrorfor them, onlyMarkSkippedChildren, so their consumers ended SKIPPED and were never built after the upstream recovered on a retry. Cosmos now reads theMarkSkippedChildrenevent that dbt 2 emits for each node it skips and treats the node as it does for dbt 1, including the nodes below a failed test and below an excluded node by @pankajastro in #3124, see #2698 and #3023InvocationMode.DBT_RUNNERnow matches dbt node statuses case-insensitively when it collects warnings. dbt OSS reports a source freshness warning asWarn, which did not matchwarn, soDbtSourceLocalOperatorcalledon_warning_callbackwith emptytest_namesandtest_results. dbt 2 source freshness results have nomessage, so their status is reported intest_resultsinstead. dbt 1 is unchanged by @pankajastro in #3123ExecutionMode.WATCHERnow emits the datasets of models, seeds and snapshots when the manifest has no URI for them, as with dbt-oss and dbt Fusion by @pankajastro in #3129- Do not select sources with bare and
fqn:selectors underLoadMode.DBT_MANIFEST, as dbt does by @pankajastro in #3147 - Skip the
--no-static-parserflag underInvocationMode.DBT_RUNNERwhen dbt OSS is installed. dbt 2 has no static parser, so the flag loggedNoLongerSupportedOption (dbt1700)on every command, which failed the task whenwarn_error=Trueby @pankajastro in #3144 - Find the compiled SQL of dbt OSS models in the
ExecutionMode.WATCHERproducer. dbt 2 reportsnode_pathrelative to the project instead of the models folder, so the compiled SQL was never found by @pankajastro in #3145 - In
InvocationMode.SUBPROCESS, read the source freshness warnings that dbt OSS prints asWarned source <name> (...), soDbtSourceLocalOperatorcallson_warning_callbackwith the source intest_namesand the line dbt printed intest_resultsby @pankajastro in #3146 - Detect dbt OSS source freshness warnings in the Kubernetes and GKE operators, so
on_warning_callbackruns for a stale source by @pankajastro in #3156 - In
InvocationMode.SUBPROCESS, list the[error] [<Name> (dbt<code>)]blocks of failed models, macros and stale sources of dbt OSS in the exception of a failed command by @pankajastro in #3148 - In
InvocationMode.DBT_RUNNER, report a dbt OSS failure that is not tied to one node, such as a failingrun-operationmacro, in one line instead of listing every node of the project by @pankajastro in #3149 - Serve the
assets/andinfo_schema/files of the dbt OSS docs site in the Airflow 2 plugin, which loaded as a blank page before by @pankajastro in #3155 - Serve the
assets/andinfo_schema/files of the dbt OSS docs site in the Airflow 3 plugin, which loaded as a blank page before by @pankajastro in #3154
Docs
- Unify internal doc links to use the
:ref:role by @pankajastro in #2873 - Document the list-based relative-path arguments of
ProjectConfigby @pankajastro in #2876 - Link the
AGENTS.mdtest matrix topyproject.tomlinstead of hardcoding versions by @pankajastro in #2887 - Add dbt-core 1.12 to the Airflow/dbt conflicts table by @pankajastro in #2938
- Fix broken Slack invite links to the #airflow-dbt channel by @pankajastro in #2956
- Document
on_failure_callbackaccess to dbt test failures by @pankajastro in #2846 - Align Runtime support in the compatibility policy with End of Maintenance by @pankajkoti in #3150
- Document dbt OSS (dbt 2) in Kubernetes Pods by @pankajastro in #3157
- Fix the
enable_dataset_aliasvalue that Airflow 3 rejects in the scheduling guide by @jedcunningham in #3153 - Add a dbt OSS setup guide and list dbt Fusion and dbt OSS 2.0 separately in the compatibility policy by @pankajastro in #3132
- Add a favicon to the docs site by @jedcunningham in #3162
Architectural Proposal
- Add a proposal for a Snowflake dbt Project execution mode by @tatiana in #2896. Community contributions are welcome on the umbrella issue: #3058
Others
- Add a bidirectional cross-project dbt-loom example by @pankajkoti in #2883
- Exclude flaky and bot-blocked external links from the docs link checker by @tatiana, @pankajkoti and @pankajastro in #2858, #2952, and #2965
- Pin dbt Fusion and cap the fusion job runtime by @pankajastro in #2966
- Run the test suite against Astronomer Runtime alpha images by @pankajkoti and @jedcunningham in #2991, #3068, and #3035
- Add Airflow 3.4 (beta) to the test matrix by @pankajkoti in #3049
- Keep
manifest.jsonforaltered_jaffle_shopup to date in tests by @shantanutheone in #3063 - Fix a mypy
no-any-returnerror in_resolve_env_varby @tatiana in #2904 - Reduce
create_test_task_metadatacomplexity by @tatiana in #2933 - Group
github/codeql-actionupdates in a single Dependabot PR by @tatiana in #2928 - Rename the dbt Fusion CI matrix value to
2.0-dbt-fusionby @pankajastro in #3043 - Add end-to-end tests for metric views and semantic views by @tatiana in #3070
- Run Snowflake CI as
OSSUSERinOSS.COSMOS_CIwith a key pair by @tatiana in #3075 - Fix the pre-commit black failure on
mainby @tatiana in #3077 - Show the Runtime alpha tag in the
test-runtime-alpharun name and summary by @jedcunningham in #3078 - Unskip dbt-oss integration tests for dbt ls and profile schema by @pankajastro in #3083
- Run the integration tests against dbt-oss on BigQuery by @pankajastro in #3046
- Run unit tests against dbt-oss in CI by @pankajastro in #3052
- Enable and unskip more integration tests in the dbt-oss CI jobs by @pankajastro and @pankajkoti in #3090, #3093, #3097, #3098, #3100, #3102, #3106, #3107, #3110, #3114, #3115, #3116, #3118, #3120, #3121, #3122, #3125, #3126, #3127, #3128, and #3129
- Run the test workflows on
ubuntu-24.04by @pankajastro in #3134 - Dependency updates by @dependabot and @pre-commit-ci in #2854, #2856, #2866, #2872, #2882, #2894, #2897, #2898, #2899, #2907, #2909, #2911, #2912, #2915, #2916, #2919, #2922, #2923, #2924, #2929, #2934, #2937, #2941, #2943, #2946, #2949, #2951, #2954, #2955, #2958, #2963, #2971, #2973, #2974, #2975, #2984, #2985, #2987, #2989, #2994, #3002, #3009, #3010, #3012, #3013, #3014, #3017, #3019, #3020, #3026, #3028, #3029, #3032, #3033, #3039, #3053, #3054, #3056, #3057, #3064, #3065, #3066, #3067, #3074, #3079, #3085, #3086, #3094, #3131, #3141, #3143, #3164, and #3165
Milestone: Cosmos 1.16.0
Full changelog: astronomer-cosmos-v1.15.1...astronomer-cosmos-v1.16.0