

- Description
- Falaise de roches sédimentaires empilées en couches successives, chaque strate conservant une période.
- Source
- DimiTalen · original page
- Licence
- CC0 Public domain
Version Control and Industrialization of Reports
This topic assesses how a BI product is stored, reviewed, merged, deployed, and restored: Power BI Project (PBIP) projects with TMDL (model) and PBIR (report) definitions, Git or TFVC…
In brief
This topic assesses how a BI product is stored, reviewed, merged, deployed, and restored: Power BI Project (PBIP) projects with TMDL (model) and PBIR (report) definitions, Git or TFVC, change review, dev/test/prod environments, deployment pipelines, parameter rules, XMLA/TMDL scripts, rollback. For source control principles, see Source Control for Data: SQL and Power BI.
On this page
Level: 🟢→🔴 · Theme code: IND
1. Why this topic#
A .pbix is a compressed binary: impossible to compare, merge, or review line by line. Two people editing the same .pbix step on each other, and one loses their work. The PBIP format (first in preview, now stabilized; to be verified depending on the feature) breaks the product into text files: *.SemanticModel/definition/*.tmdl (tables, measures, relationships, roles, cultures) and *.Report/definition/ (pages, visuals in PBIR JSON format). Text can be versioned, diffed, reviewed, merged. Without this, there is no code review, no history, no reproducible deployment.
2. What this topic measures#
- Axis: from shared file to continuous delivery pipeline with rollback.
- Key indicators: share of BI artifacts versioned in text format; deployment frequency; rollback lead time; share of reviewed changes; deployment failure rate.
- Units: %, deployments/month, minutes.
3. The 5 levels#
| Level | Short name | Promise | Typical indicator (order of magnitude) |
|---|---|---|---|
| 1 | Shared file | The report exists somewhere; yesterday's copy can be found if you're lucky. | .pbix on share; “v2_final” versions |
| 2 | File repository | Any delivered version can be retrieved, with who changed it and when. | .pbix in repository; commit messages |
| 3 | Text project | Two developers work in parallel on the same model and merge without loss. | PBIP/TMDL in Git or TFVC; change review |
| 4 | Pipeline | A validated change reaches production through the same path every time, with no manual handling. | Dev → Test → Prod; parameter rules; 0 manual publishing |
| 5 | Continuous | Deployment is a non-event: frequent, verified, reversible in minutes. | ≥ 1 deployment/week; rollback < 15 min |
4. Milestones by level#
| ID | Milestone | Verifiable evidence |
|---|---|---|
| BI-IND-1.1 | The production report is identified and its owner is known | Report sheet |
| BI-IND-1.2 | A backup of the production version exists | Dated copy |
| BI-IND-1.3 | Publishing is done to an identified workspace (not “My workspace”) | Team workspace |
| BI-IND-2.1 | Files are in a source control repository (Git or TFVC) | Repository with history |
| BI-IND-2.2 | Commit messages reference a work item | WI ↔ changeset/commit link |
| BI-IND-2.3 | File and version naming convention | Documented rule |
| BI-IND-2.4 | Large or binary files have a strategy (cache excluded, .gitignore/.tfignore) |
Exclusion file |
| BI-IND-3.1 | The model is in TMDL, the report in PBIR; .pbix is no longer the source |
.SemanticModel/.Report folders in repository |
| BI-IND-3.2 | Change review (pull request or changeset review) is mandatory | Review history |
| BI-IND-3.3 | Branches or merge strategy defined for the model | Strategy document (Branching Strategies) |
| BI-IND-3.4 | TMDL merge conflicts are manageable (readable diff) | Documented successful merge |
| BI-IND-3.5 | Local cache and personal settings excluded from repository | Up-to-date exclusion files |
| BI-IND-4.1 | Separate dev/test/prod environments (distinct workspaces or capacities) | Environment map |
| BI-IND-4.2 | A deployment pipeline (service or CI) moves artifacts from one environment to another | Deployment history |
| BI-IND-4.3 | Parameter rules (server, database, ID) by environment; no manual changes after deployment | Rules in place |
| BI-IND-4.4 | Tests (TST) run before promotion | Test stage in pipeline |
| BI-IND-4.5 | Promotion rights separated from development rights | Distinct roles |
| BI-IND-5.1 | Deployment automatically triggered by validated merge | CI/CD pipeline |
| BI-IND-5.2 | Rollback tested: restore version N−1 in < 15 min | Documented exercise |
| BI-IND-5.3 | Related artifacts (SQL kits, models, reports) are deployed together with verified compatibility | Compatibility matrix |
| BI-IND-5.4 | Release notes generated from history | Published notes |
5. Detailed reading by level#
🟢 Level 1 — Shared file#
- Signs:
Report_v3_final_OK.pbix, publishing from the author's machine, no idea what changed. - Difficulty: 1/5 · Effort: 1/5.
🟢 Level 2 — File repository#
- Signs:
.pbixfiles are in Git (or TFVC) with history; the repo grows (binary not delta-compressible), diff is impossible. - Benefit: traceability, rollback to a version.
- Limit: no in-depth review, no merge.
- Difficulty: 2/5 · Effort: 2/5.
Symptom: the TFVC/Git repository grows by 50 MB with each .pbix commit. Cause: binary fully stored at each version. Fix: move to PBIP text format; exclude cache.abf, localSettings.json, and the .pbi/ folder from local files.
🟡 Level 3 — Text project#
Typical PBIP structure:
Rapport Ventes.pbip
Rapport Ventes.SemanticModel/
definition/
model.tmdl
tables/FACT_VISITE.tmdl
relationships.tmdl
roles/Perimetre.tmdl
cultures/en-US.tmdl
Rapport Ventes.Report/
definition/
pages/pages.json
pages/<id>/visuals/<id>/visual.json
- Signs: a measure diff is read like code; two developers work on two tables; review is done on TMDL. TMDL has strict formatting rules (indentation, only one key column per table): a syntax validator before opening prevents project corruption.
- Benefit: parallelism, review, fine-grained history.
- Limit: merging report JSON files (PBIR) is still more delicate; visual identifiers are GUIDs.
- Difficulty: 3/5 · Effort: 3/5.
In centralized source control (TFVC), locking or exclusive checkout of a report file avoids risky JSON merges; in Git, prefer short branches and a responsibility area per page.
BOM and line endings matter: TMDL files written by the Power BI tool are saved without BOM; don't “fix” them, the tool rewrites them at each save. Document encoding by file type in the repository.
🟡 Level 4 — Pipeline#
- Signs: three workspaces (or three capacities); a deployment pipeline from the Power BI service, or a CI pipeline that publishes through APIs/command-line tools (Tabular Editor CLI,
fabric-cicd, REST API — tools to verify by version). Parameters change by environment via rules, not manually. - Benefit: reproducibility.
- Limit: not all objects deploy the same way (some sources, gateways, rights still require configuration); possible drift between environments.
- Difficulty: 4/5 · Effort: 4/5.
# Pipeline outline (logical steps, tool-independent)
stages:
- validate: # TMDL syntax, BPA, measure tests on the test model
- deploy_test: # publish to the Test workspace with parameter rules
- smoke_test: # reference DAX queries, refresh
- approve: # human validation (business)
- deploy_prod
SFA thread: a report linked to the datamart is delivered with an SQL kit. The report version requires a minimum datamart version. The compatibility matrix (report X.Y ↔ datamart ≥ X.Y.Z) is verified by a test that reads the datamart version before promotion.
🔴 Level 5 — Continuous#
- Signs: validated merge → automatic deployment to Test → prod promotion after tests and approval; rollback rehearsed; generated release notes.
- Benefit: deliver often, small, safely (see CI/CD: Continuous Integration and Continuous Delivery and CI/CD for data: foundations, datamarts, pipelines, and reports).
- Limit: a model change (schema) is not reversible like a report change (e.g., column deletion, lineage loss); rollback requires an upward-compatibility strategy.
- Difficulty: 5/5 · Effort: 5/5.
Assistants generate plausible YAML pipelines but without knowing your environments, rights, and gateways; they also write syntactically invalid TMDL. Validate with a syntax checker before opening.
6. Partial achievement and rating#
Common rule. “A partial 5”: automatic deployment exists for the model, but not for reports (BI-IND-5.1 = 0.5); rollback never rehearsed (5.2 = 0); compatibility between kits verified manually (5.3 = 0.5); release notes written manually (5.4 = 0.5).
7. Moving to the next level#
Possible means (optional):
| Transition | Possible levers |
|---|---|
| 1 → 2 | Repository, conventions, team workspace |
| 2 → 3 | PBIP/TMDL/PBIR migration; mandatory review; syntax validators |
| 3 → 4 | Deployment pipeline; parameter rules; rights separation |
| 4 → 5 | Full CI/CD; rollback test; compatibility matrix; generated notes |
Pitfalls:
- False positive: “everything is in Git” but deployment still goes through manual publishing from Desktop.
- Goodhart: counting deployments encourages low-value micro-deployments; also measure failure rate and rollback lead time.
- Renaming a published object breaks connected reports: model delivery is a contract (MOD, DAX).
- Overwriting a colleague's work: without readable merge, last save wins.
8. See also#
- Related topics: TST · MOD · GOV · OPS
- Other matrices: DL — Version Control and Branches · DL — Deployment and Operations · PD — Lead Time and DataOps
- Content: Git In Depth · TFVC In Depth · Source Control for Data: SQL and Power BI · CI/CD · Azure DevOps Server (ex-TFS) in Depth
✻ Written by Claude Sonnet 5.5