Fabric Git Integration and Deployment Pipelines: Version Control, CI/CD, and Promoting Changes from Dev to UAT to Production
You have built notebooks, pipelines, dataflows, lakehouses, and warehouses in Fabric. Everything works in your development workspace. Now your manager asks: “How do we deploy this to production without breaking anything?”
Without CI/CD, the answer is terrifying: manually recreate everything in the production workspace, hope nothing is different, and pray nothing breaks. One wrong connection string, one missed notebook, one forgotten pipeline parameter — and production is down.
Git Integration and Deployment Pipelines solve this. Git Integration gives you version control — every change is tracked, reversible, and collaborative. Deployment Pipelines give you promotion — push changes from Dev to Test to Production with one click, with rules that keep environment-specific settings intact.
Think of Git Integration like Google Docs version history for your entire Fabric workspace. Every save is tracked. You can see who changed what, when, and revert to any previous version. Deployment Pipelines are like a publishing workflow — the writer drafts in a Dev document, the editor reviews in a Test document, and only approved content reaches the Published (Production) document. Same content, controlled promotion, no manual copy-paste.
Table of Contents
- Why CI/CD Matters for Fabric
- The Two Tools: Git Integration + Deployment Pipelines
- Part 1: Git Integration (Source Control)
- What Gets Tracked in Git
- Supported Git Providers
- Connecting a Workspace to Git
- Step-by-Step: Connect to Azure DevOps
- Step-by-Step: Connect to GitHub
- The Commit and Sync Workflow
- Committing Changes to Git
- Syncing Changes from Git to Workspace
- Branching Strategies
- Feature Branch Workflow
- Resolving Conflicts
- Part 2: Deployment Pipelines (Environment Promotion)
- What Is a Deployment Pipeline
- Creating a Deployment Pipeline
- Assigning Workspaces to Stages
- Deploying from Dev to Test
- Deploying from Test to Production
- Deployment Rules (Environment-Specific Settings)
- What Deployment Rules Handle
- Selective Deployment (Choose What to Deploy)
- Part 3: Putting It Together — Complete CI/CD Workflow
- The End-to-End Flow
- Scenario 1: Data Engineer Develops a New Pipeline
- Scenario 2: Hotfix in Production
- Scenario 3: Team of 5 Collaborating on a Project
- Advanced: Automating with Fabric APIs
- Git Integration vs Deployment Pipelines: When to Use Which
- The Recommended Production Setup
- Common Mistakes
- Interview Questions
- Wrapping Up
Why CI/CD Matters for Fabric
Without CI/CD
Developer builds in Dev workspace → works great!
Developer manually recreates in Prod workspace:
"Did I copy all the notebooks? I think so..."
"Wait, the connection string is different in Prod..."
"Oops, the pipeline parameter was hardcoded for Dev..."
→ Production breaks at 2 AM
→ No way to roll back
→ No record of what changed
With CI/CD
Developer builds in Dev workspace → commits to Git
(Every change tracked, reversible, auditable)
Deploy to Test workspace → test with production-like data
(One click, deployment rules swap connection strings)
Deploy to Production → one click, validated, safe
(If something breaks, roll back to previous version in Git)
The Two Tools: Git Integration + Deployment Pipelines
| Tool | Purpose | Analogy |
|---|---|---|
| Git Integration | Source control — track changes, branch, collaborate, revert | Google Docs version history |
| Deployment Pipelines | Environment promotion — move content Dev → Test → Prod | Publishing workflow (draft → review → publish) |
Fabric’s best practice: Git Integration is for source control. Deployment Pipelines are for release. Use BOTH together for a complete CI/CD workflow.
Part 1: Git Integration (Source Control)
What Gets Tracked in Git
| Fabric Item | Supported in Git? |
|---|---|
| Notebooks | ✅ Yes |
| Pipelines (Data Factory) | ✅ Yes |
| Dataflow Gen2 | ✅ Yes |
| Semantic Models (Power BI datasets) | ✅ Yes |
| Reports (Power BI) | ✅ Yes |
| Lakehouse (metadata only) | ✅ Yes |
| Warehouse (metadata only) | ✅ Yes |
| Spark Job Definitions | ✅ Yes |
| Spark Environments | ✅ Yes |
| Lakehouses/Warehouse data | ❌ No (only structure, not data) |
| Mirrored databases | ❌ No |
| Eventstreams | ❌ No |
Important: Git tracks the DEFINITIONS (code, configuration, metadata) — not the DATA. Lakehouse tables, warehouse data, and uploaded files are NOT stored in Git.
Supported Git Providers
| Provider | Status |
|---|---|
| Azure DevOps (Azure Repos) | ✅ Fully supported |
| GitHub | ✅ Fully supported |
| Bitbucket, GitLab | ❌ Not supported yet |
Connecting a Workspace to Git
Step-by-Step: Connect to Azure DevOps
- Open your Fabric workspace (e.g.,
DataEng_Dev) - Click Workspace settings (gear icon)
- Click Git integration
- Select Azure DevOps
- Configure:
- Organization: your-org (e.g.,
naveen-org) - Project: your-project (e.g.,
FabricProject) - Repository: your-repo (e.g.,
fabric-analytics) - Branch:
main(ordev) - Folder:
/or/dev-workspace(subfolder in repo) - Click Connect and sync
Fabric synchronizes the workspace items with the Git branch. Each item becomes a folder in the repository with JSON/notebook definitions.
Step-by-Step: Connect to GitHub
- Workspace settings → Git integration → GitHub
- Authenticate with your GitHub account
- Select repository → branch → folder
- Click Connect and sync
The Commit and Sync Workflow
Once connected, the Source control panel appears in your workspace:
Workspace: DataEng_Dev
┌──────────────────────────────────────────┐
│ SOURCE CONTROL │
│ │
│ Status: 3 uncommitted changes │
│ │
│ Modified: │
│ ✏️ NB_Clean_Customers (notebook) │
│ ✏️ PL_Daily_ETL (pipeline) │
│ ➕ DF_New_Dataflow (new item) │
│ │
│ [Commit] [Undo all] │
└──────────────────────────────────────────┘
Committing Changes to Git
- Click Source control in the workspace toolbar
- Review the list of changed items
- Select which changes to commit (or select all)
- Write a commit message: “Added customer cleaning dataflow and updated ETL pipeline”
- Click Commit
Changes are pushed to the connected Git branch.
Git log:
commit abc123 — "Added customer cleaning dataflow and updated ETL pipeline"
Modified: NB_Clean_Customers.notebook
Modified: PL_Daily_ETL.pipeline
Added: DF_New_Dataflow.dataflow
commit def456 — "Fixed date filter in incremental load"
Modified: NB_Incremental_Orders.notebook
commit ghi789 — "Initial workspace setup"
Added: 12 items
Syncing Changes from Git to Workspace
When someone ELSE pushes changes to the branch (or you make changes from another workspace):
- Click Source control
- Status shows: “2 updates available”
- Click Update all → changes from Git are applied to the workspace
Branching Strategies
Feature Branch Workflow (Recommended)
main (production code)
│
├── feature/add-customer-pipeline (Developer A)
│ → Create feature branch
│ → Connect a feature workspace to this branch
│ → Build and test
│ → Create Pull Request to merge into main
│ → Code review + approval
│ → Merge → main updated → Dev workspace syncs
│
└── feature/fix-date-filter (Developer B)
→ Same process, independent branch
Step by Step:
- In Azure DevOps/GitHub, create branch
feature/add-customer-pipelinefrommain - In Fabric, create a new workspace
DataEng_Feature_CustomerPipeline - Connect this workspace to the
feature/add-customer-pipelinebranch - Build and test in this workspace
- Commit changes to the feature branch
- Create a Pull Request (PR) from feature → main
- Team reviews code, approves, merges
- Delete the feature workspace
Resolving Conflicts
When two people change the same item on different branches:
Developer A changes NB_Clean_Customers on feature-A
Developer B changes NB_Clean_Customers on feature-B
Both try to merge into main:
Developer A merges first → success
Developer B merges → CONFLICT!
Resolution:
Developer B pulls latest main → resolves conflict → commits → merges
Fabric shows conflicts in the Source control panel with a Conflict indicator. Resolve by choosing the correct version.
Part 2: Deployment Pipelines (Environment Promotion)
What Is a Deployment Pipeline
A Deployment Pipeline defines 2-4 stages (typically Dev → Test → Production) and lets you promote content between stages with one click:
┌──────────┐ Deploy → ┌──────────┐ Deploy → ┌──────────┐
│ DEV │ ───────────────► │ TEST │ ───────────────► │ PROD │
│ workspace│ │ workspace│ │ workspace│
│ │ │ │ │ │
│ Build │ │ Validate │ │ Serve │
│ Iterate │ │ UAT test │ │ Stable │
│ Experiment│ │ QA check │ │ Governed │
└──────────┘ └──────────┘ └──────────┘
Creating a Deployment Pipeline
- In the Fabric portal, click Workspaces in the left sidebar
- Click Deployment pipelines (or find it under workspace settings)
- Click + New pipeline
- Name:
Analytics_Deployment - Number of stages: 3 (Dev, Test, Production)
- Click Create
Assigning Workspaces to Stages
- Open the deployment pipeline
- For each stage, click Assign a workspace:
- Dev stage: →
DataEng_Devworkspace - Test stage: →
DataEng_Testworkspace - Prod stage: →
DataEng_Prodworkspace - Each workspace now shows its items in the pipeline view
Analytics_Deployment Pipeline:
DEV (DataEng_Dev) TEST (DataEng_Test) PROD (DataEng_Prod)
├── NB_Clean_Customers ├── NB_Clean_Customers ├── NB_Clean_Customers
├── PL_Daily_ETL ├── PL_Daily_ETL ├── PL_Daily_ETL
├── DF_Clean_Orders ├── DF_Clean_Orders ├── DF_Clean_Orders
├── sales_lakehouse ├── sales_lakehouse ├── sales_lakehouse
└── sales_warehouse └── sales_warehouse └── sales_warehouse
Deploying from Dev to Test
- In the pipeline view, click Deploy between Dev and Test
- Review the items that will be deployed:
- New items (exist in Dev, not in Test) → will be CREATED
- Modified items (different version) → will be UPDATED
- Unchanged items → skipped
- Click Deploy
- Wait for deployment to complete (typically 1-5 minutes)
Deploying from Test to Production
Same process — but typically requires: – Approval from a manager/lead – Validation that Test passed QA – Deployment window (e.g., not during business hours)
Deployment Rules (Environment-Specific Settings)
The critical feature that makes deployment work: rules that change connection strings, parameters, and settings per environment.
Problem without rules:
Dev notebook connects to: dev_lakehouse
When deployed to Prod: notebook still connects to dev_lakehouse ← WRONG!
Problem solved with rules:
Deployment rule: "In Prod stage, change lakehouse connection to prod_lakehouse"
Dev → Test: lakehouse swapped to test_lakehouse
Test → Prod: lakehouse swapped to prod_lakehouse
What Deployment Rules Handle
| Rule Type | Example |
|---|---|
| Data source | Dev lakehouse → Prod lakehouse |
| Connection strings | dev-sql-server → prod-sql-server |
| Semantic model data source | Dev SQL endpoint → Prod SQL endpoint |
| Parameters | environment = “dev” → environment = “prod” |
Setting Up a Deployment Rule
- In the deployment pipeline, click the ⚙️ settings icon on the Prod stage
- Select the item to configure (e.g.,
PL_Daily_ETLpipeline) - Add rule:
- Rule type: Data source
- Source (Dev):
dev_lakehouse - Target (Prod):
prod_lakehouse - Save
Now every deployment automatically swaps the connection.
Selective Deployment (Choose What to Deploy)
You do not have to deploy EVERYTHING:
- Click Deploy between stages
- In the review dialog, UNCHECK items you do not want to deploy
- Deploy only the selected items
Use case: You updated 3 notebooks and 1 pipeline, but only the pipeline is ready for production. Deploy only the pipeline. The notebooks stay as-is in Prod.
Part 3: Putting It Together — Complete CI/CD Workflow
The End-to-End Flow
CONTINUOUS INTEGRATION (Git):
Developer creates feature branch → builds in feature workspace →
commits to Git → creates Pull Request → code review → merge to main →
Dev workspace syncs with main branch
CONTINUOUS DEPLOYMENT (Deployment Pipeline):
Dev workspace (synced with main) → Deploy to Test → QA validation →
Deploy to Production → done
Combined:
Feature branch → PR → main → Dev workspace → Deploy → Test → Deploy → Prod
Scenario 1: Data Engineer Develops a New Pipeline
Day 1:
1. Create branch: feature/daily-sales-pipeline
2. Create workspace: DataEng_Feature_Sales
3. Connect workspace to feature branch
4. Build: notebook, pipeline, dataflow
Day 2-3:
5. Test in feature workspace (run notebook, validate output)
6. Commit changes to feature branch
7. Create PR: feature/daily-sales-pipeline → main
8. Team reviews: "Looks good, approved ✅"
9. Merge PR → main branch updated
Day 3:
10. Dev workspace auto-syncs from main (new pipeline appears)
11. Test in Dev workspace with full data
12. Deploy Dev → Test via deployment pipeline
13. QA validates in Test workspace
Day 4:
14. Deploy Test → Production via deployment pipeline
15. Deployment rules swap connections to production sources
16. Pipeline is live in production 🎉
17. Delete feature workspace (cleanup)
Scenario 2: Hotfix in Production
Problem: Production notebook has a bug — wrong date filter
Fix process:
1. Create branch: hotfix/fix-date-filter from main
2. Fix the bug in a hotfix workspace connected to this branch
3. Test the fix
4. Create PR: hotfix/fix-date-filter → main (expedited review)
5. Merge → Dev workspace syncs
6. Deploy Dev → Test → Prod (fast-track deployment)
7. Bug fixed in production within hours, not days
8. Full audit trail in Git: who fixed what, when, why
Scenario 3: Team of 5 Collaborating on a Project
Team setup:
Shared workspace: DataEng_Dev (connected to main branch)
Each developer: own feature workspace + feature branch
Developer A: feature/customer-dim (building customer dimension)
Developer B: feature/product-dim (building product dimension)
Developer C: feature/sales-fact (building sales fact table)
Developer D: feature/pbi-reports (building Power BI reports)
Developer E: feature/pipeline-orchestration (building the pipeline)
Each developer:
→ Works independently in their feature workspace
→ No conflicts with other developers
→ Commits to their branch
→ Creates PR when ready
→ Merges into main after review
Main branch accumulates all approved changes.
Dev workspace reflects the latest integrated code.
Deployment pipeline promotes from Dev → Test → Prod.
Advanced: Automating with Fabric APIs
For fully automated deployments (trigger on PR merge):
# Trigger deployment programmatically via Fabric REST API
import requests
# Get auth token
token = get_fabric_token() # Azure AD authentication
# Deploy from Dev to Test stage
url = f"https://api.fabric.microsoft.com/v1/deploymentPipelines/{pipeline_id}/deploy"
headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
payload = {
"sourceStageOrder": 0, # 0 = Dev
"targetStageOrder": 1, # 1 = Test
"isBackwardDeployment": False,
"newWorkspace": False
}
response = requests.post(url, headers=headers, json=payload)
print(f"Deployment status: {response.status_code}")
Integrate with Azure DevOps / GitHub Actions: Trigger the Fabric API call on PR merge → fully automated Dev → Test deployment.
Git Integration vs Deployment Pipelines: When to Use Which
| Scenario | Tool |
|---|---|
| Track changes and revert mistakes | Git Integration |
| Collaborate on same workspace with branches | Git Integration |
| Code review before merging changes | Git Integration (Pull Requests) |
| Promote content from Dev to Test to Prod | Deployment Pipelines |
| Swap connection strings between environments | Deployment Pipelines (rules) |
| Selective deployment of specific items | Deployment Pipelines |
| Automate deployment on PR merge | Both (Git triggers API → Pipeline deploys) |
| Audit who changed what and when | Git Integration (commit history) |
Use BOTH for production: – Git Integration = source control (track, branch, collaborate, revert) – Deployment Pipelines = release management (promote, configure, deploy)
The Recommended Production Setup
Workspaces:
DataEng_Dev → Connected to Git (main branch)
DataEng_Test → NOT connected to Git (receives content via deployment pipeline)
DataEng_Prod → NOT connected to Git (receives content via deployment pipeline)
Feature workspaces (temporary):
DataEng_Feature_XYZ → Connected to Git (feature/XYZ branch)
Created per feature, deleted after merge
Git repository:
main branch → represents Dev workspace state
feature/* branches → one per developer/feature
Deployment pipeline:
Dev stage → DataEng_Dev workspace
Test stage → DataEng_Test workspace
Prod stage → DataEng_Prod workspace
Rules: swap data sources per environment
Workflow:
feature branch → PR → main → Dev syncs → Deploy → Test → Deploy → Prod
Common Mistakes
-
Not using Git at all — “I’ll just rebuild in Prod manually.” One mistake = hours of debugging. One Git commit = instant rollback. There is no excuse to skip version control.
-
Connecting ALL workspaces to Git — only Dev and feature workspaces should be Git-connected. Test and Prod should receive content ONLY through the deployment pipeline — never direct edits.
-
No deployment rules for environment-specific settings — deploying Dev notebooks to Prod without swapping connection strings means Prod reads Dev data. Always configure deployment rules.
-
Skipping the Test stage — “It works in Dev, deploy straight to Prod.” This is how production breaks. Always validate in Test with production-like data.
-
Not using feature branches — all developers committing directly to main creates chaos. Feature branches isolate work until it is ready and reviewed.
-
Forgetting that data is NOT in Git — Git tracks definitions (notebooks, pipelines). Data stays in OneLake. Deploying from Dev to Prod does not copy data — only the item definitions. Data pipelines must run in each environment separately.
-
Editing items directly in the Prod workspace — all changes should flow through the CI/CD process. Direct edits in Prod create drift between Git and the workspace.
Interview Questions
Q: How does CI/CD work in Microsoft Fabric? A: Fabric uses two complementary tools. Git Integration provides source control — connecting workspaces to Azure DevOps or GitHub for tracking changes, branching, and collaboration. Deployment Pipelines provide environment promotion — moving content from Dev to Test to Production with one click. Deployment rules handle environment-specific settings like connection strings. The recommended flow: feature branch → Pull Request → main → Dev workspace → Deploy → Test → Deploy → Prod.
Q: What is the difference between Git Integration and Deployment Pipelines? A: Git Integration is for source control — tracking every change, enabling branching, code review via Pull Requests, and rollback to previous versions. Deployment Pipelines are for release management — promoting validated content between environments (Dev, Test, Prod) with rules that swap connection strings and parameters. Use Git for collaboration and traceability. Use Deployment Pipelines for safe, controlled releases.
Q: What items are supported in Fabric Git Integration? A: Notebooks, Pipelines, Dataflow Gen2, Semantic Models, Reports, Lakehouse metadata, Warehouse metadata, Spark Job Definitions, and Spark Environments. Important: Git tracks item definitions and code, NOT data. Lakehouse tables, warehouse data, and uploaded files are not stored in Git.
Q: How do you handle environment-specific configurations (Dev vs Prod)?
A: Using Deployment Rules in the Deployment Pipeline. For each stage (Test, Prod), you configure rules that swap data sources, connection strings, and parameters. For example, a rule that changes dev_lakehouse to prod_lakehouse when deploying to the Prod stage. This ensures items work correctly in each environment without manual changes.
Q: How do you handle hotfixes in production? A: Create a hotfix branch from main, fix the issue in a temporary workspace connected to the hotfix branch, test the fix, create an expedited Pull Request, merge into main, sync to Dev workspace, then fast-track deploy through Test to Production. The full audit trail is maintained in Git — who fixed what, when, and why.
Wrapping Up
Git Integration and Deployment Pipelines transform Fabric from a development playground into a production-grade platform. Git gives you version control — every change tracked, reversible, collaborative. Deployment Pipelines give you controlled releases — Dev to Test to Prod with environment-specific rules.
The formula is simple: track everything in Git, develop in feature branches, review with Pull Requests, merge to main, and deploy through the pipeline. No manual recreation. No “works in Dev, breaks in Prod.” No 2 AM production outages from untested changes.
Related posts: – Databricks Git Integration and CI/CD – CI/CD with ARM Templates (ADF/Synapse) – Fabric Data Factory & Pipelines – Fabric Foundations: Capacity, Workspaces, Items
Naveen Vuppula is a Senior Data Engineering Consultant and app developer based in Ontario, Canada. He writes about Python, SQL, AWS, Azure, and everything data engineering at DriveDataScience.com.