Skip to content

[release/17.0] build: unify bundle build, publish and packaging in MSBuild - #22016

Closed
Mitch Denny (mitchdenny) wants to merge 1 commit into
mitchdenny-backport-17-0-18-pr21545from
mitchdenny-backport-17-0-19-pr21304
Closed

Mitch Denny (mitchdenny) wants to merge 1 commit into
mitchdenny-backport-17-0-18-pr21545from
mitchdenny-backport-17-0-19-pr21304

Conversation

@mitchdenny

Copy link
Copy Markdown
Member

Description

Backport of #21304 to release/17.0 (cherry-picked from 9b8d7c0 with no modifications). Layer 19 of 55 in the release/17.0 backport stack; stacked on #22015.

Backport recommendation: No — Large build-infrastructure refactor.

Backport of #21304

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
  • Did you add public API?
    • Yes
      • If yes, did you have an API Review for it?
        • Yes
        • No
      • Did you add <remarks /> and <code /> elements on your triple slash comments?
        • Yes
        • No
    • No
  • Does the change make any security assumptions or guarantees?
    • Yes
      • If yes, have you done a threat model and had a security review?
        • Yes
        • No
    • No

## Description

GitHub Actions and Azure Pipelines carry separate publish, signing, and
packaging steps for the same native bundle. This PR consolidates that
work in
`eng/Bundle.proj`, so both CI systems use one implementation instead of
growing
parallel lists of workflow and pipeline steps.

The shared MSBuild flow publishes the components, signs prepared
outputs,
assembles the embedded bundle, and builds and packages the native CLI.
Callers
supply their RID, version, configuration, and signing mode; component
reuse and
the ordering of those operations stay in the shared build.

CreateLayout accepts explicit prepared component paths so assembly uses
the
intended payload and fails on invalid explicit inputs. Components are
signed
before embedding, and the CLI is signed before distribution packaging.
Official Assemble signs the three Linux Dashboard NuGet containers and
stages
the four producer-signed Windows/macOS containers without modifying
them.

### Validation

Validation head: `97719af00186e44771ca776dd6871d621eea68f0`.
GitHub CI/native hosting tested merge
`e6b1aae613675bb356325fc2133b08c539805c94`,
whose parents are this head and target `100acc9` and whose source tree
matches
the head. Official and standalone builds pinned the exact head.

Upstream main subsequently advanced to `be803a1`. A fresh merge-tree
check
found no conflicts with this head, without changing the branch, index,
or
worktree. Integration with that newer base has not been rebuilt or
retested;
the runs below cover the explicitly identified baseline.

**CI, native hosting, real signing, and independent artifact checks
passed.
The standalone full-solution build failed, and a broader local
coordinator
test run was incomplete; validation is not all green.**

