From 20b46bbf8fc1fdc8ee9ff94080758bdea1f5b88e Mon Sep 17 00:00:00 2001 From: Rob Wood Date: Sat, 24 Jan 2026 10:25:40 +0000 Subject: [PATCH] Add submission. --- .../Scalable-Enterprise-ALM.md | 92 ++++++++++++ .../Scalable-Enterprise-ALM/architecture.png | Bin 0 -> 33148 bytes .../Scalable-Enterprise-ALM/architecture.puml | 136 ++++++++++++++++++ 3 files changed, 228 insertions(+) create mode 100644 submit-architecture/Scalable-Enterprise-ALM.md create mode 100644 submit-architecture/Scalable-Enterprise-ALM/architecture.png create mode 100644 submit-architecture/Scalable-Enterprise-ALM/architecture.puml diff --git a/submit-architecture/Scalable-Enterprise-ALM.md b/submit-architecture/Scalable-Enterprise-ALM.md new file mode 100644 index 0000000..de9e10c --- /dev/null +++ b/submit-architecture/Scalable-Enterprise-ALM.md @@ -0,0 +1,92 @@ +--- +title: Scalable enterprise application lifecycle management for Power Platform +description: ALM is an important concern when building projects on the Power Platform and D365 but meeting enterprise polcies at their scale is challenging. This architecture demonstrates a pattern manage this efficiently. +keywords: +ms.service: dynamics-365 #Required. Leave as-is for all things Dynamics 365, but change to dccp for DCCP content. +ms.subservice: guidance #Required. Leave as-is. +ms.topic: conceptual #Required. Leave as-is. +ms.custom: bap-template #Required; Leave as-is. +author: rnwood +ms.date: 01/24/2026 +--- + +# Scalable enterprise application lifecycle management for Power Platform + +**Applies to: Power Apps, Dynamics 365 Customer Service, other Power Platform Services using solutions** + +## Scenario + +**Overview of ALM Requirements** + +ALM is an important concern when building projects on the Power Platform and D365. + +A high-quality ALM process: + +- Ensures that teams can reliably deploy the system to test and production environments without introducing unexpected differences or missing components/steps that would cause it to behave differently. This allows them to focus on the change they are making and reducing the risk of breaking other existing working features. + +- Tracks what was changed when, by who and why linking changes to the requests from system stakeholders and users. This is it typically done by using source control (for example GitHub or Azure DevOps repos), with changes linked to tickets. + +- Includes everything that is needed to make the system work including solutions (potentially several) and other important assets such as key configuration data and associated Azure resources. + +Together this ensures that the system remains maintainable and stable long-term as ownership of the system may transcend many different individuals and teams. + +**Standard Tools** + +The current tools that come with the platform can help us build an ALM system, but don't give us a complete pre-developed setup that we can use: + +- The Power Platform solutions system gives us a mechanism to import and export solution aware components, *but it doesn't give us any way to include other assets like base configuration data, or to take any other custom steps during deployment* + +- The built-in Power Platform Pipelines feature allows us to manage individual solutions, *but it doesn't include source control integration and custom asset support. (Although it can be extended for simple cases)* + +- Power Platform Build Tools for Azure DevOps and GitHub and the Power Apps CLI give us some low level tools to build more complex pipelines, *but require complex orchestration in each pipeline to build complete, stable ALM*. + +**Enterprise Challenges** + +Enterprise organizations come with additional challenges. + +Often there will be a general policy mandating that teams use standard tools and follow a standard workflow. For example: +- using GitHub or Azure DevOps for source control together with tickets in Azure Boards or Jira. +- ensuring all changes are traceable to the ticket to which they relate. +- standard requirements for review and gated deployment approval +- deploying required Azure Resources using BICEP templates via pipelines with managed identities. + +Each system could develop their own solution to the challenges to ensure they have good complete ALM that meet the corporate policies, but as the organization scales up their use of Power Platform and D365, this becomes inefficient. The current tools require complex extension to meet the needs and policies. Many different processes will emerge, requiring people to learn them and maintain them separately. + +**Enterprises ideally need a single ALM process with as much implementation shared as possible.** + +## Architecture + +This archtecture demonstrates a scalable enterprise-compliant architecture for ALM using the standard Microsoft Tools. + +> **Notes** +> +> This example presents the architecture using Azure DevOps concepts and terminology. A similar pattern is possible with GitHub +> +> A deployment process is shown here, but the same patterns can be applied to other process steps. + +The following diagram illustrates how multiple AzDO project and repositories can consume shared pipeline templates from a common repository. + +The template contains all the logic and complex steps required to achieve a stable process + +> This simplified example shows illustrates the capability to deploy zero to many solutions and zero to many associated Azure resource templates (using the standard BICEP). This illustrates the concept and can be extended to handle other required assets and steps. + +Each consuming repo simply defined stub pipelines that point at the template and provide the parameters that specify which assets should be processed. + +The complex logic can therefore be maintained centrally and is not repeated for every project. Teams can follow a standardised lifecycle process. + + +![Architecture diagram](Scalable-Enterprise-ALM/architecture.png) + +### Alternatives + +Power Platform Pipelines offers several extension mechanism that can be used to add the logic needed to comply with enterprise standard and polcies: + +- [Extend pipelines using business events](https://learn.microsoft.com/en-us/power-platform/alm/extend-pipelines) +- [Extend pipelines using GitHub Actions](https://learn.microsoft.com/en-us/power-platform/alm/extend-pipelines-github-export) + +An alternative archtecture would be needed to put those customisation in place and keep them up to date across many consuming system. + +## Next steps + +[Azure Devops Documentation - Use YAML templates in pipelines for reusable and secure processes](https://learn.microsoft.com/en-us/azure/devops/pipelines/process/templates?view=azure-devops&pivots=templates-includes) +[GitHub Actions - Reuse Workflows](https://docs.github.com/en/actions/how-tos/reuse-automations/reuse-workflows) \ No newline at end of file diff --git a/submit-architecture/Scalable-Enterprise-ALM/architecture.png b/submit-architecture/Scalable-Enterprise-ALM/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..7d2cbe0afb422b67fb6270e4346bb4cb02254ff1 GIT binary patch literal 33148 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 literal 0 HcmV?d00001 diff --git a/submit-architecture/Scalable-Enterprise-ALM/architecture.puml b/submit-architecture/Scalable-Enterprise-ALM/architecture.puml new file mode 100644 index 0000000..81c6486 --- /dev/null +++ b/submit-architecture/Scalable-Enterprise-ALM/architecture.puml @@ -0,0 +1,136 @@ +@startuml +!define ICONURL https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/refs/heads/main/icons +!include ICONURL/common.puml +!include ICONURL/devicons2/azuredevops.puml +!include ICONURL/devicons2/azure.puml +!include ICONURL/devicons/git.puml +!include ICONURL/font-awesome-6/file_code.puml +!include ICONURL/font-awesome-6/folder_tree.puml +!include ICONURL/font-awesome-6/table.puml +skinparam componentStyle rectangle +skinparam ranksep 0 +skinparam nodesep 0 + + + +package "<$azuredevops{scale=0.5}> Common AzDO project" { + + package "<$git{scale=0.5}>Common Repository\n(alm-templates)" <> #E1F5FF { + component "<$file_code{scale=1}>\ndeploy-job-template.yml" as deploy #A8DAFF { + component parameters [ + **Template** + + Parameters: + - solutionNames + - dataPackages + - azureResourceBICEPTemplates + ] + + component solutions [ + Step: Deploy solutions + //Complex logic using// + //Power Apps CLI// + //and conditional logic// + ] + + component data [ + Step: Deploy data CMT packages + //Complex logic using// + //Configuration Migration in PAC// + ] + + component azure [ + Step: Deploy Azure BICEP templates + //Complex logic// + ] + + parameters -> solutions + solutions -> data + data -> azure + } + } +} + +package "<$azuredevops{scale=0.5}> CustomerService AzDO project" { + + + package "<$git{scale=0.5}>CustomerService Repository" <> #FFF4E1 { + + component "<$file_code{scale=1}>\ndeploy.yml" as pipeline1 { + component pipeline1Step [ + **Job: use template in common repo** + + Parameter values: + solutionNames: CustomerServiceCore, CustomerServiceFeedback + dataPackages: products.zip + azureResourceBICEPTemplates: integration1.bicep + ] + } + +component "<$folder_tree{scale=0.3}> Solution folder:\nCustomerServiceCore" as s1 +component "<$folder_tree{scale=0.3}> Solution folder:\nCustomerServiceFeedback" as s2 +component "<$table{scale=0.3}> CMT Data package:\nproducts" as t1 +component "<$azure{scale=0.3}> Azure BICEP template:\nintegration1" as a1 + + + } +} + +s1 .up.> pipeline1Step +s2 .up.> pipeline1Step +t1 .up.> pipeline1Step +a1 .up.> pipeline1Step + + +package "<$azuredevops{scale=0.5}> Sales AzDO project" { + +package "<$git{scale=0.5}>SalesApp Repository" <> #FFF4E1 { + component "<$file_code{scale=1}>\ndeploy.yml" as pipeline2 { + component pipeline2Step [ + **Job: use template in common repo** + + Parameter values: + solutionNames: SalesApp + dataPackages: territories.zip + ] + + } + component "<$folder_tree{scale=0.3}> Solution folder:\nSalesApp" as s3 +component "<$table{scale=0.3}> CMT Data package:\nterritories" as t2 +s3 .up.> pipeline2Step +t2 .up.> pipeline2Step +} +} + + +package "<$azuredevops{scale=0.3}> Employee Feedback (Power Apps) AzDO project" { +package "<$git{scale=0.5}>EmployeeFeedback Repository" <> #FFF4E1 { + component "<$file_code{scale=1}>\ndeploy.yml" as pipeline3 { + + component pipeline3Step [ + **Job: use template in common repo** + + Parameter values: + solutionNames: EmployeeFeedback + azureResourceBICEPTemplates: hrSystemIntegration.bicep + ] + + } + + component "<$folder_tree{scale=0.3}> Solution folder:\nEmployeeFeedback" as s4 + component "<$azure{scale=0.3}> Azure BICEP template:\nhrSystemIntegration" as a2 + + s4 .up.> pipeline3Step + a2 .up.> pipeline3Step + +} +} + + +pipeline1Step --up-> parameters : invokes template + +pipeline2Step --up-> parameters : invokes template + +pipeline3Step --up-> parameters : invokes template + +@enduml \ No newline at end of file