The Power BI Fellowship
Tools · Guide

Ship Power BI like software

PBIX vs PBIP, the PBIP folder, TMDL, Git, branches, pull requests and code review, deployment pipelines, Dev/Test/Prod, parameters and rules, rollback, hotfixes and CI/CD with fabric-cicd, with starter files to download.

Senior BI DeveloperBI EngineerBI Architect / LeadGitVS CodeDeployment pipelinesfabric-cicdChecked 2 Oct 2026
On this page (11)

Why treat a report like software

A PBIX file on a shared drive has no history, no review and no safe way for two people to work on it. When something breaks in Production, nobody can say what changed. Software teams solved this decades ago with source control, review, automated checks and repeatable deployments. Power BI now supports all of them.

PBIX vs PBIP

PBIXPBIP (Power BI project)
FormatOne binary fileA folder of text files
Diff and reviewNoYes: every measure and visual change is a readable diff
Two people at onceLast save winsMerge in Git
DataStored in the fileNot committed (cache stays local)
Best forPersonal analysis, sharing a one-offAnything a team maintains

Save as PBIP from Desktop: File → Save as → Power BI project (.pbip).

Inside a PBIP project

TMDL (Tabular Model Definition Language) is the model as readable text. A measure looks like this:

text
measure 'Net Sales' =
        SUMX ( FactSales, FactSales[Quantity] * FactSales[UnitPrice] * ( 1 - FactSales[Discount] ) )
    formatString: \$#,0.00
    displayFolder: Sales

PBIR, the default report format for new projects, stores each page and visual as its own JSON file, so two people editing different pages don't conflict.

Git fundamentals for BI developers

bash
git clone https://github.com/<your-org>/sales-bi.git
git switch -c feature/BI-1103-revenue-measure   # one branch per ticket
# open Sales.pbip in Desktop, change, save, close Desktop
git status                                      # what changed
git diff                                        # how it changed
git add Sales.SemanticModel
git commit -m "BI-1103: certified Revenue excludes returns and test orders"
git push -u origin feature/BI-1103-revenue-measure

Download the .gitignore for PBIP so per-user files and data caches never reach the repository, and the branching guide.

Branches, pull requests and code review

Practise reviewing in the pull request drill and resolving conflicts in Sprint 06.

Dev, Test and Prod

StageWho uses itData
DevelopmentDevelopersDev or a small sample
TestTesters and business UATProduction-like (masked if sensitive)
ProductionEveryone elseProduction

The same content must point at different sources in each stage. Use parameters in Power Query for server and database names, and:

Deployment pipelines

Fabric deployment pipelines copy content between workspaces assigned to stages, compare stages, and apply rules. Good habits:

  1. Deploy to Test, run the checks, get sign-off, then deploy to Production.
  2. Set rules once per stage and check them after every new data source.
  3. After deploying, open one known number in the target stage. Sprint 07 is what happens when nobody does.
  4. Use the deployment checklist.

CI/CD

With PBIP in Git, a pipeline can deploy what was merged, so Production always matches main. Microsoft's documented route is fabric-cicd, a Microsoft-backed open-source Python library:

  1. pip install fabric-cicd.
  2. A deployment script builds a FabricWorkspace for the target workspace and environment and calls publish_all_items.
  3. parameter.yml swaps environment-specific values (servers, lakehouse IDs) at deploy time.
  4. A GitHub Actions workflow maps the branch to the workspace, signs in as a service principal and runs the script. Azure DevOps works the same way.

Prerequisites: a service principal with Contributor on the target workspaces, the tenant setting that allows service principals to call Fabric public APIs, and data source credentials configured once in the Service after the first deployment.

Add checks before deploy: Best Practice Analyzer rules, a test that the model loads, and tests that query known numbers (see refresh tests and regression).

Release notes

Users should never discover a change by noticing a number moved. Every Production release gets release notes: what changed for users, any number that will differ and why, and who to ask.

Rollback

Rollback must be boring:

Hotfixes

When Production is wrong now:

  1. Mitigate first: roll back, or hide the broken page and tell users.
  2. Branch hotfix/INC-… from main, make the smallest fix, get a fast review from one other person, deploy through the pipeline.
  3. Merge the hotfix back into dev so it isn't lost in the next release.
  4. Write the postmortem.

The hotfix or rollback drill practises the decision.

Something missing or out of date? Open an issue or edit content/toolkit/guides/ship-like-software.md.