{"id":293,"date":"2026-01-13T17:07:51","date_gmt":"2026-01-13T16:07:51","guid":{"rendered":"https:\/\/dataguide.tech\/?p=293"},"modified":"2026-01-13T21:42:25","modified_gmt":"2026-01-13T20:42:25","slug":"microsoft-fabric-ci-cd-made-simple-organizing-workspaces-and-collaboration","status":"publish","type":"post","link":"https:\/\/dataguide.tech\/index.php\/2026\/01\/13\/microsoft-fabric-ci-cd-made-simple-organizing-workspaces-and-collaboration\/","title":{"rendered":"Microsoft Fabric CI\/CD Made Simple: Organizing Workspaces and Collaboration"},"content":{"rendered":"\n<p>If you&#8217;ve ever worked on building or releasing data solutions, you&#8217;ve probably run into the usual suspects: long release cycles, last-minute bugs, and the classic &#8220;it works on my machine&#8221; problem. Writing clean code is only half the job\u2014getting it into production reliably and quickly is where things tend to break down.<\/p>\n\n\n\n<p>That&#8217;s where CI\/CD (Continuous Integration \/ Continuous Deployment) comes in. In this post, we&#8217;ll focus on applying CI\/CD in <strong>Microsoft Fabric<\/strong>, covering how to set up your environment, manage development across branches, and collaborate effectively across teams.<\/p>\n\n\n\n<p>This is <strong>Part 1<\/strong> of a two-part series. Here, we&#8217;ll tackle workspace organization and collaboration. In Part 2, we&#8217;ll dive into deployment strategies between environments.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">How Will We Produce Code in Microsoft Fabric?<\/h1>\n\n\n\n<p>In Fabric, development happens in two main ways:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Fabric Items<\/strong> &#8211; Mainly developed using the Microsoft Fabric UI. You can also use VS Code, but to keep things simple, I&#8217;ll describe the process using the Fabric UI\u2014VS Code isn&#8217;t quite there yet, though the general approach remains similar.<\/li>\n\n\n\n<li><strong>Power BI Reports and Semantic Models<\/strong> &#8211; Mainly developed using Power BI Desktop.<\/li>\n<\/ol>\n\n\n\n<p>Since these two areas are developed differently, we&#8217;ll need different collaboration and CI\/CD processes for each. Let&#8217;s walk through how to organize this.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Organizing Your Microsoft Fabric Tenant<\/h1>\n\n\n\n<p>Planning CI\/CD should start with your overall workspace architecture\u2014essentially, what kind of items you&#8217;re creating in which environment. Here&#8217;s the approach I&#8217;ve established (feel free to adapt it to your needs):<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"555\" height=\"617\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image.png\" alt=\"\" class=\"wp-image-295\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image.png 555w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-270x300.png 270w\" sizes=\"auto, (max-width: 555px) 100vw, 555px\" \/><\/figure>\n<\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Data Foundations Workspace<\/strong> &#8211; This is where all Fabric items (pipelines, notebooks, etc.) are stored.<\/li>\n\n\n\n<li><strong>Data Analytics Workspace<\/strong> &#8211; This is where semantic models and Power BI reports are managed.<\/li>\n<\/ul>\n\n\n\n<p>Separating these makes collaboration much easier. Use the Fabric UI for developing items in the Data Foundation workspace, and Power BI Desktop for work in the Data Analytics workspace.<br><em>You can think about separating semantic model from the reporias well due to the security reasons, but that&#8217;s the story for another post.<\/em><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Configuring Your Workspaces<\/h1>\n\n\n\n<p>First things first\u2014you&#8217;ll need to create a workspace, set up a Git or Azure Repo repository, and connect them. Here&#8217;s how:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Create Your Workspace<\/h2>\n\n\n\n<p>Go to Microsoft Fabric and create a workspace for Data Foundation purposes:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"912\" height=\"901\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-1.png\" alt=\"\" class=\"wp-image-297\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-1.png 912w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-1-300x296.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-1-768x759.png 768w\" sizes=\"auto, (max-width: 912px) 100vw, 912px\" \/><\/figure>\n\n\n\n<p>The highlighted configuration is required; the rest you can set up based on your needs. I use the following naming convention:<\/p>\n\n\n\n<p><strong>{Data Domain} &#8211; {Purpose} [{Environment}]<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Create Your Repository<\/h2>\n\n\n\n<p>Head over to Git or Azure Repos and create a repository (I&#8217;m using Azure Repos in my case):<\/p>\n\n\n\n<p data-wp-context---core-fit-text=\"core\/fit-text::{&quot;fontSize&quot;:&quot;&quot;}\" data-wp-init---core-fit-text=\"core\/fit-text::callbacks.init\" data-wp-interactive data-wp-style--font-size=\"core\/fit-text::context.fontSize\" class=\"has-fit-text\">In your project, go to <strong>Repos<\/strong> and create a new repository (or use an existing one):<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"504\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-2-1-1024x504.png\" alt=\"\" class=\"wp-image-298\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-2-1-1024x504.png 1024w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-2-1-300x148.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-2-1-768x378.png 768w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-2-1.png 1255w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Connect Repository to Your Workspace<\/h2>\n\n\n\n<p>Go to Fabric, open your workspace settings, and connect to Azure DevOps or Git:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"626\" height=\"618\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-3.png\" alt=\"\" class=\"wp-image-299\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-3.png 626w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-3-300x296.png 300w\" sizes=\"auto, (max-width: 626px) 100vw, 626px\" \/><\/figure>\n\n\n\n<p>Provide your connection details:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"635\" height=\"618\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-4.png\" alt=\"\" class=\"wp-image-300\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-4.png 635w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-4-300x292.png 300w\" sizes=\"auto, (max-width: 635px) 100vw, 635px\" \/><\/figure>\n\n\n\n<p>The configuration for Data Analytics workspaces follows exactly the same steps\u2014the only differences are the names and repositories you&#8217;ll use.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Collaboration on Data Foundation Workspaces<\/h1>\n\n\n\n<p>Here&#8217;s where things get interesting. Collaboration in Fabric works a bit differently than in standard development. Apart from branches, you&#8217;ll need to create a side workspace for development. You can&#8217;t just change the branch on your main workspace (e.g., <strong>Blog &#8211; Data Foundation Workspace [DEV]<\/strong>) since that would affect all users.<\/p>\n\n\n\n<p>Thankfully, Microsoft has added this option to the UI:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1022\" height=\"620\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-5.png\" alt=\"\" class=\"wp-image-301\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-5.png 1022w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-5-300x182.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-5-768x466.png 768w\" sizes=\"auto, (max-width: 1022px) 100vw, 1022px\" \/><\/figure>\n\n\n\n<p>This lets you easily create a new branch and assign it to a new or existing workspace.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Two Approaches to Feature Branch Development<\/h2>\n\n\n\n<p>You have two options for working on feature branches:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Create a new workspace for each development task<\/strong> &#8211; I don&#8217;t recommend this approach.<\/li>\n\n\n\n<li><strong>Create a dedicated development workspace for each developer<\/strong> &#8211; This is my recommended approach.<\/li>\n<\/ol>\n\n\n\n<p><strong>Why not Option 1?<\/strong> Creating a new workspace per development tends to result in a large number of unused workspaces over time, especially when they aren&#8217;t cleaned up after the work is finished\u2014which happens quite often. On top of that, there are security considerations since you&#8217;d need to grant every developer rights to create workspaces, which isn&#8217;t always ideal.<\/p>\n\n\n\n<p><strong>Why Option 2?<\/strong> With a separate development workspace for each developer, things stay organized. For example, if you have three developers\u2014John, Joe, and Kate\u2014your workspace list would look like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"643\" height=\"438\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-6.png\" alt=\"\" class=\"wp-image-302\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-6.png 643w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-6-300x204.png 300w\" sizes=\"auto, (max-width: 643px) 100vw, 643px\" \/><\/figure>\n\n\n\n<p><strong>Heads up:<\/strong> All these workspaces must be linked to Fabric capacity.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Branching Out<\/h2>\n\n\n\n<p>When you attempt to create a new branch and link it to your existing development workspace, you might see this message:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"418\" height=\"522\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-7.png\" alt=\"\" class=\"wp-image-303\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-7.png 418w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-7-240x300.png 240w\" sizes=\"auto, (max-width: 418px) 100vw, 418px\" \/><\/figure>\n\n\n\n<p>\u26a0\ufe0f <strong>Critical Warning:<\/strong> Before clicking &#8220;Branch out,&#8221; make sure everything from your previous development has been committed and is no longer needed\u2014this action will completely replace your current items with those from the base branch. Also, keep in mind that the branch you&#8217;re branching from must contain at least one item (even a dummy commit created directly on the main branch will work).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Committing Your Changes<\/h2>\n\n\n\n<p>Once you&#8217;ve completed your development, commit your changes to the repository. Navigate to source control:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"559\" height=\"649\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-8.png\" alt=\"\" class=\"wp-image-304\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-8.png 559w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-8-258x300.png 258w\" sizes=\"auto, (max-width: 559px) 100vw, 559px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Creating a Pull Request<\/h2>\n\n\n\n<p>After committing, you&#8217;ll need to create a pull request and merge your changes to the main branch. Click on the URL shown:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"632\" height=\"1024\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-9-632x1024.png\" alt=\"\" class=\"wp-image-305\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-9-632x1024.png 632w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-9-185x300.png 185w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-9.png 715w\" sizes=\"auto, (max-width: 632px) 100vw, 632px\" \/><\/figure>\n\n\n\n<p>Then follow these steps:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"650\" height=\"273\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-10.png\" alt=\"\" class=\"wp-image-306\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-10.png 650w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-10-300x126.png 300w\" sizes=\"auto, (max-width: 650px) 100vw, 650px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"752\" height=\"515\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-11.png\" alt=\"\" class=\"wp-image-307\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-11.png 752w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-11-300x205.png 300w\" sizes=\"auto, (max-width: 752px) 100vw, 752px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"716\" height=\"529\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-12.png\" alt=\"\" class=\"wp-image-309\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-12.png 716w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-12-300x222.png 300w\" sizes=\"auto, (max-width: 716px) 100vw, 716px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Syncing the Main Workspace<\/h2>\n\n\n\n<p>Once the merge is complete, return to your <strong>Main<\/strong> workspace and sync your changes. You&#8217;ll see a warning indicating pending changes from Git:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1007\" height=\"650\" src=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-13.png\" alt=\"\" class=\"wp-image-310\" srcset=\"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-13.png 1007w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-13-300x194.png 300w, https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/image-13-768x496.png 768w\" sizes=\"auto, (max-width: 1007px) 100vw, 1007px\" \/><\/figure>\n\n\n\n<p>Click <strong>Update all<\/strong> and Fabric will sync all items from Git into your main workspace.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Collaboration on Data Analytics Workspaces<\/h1>\n\n\n\n<p>Collaboration for Data Analytics workspaces works a bit differently if you&#8217;re using Power BI Desktop.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u2139\ufe0f <strong>Please note:<\/strong> If you&#8217;re not using Power BI Desktop\u2014for example, you&#8217;re using Direct Lake semantic models and doing all Power BI dashboard development via the Fabric UI\u2014follow the same steps described in &#8220;Collaboration on Data Foundation Workspaces&#8221; above.<\/p>\n<\/blockquote>\n\n\n\n<p>For Power BI Desktop development, you&#8217;ll follow standard Git workflows. Here&#8217;s what you need to do (check out the <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/devops\/user-guide\/code-with-git?view=azure-devops\" target=\"_blank\" rel=\"noopener\">official Microsoft documentation<\/a> for detailed instructions):<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Install Git<\/strong> on your local machine.<\/li>\n\n\n\n<li><strong>Clone the repository<\/strong> to a local folder on your computer.<\/li>\n\n\n\n<li><strong>Create or update your Power BI reports or semantic models<\/strong> in that local folder.<\/li>\n\n\n\n<li><strong>Commit your changes<\/strong> to the repository.<\/li>\n\n\n\n<li><strong>Open a pull request<\/strong> in Azure DevOps (just like you would for changes in the Data Foundation workspace).<\/li>\n\n\n\n<li><strong>Go back to the Microsoft Fabric workspace<\/strong> and sync it with the latest changes from the repository.<\/li>\n<\/ol>\n\n\n\n<h1 class=\"wp-block-heading\">Wrapping Up<\/h1>\n\n\n\n<p>That&#8217;s it for <strong>Part 1<\/strong>! We&#8217;ve covered how to organize your workspaces, connect them to Git, and collaborate effectively in Microsoft Fabric\u2014both for Data Foundation and Data Analytics scenarios.<\/p>\n\n\n\n<p><strong>Key Takeaway:<\/strong> A well-organized workspace structure with dedicated developer workspaces makes collaboration smoother and keeps your environments clean.<\/p>\n\n\n\n<p>In <strong>Part 2<\/strong>, we&#8217;ll look at how to <strong>deploy<\/strong> your changes between environments. I&#8217;ll walk through two approaches:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>One using <strong>Deployment Pipelines<\/strong> (for environments with Power BI Premium)<\/li>\n\n\n\n<li>And one for <strong>non-Premium environments<\/strong>, using a custom deployment strategy that still ensures control and repeatability<\/li>\n<\/ul>\n\n\n\n<p>Got questions or want to share how you&#8217;ve set up CI\/CD in your Fabric environment? Drop a comment below\u2014I&#8217;d love to hear about your experiences!<\/p>\n\n\n\n<p>Happy building!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you&#8217;ve ever worked on building or releasing data solutions, you&#8217;ve probably run into the usual suspects: long release cycles, last-minute bugs, and the classic &#8220;it works on my machine&#8221; problem. Writing clean code is only half the job\u2014getting it into production reliably and quickly is where things tend to break down. That&#8217;s where CI\/CD&#8230;<\/p>\n","protected":false},"author":1,"featured_media":311,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"everybody","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[8,9],"tags":[],"class_list":["post-293","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administration","category-microsoft-fabric"],"jetpack_featured_media_url":"https:\/\/dataguide.tech\/wp-content\/uploads\/2026\/01\/Background-Final-v2-scaled-e1768336919480.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/posts\/293","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/comments?post=293"}],"version-history":[{"count":3,"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/posts\/293\/revisions"}],"predecessor-version":[{"id":313,"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/posts\/293\/revisions\/313"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/media\/311"}],"wp:attachment":[{"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/media?parent=293"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/categories?post=293"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dataguide.tech\/index.php\/wp-json\/wp\/v2\/tags?post=293"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}