clement13.net
Original photo: Falaise de roches sédimentaires empilées en couches successives, chaque strate conservant une période.
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
Original photo, unretouched. The background is a version of it stylised by the site.

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…

Guide≈ 6 min readPartly checkedPartial checkThe main facts were checked by searching the cited sources. The items below still need checking before relying on them.To re-check
  • Statut exact (disponibilité générale) de PBIP/PBIR confirmé uniquement par la doc Learn (plus de mention de préversion) et une source tierce, pas par l'annonce officielle (403).
Written with AI assistance; sources are cited at the bottom of the page. An error? Report it via clement13.net.
Reading
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: .pbix files 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.
⚠️ Pitfall

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.
💡 Expert tip

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.

✅ Good practice

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
🧪 Example

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#

🤖 AI

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#

✻ Written by Claude Sonnet 5.5