Skip to content

Add win-arm64 and linux-arm64 to CLI native archive build matrix#15599

Open
davidfowl wants to merge 3 commits intorelease/13.2from
davidfowl/more-arch
Open

Add win-arm64 and linux-arm64 to CLI native archive build matrix#15599
davidfowl wants to merge 3 commits intorelease/13.2from
davidfowl/more-arch

Conversation

@davidfowl
Copy link
Contributor

@davidfowl davidfowl commented Mar 26, 2026

Description

Adds win-arm64 and linux-arm64 native CLI archive builds to the CI pipeline, and fixes architecture detection for test runners.

Currently only linux-x64, win-x64, and osx-arm64 are built, which means the dogfood script and release bundles have no arm64 binaries for Windows or Linux.

Changes

build-cli-native-archives.yml

  • Added linux-arm64 target on ubuntu-24.04-arm runner
  • Added win-arm64 target on windows-11-arm runner
  • Updated default matrix description
  • Changed job name to use RID instead of OS for unique display names

tests.yml

  • Added build_cli_archive_linux_arm64 and build_cli_archive_windows_arm64 jobs (following existing per-OS pattern)
  • Wired new jobs into the results final status check

run-tests.yml

  • Fixed RID computation to use runner.arch in addition to runner.os, so arm64 runners download the correct architecture-specific NuGet packages instead of always assuming x64

The new jobs run in parallel with existing builds, so they don't increase overall CI wall time.

Related to #15529 (cross-compiled CLI bundles missing DCP).

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected.
  • Are you including unit tests for the changes and scenario tests if relevant?
    • Yes
    • No — CI workflow change only
  • Did you add public API?
    • No
  • Does the change make any security assumptions or guarantees?
    • No
  • Does the change require an update in our Aspire docs?
    • No

Add native arm64 build targets to the CI pipeline so the dogfood script
and release bundles include arm64 CLI binaries:

- win-arm64 on windows-11-arm runner
- linux-arm64 on ubuntu-24.04-arm runner

Updates build-cli-native-archives.yml default matrix and adds per-OS
build jobs in tests.yml following the existing pattern.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings March 26, 2026 05:10
@github-actions
Copy link
Contributor

github-actions bot commented Mar 26, 2026

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 15599

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 15599"

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Extends the CI workflows to produce native Aspire CLI archive builds for additional ARM64 platforms, so release/dogfood bundles include Windows/Linux ARM64 binaries alongside existing x64/macOS builds.

Changes:

  • Add linux-arm64 and win-arm64 targets to the reusable native-archive workflow’s default build matrix.
  • Add corresponding ARM64 archive jobs to tests.yml and include them in the final “results” gate.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

File Description
.github/workflows/tests.yml Adds Linux/Windows ARM64 native CLI archive jobs and wires them into the final results job dependencies.
.github/workflows/build-cli-native-archives.yml Expands the default targets matrix to include linux-arm64 and win-arm64 native archive builds.
Comments suppressed due to low confidence (1)

.github/workflows/tests.yml:74

  • In the targets JSON, os is set to windows-latest but the runner label is windows-11-arm. If os is intended to be a display value, this currently hides that the build is running on Windows ARM64 and can lead to ambiguous/duplicate job names in the called workflow. Consider aligning os with the runner/actual platform, or relying on rids/runner for display in the reusable workflow.
    uses: ./.github/workflows/build-cli-native-archives.yml
    with:
      versionOverrideArg: ${{ inputs.versionOverrideArg }}
      targets: '[{"os": "windows-latest", "runner": "windows-11-arm", "rids": "win-arm64"}]'

Comment on lines 21 to 25
{"os": "ubuntu-latest", "runner": "8-core-ubuntu-latest", "rids": "linux-x64"},
{"os": "ubuntu-latest", "runner": "ubuntu-24.04-arm", "rids": "linux-arm64"},
{"os": "windows-latest", "runner": "windows-latest", "rids": "win-x64"},
{"os": "windows-latest", "runner": "windows-11-arm", "rids": "win-arm64"},
{"os": "macos-latest", "runner": "macos-latest", "rids": "osx-arm64"}
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The default targets array now has multiple entries with the same os value (ubuntu-latest for both linux-x64/linux-arm64 and windows-latest for both win-x64/win-arm64). Since the matrix job name is Build CLI (${{ matrix.targets.os }}), this will create duplicate job names in the Actions UI, making it hard to tell which RID/runner failed. Consider changing the job name to include ${{ matrix.targets.rids }} (and/or ${{ matrix.targets.runner }}), or make the os field unique per target (or drop it if it’s only used for display).

Copilot uses AI. Check for mistakes.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed — changed job name to Build CLI (${{ matrix.targets.rids }}) so each target gets a unique name like "Build CLI (linux-arm64)".

