Contents

Build Your First DevOps Pipeline for the Power Platform


Build Your First DevOps Pipeline for the Power Platform

πŸ“… Date: Friday, June 27, 2025
πŸ•’ Time: 2:15 PM – 3:00 PM BST
πŸ“ Location: National Usergroup, Room G8
🎟️ Session Link: https://d365ppug-national-27-06-2025.sessionize.com/session/905816

Session Overview

image.png You’ve exported a solution. Maybe even unpacked it. But what’s next?

In this hands-on, beginner-friendly session, Ian Tweedie (TechTweedie), Power Platform Technical Consultant at Capgemini, will walk you through building your very first DevOps pipeline for the Power Platform β€” using Azure DevOps and real-world tools that anyone can adopt.

You’ll see how to go from manual solution management to a repeatable, secure deployment process, powered by the Power Platform CLI and Azure DevOps build tasks. Expect practical guidance, live demos, and templates you can use right away.

Whether you’re a low-code maker or a seasoned dev dipping your toes into DevOps, you’ll leave with the confidence to automate your solution lifecycle.

What You’ll Learn

  • Why DevOps matters for Power Platform projects
  • How to structure your repo and solutions
  • Setting up your first Azure DevOps pipeline to export, unpack, commit, and document a solution
  • How to deploy
  • Bonus: How to include automated documentation of your solution

Demos Include

  • Creating your first pipeline in Azure DevOps
  • Explore an unpacked solution
  • Generating documentation
  • Schedule a backup of the build
  • Deploy to a target

Why Attend?

  • πŸ’‘ Gain practical insights into DevOps for Power Platform
  • πŸ› οΈ Learn hands-on with live demos and real-world tools
  • πŸ“‚ Take away templates and guidance to start automating your solution lifecycle

Don’t miss this opportunity to level up your Power Platform projects with DevOps!

Slides

Access the slides here

Pipelines

MyPowerPlatformProject/
β”œβ”€β”€ solutions/
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   └── MySolution/
β”‚   └── MySolution.zip
β”œβ”€β”€ pipelines/
β”‚   β”œβ”€β”€ export-solution.yml
β”‚   β”œβ”€β”€ build-and-deploy-solution.yml
β”œβ”€β”€ documentation/
└── README.md

export-solution.yml

name: $(TeamProject)_$(BuildDefinitionName)_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r)

variables:
  - name: varPowerPlatformSPN
   # value: YOUR-OWN-VALUE-HERE 
    value: Dataverse - Backup
  - name: varSolutionName
   # value: YOUR-OWN-VALUE-HERE
    value: ProjectExpenseLogger

trigger: none

pool:
  vmImage: 'windows-latest'

steps:
- checkout: self
  persistCredentials: true
  clean: true
- task: PowerPlatformToolInstaller@2
  inputs:
    DefaultVersion: true
    AddToolsToPath: true
- task: PowerPlatformSetSolutionVersion@2
  inputs:
    authenticationType: 'PowerPlatformSPN'
    PowerPlatformSPN: '$(varPowerPlatformSPN)'
    SolutionName: '$(varSolutionName)'
    SolutionVersionNumber: '1.0.0.$(Build.BuildID)'
- task: PowerPlatformExportSolution@2
  inputs:
    authenticationType: 'PowerPlatformSPN'
    PowerPlatformSPN: '$(varPowerPlatformSPN)'
    SolutionName: '$(varSolutionName)'
    SolutionOutputFile: '$(Build.SourcesDirectory)\solutions\$(varSolutionName)_1.0.0.$(Build.BuildID)_managed.zip'
    Managed: true
    AsyncOperation: true
    MaxAsyncWaitTime: '60'
- task: PowerPlatformExportSolution@2
  inputs:
    authenticationType: 'PowerPlatformSPN'
    PowerPlatformSPN: '$(varPowerPlatformSPN)'
    SolutionName: '$(varSolutionName)'
    SolutionOutputFile: '$(Build.SourcesDirectory)\solutions\$(varSolutionName)_1.0.0.$(Build.BuildID).zip'
    Managed: false
    AsyncOperation: true
    MaxAsyncWaitTime: '60'
- task: PowerPlatformUnpackSolution@2
  inputs:
    SolutionInputFile: '$(Build.SourcesDirectory)\solutions\$(varSolutionName)_1.0.0.$(Build.BuildID).zip'
    SolutionTargetFolder: '$(Build.SourcesDirectory)\solutions\src\$(varSolutionName)'
    SolutionType: 'Both'
- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: 'pac solution create-settings --solution-zip $(Build.SourcesDirectory)\solutions\$(varSolutionName)_1.0.0.$(Build.BuildID).zip --settings-file $(Build.SourcesDirectory)\solutions\$(varSolutionName)-settings.json'

- task: CmdLine@2
  inputs:
    script: |
      echo commit all changes
      git config user.email "$(Build.RequestedForEmail)"
      git config user.name "$(Build.RequestedFor)"
      git checkout -b main
      git add --all
      git commit -m "Latest solution changes."
      echo push code to new repo
      git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" push origin main      

build-and-deploy-solution.yml

name: $(TeamProject)_$(BuildDefinitionName)_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r)

variables:
  - name: varSolutionName
   # value: YOUR-OWN-VALUE-HERE
    value: FirstPipeline
  - name: varPowerPlatformSPN
   # value: YOUR-OWN-VALUE-HERE 
    value: Dataverse - mightora

trigger: none

pool:
  vmImage: 'windows-latest'

steps:
- checkout: self
  persistCredentials: true
  clean: true
- task: PowerPlatformToolInstaller@2
  inputs:
    DefaultVersion: true
    AddToolsToPath: true

- task: PowerPlatformPackSolution@2
  inputs:
    SolutionSourceFolder: '$(Build.SourcesDirectory)\solutions\src\$(varSolutionName)'
    SolutionOutputFile: '$(Build.ArtifactStagingDirectory)\solutions\build\$(varSolutionName).zip'
- task: PowerPlatformImportSolution@2
  inputs:
    authenticationType: 'PowerPlatformSPN'
    PowerPlatformSPN: 'Dataverse - Backup'
    Environment: 'https://mightora.crm11.dynamics.com/'
    SolutionInputFile: '$(Build.ArtifactStagingDirectory)\solutions\build\$(varSolutionName).zip'
    AsyncOperation: true
    MaxAsyncWaitTime: '60'

Schedule / Backup


schedules:
  - cron: 0 18 * * 1-5
    displayName: Weekday Backup
    branches:
      include:
        - main
    always: true

Documentation

Download from here: https://marketplace.visualstudio.com/items?itemName=mightoraio.mightora-power-platform-devOps-extension


steps:
- task: mightoraio.mightora-power-platform-devOps-extension.mightora-documentTableRelationships-task.documentTableRelationships@1
  displayName: 'Mightora Power Platform Table Relationship Documentation Generator'
  inputs:
    locationOfUnpackedSolution: $(Build.SourcesDirectory)\solutions\src\$(varSolutionName)
    wikiLocation: documentation