Blog

Einhalten von Konventionen in dbt-Projekten mit dbt-bouncer

Pádraic Slattery

Pádraic Slattery

Aktualisiert Oktober 15, 2025
8 Minuten

dbt (data build tool) wurde in den letzten Jahren zunehmend als Werkzeug zur Transformation von Daten in Data Warehouses eingesetzt. Bei Xebia haben wir eine Vielzahl von dbt-Implementierungen und die Herausforderungen bei der Skalierung ihrer Wirkung erlebt. Unabhängig davon, ob Sie ein einzelnes dbt-Projekt oder eine Vielzahl von dbt-Projekten haben, besteht eine gemeinsame Herausforderung darin, die Konventionen beizubehalten, wenn die Zahl der Mitwirkenden an Ihrem dbt-Projekt bzw. Ihren dbt-Projekten wächst.

Die Herausforderungen des Wachstums

Stellen Sie sich das folgende Szenario vor: Sie haben ein dbt-Projekt und liefern erfolgreich wertvolle Daten an Ihre Geschäftspartner. Um diese Arbeit fortzusetzen, ist es wichtig, dass Sie neue Mitarbeiter in Ihr dbt-Projekt aufnehmen. Diese Mitarbeiter können aus Ihrem Team, einem anderen Analyseteam oder einem anderen technischen Team stammen. Unabhängig von ihrer Herkunft müssen diese Mitarbeiter mit den von Ihnen festgelegten Konventionen und Standards arbeiten und diese einhalten. Aber:

  • Werden sie ihre Staging-Modelle in Übereinstimmung mit den dbt-Empfehlungen"stg_[source]__[entity]s" nennen?
  • Woher wissen sie, dass Sie boolesche Werte für Spalten wie "is_active" und "is_deleted" bevorzugen?
  • Wie können sie sich an Benennungskonventionen wie "updated_at_utc" und "created_at_cet" anpassen?
  • Werden sie sich wohl dabei fühlen, die Pull Requests ihrer Kollegen zu genehmigen, wenn sie selbst nicht sicher sind, ob sie sich an alle Diskussionen über die bestehenden Konventionen erinnern können?

In traditionellen Softwareentwicklungsprojekten werden solche Herausforderungen mit automatisierten Werkzeugen bewältigt. Verzeichnisstrukturen fördern ein standardisiertes Dateilayout, pre-commit bietet konfigurationsbasierte Formatierung und Werkzeuge wie flake8 bieten Linting-Funktionen.

Aber was ist mit dbt?

Beibehaltung von Konventionen in einem dbt-Projekt

Die meisten Teams, die an einem dbt-Projekt arbeiten, dokumentieren ihre Konventionen. Manchmal geschieht dies in der README.md des Repositorys, manchmal in einem externen Tool wie Confluence oder Notion. Unabhängig davon, wo sie abgelegt wird, ist die Dokumentation ein hervorragender Ausgangspunkt, denn das Aufschreiben der Ergebnisse von Diskussionen ermöglicht es neuen Entwicklern, sich schnell einzuarbeiten. Aber wenn die Größe eines dbt-Projekts wächst und die Anzahl der Entwickler zunimmt, ist ein automatisierter Ansatz oft der einzige skalierbare Weg nach vorne.

In dbt Core-Projekten ist es üblich, dbt-checkpoint zu implementieren, um Konventionen zu vereinheitlichen. dbt-checkpoint enthält eine umfangreiche Palette von Pre-Commit-Hooks, die dbt-Artefakte wie manifest.json abfragen, um sicherzustellen, dass Modelle Verträge implementiert haben, alle Spalten in Quelltabellen angegeben sind und vieles mehr. Die Konfigurationsoptionen werden über eine .pre-commit-config.yaml Datei bereitgestellt, die sich im dbt-Repository befindet.

repos:
  - repo: https://github.com/dbt-checkpoint/dbt-checkpoint
    rev: v2.0.6
    hooks:
      - id: check-model-has-tests
        args: ["--test-cnt", "2", "--"]

dbt-checkpoint bietet zwar zahlreiche nützliche Hooks, ist aber durch die Tatsache eingeschränkt, dass es als Pre-Commit-Hook konzipiert ist. Dies verhindert die Ausführung der Hooks in dbt Cloud (da dbt Cloud nur dbt-Befehle ausführen kann) und macht die Entwicklung neuer Hooks zu einer schwierigen Aufgabe für diejenigen, die nicht bereits mit dem Innenleben von pre-commit vertraut sind.

Ein weiteres Tool in diesem Bereich ist dbt-project-evaluator, ein dbt-Paket von dbt Labs, das den Inhalt der Kontextvariable graph von dbt in der zugrundeliegenden Datenbank materialisiert. dbt-project-evaluator unterstützt die Empfehlungen im dbt Explorer. Dieses Paket kann über die dbt Cloud IDE ausgeführt werden, ist jedoch nicht mit allen dbt-Adaptern kompatibel (weder Fabric noch Synapse werden unterstützt). Es können Tests für Modelle, Dokumentationsabdeckung und Best Practices wie die Vermeidung von verketteten Ansichten hinzugefügt werden. Die Konfiguration dieser Tests erfolgt über Variablen, die der dbt_project.yml Datei Ihres dbt-Projekts hinzugefügt werden, und über Seeds, was manchmal zu einem unzusammenhängenden Ansatz führt, bei dem Sie nicht wissen, wo Sie nach einer bestimmten Konfigurationsoption suchen müssen.

