Uh oh!
There was an error while loading. Please reload this page.
[perf][wasm] fix wasm-perf lane, stage complete CoreCLR toolchain cohort - #133203
[perf][wasm] fix wasm-perf lane, stage complete CoreCLR toolchain cohort#133203lewing wants to merge 10 commits into
Conversation
Produce and stage the matching ILLink tasks package with the local WebAssembly SDK, reference pack, and Crossgen2 package used by CoreCLR browser-WASM performance publishes. Validate that each non-symbol package is present exactly once and belongs to the same local package cohort. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
Azure Pipelines: Successfully started running 6 pipeline(s). 10 pipeline(s) were filtered out due to trigger conditions. There may be pipelines that require an authorized user to comment /azp run to run. |
Tagging subscribers to this area: @dotnet/runtime-infrastructure |
The performance artifact build packs ILLink only to stage its matching local tool package. Skip baseline validation for this narrow no-build/no-restore pack invocation so it does not require the unavailable 10.0.0 baseline package. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 26a97530-a6d9-44e6-8754-2783961f1313
Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara |
|
Azure Pipelines: Successfully started running 6 pipeline(s). 10 pipeline(s) were filtered out due to trigger conditions. There may be pipelines that require an authorized user to comment /azp run to run. |
There was a problem hiding this comment.
🟢 Approval recommended
The change is localized to perf pipeline artifact staging and appears consistent with existing template usage, with only a minor diagnostic-message clarity nit identified.
Pull request overview
Stages a complete same-build NuGet cohort for CoreCLR browser-WASM performance artifacts by packing Microsoft.NET.ILLink.Tasks and (optionally) staging/validating the CoreCLR R2R toolchain packages alongside the existing SDK/runtime/ref inputs.
Changes:
- Replace the CoreCLR-only Crossgen2 staging switch with a single
includeCoreClrToolchainPacksswitch and add an explicitdotnet packstep forILLink.Tasks.csproj(no build/restore). - Add a staging script that enforces “exactly one non-symbol nupkg” per required package ID and verifies all selected packages share the same cohort version.
- Update the CoreCLR wasm perf job to enable the new toolchain/cohort staging switch.
File summaries
| File | Description |
|---|---|
| eng/pipelines/performance/templates/perf-wasm-prepare-artifacts-steps.yml | Adds ILLink packing plus cohort selection/version validation and stages CoreCLR toolchain packs when enabled. |
| eng/pipelines/performance/templates/perf-wasm-build-jobs.yml | Switches the CoreCLR job to use includeCoreClrToolchainPacks: true. |
Review details
- Files reviewed: 2/2 changed files
- Comments generated: 1
- Review effort level: Lite
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
🟡 Changes recommended
The new ILLink pack step is configured as --no-build --no-restore even though the job’s main build subset doesn’t build tools.illink, making the pipeline likely to fail.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
- Files reviewed: 2/2 changed files
- Comments generated: 2
- Review effort level: Lite
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Use the canonical SDK R2R output directory spelling when staging trimmed CoreCLR browser-WASM images for WebCIL conversion. Add a focused target evaluation test that compares the path ordinally so case-insensitive hosts catch regressions too. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 26a97530-a6d9-44e6-8754-2783961f1313
lewing
commented
Sep 4, 2026
Follow-up: case-sensitive per-app R2R stagingCombined The publish binlog showed the mismatch:
On a case-sensitive filesystem the consumer missed the generated image and attempted to convert the R2R Commit Validation:
Note This comment was generated with the assistance of GitHub Copilot. |
Let the strict CoreCLR cohort loop exclusively stage its SDK, reference, Crossgen2, and ILLink packages while preserving Mono's existing wildcard package copies. Keep missing-package diagnostics aligned with the non-symbol selection. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 26a97530-a6d9-44e6-8754-2783961f1313
There was a problem hiding this comment.
🟡 Changes recommended
The pipeline step uses dotnet pack --no-build for ILLink.Tasks, which isn’t guaranteed to have been built by the clr+libs+host+packs subset and can make the artifact staging fragile.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
Suppressed comments (1)
eng/pipelines/performance/templates/perf-wasm-prepare-artifacts-steps.yml:64
dotnet pack --no-buildassumesILLink.Tasks.csprojwas already built in this job. However,eng/Subsets.propsonly schedulesILLink.Tasks.csprojunder the+tools.illink+subset, which is not part of theclr+libs+host+packssubset used by the CoreCLR wasm build job. This makes the artifact staging brittle: if the project wasn't built as a transitive dependency,pack --no-buildcan fail due to missing outputs.
Consider dropping --no-build (keep --no-restore) so packing can build incrementally when needed without re-restoring.
# The WebAssembly SDK, ref, and host tool packages form the complete local product cohort
# consumed by a trimmed CoreCLR R2R publish.
- ${{ if eq(parameters.includeCoreClrToolchainPacks, true) }}:
- script: >-
./dotnet.sh pack --no-build --no-restore
- Files reviewed: 4/4 changed files
- Comments generated: 1
- Review effort level: Lite
Uh oh!
There was an error while loading. Please reload this page.
Stop the diagnostic path capture at its closing quote so unexpected apostrophes cannot broaden the match. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 26a97530-a6d9-44e6-8754-2783961f1313
There was a problem hiding this comment.
🔵 Needs a closer look
It changes CI/perf artifact staging and MSBuild target behavior for CoreCLR wasm R2R, which has a high blast radius and should be validated by a human via an end-to-end pipeline run.
Review details
- Files reviewed: 4/4 changed files
- Comments generated: 0 new
- Review effort level: Lite
There was a problem hiding this comment.
🟡 Changes recommended
The new test currently relies on default target scheduling despite testing publish-only properties, which risks flakiness unless it explicitly runs the target that computes/prints _WasmPublishR2RDir.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
- Files reviewed: 4/4 changed files
- Comments generated: 1
- Review effort level: Lite
Uh oh!
There was an error while loading. Please reload this page.
Publish the matching browser runtime and host Crossgen2 packages from the CoreCLR build and stage both into the Mono job's local feed before workload installation. Centralize strict non-symbol cohort selection and verify the handoff matches the Mono WebAssembly SDK package version. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 26a97530-a6d9-44e6-8754-2783961f1313
lewing
commented
Sep 4, 2026
Follow-up: complete CoreCLR-to-Mono workload handoffCombined build 1583669 validated the CoreCLR side end-to-end: the artifact build, JIT lane, and R2R lane all passed. The Mono artifact job then failed in The current
Commit Validation:
Note This comment was generated with the assistance of GitHub Copilot. |
Invoke the diagnostic target directly and make it depend on CoreCLR R2R directory selection so the test does not rely on incidental build graph ordering. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 26a97530-a6d9-44e6-8754-2783961f1313
There was a problem hiding this comment.
🔵 Needs a closer look
It changes artifact composition and Azure Pipelines staging logic for perf workloads, which has a high blast radius and can’t be fully validated here without an end-to-end pipeline run.
Review details
- Files reviewed: 5/5 changed files
- Comments generated: 1
- Review effort level: Lite
Uh oh!
There was an error while loading. Please reload this page.
Initialize package cohort validation from the caller-provided version so patterns with RID-qualified package names can appear first without affecting version parsing. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 26a97530-a6d9-44e6-8754-2783961f1313
There was a problem hiding this comment.
🟢 Approval recommended
The changes are cohesive, parameter rename/update is consistent across templates, and the behavioral change (R2R dir casing) is covered by a focused test.
Review details
- Files reviewed: 5/5 changed files
- Comments generated: 0 new
- Review effort level: Lite
green run againt this and dotnet/performance#5297 here https://dev.azure.com/dnceng-public/public/_build/results?buildId=1584001&view=results |
lewing
commented
Sep 5, 2026
@radekdoulik this is now required after the workload changes in the thunk generator. |
Summary
Stage the complete same-build CoreCLR browser-WASM package cohort consumed by the performance pipeline. This fixes two failures:
Microsoft.NETCore.App.Crossgen2.linux-x64version11.0.0-ciwas absent from the local feed.Microsoft.NET.ILLink.Taskspackage. In build 1581666, restore requested ILLink product version.109, the artifact did not contain it, NuGet floated to.118, and_RunILLinkthen failed because the payload only contained the.109runtime.The existing CoreCLR-only Crossgen2 staging switch becomes one toolchain/cohort staging switch that:
ILLink.Tasks.csprojwithout rebuilding or restoring, because the normalclr+libs+host+packsbuild compiles the project but does not pack it;This completes the runtime artifact consumed by dotnet/performance#5297 and repairs the prerequisite artifact build used by the existing Mono WASM performance lane.
Complete staged cohort
The CoreCLR performance artifact now carries the complete same-build publish inputs:
staging/dotnet-nonestaging/microsoft.netcore.app.runtime.browser-wasmMicrosoft.NETCore.App.RefMicrosoft.NET.Sdk.WebAssembly.PackMicrosoft.NETCore.App.Crossgen2.linux-x64Microsoft.NET.ILLink.TasksThe dependent Mono artifact job also receives the same-build CoreCLR browser runtime and Crossgen2 packages before installing its workload. WebAssembly SDK and ILLink are direct SDK tool restore dependencies, while Crossgen2 and the runtime/ref packs are selected through the SDK framework/tool-pack graph. ILLink's private dependencies are included in its tooling package, so no additional locally built SDK tool package is required. The performance-side override aligns
KnownWebAssemblySdkPack,KnownCrossgen2Pack, andKnownILLinkPackto the staged local package version.Validation
Microsoft.NETCore.App.Crossgen2.linux-x64version11.0.0-ciwas missing from the local package feed; this change publishes and downloads that exact package from the CoreCLR build job..118ILLink/runtime mismatch, the package graph above, and that the regular runtime build compiles but does not packILLink.Tasks.csproj.git diff --checkand an independent focused review of the final pipeline diff.Remaining end-to-end validation
Queue
runtime-wasm-perfpipeline 156 on Ubuntu 22.04 with repository resource overrides:{ "resources": { "repositories": { "self": { "refName": "refs/heads/lewing-stage-wasm-r2r-tools" }, "performance": { "refName": "refs/heads/lewing-wasm-coreclr-r2r-perf" } } } }The Mono artifact job must install the workload from the local feed without a missing Crossgen2 package. The CoreCLR R2R lane must restore without NU1603/fallback, complete ILLink, emit non-empty per-app R2R images through Crossgen2, stage WebCIL, and start the benchmark under V8. Existing failed builds cannot provide that proof because their published artifacts predate the complete cohort staged by this change.
Note
This pull request description was generated with the assistance of GitHub Copilot.