diff --git a/.azure/pipelines/ci.yml b/.azure/pipelines/ci.yml
index cdac5c8346b5eb8d0fc1a3aedea9c05c6f35f3b6..99c6daae90232257a8efdc45f7dddcc08d727709 100644
--- a/.azure/pipelines/ci.yml
+++ b/.azure/pipelines/ci.yml
@@ -244,12 +244,27 @@ stages:
                 -noBuildNative
                 /p:DotNetSignType=$(_SignType)
                 $(_BuildArgs)
-                $(_PublishArgs)
                 $(_InternalRuntimeDownloadArgs)
-                /p:PublishInstallerBaseVersion=true
                 $(WindowsInstallersLogArgs)
         displayName: Build Installers
 
+      # Windows installers bundle and sharedfx msi for arm64
+      - script: ./eng/build.cmd
+                -ci
+                -noBuildRepoTasks
+                -arch arm64
+                -sign
+                -buildInstallers
+                -noBuildNative
+                /p:DotNetSignType=$(_SignType)
+                /p:AssetManifestFileName=aspnetcore-win.xml
+                $(_BuildArgs)
+                $(_PublishArgs)
+                /p:PublishInstallerBaseVersion=true
+                $(_InternalRuntimeDownloadArgs)
+                $(WindowsArm64InstallersLogArgs)
+        displayName: Build ARM64 Installers
+
       # A few files must also go to the VS package feed.
       - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), ne(variables.PostBuildSign, 'true')) }}:
         - task: NuGetCommand@2