Skip to content

Fix failing dbt-fusion tests when run in parallel in CI#1896

Merged
tatiana merged 10 commits into
mainfrom
fix-dbt-fusion
Aug 4, 2025
Merged

Fix failing dbt-fusion tests when run in parallel in CI#1896
tatiana merged 10 commits into
mainfrom
fix-dbt-fusion

Conversation

@pankajkoti
Copy link
Copy Markdown
Contributor

@pankajkoti pankajkoti commented Jul 30, 2025

Problem

The dbt Fusion integration tests were experiencing resource conflicts when multiple matrix jobs ran in parallel against the same Snowflake schema. All jobs were attempting to create and operate on tables/views with identical names (e.g., customers, orders, stg_payments), leading to:

  • Race conditions between parallel jobs
  • dbt test failures due to duplicate records

Initial attempt to resolve:

As described in issue #1887, I attempted to specify a separate schema in the environment variable to uniquely identify the PR, and matrix entry. However, since such schemas don't pre-exist in our database, when dbt tries to create them, we encounter failures because the Snowflake CI account does not have the necessary permissions to create schemas.

Working solution proposed in the PR:

Instead of creating separate schemas, this PR implements resource-level isolation within a shared schema:

  1. Unique Resource Prefixes: Each matrix job gets a unique prefix like COSMOS_<PR_IDENTIFIER>_PY311_AF210_DBT20_
  2. Custom dbt Macro: Added generate_alias_name macro that prefixes all table/view names when RESOURCE_PREFIX is set (this is set for CI jobs)
  3. Safe Environment Handling: Uses GitHub Actions step outputs instead of $GITHUB_ENV (one of the initial attempts to export RESOURCE_PREFIX and make it available for subsequent steps in the CI jobs) to avoid security issues flagged by Zizmor
  4. Automatic Cleanup: Added a cleanup step (calling a Python script) that removes all objects created by each job after completion, as otherwise it would just keep on populating a huge number of tables and views for each PR * matrix entry in the database.

Successful job run: https://github.com/astronomer/astronomer-cosmos/actions/runs/16622909325

And a specific dbt fusion tests job example: https://github.com/astronomer/astronomer-cosmos/actions/runs/16622909325/job/47031551362?pr=1896

closes: #1887

@netlify
Copy link
Copy Markdown

netlify Bot commented Jul 30, 2025

Deploy Preview for sunny-pastelito-5ecb04 canceled.

Name Link
🔨 Latest commit 624e5f5
🔍 Latest deploy log https://app.netlify.com/projects/sunny-pastelito-5ecb04/deploys/6890dd7d7867730008632535

@codecov
Copy link
Copy Markdown

codecov Bot commented Jul 30, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.06%. Comparing base (c9fb4ab) to head (4bda381).

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #1896   +/-   ##
=======================================
  Coverage   98.06%   98.06%           
=======================================
  Files          85       85           
  Lines        5312     5312           
=======================================
  Hits         5209     5209           
  Misses        103      103           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Comment thread .github/workflows/test.yml Fixed
Comment thread .github/workflows/test.yml Outdated
@pankajkoti pankajkoti changed the title Try fixing dbt fusion tests Fix failing dbt-fusion tests when run in parallel in CI Jul 30, 2025
@pankajkoti pankajkoti marked this pull request as ready for review July 30, 2025 12:12
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR fixes failing dbt-fusion tests when run in parallel in CI by implementing resource-level isolation to prevent race conditions. Instead of creating separate schemas, it uses unique prefixes for table/view names within a shared schema.

  • Implements unique resource prefixes per matrix job to avoid naming conflicts
  • Adds a custom dbt macro to automatically prefix table/view names when RESOURCE_PREFIX is set
  • Includes automatic cleanup of Snowflake resources after each job completion

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 5 comments.

File Description
.github/workflows/test.yml Adds resource prefix generation and cleanup steps for dbt-fusion tests
dev/dags/dbt/jaffle_shop/macros/generate_alias_name.sql Custom dbt macro to prefix table/view names with RESOURCE_PREFIX
scripts/ci_dbtf_delete_snowflake_resources.py Python script to clean up Snowflake resources with matching prefix
tests/dbt/test_graph.py Updates expected hash values for test assertions

