Tuesday, May 27, 2025

Setting Up Azure DevOps Pipeline for Dynamics 365 Managed Solution Deployment

 

Recently, I had the opportunity to set up an Azure DevOps pipeline to automate the deployment of Managed Solutions in Dynamics 365 Customer Engagement (Dataverse). The goal was to streamline the release process across multiple environments (ITG → PreProd → Production) with minimal manual intervention.

While the process involves a bit of configuration and understanding of Microsoft’s Power Platform tooling, once it’s in place, it can save a lot of time and reduce deployment errors. In this post, I’ll walk through the approach I followed and point to the official documentation that helped me along the way.


 Objectives

  • Export and store Managed Solution from source environment (e.g., Dev or ITG)

  • Use Azure DevOps Pipeline to deploy the solution into target environments

  • Parameterize the deployment using variables

  • Ensure auditability and automation across environments


 Tools & Prerequisites

To begin with, here are the core tools and prerequisites:

  • Azure DevOps Project

  • Power Platform Build Tools Extension (Install from Marketplace)

  • Service Principal or Application User with environment-level access

  • Power Platform CLI (PAC CLI) – optional for local testing


 Solution Setup in DevOps

1. Install Power Platform Build Tools

This extension provides Azure DevOps tasks for working with Power Platform and Dataverse. You can install it from the Visual Studio Marketplace:

๐Ÿ”— Power Platform Build Tools


2. Create a Service Connection

Go to Project Settings > Service Connections > New Service Connection > Power Platform.

You’ll need:

  • Client ID

  • Client Secret

  • Tenant ID

  • Environment URL

Follow the guide:
๐Ÿ“˜ Set up a service principal


3. Define Pipeline Structure

Here’s an outline of how the pipeline is structured:

Stage 1: Export Solution from Source Environment

  • Power Platform Tool Installer

  • Export Solution Task (Set Export As = Managed)

  • Upload Artifacts (Store .zip file)

Stage 2: Import Solution into Target Environment

  • Download Artifacts

  • Import Solution Task

  • Publish All Customizations (optional but recommended)

You can also enable "Check Solution" before import for validation.


4. Sample YAML Pipeline Snippet

trigger:
- main

pool:
  vmImage: 'windows-latest'

variables:
  SolutionName: 'MyManagedSolution'
  EnvironmentUrl: 'https://myenv.crm.dynamics.com'

stages:
- stage: ExportSolution
  jobs:
  - job: Export
    steps:
    - task: PowerPlatformToolInstaller@2
    - task: PowerPlatformExportSolution@2
      inputs:
        authenticationType: 'PowerPlatformSPN'
        PowerPlatformSPN: 'MyServiceConnection'
        solutionName: '$(SolutionName)'
        solutionOutputFile: '$(Build.ArtifactStagingDirectory)/$(SolutionName).zip'
        managed: true
    - task: PublishBuildArtifacts@1
      inputs:
        pathToPublish: '$(Build.ArtifactStagingDirectory)'
        artifactName: 'solutionArtifact'

- stage: ImportSolution
  dependsOn: ExportSolution
  jobs:
  - job: Import
    steps:
    - task: DownloadBuildArtifacts@0
      inputs:
        artifactName: 'solutionArtifact'
    - task: PowerPlatformImportSolution@2
      inputs:
        authenticationType: 'PowerPlatformSPN'
        PowerPlatformSPN: 'MyServiceConnection'
        environmentUrl: '$(EnvironmentUrl)'
        solutionInputFile: '$(Pipeline.Workspace)/solutionArtifact/$(SolutionName).zip'

 Tips and Best Practices

  • Use variables/groups for managing credentials and URLs

  • Split pipelines by environment stages for approvals

  • Set Async Operations timeout for large solutions

  • Use PAC CLI locally for troubleshooting before automating


 Additional Resources

Here are some helpful links I relied on:


 Final Thoughts

This experience really showcased the power of DevOps in enterprise Dynamics 365 development. With a properly set up pipeline, deployments become repeatable, reliable, and consistent. If you're just getting started, I highly recommend playing with PAC CLI locally before configuring your pipelines.

Have you tried DevOps with Dynamics 365? Feel free to share your thoughts or questions!


Tuesday, May 13, 2025

