<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Migration | The .NET Blog</title><link>https://thedotnetblog.com/tags/migration/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>en</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/tags/migration/index.xml" rel="self" type="application/rss+xml"/><item><title>Removing the Monkey Work of Migration with Agentic Platform Engineering</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/agentic-platform-engineering-migration-automation/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/agentic-platform-engineering-migration-automation/</guid><description>Git-Ape walks through migrating a real AWS Terraform deployment to Azure Bicep — extracting deployment intent and remapping architecture rather than doing a 1:1 syntax conversion.</description><content:encoded>&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/all-things-azure/removing-the-monkey-work-of-migration-using-agentic-platform-engineering/"&gt;Removing the Monkey Work of Migration with Agentic Platform Engineering&lt;/a&gt; — a walkthrough of Git-Ape (git agentic platform engineering tool) migrating a real AWS Terraform repo to Azure, focusing on intent extraction rather than line-by-line conversion.&lt;/p&gt;
&lt;h2 id="the-input-contoso-migration"&gt;The input: contoso-migration&lt;/h2&gt;
&lt;p&gt;The source is a real Terraform project (&lt;code&gt;contoso-migration&lt;/code&gt;) that deploys a Next.js app on AWS — EC2 for compute, ALB for load balancing, S3 for artifacts, and IAM keys for identity. Cost: ~$34/month. The goal isn&amp;rsquo;t to reproduce the same infrastructure on Azure; it&amp;rsquo;s to figure out what the deployment is actually trying to do and rebuild that on Azure-native services.&lt;/p&gt;
&lt;h2 id="step-1-validation-and-auth"&gt;Step 1: Validation and auth&lt;/h2&gt;
&lt;p&gt;Git-Ape starts by validating all required CLI tools — &lt;code&gt;az&lt;/code&gt;, &lt;code&gt;aws&lt;/code&gt;, &lt;code&gt;gh&lt;/code&gt;, &lt;code&gt;jq&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt; — and confirming active auth sessions before touching anything. No partial runs.&lt;/p&gt;
&lt;h2 id="step-2-intent-extraction"&gt;Step 2: Intent extraction&lt;/h2&gt;
&lt;p&gt;The agent reads the entire source repo through the GitHub API and extracts the deployment intent: runtime (Node.js), compute type, ingress pattern, artifact handling, identity model, networking, and monitoring. This is the key step — it&amp;rsquo;s building a semantic model of what the deployment does, not what Terraform keywords it uses.&lt;/p&gt;
&lt;h2 id="step-3-service-mapping"&gt;Step 3: Service mapping&lt;/h2&gt;
&lt;p&gt;AWS services get mapped to Azure equivalents:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EC2 → App Service (Linux, Node 20 LTS)&lt;/li&gt;
&lt;li&gt;ALB → App Service built-in load balancing&lt;/li&gt;
&lt;li&gt;IAM roles/keys → Managed Identity&lt;/li&gt;
&lt;li&gt;Terraform → Bicep + GitHub Actions&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="step-4-critique-agent"&gt;Step 4: Critique agent&lt;/h2&gt;
&lt;p&gt;Before generating output, a critique agent runs and catches two blocking issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Build-on-startup anti-pattern&lt;/strong&gt; — the original Terraform was running &lt;code&gt;npm install &amp;amp;&amp;amp; npm run build&lt;/code&gt; on EC2 at startup. Fix: build in CI, deploy a ready artifact.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unnecessary Blob Storage&lt;/strong&gt; — S3 was used for artifact staging that could be eliminated with proper CI/CD. The critique agent dropped it entirely.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="step-5-generated-output"&gt;Step 5: Generated output&lt;/h2&gt;
&lt;p&gt;The result is ~80 lines of Bicep instead of the original 200+ lines of Terraform. The agent created a new GitHub repo with &lt;code&gt;infra/main.bicep&lt;/code&gt; and &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt; and removed all AWS-specific files.&lt;/p&gt;
&lt;h2 id="security-posture-comparison"&gt;Security posture comparison&lt;/h2&gt;
&lt;p&gt;The migration also produced a meaningful security upgrade:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;AWS original&lt;/th&gt;
&lt;th&gt;Azure output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HTTP only&lt;/td&gt;
&lt;td&gt;HTTPS only, TLS 1.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH open to 0.0.0.0/0&lt;/td&gt;
&lt;td&gt;No SSH exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IAM access keys&lt;/td&gt;
&lt;td&gt;OIDC + Managed Identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No monitoring&lt;/td&gt;
&lt;td&gt;Application Insights&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Cost: ~$13/month vs the original $34/month.&lt;/p&gt;
&lt;h2 id="what-makes-this-different-from-a-syntax-converter"&gt;What makes this different from a syntax converter&lt;/h2&gt;
&lt;p&gt;The critique agent step is what separates this from a mechanical translation. It caught patterns that would have worked on AWS but would be wrong on Azure — and fixed them instead of replicating them. The output isn&amp;rsquo;t &amp;ldquo;AWS in Azure syntax&amp;rdquo;; it&amp;rsquo;s an Azure-native deployment that achieves the same goal more cleanly.&lt;/p&gt;
&lt;p&gt;See the &lt;a href="https://devblogs.microsoft.com/all-things-azure/removing-the-monkey-work-of-migration-using-agentic-platform-engineering/"&gt;full walkthrough&lt;/a&gt; for the complete agent trace and generated files.&lt;/p&gt;</content:encoded></item><item><title>GitHub Copilot's Modernization Assessment Is the Best Migration Tool You're Not Using Yet</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/</guid><description>GitHub Copilot's modernization extension doesn't just suggest code changes — it produces a full migration assessment with actionable issues, Azure target comparisons, and a collaborative workflow. Here's why the assessment document is the key to everything.</description><content:encoded>&lt;p&gt;Migrating a legacy .NET Framework app to modern .NET is one of those tasks everyone knows they should do but nobody wants to start. It&amp;rsquo;s never just &amp;ldquo;change the target framework.&amp;rdquo; It&amp;rsquo;s APIs that disappeared, packages that don&amp;rsquo;t exist anymore, hosting models that work completely differently, and a million small decisions about what to containerize, what to rewrite, and what to leave alone.&lt;/p&gt;
&lt;p&gt;Jeffrey Fritz just published a &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;deep dive into GitHub Copilot&amp;rsquo;s modernization assessment&lt;/a&gt;, and honestly? This is the best migration tooling I&amp;rsquo;ve seen for .NET. Not because of the code generation — that&amp;rsquo;s table stakes now. Because of the assessment document it produces.&lt;/p&gt;
&lt;h2 id="its-not-just-a-code-suggestion-engine"&gt;It&amp;rsquo;s not just a code suggestion engine&lt;/h2&gt;
&lt;p&gt;The VS Code extension follows an &lt;strong&gt;Assess → Plan → Execute&lt;/strong&gt; model. The assessment phase analyzes your entire codebase and produces a structured document that captures everything: what needs to change, what Azure resources to provision, what deployment model to use. Everything downstream — infrastructure-as-code, containerization, deployment manifests — flows from what the assessment finds.&lt;/p&gt;
&lt;p&gt;The assessment is stored under &lt;code&gt;.github/modernize/assessment/&lt;/code&gt; in your project. Each run produces an independent report, so you build up a history and can track how your migration posture evolves as you fix issues.&lt;/p&gt;
&lt;h2 id="two-ways-to-start"&gt;Two ways to start&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Recommended Assessment&lt;/strong&gt; — the fast path. Pick from curated domains (Java/.NET Upgrade, Cloud Readiness, Security) and get meaningful results without touching configuration. Great for a first look at where your app stands.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Custom Assessment&lt;/strong&gt; — the targeted path. Configure exactly what to analyze: target compute (App Service, AKS, Container Apps), target OS, containerization analysis. Pick multiple Azure targets to compare migration approaches side-by-side.&lt;/p&gt;
&lt;p&gt;That comparison view is genuinely useful. An app with 3 mandatory issues for App Service might have 7 for AKS. Seeing both helps drive the hosting decision before you commit to a migration path.&lt;/p&gt;
&lt;h2 id="the-issue-breakdown-is-actionable"&gt;The issue breakdown is actionable&lt;/h2&gt;
&lt;p&gt;Each issue comes with a criticality level:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mandatory&lt;/strong&gt; — must fix or migration fails&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Potential&lt;/strong&gt; — might impact migration, needs human judgment&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optional&lt;/strong&gt; — recommended improvements, won&amp;rsquo;t block migration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And each issue links to affected files and line numbers, provides a detailed description of what&amp;rsquo;s wrong and why it matters for your target platform, gives concrete remediation steps (not just &amp;ldquo;fix this&amp;rdquo;), and includes links to official documentation.&lt;/p&gt;
&lt;p&gt;You can hand individual issues to developers and they have everything they need to act. That&amp;rsquo;s the difference between a tool that tells you &amp;ldquo;there&amp;rsquo;s a problem&amp;rdquo; and one that tells you how to solve it.&lt;/p&gt;
&lt;h2 id="the-upgrade-paths-covered"&gt;The upgrade paths covered&lt;/h2&gt;
&lt;p&gt;For .NET specifically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.NET Framework → .NET 10&lt;/li&gt;
&lt;li&gt;ASP.NET → ASP.NET Core&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each upgrade path has detection rules that know which APIs were removed, which patterns have no direct equivalent, and what security issues need attention.&lt;/p&gt;
&lt;p&gt;For teams managing multiple apps, there&amp;rsquo;s also a CLI that supports multi-repo batch assessments — clone all repos, assess them all, get per-app reports plus an aggregated portfolio view.&lt;/p&gt;
&lt;h2 id="my-take"&gt;My take&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re sitting on legacy .NET Framework apps (and let&amp;rsquo;s be real, most enterprise teams are), this is &lt;em&gt;the&lt;/em&gt; tool to start with. The assessment document alone is worth the time — it turns a vague &amp;ldquo;we should modernize&amp;rdquo; into a concrete, prioritized list of work items with clear paths forward.&lt;/p&gt;
&lt;p&gt;The collaborative workflow is smart too: export assessments, share with your team, import them without re-running. Architecture reviews where the decision-makers aren&amp;rsquo;t the ones running the tools? Covered.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;GitHub Copilot&amp;rsquo;s modernization assessment transforms .NET migration from a scary, undefined project into a structured, trackable process. Start with a recommended assessment to see where you stand, then use custom assessments to compare Azure targets and build your migration plan.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;full walkthrough&lt;/a&gt; and grab the &lt;a href="https://aka.ms/ghcp-appmod/vscode-ext"&gt;VS Code extension&lt;/a&gt; to try it on your own codebase.&lt;/p&gt;</content:encoded></item></channel></rss>