DataPartner365

Jouw partner voor datagedreven groei en inzichten

CI/CD Best Practices voor Data Engineers

Gepubliceerd: 28 december 2025
Leestijd: ±11 minuten
Data Engineering · DevOps · CI/CD

Hoe richt je een robuuste CI/CD-pijplijn in voor data engineering? Van geautomatiseerde tests op Spark-code tot blue/green deployments voor Databricks-pipelines: alles wat je nodig hebt om data als software te behandelen.

Inhoudsopgave
  1. Waarom CI/CD voor data engineering?
  2. De fundamenten van een data CI/CD pipeline
  3. Testen in data pipelines
  4. CI/CD met GitHub Actions
  5. CI/CD met Azure DevOps
  6. Deployment strategies
  7. CI/CD voor Databricks
  8. Monitoring na deployment
  9. Best practices samengevat
  10. Conclusie

Waarom CI/CD voor data engineering?

Data engineers bouwen complexe systemen: pipelines die data transformeren, valideren en klaarmaken voor analyse. Toch wordt code in veel data teams nog steeds handmatig gedeployed — een notebook kopiëren naar productie, een script rechtstreeks aanpassen op de server, of een stored procedure deployen via een SQL client. Dit leidt tot fouten, inconsistentie tussen omgevingen en nachtmerrie-scenario's waarbij niemand meer weet welke versie in productie staat.

Continuous Integration en Continuous Delivery (CI/CD) lost dit op door het deploymentproces te automatiseren en te standaardiseren. Net als softwareontwikkelaars al jaren doen, kunnen data engineers hun pipeline-code behandelen als eersterangsburger: versiebeheer, geautomatiseerde tests, code reviews en gecontroleerde deployments.

De voordelen zijn concreet:

De fundamenten van een data CI/CD pipeline

Een goede CI/CD pipeline voor data engineering bestaat uit een aantal bouwblokken die je op de juiste manier aan elkaar schakelt:

1. Versiebeheer als vertrekpunt

Alles — pipeline-code, SQL-transformaties, configuratiebestanden, infrastructure as code — leeft in een Git-repository. Niet in een SharePoint, niet op een netwerkschijf, niet als notebook-export via e-mail. Git is de single source of truth. Gebruik een branching-strategie die past bij je team: GitFlow voor grote teams met aparte release-branches, of trunk-based development voor kleine, snel-itererende teams.

2. Omgevingen scheiden

Minimaal drie omgevingen: development (lokaal of een dev-workspace), staging/test (productie-achtig, maar met beperkte data) en productie. Code stroomt altijd van links naar rechts — nooit direct naar productie zonder door test te gaan. Dit klinkt vanzelfsprekend, maar in de praktijk wordt het in data-teams regelmatig overgeslagen vanwege tijdsdruk.

3. Pipeline-as-code

Definieer je CI/CD pipeline zelf als code (YAML-bestanden in GitHub Actions of Azure DevOps). Dit betekent dat ook de pipeline zelf versiebeheer heeft, gereviewed kan worden en reproduceerbaar is.

4. Secrets management

Wachtwoorden, API-keys en verbindingsstrings horen nooit in je code. Gebruik GitHub Secrets, Azure Key Vault, of HashiCorp Vault. Injecteer secrets als omgevingsvariabelen tijdens de pipeline-run, nooit hardcoded in bestanden.

Testen in data pipelines

Testen is het hart van CI/CD. Voor data engineering onderscheiden we meerdere soorten tests, elk met een eigen doel en uitvoeringstijdstip in de pipeline.

Unit tests

Unit tests valideren de kleinste eenheid van je code: een functie, een transformatie, een helper-klasse. Voor PySpark-code gebruik je pytest in combinatie met een lokale Spark-sessie of de chispa library die DataFrames vergelijkt. Een unit test voor een transformatiefunctie ziet er zo uit:

from chispa.dataframe_comparer import assert_df_equality
from pyspark.sql import SparkSession
from mypackage.transformations import clean_customer_data

def test_clean_customer_data(spark: SparkSession):
    input_df = spark.createDataFrame([
        (1, "  Jan de Vries  ", "jan@example.com"),
        (2, None, "pia@example.com"),
    ], ["id", "naam", "email"])

    expected_df = spark.createDataFrame([
        (1, "Jan de Vries", "jan@example.com"),
    ], ["id", "naam", "email"])

    result = clean_customer_data(input_df)
    assert_df_equality(result, expected_df, ignore_row_order=True)