From Campaign Chaos to Customer Connection: How the New Dynamics 365 Marketing Changes Are Revolutionizing Engagement

 

๐ŸŒŸ The Backstory: A Marketing Manager’s Wake-Up Call

Last quarter, Amanda, a seasoned Marketing Manager at a mid-sized retail company, was frustrated.

She had just wrapped up a campaign that should have driven conversions. But the numbers told a different story—email open rates were low, customer journeys weren’t converting, and real-time decisions were more of a dream than reality.

That’s when she saw the update notification for Microsoft Dynamics 365 Marketing.

Curious (and a bit desperate), Amanda clicked in—and what she found changed how her team approached marketing forever.

Welcome to the new Dynamics 365 Marketing, where personalization is smarter, journeys are real-time, and data drives every move.


๐Ÿš€ What’s New in Dynamics 365 Marketing (Now Part of Customer Insights - Journeys)

Microsoft has integrated Dynamics 365 Marketing into Customer Insights – Journeys, creating a seamless platform for data-driven, real-time customer experiences.

Here are the game-changing updates:


๐Ÿ’ก 1. Real-Time Marketing is Now the Default Experience

Old Way: Outbound marketing was the primary model—scheduled campaigns, static segments.

New Way: Real-time marketing is now front and center, allowing businesses to trigger journeys instantly based on customer actions.

Key Features:

  • Event-triggered journeys (e.g., form submissions, purchases)

  • Dynamic content personalization

  • AI-powered channel selection

๐Ÿ”— Learn more about real-time marketing


๐Ÿ”„ 2. Unified Customer Data with Dynamics 365 Customer Insights

By combining Customer Insights - Data and Customer Insights - Journeys, marketers now have a 360° customer view that updates in real-time.

๐Ÿ’ฅ Benefits:

  • Unified profiles from multiple data sources

  • AI-enriched segments

  • Seamless handoff between sales and marketing teams

๐Ÿ”— Unified Customer Profile Documentation


✍️ 3. Enhanced Personalization with Copilot

Microsoft’s Copilot for Dynamics 365 Marketing introduces AI-powered content creation and suggestions.

๐Ÿง  Capabilities:

  • Auto-generate email content based on prompts

  • Recommend subject lines to increase open rates

  • Analyze campaign effectiveness with natural language queries

๐Ÿ“˜ Explore Copilot in Marketing


๐Ÿ” 4. New Channel Integrations

Customers don’t live in just one inbox—and now, neither do your campaigns.

๐Ÿ“ฑ Channel Updates:

  • SMS powered by Azure Communication Services

  • In-app messaging and push notifications

  • Microsoft Teams events integration

๐Ÿ“˜ Channel Capabilities in Real-Time Marketing


๐Ÿ“Š 5. Revamped Analytics & Reporting

Goodbye basic charts—hello deep insights. The new updates bring:

  • Journey-level insights

  • Customer path analysis

  • A/B testing results

  • Power BI integration for advanced dashboards

๐Ÿ“˜ Analyze Customer Journeys


๐Ÿง  From Amanda’s Lens: What Changed for Her Team?

With real-time journeys and AI-powered insights, Amanda’s team:

  • Reduced campaign creation time by 40%

  • Increased email open rates by 27%

  • Personalized outreach for every lead, at scale

In her words:

“It feels like we finally have a marketing engine that thinks with us, not just for us.”


๐Ÿ’ฌ Final Thoughts: Why You Should Care

Whether you're a marketing director at a global enterprise or a CRM lead at a non-profit, the new Dynamics 365 Marketing experience empowers you to connect, convert, and captivate like never before.

๐Ÿ”— Get started with Customer Insights – Journeys


๐Ÿ“ฃ Ready to Level Up?

If you're already using Dynamics 365 Marketing, explore the upgrade path to Customer Insights – Journeys. If not, this might be the perfect time to reimagine your marketing tech stack.

๐Ÿ‘‰ For a hands-on feel, start with Microsoft’s Customer Insights – Journeys Trial.

Monday, May 12, 2025

How I Modernized an 8-Year-Old .NET Solution Using .NET Upgrade Assistant

“20+ projects. .NET Framework 4.6. Legacy dependencies. And a deadline to move everything to .NET 8.”

