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 }}| 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 |
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- 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 - Bicep modules and naming
- Azure OIDC Setup - GitHub Actions authentication
- Azure Coordination - Coordinating Azure and Dataverse deployments
- 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/ # 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
| ALM Version | Dependencies |
|---|---|
| v1.0.x | PPDS.Cli (for plugins), PAC CLI (for solutions) |
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 | 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 |
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.