In den letzten Monaten hat Picnic dbt-score veröffentlicht, ein Python-Paket, das manifest.json verwendet, um einzelnen Modellen und Quellen einen Score zuzuweisen. Damit ist dbt-score zwar mit jedem dbt-Adapter kompatibel, aber durch die begrenzte Anzahl von Regeln (derzeit nur 5) und die Komplexität, die für die Anwendung verschiedener Konfigurationen auf Modelle und Quellen erforderlich ist, etwas eingeschränkt.

dbt-bouncer: Ein neuer Ansatz

Die zuvor genannten Tools haben zwar Vorteile, sind aber alle auf die eine oder andere Weise begrenzt. Bei Xebia haben wir den Vorteil erkannt, die Erkenntnisse aus diesen Tools in einen Ansatz zu integrieren, der maximale Flexibilität und Benutzerfreundlichkeit bietet. Dies hat zu folgendem Ergebnis geführt dbt-bouncer, ein Python-Paket, das dabei hilft, Konventionen und Standards in dbt-Projekten einzuhalten.

dbt-bouncer führt Prüfungen gegen dbt-Artefakte durch und ist daher mit jedem dbt-Adapter kompatibel. Das bedeutet auch, dass es keine direkte Verbindung zu Ihrer Datenbank benötigt. Wie funktioniert dbt-bouncer?

Der erste Schritt besteht darin, das Python-Paket in Ihrer virtuellen Umgebung zu installieren:

pip install dbt-bouncer

Als nächstes müssen Sie eine Konfigurationsdatei für dbt-bouncer mit dem Namen dbt-bouncer.yml erstellen. Hier ist ein einfaches Beispiel für den Anfang:

manifest_checks:
  - name: check_model_directories
    include: ^models
    permitted_sub_directories:
      - intermediate
      - marts
      - staging

Mit dieser Prüfung wird sichergestellt, dass alle Ihre Modelle in einem der Unterverzeichnisse vorhanden sind, die im Schlüssel permitted_sub_directories angegeben sind.

Die Ausführung von dbt-bouncer ist so einfach wie:

dbt-bouncer

Die Ausgabe auf Ihrer Konsole zeigt an, wie viele Prüfungen durchgeführt wurden (in diesem Beispiel eine für jedes Modell im dbt-Projekt):

Running dbt-bouncer (1.5.0)...
Loaded config from dbt-bouncer-example.yml...
Validating conf...
Parsed `manifest.json`, found `dbt_bouncer_test_project` project: 1 exposures, 3 macros, 8 nodes, 1 semantic models, 3 sources, 28 tests, 2 unit tests.
Running checks...
Assembled 8 checks, running...
Running checks... |################################| 8/8
`dbt-bouncer` failed. Please see below for more details or run `dbt-bouncer` with the `-v` flag.
Failed checks:
| Check name                                      | Severity   | Failure message                                                                                       |
|-------------------------------------------------|------------|-------------------------------------------------------------------------------------------------------|
| check_model_directories:0:metricflow_time_spine | error      | AssertionError: `metricflow_time_spine` is located in `utilities`, this is not a valid sub-directory. |
Done. SUCCESS=7 WARN=0 ERROR=1

Oje! Ich habe mein Unterverzeichnis utilities vergessen. Zum Glück ist die Fehlermeldung aussagekräftig genug, um mir zu helfen, zu beurteilen, ob ich "utilities" zur Konfiguration in dbt-bouncer.yml hinzufügen oder das nicht konforme Modell genauer betrachten sollte, um zu sehen, ob es angepasst werden muss.

Welche anderen Prüfungen kann dbt-bouncer durchführen? Wie sich herausstellt, gibt es viele Prüfungen, einige Beispiele:

  • check_columns_are_all_documented stellt sicher, dass alle Spalten eines Modells in der Eigenschaftsdatei des Modells enthalten sind, was die Dokumentation verbessert.
  • check_exposure_based_on_view stellt sicher, dass Engagements nicht auf Ansichten basieren, da dies zu einer schlechten Leistung für Datenkonsumenten führen kann.
  • check_run_results_max_execution_time stellt sicher, dass jeder Knoten in der DAG von dbt vor der angegebenen Dauer abgeschlossen wird, um zu verhindern, dass Entwickler langlaufende Modelle erstellen.