Recently, I began the ambitious journey of migrating an 8-year-old enterprise solution—a massive monolith with over 20 interconnected projects, built on .NET Framework 4.6, using WCF, old-school config files, and long-abandoned NuGet packages.

The goal?
✔️ Modernize the solution
✔️ Make it cloud-ready
✔️ Target .NET 8
✔️ Run cross-platform

At first, it felt like staring at a mountain with no visible trail. Rewriting everything from scratch wasn’t an option. I needed a guided, gradual approach—something to help me lift and shift without breaking everything in the process.

That's when I discovered the .NET Upgrade Assistant.


๐Ÿš€ Enter: .NET Upgrade Assistant

This tool, provided by Microsoft, is a command-line utility that guides you through upgrading your existing .NET Framework or .NET Core projects to modern .NET versions (6, 7, or 8).

What makes it special is that it doesn’t just convert your project file—it walks through your entire solution, project by project, making incremental, intelligent suggestions and transformations.

๐Ÿ“˜ Official Docs:

๐Ÿ‘‰ https://learn.microsoft.com/en-us/dotnet/upgrade-assistant/


๐Ÿ’ก Why Use .NET Upgrade Assistant?

Here’s what stood out to me:

  • Step-by-step CLI guidance instead of just scripts

  • Automated backup of your solution

  • Dependency analysis and recommendations

  • Target framework upgrades to .NET 6, 7, or 8

  • Support for ASP.NET MVC, WPF, WinForms, Class Libraries, etc.

  • Great integration with modern tools like try-convert, analyzers, and Roslyn-based refactoring


๐Ÿ› ️ Step-by-Step: My Upgrade Journey

Step 1: Installing the Assistant

I started by installing the tool globally:

dotnet tool install -g upgrade-assistant

To ensure I always had the latest version:

dotnet tool update -g upgrade-assistant

Step 2: Running the Upgrade

I moved into my solution directory and ran:

upgrade-assistant upgrade MyLegacySolution.sln

It launched an interactive experience—asking which project to upgrade first, what changes to apply, and whether I wanted to proceed step-by-step.

The tool processed each project by:

  • Updating TargetFramework to net8.0

  • Migrating from packages.config to <PackageReference>

  • Replacing web.config with appsettings.json (for ASP.NET)

  • Notifying me of deprecated APIs

  • Updating project references


Step 3: Handling the Unexpected

Of course, some projects didn’t upgrade cleanly:

  • A few third-party NuGet packages weren’t compatible with .NET 8.

  • WCF references required rewrites or moving to gRPC or REST.

  • Some AppDomain and Remoting APIs had no direct equivalent.

For each issue, the Upgrade Assistant flagged the problem and left comments in the code or console to guide manual intervention.

I also leaned on these helpful docs:


Step 4: Testing & Tuning

After upgrading:

  • I ran all unit and integration tests (yes, we had a decent suite!)

  • Manually tested critical app paths

  • Removed obsolete dependencies

  • Modernized logging to use Microsoft.Extensions.Logging

  • Replaced Web API methods with Minimal APIs


✅ Benefits I Saw Firsthand

Using the Upgrade Assistant saved me weeks of effort and helped me maintain confidence throughout the process.

Here’s what I gained:

Benefit Impact
⚙️ Incremental Upgrades Focused on one project at a time
⏱️ Time Savings Automated 60–70% of migration work
๐Ÿง  Developer Awareness Better understanding of what changed in modern .NET
๐Ÿ”’ Security Moved away from unsupported frameworks
☁️ Cloud-Ready Easy to deploy via Docker + Azure App Service

๐Ÿงญ My Advice for You

  • Take a backup (or commit everything before you start)

  • Use upgrade-assistant analyze to scan your solution beforehand

  • Upgrade class libraries first, then consumers like web apps

  • Expect manual tweaks—this tool gets you 80% there

  • Don't forget to update your DevOps pipeline, if applicable


๐Ÿงต Conclusion

Migrating a large legacy .NET Framework solution to .NET 8 might seem overwhelming—but it doesn't have to be a full rewrite or a leap into the unknown. With the .NET Upgrade Assistant, I found a structured, guided path that made the journey manageable and insightful.

It won’t magically fix every line of code, but it will illuminate the path, project by project, and help you bring your software into the modern .NET era.

If you're holding off on your upgrade—this is your sign to get started.


๐Ÿงฐ Helpful Links