Datenkontrakte in der Praxis
Fortschritt
0%
ende
Los geht’s
  • Willkommen15′
  • Setup20′
Teil A · Das Quell-Datenprodukt
  • 1.Daten unter Vertrag nehmen60′
  • 2.Evolution von Datenkontrakten30′
  • 3.Datenprodukt beschreiben20′
Teil B · Das Consumer-Aligned Data Product
  • 4.Contract-first entwerfen30′
  • 5.Datenprodukt implementieren25′
  • 6.Consumer-driven Contracts30′
Teil C · Automatisieren
  • 7.CI/CD mit GitHub Actions45′
Teil D · Datenplattformoptional
  • 8.Auf Entropy Data veröffentlichen40′
  • 9.Semantik25′
Abschluss
  • Abschluss10′
Teil D · Datenplattformoptional

Übung 8 · Auf Entropy Data veröffentlichen

Deine Datenprodukte auf einer Datenproduktplattform auffindbar machen.

~40 Min.0 von 8 Schritten erledigt
Zurück
CI/CD mit GitHub Actions
Weiter
Semantik
Gepflegt vonEntropy Data

YAML-Dateien in Git reichen für ein einzelnes Team. Aber wie finden andere Teams deine Datenprodukte, lesen die Kontrakte und beantragen Zugriff? Dafür gibt es eine Datenproduktplattform. In dieser Übung veröffentlichst du alles aus Teil A und B mit der Entropy Data CLI auf Entropy Data.

Das lernst du
  • Die Entropy Data CLI mit einer Cloud-Organisation oder einer lokalen Community Edition verbinden
  • Teams, Datenkontrakte und Datenprodukte veröffentlichen
  • Die Abhängigkeit zwischen zwei Datenprodukten als Access Agreement abbilden
  • Testergebnisse veröffentlichen, um zu zeigen, ob ein Kontrakt eingehalten wird
Optionaler Teil

Teil D ist optional und nutzt eine kommerzielle Plattform mit kostenlosem Einstieg. Die kostenlose Community Edition läuft komplett lokal. Alles bisher Gebaute funktioniert auch ohne.

Zugang einrichten

Organisation anlegen

Wähle eine Option.

Option 1: Cloud. Geh auf app.entropy-data.com, leg ein Konto an und erstelle eine Organisation namens tutorial-<deinname>, z. B. tutorial-simon. Namen sind plattformweit eindeutig. Erlaubt sind Kleinbuchstaben, Ziffern und Bindestriche. Erstelle in den Organisationseinstellungen einen API Key mit Schreibrechten für die Organisation.

Option 2: Community Edition, lokal. Starte sie in Docker und führe das Setup-Skript aus. Es legt ein Konto, eine Organisation namens acme und einen API Key an:

docker compose -f entropy-data-ce/docker-compose.yaml up -d
./scripts/setup-entropy-data-ce.sh
…
Creating account [email protected] ...
Logging in ...
Creating organization acme ...
Creating organization API key ...
Writing ENTROPY_DATA_API_KEY and ENTROPY_DATA_HOST to .env ...

Done. Log in at http://localhost:8081 with [email protected] / workshop (organization: acme)
Verify the CLI connection with: entropy-data connection test

Melde dich unter http://localhost:8081 mit [email protected] / workshop an. Wo unten tutorial-<deinname> steht, nimmst du acme.

Verbindung konfigurieren

Das Install-Skript aus dem Setup hat die Entropy Data CLI schon installiert. Prüfe es:

entropy-data --version
entropy-data 0.3.13

Cloud: Setz deinen API Key als Umgebungsvariable in deinem Terminal:

export ENTROPY_DATA_API_KEY=ed_...
export ENTROPY_DATA_HOST=https://api.entropy-data.com
Committe niemals deinen API Key

Dein Fork ist öffentlich, und .env ist in Git getrackt. Alles, was du dort pushst, kann jeder sehen, und es bleibt in der Historie. Setz den Key deshalb in deiner Shell. Shell-Variablen haben Vorrang vor den Platzhaltern in .env. Wiederhole diese Zeilen in jedem neuen Terminal.

Community Edition: Das Setup-Skript hat den Key und ENTROPY_DATA_HOST=http://localhost:8081 in .env geschrieben. Halte ihn trotzdem aus Git heraus: Prüfe vor jedem Commit git status und mach die Änderung mit git checkout .env rückgängig. Führe nie git add .env aus.

Teste die Verbindung:

entropy-data connection test
Connection successful.

Veröffentlichen

Teams anlegen