Nachdem wir nun gesehen haben, wie Sie dbt-bouncer schnell einrichten und ausführen können, ist es an der Zeit, sich einige Vorteile anzusehen, die es bietet:

  • Da dbt-bouncer gegen dbt-Artefakte läuft, benötigt es keine Datenbankverbindung. Dies vereinfacht die Ausführung von dbt-bouncer in einer kontinuierlichen Integrationspipeline (CI) und gewährleistet die Kompatibilität mit allen dbt-Adaptern.
  • Läuft gegen alle dbt-Artefakte. Die Prüfungen können gegen catalog.json, manifest.json und run_results.json durchgeführt werden, d.h. die Prüfungen können auf Makros, Modelle, Laufergebnisse, Quellen und viele weitere Objekte angewendet werden.
  • dbt-bouncer ist in Python geschrieben, so dass neue Prüfungen in einer vertrauten Sprache geschrieben werden können, die gründlich getestet werden kann.
  • dbt-bouncer ist erweiterbar. Sie können Ihre eigenen Prüfungen schreiben und sie Ihrem Repository hinzufügen.
  • Ist über eine YML Datei konfigurierbar, ein Format, mit dem alle dbt-Entwickler bereits vertraut sind.
  • Enthält alle Tests, die von dbt-checkpoint, dbt-project-evaluator und dbt-score ausgeführt werden können.

Aber ist es schnell?

Wie bei jedem neuen Tool wird auch hier häufig die Frage nach der Geschwindigkeit gestellt. dbt-bouncer ist konkurrenzfähig mit ähnlichen Tools. Bei unseren Tests an einem mittelgroßen, bereits geparsten dbt-Projekt mit 250 Modellen, die mit Google BigQuery verbunden sind, haben wir bei der Überprüfung/Testung von Modellen, die nicht dokumentiert sind, die folgenden Laufzeiten festgestellt:

Dauer der Ausführung (Sekunden)
dbt-bouncer1.69
dbt-checkpoint0.49
dbt-project-evaluator21.05
dbt-score0.94

dbt-bouncer ist zwar nicht das schnellste, aber im Kontext einer CI-Pipeline (dem beabsichtigten Anwendungsfall) ist es nicht wesentlich langsamer als ähnliche Tools.

dbt-bouncer und dbt Cloud

dbt-bouncer ist ein Python-Paket und kann daher nicht über die dbt Cloud IDE ausgeführt werden. Es kann jedoch von einer CI-Pipeline aus ausgeführt werden, wenn es mit GitHub integriert ist. Verwenden Sie dazu die Aktion dbt-cloud-download-artifacts-action, um die Artefakte aus dem in dbt Cloud ausgeführten CI-Job herunterzuladen:

name: CI pipeline

on:
  pull_request:
      branches:
          - main

jobs:
    run-dbt-bouncer:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout
            uses: actions/checkout@v4

          - name: Download dbt artifacts
            uses: pgoslatara/dbt-cloud-download-artifacts-action@v1
            with:
              commit-sha: ${{ github.event.pull_request.head.sha }}
              dbt-cloud-api-token: ${{ secrets.DBT_CLOUD_API_TOKEN }}
              output-dir: target

          - name: Run dbt-bouncer
            uses: godatadriven/dbt-bouncer@v1
            env:
              GH_TOKEN: ${{ github.token }}

dbt-bouncer in einem Multiprojekt-Setup (dbt Mesh)

In einigen Organisationen werden dbt-Projekte pro Team zugewiesen, von denen einige Modelle aus anderen dbt-Projekten lesen können. Dies wird manchmal als"dbt Mesh" bezeichnet, in Anlehnung an den Begriff Data Mesh. Ein dbt Mesh wird zwar nur von dbt Cloud nativ unterstützt, kann aber auch mit dbt Core eingerichtet werden.

Eine Herausforderung in einem dbt-Mesh ist die große Anzahl von Entwicklern, die in mehreren dbt-Projekten arbeiten, was dazu führt, dass inkonsistente Konventionen implementiert werden. dbt-bouncer kann dabei helfen, diese Konventionen durch die Verwendung von projektspezifischen Konfigurationsdateien oder sogar einer gemeinsamen Konfigurationsdatei zu vereinheitlichen, mehr dazu hier.

Sollten Sie dbt-bouncer verwenden?

Ganz gleich, ob Sie ein dbt-Projekt verwalten oder viele, ob Sie dbt Core oder dbt Cloud verwenden, es ist eine nie endende Reise, sicherzustellen, dass Konventionen und bewährte Verfahren von allen Entwicklern eingehalten werden. Mit dbt-bouncer glauben wir daran, diese Reise reibungsloser und hoffentlich auch schneller zu gestalten!

Werfen Sie noch heute einen Blick auf unser GitHub-Repository, um loszulegen!


Gehören Sie zu einer Organisation, die sich mit der Implementierung von Best Practices rund um dbt beschäftigt? Unsere Berater für Analytik-Ingenieure helfen Ihnen gerne weiter - kontaktieren Sie uns einfach und wir melden uns bei Ihnen. Oder sind Sie ein Analyst, Analytiker oder Datentechniker und möchten mehr über dbt erfahren? Schauen Sie sich unseren dbt Learn Kurs in der Xebia Academy an oder werfen Sie einen Blick auf unsere Stellenangebote.

Verfasst von

Pádraic Slattery

Pádraic is a technical-minded engineer passionate about helping organizations derive business value from data. With experience in data engineering, Business Intelligence development, and data analysis, he specializes in data ingestion pipelines and DataOps.

Contact

Let’s discuss how we can support your journey.