How to Navigate This Presentation

๐ŸŽฎ Controls

Use โ† โ†’ โ†‘ โ†“ arrow keys to navigate
Press Space or Enter to go to next slide
Press Esc to see slide overview
Press F for fullscreen mode
Press ? to see all keyboard shortcuts

Today’s Agenda

๐Ÿš€ What We’ll Cover

5 Key Areas Over 40 Minutes

  1. ๐ŸŽฏ Foundation - Understanding the Why (5 mins)
  2. ๐Ÿ› ๏ธ Hands-On Demos - Building Your First Pipeline (35 mins)
  3. ๐ŸŽ Resources - Take Home Materials (3 mins)
  4. โ“ Q&A - Your Questions (2 mins)

๐ŸŽฏ Foundation

(5 mins)

Why DevOps? Manual deployments = Problems

Prerequisites: Azure DevOps + Power Platform CLI

Repository: Organized folders = Success

๐Ÿ› ๏ธ Hands-On Demos

(25 mins)

Demo 1: Setup Pipeline + Build Tools

Demo 2: Export & Unpack Solutions

Demo 3: Deploy to Target Environment

๐ŸŽ Resources & Next Steps

(5 mins)

Templates: Download ready-to-use pipeline YAML files

Takeaways: Start simple, automate gradually, secure always

Link to slides: QR code at the end

Questions: Ask now or connect later for follow-up

Ian Tweedie

Certification Wall

height:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100pxheight:100px




PowerPlatformClinic.github.io

alt text

North East

Build Your First DevOps Pipeline for the Power Platform

The Journey Starts Here

  • You’ve exported a solution โœ…
  • Maybe even unpacked it โœ…
  • But what’s next? ๐Ÿค”

Why DevOps Matters for Power Platform

Why use DevOps

๐Ÿ”’ Enhanced Security & Compliance

โšก Better Performance & Scalability

๐Ÿ”„ Advanced Branching Strategies

๐ŸŒ Tenant Independent

๐Ÿงช Expand into Automated Testing

Why use DevOps

๐Ÿš€ No Managed Environments Required

๐Ÿ” Source Code Visibility

๐Ÿ“š Automated Documentation

โœ๏ธ Edit Solutions Between Environments

Prerequisites

Before We Start

Install Dataverse Build Tools

App Registration

Client ID:

Tenant ID:

Secret:

Give Permission

Create service connection

Client ID:

Tenant ID:

Secret:

Server URL:

Repository Structure

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

Demo 1: Creating Your First Pipeline

Export Pipeline YAML

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

Demo 2: Exploring an Unpacked Solution

Live Demo: Understanding the solution structure

Demo 3: Deploy Solution

Live Demo: Deploy the solution

Deploy Solution

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'

Common Challenges & Solutions

Challenge: Large Solutions

Problem:

Solution export times out

Solution:

  • Use AsyncOperation: true
  • Increase MaxAsyncWaitTime
  • Split large solutions

Challenge: Connection References

Problem:

Connections fail in target environment

Solution:

  • Use deployment settings files
  • Parameterize connection references
  • Update connections post-deployment

Challenge: Environment Variables

Problem:

Environment-specific values

Solution:

  • Use environment variables in solution
  • Configure per environment
  • Automate variable updates

What next

  • Automated testing with Test Engine
  • Multi-solution management
  • Branch strategies for teams
  • Release management
  • Monitoring & alerting

Key Takeaways

Remember

DevOps is a Journey, Not a Destination

  • โœ… Start with basic export/deploy
  • โœ… Add source control
  • โœ… Automate what you can
  • โœ… Iterate and improve
  • โœ… Share knowledge with team

Resources

Questions?

You now have the tools to automate your Power Platform solution lifecycle!

Slides

Link to Presentation

Connect

QR Code