Integratietests

Integratietests controleren of componenten correct samenwerken: leest de pipeline correct uit de bron, schrijft ze naar de juiste doeltabel, worden de juiste transformaties toegepast? Deze tests draaien op de staging-omgeving en gebruiken een representatieve subset van echte data.

Data quality tests

Data quality tests valideren de inhoud van de data zelf: zijn er geen nullwaarden in verplichte kolommen, liggen getallen binnen verwachte grenzen, zijn datumvelden valide? Tools als Great Expectations en dbt tests zijn hiervoor ontworpen. In een CI/CD context run je deze tests automatisch na elke deployment op de staging-omgeving.

Schema tests

Schema tests controleren of de structuur van je data niet onverwacht veranderd is. Een kolom die plotseling verdwijnt of van datatype wisselt, kan downstream dashboards en ML-modellen breken. Leg schema's vast en valideer ze bij elke pipeline-run.

CI/CD met GitHub Actions

GitHub Actions is een populaire keuze voor data teams die hun code al op GitHub bewaren. Het is gratis voor publieke repositories en relatief goedkoop voor private repos. Een basis workflow voor een Python data engineering project:

# .github/workflows/ci.yml
name: Data Pipeline CI

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install dependencies
        run: |
          pip install -r requirements.txt
          pip install pytest chispa great-expectations

      - name: Run linting
        run: |
          pip install ruff
          ruff check src/

      - name: Run unit tests
        run: pytest tests/unit/ -v --tb=short

      - name: Run integration tests
        env:
          AZURE_STORAGE_ACCOUNT: ${{ secrets.AZURE_STORAGE_ACCOUNT }}
          AZURE_STORAGE_KEY: ${{ secrets.AZURE_STORAGE_KEY }}
        run: pytest tests/integration/ -v --tb=short

Voor deployments naar Databricks kun je de Databricks CLI gebruiken in je GitHub Actions workflow. Na succesvolle tests op main-branch wordt de code automatisch gedeployed naar de productie-workspace.

Pull Request checks

Koppel je CI workflow aan branch protection rules: een pull request kan alleen gemerged worden als alle checks slagen. Dit dwingt code review en geautomatiseerde tests af voor elke wijziging. Voeg ook een code coverage minimum toe (bijv. 70%) zodat de testdekking niet sluipenderwijs daalt.

CI/CD met Azure DevOps

Azure DevOps Pipelines is de go-to keuze voor organisaties die al in het Microsoft-ecosysteem zitten. Het integreert naadloos met Azure services (Key Vault, Container Registry, Databricks) en biedt uitgebreide mogelijkheden voor enterprise-grade deployments.

Een Azure DevOps pipeline bestaat uit stages, jobs en steps. Een typische pipeline voor een Databricks data project:

De manual approval gate tussen test en productie is een essentieel veiligheidsmechanisme: automatisch deployen naar productie alleen als een persoon dit expliciet goedkeurt. Zo combineer je de snelheid van automatisering met menselijke controle op het kritieke moment.

Variable groups en Key Vault integratie

Azure DevOps Variable Groups laten je omgevingsspecifieke variabelen (verbindingsstrings, workspace URLs) centraal beheren en per pipeline-stage injecteren. Koppel een Variable Group aan Azure Key Vault zodat secrets automatisch worden opgehaald — zonder dat engineers toegang nodig hebben tot de eigenlijke waarden.

Deployment strategies

Hoe je nieuwe versies van je data pipeline uitrolt naar productie, bepaalt hoeveel risico je loopt bij een slechte deployment.

Blue/Green deployment

Houd twee identieke productie-omgevingen bij: "blue" (huidig actief) en "green" (nieuw). Nadat de nieuwe versie succesvol in green is gedeployed en getest, switch je het verkeer over naar green. Als er problemen zijn, switch je terug naar blue. Voor Databricks Workflows betekent dit: deploy de nieuwe versie als een nieuwe job, test deze, en schakel dan de oude job uit.

Canary releases

Bij canary releases stuur je een klein percentage van het "verkeer" (bijv. een subset van de te verwerken data) naar de nieuwe versie en monitor je het resultaat. Als de kwaliteitsmetrieken goed zijn, vergroot je het percentage geleidelijk. Dit is complexer te implementeren maar geeft maximale controle bij risicovolle wijzigingen.

