CI/CD templates for Power Platform Application Lifecycle Management (ALM).
Part of the Power Platform Developer Suite ecosystem.
name: Deploy to QA
on:
push:
branches: [develop]
jobs:
deploy:
uses: joshsmithxrm/ppds-alm/github/workflows/solution-deploy.yml@v1
with:
solution-name: MySolution
solution-folder: solutions/MySolution/src
build-plugins: true
package-type: Managed
secrets:
environment-url: ${{ vars.POWERPLATFORM_ENVIRONMENT_URL }}
tenant-id: ${{ vars.POWERPLATFORM_TENANT_ID }}
client-id: ${{ vars.POWERPLATFORM_CLIENT_ID }}
client-secret: ${{ secrets.POWERPLATFORM_CLIENT_SECRET }}resources:
repositories:
- repository: ppds-alm
type: github
name: joshsmithxrm/ppds-alm
ref: refs/tags/v1.0.0
endpoint: 'GitHub Connection'
stages:
- template: azure-devops/templates/solution-deploy.yml@ppds-alm
parameters:
solutionName: MySolution
solutionFolder: solutions/MySolution/src
serviceConnection: 'Dataverse QA'| Workflow | Purpose |
|---|---|
solution-export.yml |
Export solution from environment with noise filtering |
solution-import.yml |
Import solution with version check and retry logic |
solution-build.yml |
Build .NET code and pack solution |
solution-validate.yml |
PR validation with build, pack, and Solution Checker |
solution-deploy.yml |
Full deployment: build, pack, import |
plugin-deploy.yml |
Deploy plugins using PPDS.Tools |
plugin-extract.yml |
Extract plugin registrations from assembly |
full-alm.yml |
Complete ALM pipeline (export, build, deploy) |
Granular, reusable actions for building custom workflows:
| Action | Purpose |
|---|---|
setup-pac-cli |
Install .NET SDK and Power Platform CLI |
pac-auth |
Authenticate to Power Platform environment |
export-solution |
Export and unpack solution |
import-solution |
Import with version check and retry |
pack-solution |
Pack solution from source |
build-solution |
Build .NET solution with tests |
check-solution |
Run PowerApps Solution Checker |
analyze-changes |
Filter noise from exports |
copy-plugin-assemblies |
Copy built DLLs to solution |
copy-plugin-packages |
Copy NuGet packages to solution |
See Actions Reference for detailed documentation.
The import action automatically:
- Compares versions - Skips import if target has same or newer version
- Retries transient failures - Handles concurrent import conflicts with configurable retry
- Applies deployment settings - Auto-detects environment-specific configuration files
- uses: joshsmithxrm/ppds-alm/.github/actions/import-solution@v1
with:
solution-path: ./exports/MySolution_managed.zip
solution-name: MySolution
skip-if-same-version: 'true'
max-retries: '3'
settings-file: ./config/qa.deploymentsettings.jsonSolution exports often contain volatile changes that aren't real customizations:
- Solution.xml version timestamps
- Canvas app random URI suffixes
- Workflow session IDs
- Whitespace-only changes
The analyze-changes action filters these, preventing unnecessary commits.
Validate solution quality before deployment:
- uses: joshsmithxrm/ppds-alm/.github/actions/check-solution@v1
with:
solution-path: ./exports/MySolution_managed.zip
fail-on-level: High # Critical, High, Medium, Low, Informational
geography: unitedstates- Actions Reference - Detailed input/output docs for all actions
- Features Guide - Deep dive into advanced features
- Troubleshooting
- ALM Overview - Philosophy and approach
- Branching Strategy - Recommended git workflow
- Environment Strategy - Dev/QA/Prod patterns
ppds-alm/
├── .github/
│ ├── actions/ # Composite actions
│ │ ├── setup-pac-cli/
│ │ ├── pac-auth/
│ │ ├── export-solution/
│ │ ├── import-solution/
│ │ ├── pack-solution/
│ │ ├── build-solution/
│ │ ├── check-solution/
│ │ ├── analyze-changes/
│ │ ├── copy-plugin-assemblies/
│ │ └── copy-plugin-packages/
│ └── workflows/
│ └── ci.yml # CI for this repo
├── github/
│ └── workflows/ # Reusable workflows (workflow_call)
│ ├── solution-export.yml
│ ├── solution-import.yml
│ ├── solution-build.yml
│ ├── solution-validate.yml
│ ├── solution-deploy.yml
│ ├── plugin-deploy.yml
│ ├── plugin-extract.yml
│ └── full-alm.yml
├── azure-devops/
│ ├── templates/ # Pipeline templates
│ └── examples/ # Example pipelines
├── docs/
│ ├── github-quickstart.md
│ ├── azure-devops-quickstart.md
│ ├── authentication.md
│ ├── actions-reference.md
│ ├── features.md
│ ├── troubleshooting.md
│ └── strategy/
│ ├── ALM_OVERVIEW.md
│ ├── BRANCHING_STRATEGY.md
│ └── ENVIRONMENT_STRATEGY.md
├── CHANGELOG.md
└── README.md
| ALM Version | Requires PPDS.Tools |
|---|---|
| v1.0.x | >= 1.1.0 |
Use version tags for stability:
| Tag | Description | Recommendation |
|---|---|---|
@v1 |
Latest v1.x release | Recommended for production |
@v1.0.0 |
Specific version | Maximum stability |
@main |
Latest development | Not recommended for production |
| Repository | Purpose | Install |
|---|---|---|
| power-platform-developer-suite | VS Code Extension | VS Code Marketplace |
| ppds-sdk | .NET Plugin Attributes | dotnet add package PPDS.Plugins |
| ppds-tools | PowerShell Module | Install-Module PPDS.Tools |
| ppds-alm | CI/CD Templates | Reference in pipelines |
| ppds-demo | Reference Implementation | Clone |
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Run actionlint on GitHub Actions workflows
- Test with actual CI/CD environment
- Submit a pull request
MIT License - see LICENSE for details.