| Check | Result |
|---|---|
| Focused layout, bundle wrapper, tray, routing, native-publishing, and
retry tests | **741 passed**, zero failed/skipped; macOS 27.2 ARM64, SDK
`11.0.100-rc.2.26504.105` |
| Incoming IDE-capability tests | **3 passed**, zero failed/skipped |
| [GitHub
CI](https://github.com/microsoft/aspire/actions/runs/41960698568) |
**Passed on attempt 1**; 443 successful jobs, 3 skipped, 446 total. All
**115 standard test-runner native-archive consumers** passed; another 53
extension/polyglot and 2 installer consumers also passed. |
| [Native
hosting](https://github.com/microsoft/aspire/actions/runs/41960699040) |
**Passed**; Linux native AOT/generated SDK, IPC, CLI, Docker/DCP,
Dashboard, Compose and cleanup scenarios; **81/81 Windows
product/named-pipe tests** |
| [Official signed build
3126923](https://dev.azure.com/dnceng/internal/_build/results?buildId=3126923)
| **Succeeded**, all six stages; seven producer logs and Assemble
ordering inspected; **159 final Microsoft Author-signed NuGet release
packages** verified in the pipeline |
| Downloaded GitHub products | **Passed**, six RID sets; **26 stable
artifact IDs**, archive/tool/npm binary equality, Dashboard
NuGet/runtime equality, architecture/permissions, ZIP integrity, and
installer hashes |
| Downloaded official products | **Passed**, seven RID sets; manifest
reconciliation of **159 NuGets/49 blobs**, nine SHA512 sidecars and
installer hashes; **7/7 independent Dashboard NuGet signature
verifications**; **3 Linux payloads preserved and 4 producer-signed
containers unchanged** |
| [Standalone full
build/pack](https://github.com/radical/aspire/actions/runs/41960989760)
| **Failed** with CS0618 in the AzureApiManagement playground AppHost.
Independent default Bundle diagnostics passed: native CLI,
extraction/repeat setup, **144 package ZIP/version checks**, Dashboard
HTTP, and TerminalHost RPC/cleanup. |

GitHub product version: `17.0.0-pr.21304.g97719af0`.
Official product version: `17.0.0-preview.1.26554.21`.

Detailed execution, artifact, failure, review, and limitation evidence:
[validation
report](#21304 (comment)).

Focused infrastructure command - **passed, 741/741**:

```bash
TMPDIR=/tmp DOTNET_ROOT="$PWD/.dotnet" MSBUILDTERMINALLOGGER=false \
./.dotnet/dotnet test \
  --project tests/Infrastructure.Tests/Infrastructure.Tests.csproj \
  --no-launch-profile -- \
  --filter-class '*.CreateLayoutTests' \
  --filter-class '*.TrayBundleTests' \
  --filter-class '*.AutoRerunTransientCiFailuresTests' \
  --filter-class '*.Hex1bNativePublishingTests' \
  --filter-class '*.BundleBuildWrapperTests' \
  --filter-class 'Infrastructure.Tests.TestTriggerMap.*' \
  --filter-not-trait 'quarantined=true' \
  --filter-not-trait 'outerloop=true'
```

Incoming IDE-capability command - **passed, 3/3**:

```bash
TMPDIR=/tmp DOTNET_ROOT="$PWD/.dotnet" MSBUILDTERMINALLOGGER=false \
./.dotnet/dotnet test \
  --project tests/Aspire.Hosting.Dotnet.Tests/Aspire.Hosting.Dotnet.Tests.csproj \
  --no-launch-profile -- \
  --filter-method '*.DebugSessionWithoutProjectCapabilityCoordinatesBuildForProcessLaunches' \
  --filter-method '*.ExternalBuildDebugSessionCreatesCoordinatedBuild' \
  --filter-not-trait 'quarantined=true' \
  --filter-not-trait 'outerloop=true'
```

### Call-outs

- The standalone harness's `SkipNativeBuild=true ./build.sh --build
--pack -c Release`
failed because `AddProject<TProject>` is obsolete in the playground
AppHost.
  A targeted AppHost build at merged base `87ef7df` reproduced the same
  `AppHost.cs(11,15): error CS0618` on macOS ARM64 with the pinned SDK.
Relevant source/build/SDK inputs remain identical at target `100acc9`
and
this head. This specific compiler failure predates the PR, but the
standalone
workflow remains failed. The baseline was not a full-solution or Ubuntu
full-workflow reproduction; the fork-only harness did not validate Azure
  deployment.
- The broader local `DotnetProjectBuildCoordinatorTests` class run was
stopped
after repeated build-resource timeouts and is not passed. Its cause is
not
  established. Separate current CI Hosting.Dotnet runs passed on Linux
  (477 passed, 14 skipped) and Windows (475 passed, 7 skipped).
- A bounded independent Claude Sonnet 5.5 review found no issues in the
migrated retry matchers; Max was requested, but execution effort is not
  exposed. Current main's force-mode bypasses selective live retry
  classification; the rules are covered by behavioral tests.
- Eight npm PGP sidecars were structurally checked, not independently
cryptographically verified. Official Dashboard/TerminalHost runtime
smokes
passed for Linux x64, Windows x64, and macOS ARM64; four RID smokes were
skipped. Structural checks do not establish cross-architecture execution
  or Windows ARM64 tray UI.
- Official SDL ran in no-break mode. Component Governance emitted 15-
and
19-alert summaries across jobs, not distinct-alert totals, and some jobs
  did not wait for queued new-component processing. Agent-image patch,
SBoM Dockerfile-recognition/Maven, and pinned ILCompiler NU1903 warnings
  remain.
- Automatic-main `PostBuildSign=true`, main-only SDL enforcement, source
indexing, and production release promotion/publication are not
established
  by this manual personal-branch run.

### Security considerations

This changes signing orchestration. NuGet-container signatures and
native
executable signatures are separate contracts. Official signing and final
Dashboard-package provenance were checked, but the successful build is
not
a security clearance or a completed comprehensive CI-confidence verdict.

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
(cherry picked from commit 9b8d7c0)
@github-actions

Copy link
Copy Markdown
Contributor

Tests selector

Selects the full PR test matrix + all PR-gated jobs (ALL) — a rule matching 'eng/AfterSigning.targets' selects ALL


Selection computed for commit eeb9b78.

@mitchdenny
Mitch Denny (mitchdenny) force-pushed the mitchdenny-backport-17-0-19-pr21304 branch from eeb9b78 to df1a145 Compare November 10, 2026 04:22
@github-actions

Copy link
Copy Markdown
Contributor

🚀 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 -- 22016

Or

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

@mitchdenny
Mitch Denny (mitchdenny) force-pushed the mitchdenny-backport-17-0-19-pr21304 branch from df1a145 to eeb9b78 Compare November 10, 2026 04:26
@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

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