Feature flags

Feature flags laten je nieuwe functionaliteit deployen zonder het meteen te activeren. Via een configuratievariabele kun je de nieuwe code aan- of uitzetten zonder opnieuw te deployen. Handig als je een grote refactoring wil voorbereiden terwijl de huidige code in productie blijft draaien.

CI/CD voor Databricks

Databricks heeft zijn eigen uitdagingen voor CI/CD, vooral rond notebooks. Notebooks zijn populair voor exploratief werk maar lastig te versionen en testen. De aanbevolen aanpak:

  1. Productie-code in Python-modules: schrijf herbruikbare transformaties als functies in een Python-pakket (src/ directory), niet als notebook-cells. Notebooks mogen deze functies aanroepen maar bevatten zelf geen logica.
  2. Databricks Asset Bundles (DAB): gebruik de officiële Databricks CI/CD tool. Met DAB definieer je jobs, clusters, notebooks en permissies als YAML-bestanden in je repo en deploy je met één commando naar elke omgeving.
  3. Unity Catalog: gebruik Unity Catalog voor access control op data, zodat een fout in een deployment geen data-security risico oplevert.

Een minimale Databricks Asset Bundle configuratie:

# databricks.yml
bundle:
  name: mijn_data_pipeline

targets:
  dev:
    mode: development
    workspace:
      host: https://adb-xxx.azuredatabricks.net
  prod:
    mode: production
    workspace:
      host: https://adb-yyy.azuredatabricks.net

resources:
  jobs:
    dagelijkse_verwerking:
      name: "Dagelijkse Klantdata Verwerking"
      tasks:
        - task_key: bronze_ingestie
          python_wheel_task:
            package_name: mijn_pipeline
            entry_point: run_bronze
          new_cluster:
            spark_version: "14.3.x-scala2.12"
            node_type_id: Standard_DS3_v2
            num_workers: 2

Monitoring na deployment

Een deployment is pas succesvol als de pipeline ook daadwerkelijk correct draait in productie. Stel monitoring in op:

Koppel alerts aan je monitoring: een Slack-bericht of Teams-notificatie als een pipeline langer dan X minuten duurt, als de foutdrempel overschreden wordt, of als data niet binnen de verwachte window binnenkomt. Zo weet je altijd als er iets mis is — voor de business het merkt.

Best practices samengevat

Categorie Best practice
Code Schrijf testbare code: geen notebooks in productie, logica in Python-modules
Testing Unit tests, integratietests én data quality tests — minimaal 70% code coverage
Secrets Nooit credentials in code: gebruik Key Vault of GitHub Secrets
Omgevingen Dev → Test → Productie: code gaat altijd via test voor naar productie te gaan
Deployment Manual approval gate voor productie, automatisch terugdraaien bij fouten
Monitoring Alerts op runtime, foutpercentage en data freshness na elke deployment

Conclusie

CI/CD is geen luxe voor data teams — het is een noodzaak zodra je data pipelines kritisch zijn voor de business. Het opzetten kost initieel tijd, maar de investering verdient zich terug in minder productie-incidenten, snellere releases en een team dat met vertrouwen kan deployen.

Begin klein: voeg linting en unit tests toe aan je bestaande project, stel een eenvoudige GitHub Actions workflow in, en bouw vanaf daar. Perfecte CI/CD op dag één bestaat niet — het is een groeipad. De sleutel is beginnen en geleidelijk verbeteren.

Voor teams die werken met Databricks is de combinatie van Databricks Asset Bundles, pytest en Azure DevOps of GitHub Actions momenteel de meest volwassen en breed gedragen aanpak. Investeer in deze toolchain en je hebt een fundament dat jaren meegaat.

CI/CD voor jouw data team opzetten?

DataPartner365 helpt data teams met het implementeren van professionele CI/CD workflows voor data pipelines en Databricks.

Contact opnemen Onze diensten
Abdullah Özisik - Data Engineer

Over de auteur

Abdullah Özisik — Data Engineer met specialisatie in cloud-native data architectuur, AI-integratie en MLOps. Expert in het ontwerpen van schaalbare Lakehouse platforms op Azure en Databricks voor Nederlandse organisaties.

Azure Data Platform Architectuur Alle blogs Claude vs ChatGPT: Welke AI Tool is Beter in …