PPDS ALM
January 12, 2026 · View on GitHub
CI/CD templates for Power Platform Application Lifecycle Management (ALM).
Part of the Power Platform Developer Suite ecosystem.
Quick Start
GitHub Actions
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 }}
Reusable Workflows
| 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.Cli |
plugin-extract.yml | Extract plugin registrations from assembly |
solution-promote.yml | Promote solution between environments (export, build, deploy) |
azure-deploy.yml | Deploy Azure integration resources |
Composite Actions
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.
Key Features
Smart Import
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.json
Noise Filtering
Solution 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.
Solution Checker Integration
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
Documentation
Getting Started
Reference
- Workflows Reference - All reusable workflows documented
- Actions Reference - All composite actions documented
- Consumption Guide - When to use actions vs workflows
- Features Guide - Deep dive into advanced features
- Troubleshooting
Azure Integration
- Azure Integration - Bicep modules and naming
- Azure OIDC Setup - GitHub Actions authentication
- Azure Coordination - Coordinating Azure and Dataverse deployments
Strategy Guides
- ALM Overview - Philosophy and approach
- Branching Strategy - Recommended git workflow
- Environment Strategy - Dev/QA/Prod patterns
Repository Structure
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/ # All workflows
│ ├── _ci.yml # CI for this repo (internal)
│ ├── solution-export.yml # Reusable workflows (workflow_call)
│ ├── solution-import.yml
│ ├── solution-build.yml
│ ├── solution-validate.yml
│ ├── solution-deploy.yml
│ ├── plugin-deploy.yml
│ ├── plugin-extract.yml
│ ├── solution-promote.yml
│ └── azure-deploy.yml
├── bicep/ # Azure Bicep modules
├── docs/
├── CHANGELOG.md
└── README.md
Compatibility
| ALM Version | Dependencies |
|---|---|
| v1.0.x | PPDS.Cli (for plugins), PAC CLI (for solutions) |
Versioning
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 |
PPDS Ecosystem
| Repository | Purpose | Install |
|---|---|---|
| power-platform-developer-suite | SDK + CLI + TUI + Extension + MCP | NuGet / VS Code Marketplace |
| ppds-tools | PowerShell Module | Install-Module PPDS.Tools |
| ppds-alm | CI/CD Templates | Reference in pipelines |
| ppds-demo | Reference Implementation | Clone |
| ppds-orchestration | Parallel Claude Code Sessions | npm |
Contributing
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
License
MIT License - see LICENSE for details.