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

The Death of Manual Docs


A DevOps Approach to Power Platform Documentation

The Problem

  • ✅ We have a solution
  • ✅ Keeps getting updated
  • ✅ Certainty that its correct

Pre-requisites

  • Already exporting out our solution
  • Using Azure DevOps
  • We are using a YAML pipeline
  • (I have a video on how to do this - click here)

alt text

FREE

FREE

OPEN SOURCE

FREE

OPEN SOURCE

BUILT FOR THE COMMUNITY

What can it do

  • Choices
  • Security Roles
  • Solution Manifest
  • Tables
  • Table Relationships
  • Table Relationship ER diagram
  • Workflows (Preview)
  • Diagram Converter
  • Word DocX Converter
  • Table Relationships
  • Diagram Converter
  • Word DocX Converter

Step 1: Add variables


  - name: varUnpackedSolution
    value: $(Build.SourcesDirectory)\solutions\src\$(varSolutionName)

  - name: varWikiLocation
    value: $(Build.SourcesDirectory)\wiki\$(varSolutionName)

Step 2: Add tasks


- task: documentTableRelationships@2
  inputs:
    locationOfUnpackedSolution: '$(varUnpackedSolution)'
    wikiLocation: '$(varWikiLocation)'
    useSingleFile: true
    createFullERD: true

Step 4: Add more variables


  - name: varWikiOutput
    value: $(Build.SourcesDirectory)\wiki-ouput\solutions\$(varSolutionName)

  - name: varWord
    value: $(Build.SourcesDirectory)\word\solutions\$(varSolutionName)

Step 5: Add more tasks


# Convert diagrams
- task: convertConvertInlineDiagrams@1
  inputs:
    locationOfSourceMDFiles: '$(varWikiLocation)'
    outputLocation: '$(varWikiOutput)'

# Convert to Word
- task: convertMarkdownToDocx@1
  continueOnError: true
  inputs:
    locationOfMDFiles: '$(varWikiOutput)'
    outputLocation: '$(varWord)'
    includeTOC: true


# Convert to Word
- task: convertMarkdownToDocx@1
  continueOnError: true
  inputs:
    locationOfMDFiles: '$(varWikiOutput)'
    outputLocation: '$(varWord)\withTemplate'
    templateFile: '$(Build.SourcesDirectory)\TechTweedieWordTemplate.docx'
    includeTOC: true

What We’ve Accomplished

We Converted our exported solution in to

  • ✅ Markdown Documents
  • ✅ Word Documents

Why is this important

  • Knowledge Transfer
  • Enhanced Maintenance and Troubleshooting
  • Increased Collaboration and Alignment
  • Facilitated Governance and Compliance

Where can you download this

alt text

Feedback and Presentation

alt text

https://go.iantweedie.biz/feedback

Extra content - the YAML Pipeline


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

variables:
  - name: varPowerPlatformSPN
    value: Dataverse - Backup
  - name: varSolutionName
    value: ExpenseReportManager
  - name: varWebsiteId
    value: 98a716a8-c592-476c-bc5d-aefde10a8b5d
  - name: varUnpackedSolution
    value: $(Build.SourcesDirectory)\src\solutions\$(varSolutionName)
  - name: varWikiLocation
    value: $(Build.SourcesDirectory)\wiki\solutions\$(varSolutionName)
  - name: varWikiOutput
    value: $(Build.SourcesDirectory)\wiki-ouput\solutions\$(varSolutionName)
  - name: varWord
    value: $(Build.SourcesDirectory)\word\solutions\$(varSolutionName)

trigger: none

pool:
  vmImage: 'windows-2019'

steps:

## Check out repo
- checkout: self
  persistCredentials: true
  clean: true

## Install Power Platform Tool Installer
- task: PowerPlatformToolInstaller@2
  inputs:
    DefaultVersion: true
    AddToolsToPath: true

## Set Solution Version
- task: PowerPlatformSetSolutionVersion@2
  inputs:
    authenticationType: 'PowerPlatformSPN'
    PowerPlatformSPN: '$(varPowerPlatformSPN)'
    SolutionName: '$(varSolutionName)'
    SolutionVersionNumber: '1.0.0.$(Build.BuildID)'