Kontrakte und Datenprodukte nennen ein Team als Owner. Das Team muss existieren, bevor du etwas veröffentlichst, das darauf verweist:

cat <<EOF | entropy-data teams put order_data_team --file -
id: order_data_team
name: Order Data Team
type: team
description: Owns the orders data
EOF

cat <<EOF | entropy-data teams put purchasing_analytics_team --file -
id: purchasing_analytics_team
name: Purchasing Analytics Team
type: team
description: Builds analytical data products for purchasing
EOF

entropy-data teams list
Team 'order_data_team' saved.
Team 'purchasing_analytics_team' saved.
                                   teams (page 0)
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━┓
┃ ID                        ┃ Name                      ┃ Type             ┃ Parent ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━┩
│ governance-group          │ Governance Group          │ Governance Group │        │
│ platform-team             │ Platform Team             │ Platform Team    │        │
│ order_data_team           │ Order Data Team           │ team             │        │
│ purchasing_analytics_team │ Purchasing Analytics Team │ team             │        │
└───────────────────────────┴───────────────────────────┴──────────────────┴────────┘

Der team.name in deinen ODCS- und ODPS-Dateien muss der Team-ID entsprechen, z. B. order_data_team.

Datenkontrakte veröffentlichen

Das ID-Argument muss dem Feld id im jeweiligen Kontrakt entsprechen:

entropy-data datacontracts put orders_v1 --file orders_v1.odcs.yaml
entropy-data datacontracts put orders_v2 --file orders_v2.odcs.yaml
entropy-data datacontracts put sku_sales_per_year --file sku_sales_per_year.odcs.yaml
entropy-data datacontracts put orders_v2_consumer_sku_sales --file orders_v2.consumer_sku_sales.odcs.yaml

entropy-data datacontracts list
Data contract 'orders_v1' saved.
Open https://app.entropy-data.com/tutorial-simon/datacontracts/orders_v1
Data contract 'orders_v2' saved.
Open https://app.entropy-data.com/tutorial-simon/datacontracts/orders_v2
Data contract 'sku_sales_per_year' saved.
Open https://app.entropy-data.com/tutorial-simon/datacontracts/sku_sales_per_year
Data contract 'orders_v2_consumer_sku_sales' saved.
Open https://app.entropy-data.com/tutorial-simon/datacontracts/orders_v2_consumer_sku_sales
                                  datacontracts (page 0)
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ ID                           ┃ Title              ┃ Version ┃ Owner                     ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ orders_v1                    │ Orders             │ 1.0.0   │ order_data_team           │
│ orders_v2                    │ Orders             │ 2.0.0   │ order_data_team           │
│ sku_sales_per_year           │ SKU Sales per Year │ 1.0.0   │ purchasing_analytics_team │
│ orders_v2_consumer_sku_sales │ Orders (SKU Sales) │ 2.0.0   │ purchasing_analytics_team │
└──────────────────────────────┴────────────────────┴─────────┴───────────────────────────┘
Datenprodukte veröffentlichen

Entropy Data unterstützt ODPS nativ, du veröffentlichst die Dateien also unverändert. Das ID-Argument muss dem Feld id in der Datei entsprechen:

entropy-data dataproducts put orders --file orders.odps.yaml
entropy-data dataproducts put sku_sales --file sku_sales_per_year.odps.yaml

entropy-data dataproducts list
Data product 'orders' saved.
Data product 'sku_sales' saved.
                    dataproducts (page 0)
┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ ID        ┃ Title     ┃ Status ┃ Owner                     ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ orders    │ Orders    │ active │ order_data_team           │
│ sku_sales │ SKU Sales │ draft  │ purchasing_analytics_team │
└───────────┴───────────┴────────┴───────────────────────────┘
Workaround

Wegen eines aktuellen Bugs in Entropy Data schlägt das Veröffentlichen fehl, wenn die ODPS-Datei inputPorts enthält. Entferne den Abschnitt inputPorts aus sku_sales_per_year.odps.yaml direkt vor dem Veröffentlichen. Der nächste Schritt bildet die Abhängigkeit anders ab.

Alternative: die Data Product CLI

dataproduct publish prüft die Datei gegen das ODPS-Schema und veröffentlicht sie in einem Schritt. Sie liest ENTROPY_DATA_API_KEY und ENTROPY_DATA_HOST genauso und nimmt die ID aus der Datei:

dataproduct publish orders.odps.yaml
✅ Published data product successfully
Datenprodukte verbinden

Auf der Plattform ist die Abhängigkeit ein Access Agreement: SKU Sales konsumiert den Output-Port orders_v2 von Orders. Leg es direkt genehmigt an:

cat <<EOF | entropy-data access put sku_sales_consumes_orders --file -
dataUsageAgreementSpecification: 0.0.1
id: sku_sales_consumes_orders
info:
  purpose: SKU Sales aggregates orders and line items per SKU and year for the purchasing team
  status: approved
  startDate: "2026-01-01"
provider:
  dataProductId: orders
  outputPortId: orders_v2
  dataContractId: orders_v2
consumer:
  dataProductId: sku_sales
EOF
Access agreement 'sku_sales_consumes_orders' saved.

Mit Status approved und einem startDate in der Vergangenheit ist das Agreement aktiv.

Warum ein Access Agreement?

Ein Input-Port sagt: „Ich lese diese Daten.“ Ein Access Agreement ergänzt: „…und der Owner hat das für diesen Zweck genehmigt.“ So kennt der Owner von Orders alle Konsumenten und kann sie vor Änderungen warnen.

Erkunden

Plattform erkunden

Öffne die Weboberfläche (app.entropy-data.com oder localhost:8081):

  • Finde deine beiden Datenprodukte und ihre Output-Ports.
  • Öffne den Kontrakt sku_sales_per_year und vergleiche ihn mit dem Data Contract Editor.
  • Folge dem Access Agreement von SKU Sales zu Orders. Die Abhängigkeit aus Contract-first entwerfen ist jetzt ein Link in der Datenproduktkarte.
  • Wie würde jemand ein Datenprodukt über SKUs finden, ohne zu wissen, dass es existiert?

Die Liste der Datenprodukte: Orders mit zwei Output-Ports, SKU Sales mit einem

SKU Sales konsumiert Orders: das Access Agreement als Link in der Datenproduktkarte

Testergebnisse veröffentlichen

Die Plattform zeigt, ob ein Kontrakt aktuell eingehalten wird, wenn du ihr Testergebnisse schickst. Führe deine Tests mit --publish und dem Test-Results-Endpunkt deines Hosts aus:

Cloud:

datacontract test sku_sales_per_year.odcs.yaml --publish https://api.entropy-data.com/api/test-results
Testing sku_sales_per_year.odcs.yaml
🚀 Open https://app.entropy-data.com/tutorial-simon/datacontracts/sku_sales_per_year/servers/postgres/checks
Server: postgres (type=postgres, host=localhost, port=5433, database=workshop, schema=analytics)
╭────────┬──────────────────────────────────────────────────┬─────────────┬─────────╮
│ Result │ Check                                            │ Field       │ Details │
├────────┼──────────────────────────────────────────────────┼─────────────┼─────────┤
│ passed │ Ensure the view has data                         │             │         │
│ passed │ Check that field 'order_count' is present        │ order_count │         │
│ …      │                                                  │             │         │
│ passed │ Ensure year is plausible                         │ year        │         │
╰────────┴──────────────────────────────────────────────────┴─────────────┴─────────╯
🟢 data contract is valid. Run 15 checks. Took 0.58 seconds.

Community Edition:

datacontract test sku_sales_per_year.odcs.yaml --publish http://localhost:8081/api/test-results

Die CLI schickt deinen API Key nur mit, wenn die URL zum Host in ENTROPY_DATA_HOST gehört. Die Ergebnisse findest du auf der Seite des Kontrakts.

Die Seite des Kontrakts mit den veröffentlichten Testergebnissen unter Data Quality

Kurzer Check
Wohin gehört der Entropy Data API Key, wenn du in einem öffentlichen Fork arbeitest?

Bonus

  • Testergebnisse aus der CI veröffentlichen. Geh in deinem Fork auf GitHub zu Settings → Secrets and variables → Actions und leg ein Repository Secret ENTROPY_DATA_API_KEY an. Gib es im Workflow aus CI/CD mit GitHub Actions an den Test-Schritt weiter und ergänze --publish:

    YAML
    - name: Test data contracts
      env:
        ENTROPY_DATA_API_KEY: ${{ secrets.ENTROPY_DATA_API_KEY }}
        ENTROPY_DATA_HOST: https://api.entropy-data.com
      run: datacontract ci *.odcs.yaml --publish https://api.entropy-data.com/api/test-results

    Das geht nur mit der Cloud: Die Runner von GitHub erreichen deine lokale Community Edition nicht.

  • Git bleibt die Quelle der Wahrheit. Schau dir entropy-data datacontracts import-from-git --help an. Wie würdest du Kontrakte bei jedem Merge auf main automatisch veröffentlichen?