Comment thread .github/workflows/test.yml Outdated
Comment thread scripts/ci_dbtf_delete_snowflake_resources.py Outdated
Comment thread scripts/ci_dbtf_delete_snowflake_resources.py Outdated
Comment thread scripts/ci_dbtf_delete_snowflake_resources.py Outdated
Comment thread scripts/ci_dbtf_delete_snowflake_resources.py Outdated
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Copy link
Copy Markdown
Collaborator

@tatiana tatiana left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks great, @pankajkoti , I really liked the approach and implementation. This will make our dbt Fusion tests more robust and less flaky.

Co-authored-by: Pankaj Koti <pankajkoti699@gmail.com>
@tatiana tatiana merged commit c0cf312 into main Aug 4, 2025
90 of 91 checks passed
@tatiana tatiana deleted the fix-dbt-fusion branch August 4, 2025 16:20
@tatiana tatiana mentioned this pull request Aug 8, 2025
@tatiana tatiana mentioned this pull request Oct 7, 2025
@tatiana tatiana added this to the Cosmos 1.11.0 milestone Oct 28, 2025
tatiana added a commit that referenced this pull request Oct 29, 2025
**Features**

* Introduce ``ExecutionMode.WATCHER`` to reduce DAG run time by 1/5 in
several PRs. Learn more about it
[here](https://astronomer.github.io/astronomer-cosmos/getting_started/watcher-execution-mode.html#watcher-execution-mode).
This feature was implemented via multiple PRs, including:
* Expose new execution mode by @tatiana @pankajastro @pankajkoti in
#1999
* Add ``DbtProducerWatcherOperator`` for the proposed
``ExecutionMode.WATCHER`` by @pankajkoti in #1982
* Add ``DbtConsumerWatcherSensor`` for the proposed
``ExecutionMode.WATCHER`` by @pankajastro in #1998
* Push producer's task completion status to XCOM by @pankajkoti in #2000
* Add default priority_weight for ``DbtProducerWatcherOperator`` by
@pankajkoti in #1995
* Add sample dbt events for the dbt watcher execution mode by
@pankajkoti in #1952
* Add ``compiled_sql`` as a template fields on
```ExecutionMode.WATCHER``` when using ``run_results.json`` by
@pankajastro in #2070
* Set ``push_run_results_to_xcom`` kwargs correctly for invocation mode
subprocess and Watcher mode by @pankajastro in #2067
* Store compiled SQL as template field for dbt callback events in
``ExecutionMode.WATCHER`` by @pankajkoti in #2068
* Add initial documentation for ``ExecutionMode.WATCHER`` by @tatiana in
#2046
* Support running ``State.UPSTREAM_FAILED`` tasks when WATCHER consumer
upstream tasks fail by @tatiana in #2062
* Fail sensor tasks immediately if the ``ExecutionMode.WATCHER``
producer task fails by @pankajastro in #2040
  * Add ``WATCHER``` to GitHub issue template by @tatiana in #2056
* Add support for ``TestBehavior.AFTER_ALL`` with
``ExecutionMode.WATCHER`` by @pankajastro in #2049
* Add support for ``TestBehavior.NONE`` with ``ExecutionMode.WATCHER``
by @pankajastro in #2047
* Fix ``ExecutionMode.WATCHER`` behaviour with ``DbtTaskGroup`` by
@tatiana in #2044
* Fix Cosmos behaviour when using watcher with
``InvocationMode.DBT_RUNNER`` by @tatiana in #2048

* Add Airflow 3 plugin for dbt docs with multiple dbt projects support
by @pankajkoti in #2009, check the
[documentation](https://astronomer.github.io/astronomer-cosmos/configuration/hosting-docs.html).
* Initial support to ``dbt Fusion`` by @tatiana in #1803. More details
[here](https://astronomer.github.io/astronomer-cosmos/configuration/dbt-fusion).
* Support to prune sources without downstream references in dbt projects
by @corsettigyg in #1988
* Allow to set task display name as a user-defined function by
@corsettigyg in #1761
* Add dbt project's hash to dag docs to support dag versioning in
Airflow 3 by @pankajkoti in #1907
* feat: Add Jinja templating support for ``dbt_cmd_flags`` by
@skillicinski in #1899
* Add Scarf metric to collect the execution mode uses by @pankajastro in
#1981
* Support Airflow 3.1 by @tatiana in #1980
* Add MySQL profile mapping by @Lee2532 in #1977
* Add sqlserver profile mapping by @pankajastro in #1737

**Enhancement**

* Use XCom to store sql when using ``ExecutionMode.AIRFLOW_ASYNC`` by
@pankajastro in #1934
* Refactor ``AIRFLOW_ASYNC`` teardown so it doesn't install the
virtualenv by @pankajastro in #1938
* Reuse the virtual env for ``AIRFLOW_ASYNC`` setup task by @pankajastro
in #1939
* Improve dataset/asset experience in Cosmos by @tatiana in #2030
* Add ``downstreams`` to ``DbtNode`` by @wornjs in #2028

**Bug fixes**

* Fix tags extraction by @ms32035 in #1915
* Fix task flow operator args by @anyapriya in #2024

**Documentation**

* Add documentation for Airflow 3 Plugin supporting dbt docs for
multiple dbt projects by @pankajkoti in #2063
* Add Cosmos Deferrable Operator Guide by @pankajastro in #1922
* Add dbt Fusion documentation by @tatiana in #1824 #1830
* Update dbt-fusion.rst to explicitly highlight it is in alpha by
@tatiana in #1838
* Fix a bunch of docs build errors and warnings by @pankajkoti in
#1886
* Add docs note for param virtualenv_dir for async execution mode by
@pankajastro in #1969
* Use pepy.tech downloads badge in README by @pankajkoti in #1920
* Correct the default value of ``cache_dir`` by @seokyun.ha in #2027

**Others**

* Promote @corsettigyg to committer by @tatiana in #1985
* Add @pankajkoti and @pankajastro to ``contributors.rst`` by @tatiana
in #1983
* Update setup script for airflow3 script by @dwreeves in #2023
* Prevent pytest from trying to test classes that aren't actually tests
by @anyapriya in #2032
* Fix ``dag.test()`` for Airflow 3.1+ by syncing DAG to database bby
@kaxil in #2037
* Disable Scarf in CI by @pankajastro in #2016
* Fix failing dbt Fusion tests when run in parallel in CI by @pankajkoti
in #1896
* Fix MyPy issues related to ``ObjectStoragePath`` in main branch by
@tatiana in #2012
* Cleanup example dbt event JSON dictionaries kept for XCOM referencby
@pankajkoti in #1997
* Bump min hatch version that includes fixes for click>=8.3.0 by
@pankajkoti in #1996
* Use official postgres image from Docker hub for kubernetes setup by
@pankajkoti in #1986
* Use click<8.3.0 for hatch as click 8.3 breaks hatch by @pankajkoti in
#1987
* Pin Airflow version in type check CI job by @pankajastro in #2003
* Improve comments after feedback on #1948 by @tatiana in #1963
* Fix running tests with dbt Fusion 2.0.0 preview versions by @tatiana
in #1948
* Test hardening of dbt node having tags as unset or missing by
@pankajkoti in #1918
* Fix Sphinx issue in the main branch by @tatiana in #2064
* pre-commit autoupdate in #2065, #2043, #2033, #2019, #1990, #2019,
#2008, #1941, #1935, #1924
* GitHub dependabot update in #2051, #2050, #2038, #2022, #1947, #1955,
#1946, #1944, #1945, #1928, #1921, #1917


Co-authored-by: Pankaj Koti <pankaj.koti@astronomer.io>
Co-authored-by: Pankaj Singh <pankaj.singh@astronomer.io>
Co-authored-by: Pankaj Koti <pankajkoti699@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Run dbt fusion tests in CI with separate schemas for each matrix entry (also isolate per PR if feasible)

4 participants