Comment on lines +52 to +56
uses: ./.github/workflows/build-cli-native-archives.yml
with:
versionOverrideArg: ${{ inputs.versionOverrideArg }}
targets: '[{"os": "ubuntu-latest", "runner": "ubuntu-24.04-arm", "rids": "linux-arm64"}]'

Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the targets JSON, os is set to ubuntu-latest while the actual runner label is ubuntu-24.04-arm. Since the reusable workflow currently uses matrix.targets.os in the job name, this ends up mislabeling the ARM64 build as “ubuntu-latest” (and can contribute to duplicate names). Consider setting os to match the runner/actual platform, or updating the reusable workflow to use rids/runner for display instead of os.

This issue also appears on line 70 of the same file.

Copilot uses AI. Check for mistakes.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed — the reusable workflow job name now uses matrix.targets.rids instead of matrix.targets.os, so it displays correctly regardless of the os field value.

davidfowl and others added 2 commits March 25, 2026 22:16
Address review feedback: with multiple targets sharing the same 'os'
value, the job name 'Build CLI (ubuntu-latest)' appeared twice. Switch
to matrix.targets.rids for unique names like 'Build CLI (linux-arm64)'.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The RID computation hardcoded x64 for Linux and Windows, which would
download wrong-arch NuGet packages if tests ever run on arm64 runners.
Use runner.os + runner.arch to correctly map to the target RID.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions
Copy link
Contributor

🎬 CLI E2E Test Recordings — 51 recordings uploaded (commit 6343f2b)

View recordings
Test Recording
AddPackageInteractiveWhileAppHostRunningDetached ▶️ View Recording
AddPackageWhileAppHostRunningDetached ▶️ View Recording
AgentCommands_AllHelpOutputs_AreCorrect ▶️ View Recording
AgentInitCommand_DefaultSelection_InstallsSkillOnly ▶️ View Recording
AgentInitCommand_MigratesDeprecatedConfig ▶️ View Recording
AspireAddPackageVersionToDirectoryPackagesProps ▶️ View Recording
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps ▶️ View Recording
Banner_DisplayedOnFirstRun ▶️ View Recording
Banner_DisplayedWithExplicitFlag ▶️ View Recording
CertificatesClean_RemovesCertificates ▶️ View Recording
CertificatesTrust_WithNoCert_CreatesAndTrustsCertificate ▶️ View Recording
CertificatesTrust_WithUntrustedCert_TrustsCertificate ▶️ View Recording
ConfigSetGet_CreatesNestedJsonFormat ▶️ View Recording
CreateAndRunAspireStarterProject ▶️ View Recording
CreateAndRunAspireStarterProjectWithBundle ▶️ View Recording
CreateAndRunEmptyAppHostProject ▶️ View Recording
CreateAndRunJsReactProject ▶️ View Recording
CreateAndRunPythonReactProject ▶️ View Recording
CreateAndRunTypeScriptEmptyAppHostProject ▶️ View Recording
CreateAndRunTypeScriptStarterProject ▶️ View Recording
CreateStartAndStopAspireProject ▶️ View Recording
CreateTypeScriptAppHostWithViteApp ▶️ View Recording
DescribeCommandResolvesReplicaNames ▶️ View Recording
DescribeCommandShowsRunningResources ▶️ View Recording
DetachFormatJsonProducesValidJson ▶️ View Recording
DoctorCommand_DetectsDeprecatedAgentConfig ▶️ View Recording
DoctorCommand_WithSslCertDir_ShowsTrusted ▶️ View Recording
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted ▶️ View Recording
GlobalMigration_HandlesCommentsAndTrailingCommas ▶️ View Recording
GlobalMigration_HandlesMalformedLegacyJson ▶️ View Recording
GlobalMigration_PreservesAllValueTypes ▶️ View Recording
GlobalMigration_SkipsWhenNewConfigExists ▶️ View Recording
GlobalSettings_MigratedFromLegacyFormat ▶️ View Recording
InvalidAppHostPathWithComments_IsHealedOnRun ▶️ View Recording
LegacySettingsMigration_AdjustsRelativeAppHostPath ▶️ View Recording
LogsCommandShowsResourceLogs ▶️ View Recording
PsCommandListsRunningAppHost ▶️ View Recording
PsFormatJsonOutputsOnlyJsonToStdout ▶️ View Recording
PublishWithDockerComposeServiceCallbackSucceeds ▶️ View Recording
RestoreGeneratesSdkFiles ▶️ View Recording
RunFromParentDirectory_UsesExistingConfigNearAppHost ▶️ View Recording
RunWithMissingAwaitShowsHelpfulError ▶️ View Recording
SecretCrudOnDotNetAppHost ▶️ View Recording
SecretCrudOnTypeScriptAppHost ▶️ View Recording
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels ▶️ View Recording
StopAllAppHostsFromAppHostDirectory ▶️ View Recording
StopAllAppHostsFromUnrelatedDirectory ▶️ View Recording
StopNonInteractiveMultipleAppHostsShowsError ▶️ View Recording
StopNonInteractiveSingleAppHost ▶️ View Recording
StopWithNoRunningAppHostExitsSuccessfully ▶️ View Recording
TypeScriptAppHostWithProjectReferenceIntegration ▶️ View Recording

📹 Recordings uploaded automatically from CI run #23578848784

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants