Declarative project definitions for Microsoft Fabric
Project description
Fabric Automation Bundles
v1.0.0-beta — 30 item types verified against live Fabric API. Production-ready for core workflows. See what's tested.
Declarative project definitions for Microsoft Fabric.
Define your entire Fabric project in a single fabric.yml — lakehouses, notebooks, pipelines, semantic models, Data Agents, security roles, and environment targets — then validate, plan, and deploy with a single command.
fab-bundle init --template medallion --name my-project
fab-bundle validate
fab-bundle plan
fab-bundle deploy -t prod
CLI naming: The standalone CLI is
fab-bundle. The long-term goal is integration as afab bundlesubcommand in the Fabric CLI. Both syntaxes are shown in this documentation — use whichever applies to your installation.
The Problem
Microsoft Fabric has no single declarative project definition. The Fabric CLI can export/import items, fabric-cicd can deploy across workspaces, and Terraform can provision infrastructure — but none of them describe:
- What resources your project needs (lakehouses, notebooks, pipelines, semantic models, Data Agents)
- How those resources depend on each other
- How configuration varies across environments (dev/staging/prod)
- What security roles and permissions are required
- How to deploy everything in the correct order
Fabric Automation Bundles fills that gap.
Quick Start
Install
pip install fabric-automation-bundles
Create a New Project
# Medallion lakehouse architecture (bronze/silver/gold)
fab-bundle init --template medallion --name my-analytics
# OSDU + Fabric for Oil, Gas & Energy
fab-bundle init --template osdu_analytics --name my-osdu-project
Or Generate from an Existing Workspace
fab-bundle generate --workspace "My Existing Workspace"
This scans the workspace and produces a fabric.yml you can customize — the fastest on-ramp for existing projects.
Validate
fab-bundle validate
Validates all resource references, dependency chains, and target configurations.
Plan (Dry-Run)
fab-bundle plan -t dev
Shows exactly what would change:
Deployment Plan: my-analytics
Target: dev
Workspace: my-analytics-dev
+ bronze-lakehouse Lakehouse create New resource
+ silver-lakehouse Lakehouse create New resource
+ gold-lakehouse Lakehouse create New resource
+ spark-env Environment create New resource
+ etl-bronze Notebook create New resource
+ etl-silver Notebook create New resource
+ daily-refresh DataPipeline create New resource
~ analytics-model SemanticModel update Definition updated
Summary: 7 to create, 1 to update
Deploy
fab-bundle deploy -t dev # Deploy to dev (default)
fab-bundle deploy -t staging # Deploy to staging
fab-bundle deploy -t prod -y # Deploy to prod (skip confirmation)
Destroy
fab-bundle destroy -t dev # Tear down dev environment
The fabric.yml Format
bundle:
name: my-analytics
version: "1.0.0"
workspace:
capacity_id: "your-fabric-capacity-guid"
resources:
environments:
spark-env:
runtime: "1.3"
libraries: [semantic-link-labs]
lakehouses:
bronze:
description: "Raw data landing zone"
gold:
description: "Business-ready datasets"
notebooks:
etl-pipeline:
path: ./notebooks/etl.py
environment: spark-env
default_lakehouse: bronze
pipelines:
daily-refresh:
schedule:
cron: "0 6 * * *"
timezone: America/Chicago
activities:
- notebook: etl-pipeline
semantic_models:
analytics-model:
path: ./semantic_model/
default_lakehouse: gold
reports:
dashboard:
path: ./reports/dashboard/
semantic_model: analytics-model
data_agents:
my-agent:
sources: [gold]
instructions: ./agent/instructions.md
few_shot_examples: ./agent/examples.yaml
security:
roles:
- name: engineers
entra_group: sg-data-eng
workspace_role: contributor
- name: analysts
entra_group: sg-analysts
workspace_role: viewer
targets:
dev:
default: true
workspace:
name: my-analytics-dev
capacity_id: "your-dev-capacity-guid"
prod:
workspace:
name: my-analytics-prod
run_as:
service_principal: sp-fabric-prod
How It Works
Dependency Resolution
Fabric Automation Bundles automatically determines deployment order using topological sorting. You never have to think about what goes first:
environments → lakehouses → notebooks → pipelines
→ warehouses
→ semantic_models → reports
→ data_agents
Variable Substitution
Use ${var.name} in any string value:
variables:
adme_endpoint:
description: "ADME endpoint"
default: "https://dev.energy.azure.com"
targets:
prod:
variables:
adme_endpoint: "https://prod.energy.azure.com"
Include Files
Split large bundles across multiple files:
include:
- resources/notebooks.yml
- resources/pipelines.yml
- security.yml
Developer Workflow & CI/CD Architecture
flowchart TB
subgraph local["🖥️ Local Development"]
A["Author fabric.yml\n+ notebooks, SQL, etc."] --> B["fab-bundle validate"]
B --> C["fab-bundle plan -t dev"]
C --> D["fab-bundle deploy -t dev"]
D --> E["fab-bundle drift"]
E -.->|"iterate"| A
D --> F["git commit + push"]
end
subgraph cicd["⚙️ CI/CD Pipeline"]
G["PR Opened"] --> H["fab-bundle validate"]
H --> I["fab-bundle plan -t staging"]
I --> J{Merge to main}
J --> K["fab-bundle deploy -t staging -y"]
K --> L{Approval Gate}
L --> M["fab-bundle deploy -t prod -y"]
end
subgraph fabric["☁️ Microsoft Fabric"]
direction LR
DEV["Dev Workspace\n─────────────\nLakehouses\nNotebooks\nPipelines\nWarehouses\nSemantic Models\nReports\nData Agents"]
STG["Staging Workspace\n─────────────\nLakehouses\nNotebooks\nPipelines\nWarehouses\nSemantic Models\nReports\nData Agents"]
PRD["Prod Workspace\n─────────────\nLakehouses\nNotebooks\nPipelines\nWarehouses\nSemantic Models\nReports\nData Agents"]
end
F --> G
D -.->|"Fabric REST API"| DEV
K -.->|"Service Principal"| STG
M -.->|"Service Principal"| PRD
style local fill:#1a1a2e,stroke:#16213e,color:#e0e0e0
style cicd fill:#0f3460,stroke:#16213e,color:#e0e0e0
style fabric fill:#533483,stroke:#16213e,color:#e0e0e0
style DEV fill:#2d6a4f,stroke:#1b4332,color:#e0e0e0
style STG fill:#e9c46a,stroke:#f4a261,color:#1a1a2e
style PRD fill:#e76f51,stroke:#f4a261,color:#1a1a2e
How fab-bundle fits in the pipeline
| Stage | Command | What happens |
|---|---|---|
| Local dev | fab-bundle validate |
Schema validation, reference checks, dependency resolution |
| Local dev | fab-bundle plan -t dev |
Connects to Fabric, diffs desired vs actual state |
| Local dev | fab-bundle deploy -t dev |
Creates/updates resources in dev workspace |
| Local dev | fab-bundle drift |
Detects out-of-band changes made in the portal |
| PR check | fab-bundle validate |
Gate: blocks merge if bundle is invalid |
| PR check | fab-bundle plan -t staging |
Informational: shows what the merge will change |
| CI deploy | fab-bundle deploy -t staging -y |
Auto-deploys on merge, service principal auth |
| CI deploy | fab-bundle deploy -t prod -y |
Deploys after manual approval gate |
GitHub Actions
Copy cicd/github-actions.yml to .github/workflows/fabric-bundle.yml:
- name: Deploy to Fabric
run: |
pip install fabric-automation-bundles
fab-bundle deploy -t prod -y
env:
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
Azure DevOps
Copy cicd/azure-devops.yml to your repo as a YAML pipeline — includes validate, staging, and production stages with approval gates.
CLI Reference
| Command | Description |
|---|---|
fab-bundle init |
Create a new project from a template |
fab-bundle validate |
Validate the bundle definition |
fab-bundle plan |
Preview changes (dry-run) |
fab-bundle deploy |
Deploy to a target workspace |
fab-bundle destroy |
Tear down bundle resources |
fab-bundle generate |
Generate fabric.yml from existing workspace |
fab-bundle run <resource> |
Run a notebook or pipeline |
fab-bundle list |
List available templates |
fab-bundle bind |
Bind an existing workspace item |
fab-bundle drift |
Detect drift between deployed state and live workspace |
Common Flags
| Flag | Description |
|---|---|
-f, --file |
Path to fabric.yml (default: auto-detect) |
-t, --target |
Target environment (dev, staging, prod) |
-y, --auto-approve |
Skip confirmation prompts |
--dry-run |
Preview without making changes |
Templates
medallion
Bronze/Silver/Gold lakehouse architecture with:
- Three lakehouses with ETL notebooks
- Data pipeline with dependency chaining
- Semantic model and dashboard
- Data Agent with few-shot examples
- Security roles for engineers and analysts
- Dev/Staging/Prod targets
osdu_analytics
OSDU on Fabric for Oil, Gas & Energy:
- ADME integration with OSDU Search API ingestion
- Well/Wellbore/Production entity flattening
- SQL views for BI (well master, production trends, field rollups)
- Data Agent with petroleum engineering context
- Industry-specific few-shot examples (GOR, water cut, decline analysis)
- ADME connection config per environment
Custom Templates
Create your own templates by adding a directory to fab_bundle/templates/ with a template.yml and a fabric.yml.
Supported Resource Types
45 item types across all Fabric workloads:
| Category | Types |
|---|---|
| Data Engineering | Lakehouse, Notebook, Environment, SparkJobDefinition, GraphQLApi, SnowflakeDatabase |
| Data Factory | DataPipeline, CopyJob, MountedDataFactory, ApacheAirflowJob, dbt Job |
| Data Warehouse | Warehouse, SQLDatabase, MirroredDatabase, MirroredWarehouse, MirroredDatabricksCatalog, CosmosDB, Datamart |
| Power BI | SemanticModel, Report, PaginatedReport, Dashboard, Dataflow |
| Data Science | MLModel, MLExperiment |
| Real-Time Intelligence | Eventhouse, Eventstream, KQLDatabase, KQLDashboard, KQLQueryset, Reflex, DigitalTwinBuilder, DigitalTwinBuilderFlow, EventSchemaSet, GraphQuerySet |
| AI & Knowledge | DataAgent, OperationsAgent, AnomalyDetector, Ontology |
| Other | VariableLibrary, UserDataFunction, Graph, GraphModel, Map, HLSCohort |
Plus OneLake Shortcuts (ADLS, S3, cross-workspace) as lakehouse sub-resources.
See the Resource Types Guide for full details.
Authentication
Fabric Automation Bundles uses azure-identity for authentication:
# Interactive (development)
az login
fab-bundle deploy -t dev
# Service Principal (CI/CD)
export AZURE_TENANT_ID=...
export AZURE_CLIENT_ID=...
export AZURE_CLIENT_SECRET=...
fab-bundle deploy -t prod -y
VS Code Integration
Get autocomplete and validation for fabric.yml by adding a .vscode/settings.json:
{
"yaml.schemas": {
"./fabric.schema.json": "fabric.yml"
}
}
Requires the YAML extension.
Architecture
fab_bundle/
├── cli.py # Click CLI (init, validate, plan, deploy, destroy, generate, run, drift)
├── models/
│ └── bundle.py # 30+ Pydantic models for fabric.yml schema
├── engine/
│ ├── loader.py # YAML parser with includes + variable substitution
│ ├── resolver.py # Topological dependency sort
│ ├── planner.py # Diff engine (desired state vs workspace state)
│ ├── deployer.py # Executes plans via Fabric REST API
│ ├── state.py # Deployment state tracking + drift detection
│ └── secrets.py # Secrets resolution (env vars + Azure KeyVault)
├── providers/
│ └── fabric_api.py # Fabric REST API client (workspace, items, git, connections, jobs)
├── generators/
│ ├── reverse.py # Generate fabric.yml from existing workspace
│ └── templates.py # Template engine with Jinja2
└── templates/
├── medallion/ # Bronze/Silver/Gold template
└── osdu_analytics/ # OSDU + Fabric for OGE
Contributing
Contributions welcome. See CONTRIBUTING.md for details.
git clone https://github.com/dereknguyenio/fabric-automation-bundles.git
cd fabric-automation-bundles
pip install -e ".[dev]"
pytest
Tested Item Types
30 item types verified against a live Fabric workspace:
| Status | Item Types |
|---|---|
| Verified (30) | Lakehouse, Notebook, DataPipeline, Warehouse, Environment, DataAgent, Eventhouse, KQLDatabase, KQLDashboard, KQLQueryset, Eventstream, Reflex, MLModel, MLExperiment, SparkJobDefinition, GraphQLApi, CopyJob, ApacheAirflowJob, Ontology, VariableLibrary, SQLDatabase, CosmosDBDatabase, MirroredAzureDatabricksCatalog, OperationsAgent, AnomalyDetector, DigitalTwinBuilder, GraphQuerySet, GraphModel, Map, UserDataFunction |
| Capacity-gated (4) | DataBuildToolJob, Graph, HLSCohort, EventSchemaSet |
| Needs config (2) | SnowflakeDatabase, DigitalTwinBuilderFlow |
| List-only (5) | Datamart, Dashboard, MirroredWarehouse, PaginatedReport, Dataflow |
| Needs definition files (4) | SemanticModel (TMDL), Report (PBIR), MirroredDatabase, MountedDataFactory |
Feature Stability
| Feature | Status | Notes |
|---|---|---|
| validate, plan, deploy, destroy | Stable | Tested end-to-end against live API |
| drift, status, diff, history, doctor | Stable | Tested against live workspaces |
| run (notebooks/pipelines) | Stable | Job submission works, LRO tracking limited |
| Security roles (workspace) | Stable | Entra user/group GUIDs |
| Incremental deploy (hash-based) | Stable | Skips unchanged resources |
| Deployment locking | Stable | Local + remote (blob lease) |
| CI/CD (GitHub Actions) | Stable | Proven end-to-end |
| Remote state (OneLake, Blob, ADLS) | Beta | Built, not yet tested live |
| MCP server | Beta | 12 tools verified locally |
| OneLake data access roles | Beta | Built, not yet tested live |
| Environment publish (libraries) | Beta | Fire-and-forget, can't track completion |
| watch, promote, canary | Experimental | Built, untested |
| Notifications (Slack/Teams) | Experimental | Built, untested |
| Policy enforcement | Experimental | Built, untested |
| Shortcut transformations | Experimental | Model defined, API untested |
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fabric_automation_bundles-1.0.0b1.tar.gz.
File metadata
- Download URL: fabric_automation_bundles-1.0.0b1.tar.gz
- Upload date:
- Size: 92.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c1b771f84ca3864f56a28a581d3d39cbc4ff7894bde14acd699110c1b35cd7af
|
|
| MD5 |
2323ac7a8c9d529da70b49cee914b9d1
|
|
| BLAKE2b-256 |
b8ef80a01ac95126f729ed401c2329201c5c4d204c8da2e8cf54956ebe1154c4
|
File details
Details for the file fabric_automation_bundles-1.0.0b1-py3-none-any.whl.
File metadata
- Download URL: fabric_automation_bundles-1.0.0b1-py3-none-any.whl
- Upload date:
- Size: 87.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f0342648c58ce5ff72eb3a3d4672f77ba590bd126cc32625f13a79fa16ef49b0
|
|
| MD5 |
e9a7424bb4b5f702a39e900bf53763b7
|
|
| BLAKE2b-256 |
6503e46b7474c92cf2696922d5509691a0d88da367b4e8a6d9d4136b35fb844b
|