## Export Solution - managed
- task: PowerPlatformExportSolution@2
  inputs:
    authenticationType: 'PowerPlatformSPN'
    PowerPlatformSPN: '$(varPowerPlatformSPN)'
    SolutionName: '$(varSolutionName)'
    SolutionOutputFile: '$(Build.ArtifactStagingDirectory)\$(varSolutionName)_managed.zip'
    Managed: true
    AsyncOperation: true
    MaxAsyncWaitTime: '60'

## Export Solution - unmanaged
- task: PowerPlatformExportSolution@2
  inputs:
    authenticationType: 'PowerPlatformSPN'
    PowerPlatformSPN: '$(varPowerPlatformSPN)'
    SolutionName: '$(varSolutionName)'
    SolutionOutputFile: '$(Build.ArtifactStagingDirectory)\$(varSolutionName).zip'
    Managed: false
    AsyncOperation: true
    MaxAsyncWaitTime: '60'

## Unpack Solution
- task: PowerPlatformUnpackSolution@2
  inputs:
    SolutionInputFile: '$(Build.ArtifactStagingDirectory)\$(varSolutionName).zip'
    SolutionTargetFolder: '$(Build.SourcesDirectory)\src\solutions\$(varSolutionName)'
    SolutionType: 'Both'

## Document out our Solution
### Option Sets
- task: mightoraDocumentOptionSets@1
  inputs:
    unpackedSolutionPath: '$(varUnpackedSolution)'
    outputLocation: '$(varWikiLocation)'

### Security Roles
- task: documentRoles@2
  inputs:
    locationOfUnpackedSolution: '$(varUnpackedSolution)'
    wikiLocation: '$(varWikiLocation)'
    useSingleFile: true

### Solution Manifest
- task: documentSolutionManifest@1
  inputs:
    solutionXmlPath: '$(varUnpackedSolution)/Other/Solution.xml'
    outputLocation: '$(varWikiLocation)'

### Tables
- task: documentSolutionTables@2
  inputs:
    locationOfUnpackedSolution: '$(varUnpackedSolution)'
    wikiLocation: '$(varWikiLocation)'
    useSingleFile: true

### Table Relationships
- task: documentTableRelationships@2
  inputs:
    locationOfUnpackedSolution: '$(varUnpackedSolution)'
    wikiLocation: '$(varWikiLocation)'
    useSingleFile: true
    createFullERD: true

### Table Relationships ER Diagram
- task: mightora-powerplatform-documentationgenerator-erdiagram@1
  inputs:
    locationOfUnpackedSolution: '$(varUnpackedSolution)'
    wikiLocation: '$(varWikiLocation)'

### Workflows
- task: mightoraDocumentWorkflows@1
  inputs:
    solutionPath: '$(varUnpackedSolution)'
    outputLocation: '$(varWikiLocation)'


## Make documentation ready for export

### Convert diagrams
- task: convertConvertInlineDiagrams@1
  inputs:
    locationOfSourceMDFiles: '$(varWikiLocation)'
    outputLocation: '$(varWikiOutput)'

### Convert to Word
- task: convertMarkdownToDocx@1
  continueOnError: true
  inputs:
    locationOfMDFiles: '$(varWikiOutput)'
    outputLocation: '$(varWord)'
    includeTOC: true

## Push to WiKi
- task: mightora-UploadMDToWiki@0
  continueOnError: true
  inputs:
    ADOBaseUrl: '$(System.CollectionUri)'
    wikiSource: '$(varWikiOutput)'
    MDRepositoryName: '$(Build.Repository.Name)'
    MDVersion: '$(Build.BuildNumber)'
    MDTitle: 'MD for $(Build.Repository.Name)'
    WikiDestination: 'UploadedFromPipeline'
    IncludePageLink: true
    DeleteOrphanedPages: true
  env:
    SYSTEM_ACCESSTOKEN: $(PAT)
    
## Commit to Repo
- task: mightoraCommitToRepo@2
  inputs:
    commitMsg: 'Latest solution changes.'
    branchName: 'main'
    pushStrategy: 'normal'