{"id":569,"date":"2026-08-08T23:42:24","date_gmt":"2026-08-08T23:42:24","guid":{"rendered":"https:\/\/windows-vps.org\/blog\/?p=569"},"modified":"2026-08-08T23:42:24","modified_gmt":"2026-08-08T23:42:24","slug":"windows-vps-dotnet-cicd-build-agent","status":"publish","type":"post","link":"https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/","title":{"rendered":"Windows VPS for .NET Development: Setting Up a CI\/CD Build Agent on Windows Server"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">If your .NET projects still build on a developer&#8217;s laptop, you are one hard drive failure away from a stalled release. A Windows VPS running a self-hosted build agent gives your CI\/CD pipeline a consistent, always-on environment where MSBuild, NuGet, and the .NET SDK behave exactly as they do on a developer workstation. This guide covers why .NET builds need Windows at all, how to install a GitHub Actions runner or Azure DevOps agent on Windows Server 2022, and how much RAM and CPU to budget for parallel builds. If you are still choosing hardware, the <a href=\"https:\/\/windows-vps.org\/#providers\">Windows VPS provider comparison<\/a> lists plans suitable for build agents.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why .NET Builds Belong on a Windows Agent<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Modern .NET (Core\/5+) is cross-platform, so you <em>can<\/em> compile most console and web apps on Linux runners. But a surprisingly large share of real-world .NET workloads still needs Windows:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>.NET Framework projects<\/strong> (net48 and earlier) require MSBuild with the .NET Framework reference assemblies, which only ship on Windows.<\/li>\n<li><strong>WPF, WinForms, and Windows services<\/strong> compile Windows-specific targets and run their test suites on Windows only.<\/li>\n<li><strong>NuGet restore<\/strong> behaves identically everywhere, but package caches and native assets (e.g. <code>Microsoft.WindowsDesktop.App<\/code> runtimes) are far happier on Windows.<\/li>\n<li><strong>IIS deployment steps<\/strong> (Web Deploy, <code>msdeploy.exe<\/code>) in Azure DevOps or GitHub Actions run natively on a Windows agent without workarounds.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In short: a Windows build agent is the environment where your artifacts are actually produced, so it should match production. If you are weighing Windows vs. Linux for .NET workloads generally, our comparison of <a href=\"https:\/\/windows-vps.org\/blog\/windows-vps-vs-linux-vps-for-dotnet-development-which-to-choose\/\">Windows vs Linux VPS for .NET development<\/a> covers the broader trade-offs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Provision the VPS and Install Build Tooling<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Order a Windows Server 2022 (or 2025) VPS with at least 4 GB of RAM and 2 vCPUs for a single build agent \u2014 the sizing table below explains the math. After your first RDP login, install the toolchain in this order:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Git<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>winget install --id Git.Git -e --silent<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. .NET SDK<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Install the SDKs matching the projects you build. The dotnet-install script works well for exact versions:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># PowerShell (x64, installs to C:\\Program Files\\dotnet)\nInvoke-WebRequest https:\/\/dot.net\/v1\/dotnet-install.ps1 -UseBasicParsing | iex\ndotnet --list-sdks<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. Visual Studio Build Tools (for .NET Framework \/ MSBuild workloads)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># Download vs_BuildTools.exe from https:\/\/aka.ms\/vs\/17\/release\/vs_BuildTools.exe\n.\\vs_BuildTools.exe --quiet --wait --norestart --nocache ^\n  --add Microsoft.VisualStudio.Workload.MSBuildTools ^\n  --add Microsoft.VisualStudio.Workload.NetCoreBuildTools ^\n  --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verify MSBuild is discoverable by the agent: run <code>vswhere.exe<\/code> (in <code>C:\\Program Files (x86)\\Microsoft Visual Studio\\Installer<\/code>) to find the MSBuild path and add it to the machine <code>PATH<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Install a GitHub Actions Self-Hosted Runner<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In your repository go to <strong>Settings &gt; Actions &gt; Runners &gt; New self-hosted runner<\/strong>, choose Windows x64, and copy the download URL and token. Then on the VPS:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir C:\\actions-runner; cd C:\\actions-runner\nInvoke-WebRequest -Uri https:\/\/github.com\/actions\/runner\/releases\/download\/v2.327.1\/actions-runner-win-x64-2.327.1.zip -OutFile runner.zip\nExpand-Archive runner.zip -DestinationPath . -Force\n.\\config.cmd --url https:\/\/github.com\/your-org\/your-repo --token YOUR_TOKEN\n.\\run.cmd   # interactive test run<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once the test run shows <em>&#8220;Listening for Jobs&#8221;<\/em>, install it as a Windows service so it survives reboots and logoffs:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd C:\\actions-runner\n.\\svc.cmd install\n.\\svc.cmd start\nGet-Service -Name 'actions.runner.*'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For Azure DevOps, the equivalent is the <code>vsts-agent-win-x64<\/code> package: run <code>config.cmd<\/code> with the organization URL and a Personal Access Token scoped to <em>Agent Pools (read, manage)<\/em>, then <code>.\\run.cmd<\/code>. Both agents support multiple parallel workers by configuring the agent pool&#8217;s parallelism \u2014 but parallelism is bounded by your RAM and CPU, not by the software.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Size the VPS for Parallel Builds<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">MSBuild parallelizes via <code>\/m<\/code> and each concurrent agent job is a separate process tree. A rough sizing model for a .NET build agent:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Parallel jobs<\/th><th>vCPU<\/th><th>RAM<\/th><th>Disk (with NuGet cache)<\/th><th>Typical VPS tier<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>2<\/td><td>4 GB<\/td><td>40 GB<\/td><td>Entry-level Windows VPS<\/td><\/tr><tr><td>2<\/td><td>4<\/td><td>8 GB<\/td><td>80 GB<\/td><td>Mid-range<\/td><\/tr><tr><td>4<\/td><td>8<\/td><td>16 GB<\/td><td>160 GB<\/td><td>High-end<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Budget extra disk for <code>%LocalAppData%\\NuGet\\Cache<\/code> (easily 10\u201320 GB after a few big restores) and for <code>_work<\/code> directories left behind by failed builds. Set a cleanup job: <code>Get-ChildItem C:\\actions-runner\\_work -Directory | Remove-Item -Recurse -Force<\/code> on a weekly schedule. Compare <a href=\"https:\/\/windows-vps.org\/#features\">full specs and pricing across providers<\/a> before committing \u2014 the cheapest plan often skimps on exactly the disk you will need.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Isolate the Agent<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A build agent executes arbitrary code from your repositories, so treat it as a semi-trusted workload:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dedicated service account<\/strong>: create <code>svc-agent<\/code> with a long password, add it to <em>Remote Desktop Users<\/em> only \u2014 never Administrators. Register the runner service under that account.<\/li>\n<li><strong>One agent per VPS<\/strong>: do not mix a production IIS host with a build agent. A compromised pipeline step would otherwise land inside your web server.<\/li>\n<li><strong>Firewall<\/strong>: the agent only makes outbound HTTPS connections (443) to GitHub\/Azure DevOps; block inbound RDP from the internet and connect over a VPN or jump host instead.<\/li>\n<li><strong>Secrets<\/strong>: store deployment credentials in the CI system&#8217;s secret store, never in <code>appsettings<\/code> or <code>web.config<\/code> committed to the repo. For a full threat model of exposing services on a Windows VPS, see our <a href=\"https:\/\/windows-vps.org\/blog\/how-to-secure-windows-vps-essential-settings\/\">essential Windows VPS security settings<\/a> guide.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Wrap-Up<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A self-hosted Windows build agent removes the flakiest part of .NET delivery: the &#8220;works on my machine&#8221; gap. Provision a Windows Server VPS, install Git + .NET SDK + Build Tools, register a GitHub Actions or Azure DevOps runner as a service, and size for the parallelism you actually use. Start with 2 vCPUs \/ 4 GB and one job; scale up only when queue wait times hurt. For a budget-friendly starting point, <a href=\"https:\/\/vultr.com\/?ref=9804308-9J\" rel=\"noreferrer noopener sponsored\" target=\"_blank\">Vultr&#8217;s Windows VPS instances<\/a> deploy in about a minute and let you resize CPU and RAM as your pipeline grows.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>If your .NET projects still build on a developer&#8217;s laptop, you are one hard drive failure away from a stalled release. A Windows VPS running a self-hosted build agent gives your CI\/CD pipeline a consistent, always-on environment where MSBuild, NuGet, and the .NET SDK behave exactly as they do on a developer workstation. This guide &#8230; <a title=\"Windows VPS for .NET Development: Setting Up a CI\/CD Build Agent on Windows Server\" class=\"read-more\" href=\"https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/\" aria-label=\"Read more about Windows VPS for .NET Development: Setting Up a CI\/CD Build Agent on Windows Server\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":2,"footnotes":""},"categories":[5],"tags":[],"class_list":["post-569","post","type-post","status-publish","format-standard","hentry","category-tutorials-guides"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Windows VPS for .NET Development: Setting Up a CI\/CD Build Agent on Windows Server - Windows VPS Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Windows VPS for .NET Development: Setting Up a CI\/CD Build Agent on Windows Server\" \/>\n<meta property=\"og:description\" content=\"Windows VPS for .NET Development: Setting Up a CI\/CD Build Agent on Windows Server\" \/>\n<meta property=\"og:url\" content=\"https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/\" \/>\n<meta property=\"og:site_name\" content=\"Windows VPS Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-08T23:42:24+00:00\" \/>\n<meta name=\"author\" content=\"windows-vps\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"windows-vps\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/\",\"url\":\"https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/\",\"name\":\"Windows VPS for .NET Development: Setting Up a CI\/CD Build Agent on Windows Server - Windows VPS Blog\",\"isPartOf\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/#website\"},\"datePublished\":\"2026-08-08T23:42:24+00:00\",\"author\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58\"},\"breadcrumb\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/windows-vps.org\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Windows VPS for .NET Development: Setting Up a CI\/CD Build Agent on Windows Server\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#website\",\"url\":\"https:\/\/windows-vps.org\/blog\/\",\"name\":\"Windows VPS Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/windows-vps.org\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58\",\"name\":\"windows-vps\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g\",\"caption\":\"windows-vps\"},\"sameAs\":[\"https:\/\/windows-vps.org\/blog\"],\"url\":\"https:\/\/windows-vps.org\/blog\/author\/myxiechengxuan\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Windows VPS for .NET Development: Setting Up a CI\/CD Build Agent on Windows Server - Windows VPS Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/","og_locale":"en_US","og_type":"article","og_title":"Windows VPS for .NET Development: Setting Up a CI\/CD Build Agent on Windows Server","og_description":"Windows VPS for .NET Development: Setting Up a CI\/CD Build Agent on Windows Server","og_url":"https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/","og_site_name":"Windows VPS Blog","article_published_time":"2026-08-08T23:42:24+00:00","author":"windows-vps","twitter_card":"summary_large_image","twitter_misc":{"Written by":"windows-vps","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/","url":"https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/","name":"Windows VPS for .NET Development: Setting Up a CI\/CD Build Agent on Windows Server - Windows VPS Blog","isPartOf":{"@id":"https:\/\/windows-vps.org\/blog\/#website"},"datePublished":"2026-08-08T23:42:24+00:00","author":{"@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58"},"breadcrumb":{"@id":"https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/windows-vps.org\/blog\/windows-vps-dotnet-cicd-build-agent\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/windows-vps.org\/blog\/"},{"@type":"ListItem","position":2,"name":"Windows VPS for .NET Development: Setting Up a CI\/CD Build Agent on Windows Server"}]},{"@type":"WebSite","@id":"https:\/\/windows-vps.org\/blog\/#website","url":"https:\/\/windows-vps.org\/blog\/","name":"Windows VPS Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/windows-vps.org\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58","name":"windows-vps","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g","caption":"windows-vps"},"sameAs":["https:\/\/windows-vps.org\/blog"],"url":"https:\/\/windows-vps.org\/blog\/author\/myxiechengxuan\/"}]}},"_links":{"self":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/569","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/comments?post=569"}],"version-history":[{"count":1,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/569\/revisions"}],"predecessor-version":[{"id":572,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/569\/revisions\/572"}],"wp:attachment":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/media?parent=569"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/categories?post=569"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/tags?post=569"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}