Skip to content
LakeBench
ProblemsCommunityPricing
Sign inStart practicing
Back
  1. Home
  2. Interview prep
  3. CI/CD for DAGs

Airflow & DAGs · Operating Airflow in Production

CI/CD for DAGs

Mediumairflow-63
cicdtestingdag-integritygit-syncdeployment

Question

How do you deploy DAG changes safely?

Solution

Deploying DAGs to production requires automated CI/CD testing pipelines that catch parsing errors, cyclic dependencies, and missing configurations before code reaches live schedulers.

The three testing layers in CI

Automated validation should run on every pull request:

  • Code formatting and static analysis: Run linters like Ruff or Flake8 to enforce style standards and detect anti-patterns, such as top-level database queries or Variable.get() calls in DAG scope.
  • DAG integrity testing: A fast pytest suite that loads all DAGs into an in-memory DagBag to verify that files parse cleanly without syntax errors or broken dependencies:
import pytest
from airflow.models import DagBag

def test_dag_integrity():
    dagbag = DagBag(dag_folder="dags/", include_examples=False)
    # Fails CI if any DAG has a syntax error or failed import
    assert len(dagbag.import_errors) == 0, f"DAG import errors: {dagbag.import_errors}"
    
    for dag_id, dag in dagbag.dags.items():
        # Assert no circular dependencies exist
        assert len(dag.roots) > 0, f"DAG {dag_id} has no root tasks"
        # Enforce team governance standards
        assert dag.default_args.get("retries", 0) >= 1, f"{dag_id} missing retries"
        assert dag.tags, f"{dag_id} must declare tags for cataloging"

Additional testing layers:

  • Unit testing custom task logic: Test custom operators, Python callables, and SQL generators with mock databases using pytest fixtures.

Deployment strategies

Avoid manually editing or copying Python files directly on production servers. Use automated delivery mechanisms:

  • Git-Sync sidecar: On Kubernetes, a sidecar container continuously syncs DAG files from a release branch in GitHub or GitLab to a shared persistent volume mounted on scheduler and worker pods.
  • Container image bake: Bake DAG files directly into the Airflow container image during Docker builds. This guarantees immutable releases where workers and schedulers always share identical code.
  • Airflow 3 DAG bundles: Distribute DAG bundles directly from Git repositories or object storage with built-in version tracking.

Always pin provider package versions (like apache-airflow-providers-snowflake==5.6.0) in requirements.txt to prevent automated worker rebuilds from pulling breaking provider changes into production.

PreviousNext