From ae2837ec28c8d4e0e2d1a90a45ced05c978f4465 Mon Sep 17 00:00:00 2001 From: Parker Bibus Date: Thu, 24 Sep 2026 10:25:05 -0700 Subject: [PATCH 1/4] Retire default Mono performance pipelines on main Disable default Mono performance runs and builds while preserving CoreCLR, NativeAOT, and explicit manual build selections. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- eng/pipelines/performance/perf-build.yml | 22 +++++---- eng/pipelines/performance/perf-gapfill.yml | 14 ++++-- eng/pipelines/performance/perf-slow.yml | 14 +----- eng/pipelines/performance/perf.yml | 19 +++---- .../performance/runtime-wasm-perf.yml | 1 + .../performance/templates/perf-build-jobs.yml | 6 --- .../templates/perf-wasm-build-jobs.yml | 49 ++++++++++--------- 7 files changed, 61 insertions(+), 64 deletions(-) diff --git a/eng/pipelines/performance/perf-build.yml b/eng/pipelines/performance/perf-build.yml index 7f39cffcaa0e4c..5e63e91f9681f7 100644 --- a/eng/pipelines/performance/perf-build.yml +++ b/eng/pipelines/performance/perf-build.yml @@ -31,25 +31,25 @@ parameters: type: boolean default: true - name: wasm - displayName: Build WebAssembly (wasm) + displayName: Build WebAssembly Mono (wasm) type: boolean - default: true + default: false - name: monoAot_arm64_linux displayName: Build Mono AOT Arm64 Linux type: boolean - default: true + default: false - name: monoAot_x64_linux displayName: Build Mono AOT x64 Linux type: boolean - default: true + default: false - name: mono_x64_linux displayName: Build Mono x64 Linux type: boolean - default: true + default: false - name: mono_arm64_linux displayName: Build Mono Arm64 Linux type: boolean - default: true + default: false - name: nativeAot_arm64_ios displayName: Build native AOT Arm64 iOS type: boolean @@ -152,8 +152,6 @@ extends: - coreclr_x86_windows - ${{ if eq(parameters.coreclr_arm64_android, true) }}: - coreclr_arm64_android - - ${{ if eq(parameters.wasm, true) }}: - - wasm - ${{ if eq(parameters.monoAot_arm64_linux, true) }}: - monoAot_arm64_linux - ${{ if eq(parameters.monoAot_x64_linux, true) }}: @@ -166,13 +164,17 @@ extends: - nativeAot_arm64_ios - ${{ if eq(parameters.coreclr_arm64_ios, true) }}: - coreclr_arm64_ios - - ${{ if eq(parameters.wasm_coreclr, true) }}: - - wasm_coreclr - ${{ if eq(parameters.coreclr_r2r_interpreter, true) }}: - coreclr_r2r_interpreter ${{ if parameters.mauiFramework }}: mauiFramework: ${{ parameters.mauiFramework }} + # Select Mono locally without adding parameters to shared callers of older runtime wrappers. + - ${{ if or(parameters.wasm, parameters.wasm_coreclr) }}: + - template: /eng/pipelines/performance/templates/perf-wasm-build-jobs.yml + parameters: + runMono: ${{ parameters.wasm }} + - ${{ if and(ne(variables['System.TeamProject'], 'public'), or(eq(variables['Build.Reason'], 'IndividualCI'), parameters.runPrivateJobs)) }}: - stage: UploadArtifacts displayName: 'Upload Artifacts' diff --git a/eng/pipelines/performance/perf-gapfill.yml b/eng/pipelines/performance/perf-gapfill.yml index 73ab6b000c984f..486e753072160f 100644 --- a/eng/pipelines/performance/perf-gapfill.yml +++ b/eng/pipelines/performance/perf-gapfill.yml @@ -32,15 +32,15 @@ parameters: - name: run_mono_micro type: boolean - default: true + default: false - name: run_mono_interpreter type: boolean - default: true + default: false - name: run_mono_aot type: boolean - default: true + default: false - name: run_android_coreclr_jit type: boolean @@ -79,6 +79,7 @@ extends: - ${{ if eq(parameters.run_wasm, true) }}: - template: /eng/pipelines/runtime-wasm-perf-jobs.yml@performance parameters: + runMono: false ${{ if eq(variables['System.TeamProject'], 'internal') }}: runProfile: 'v8' runtimeRepoAlias: self @@ -90,6 +91,13 @@ extends: ${{ if parameters.onlySanityCheck }}: onlySanityCheck: true + # Explicit Mono source runs need their own producers; the default runtime build is CoreCLR-only. + - ${{ if and(eq(parameters.downloadSpecificBuildId, 0), or(parameters.run_mono_micro, parameters.run_mono_interpreter, parameters.run_mono_aot)) }}: + - template: /eng/pipelines/performance/templates/perf-mono-build-jobs.yml + parameters: + mono_x64: ${{ or(parameters.run_mono_micro, parameters.run_mono_interpreter) }} + monoAot_x64: ${{ parameters.run_mono_aot }} + # Runtime perf jobs (non-WASM) — included when any non-WASM group is enabled. # Per-job-group toggles are forwarded to runtime-perf-jobs.yml as parameter overrides. - ${{ if or(eq(parameters.run_viper_micro, true), eq(parameters.run_viper_micro_nor2r, true), eq(parameters.run_mono_micro, true), eq(parameters.run_mono_interpreter, true), eq(parameters.run_mono_aot, true), eq(parameters.run_android_coreclr_jit, true), eq(parameters.run_android_coreclr_r2r, true)) }}: diff --git a/eng/pipelines/performance/perf-slow.yml b/eng/pipelines/performance/perf-slow.yml index 19a9abc0185c90..c0adcc6491b45e 100644 --- a/eng/pipelines/performance/perf-slow.yml +++ b/eng/pipelines/performance/perf-slow.yml @@ -2,9 +2,6 @@ parameters: - name: runPrivateJobs type: boolean default: false -- name: runScheduledJobs - type: boolean - default: false - name: onlySanityCheck type: boolean default: false @@ -38,14 +35,6 @@ variables: - name: enableHelixJobMonitor value: true -schedules: -- cron: "30 2 * * *" - displayName: Every night at 2:30AM - branches: - include: - - main - always: true - extends: template: /eng/pipelines/common/templates/pipeline-with-resources.yml parameters: @@ -65,8 +54,7 @@ extends: - ${{ if ne(variables['System.TeamProject'], 'public') }}: - template: /eng/pipelines/runtime-slow-perf-jobs.yml@performance parameters: - ${{ if or(in(variables['Build.Reason'], 'Schedule'), parameters.runScheduledJobs) }}: - runScheduledJobs: true + runMono: false ${{ if or(notin(variables['Build.Reason'], 'Schedule', 'Manual'), parameters.runPrivateJobs) }}: runPrivateJobs: true runtimeRepoAlias: self diff --git a/eng/pipelines/performance/perf.yml b/eng/pipelines/performance/perf.yml index 93c90fa29b2079..f36a032bf33e10 100644 --- a/eng/pipelines/performance/perf.yml +++ b/eng/pipelines/performance/perf.yml @@ -32,13 +32,6 @@ variables: - name: enableHelixJobMonitor value: true -# -# For the 'schedule' case, only wasm/jsc perf jobs are run. -# And the rest are build jobs - wasm, mono, coreclr, and libraries. -# -# Since, we are not running *any* perf jobs, none of these builds are needed, -# thus the whole scheduled run can be disabled. -# schedules: - cron: "0 0 * * 1" displayName: Weekly Monday 12am UTC Build @@ -67,8 +60,7 @@ extends: - template: /eng/pipelines/runtime-wasm-perf-jobs.yml@performance parameters: - #${{ and(ne(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'Schedule')) }}: - # runProfile: 'non-v8' + runMono: false ${{ if eq(variables['System.TeamProject'], 'internal') }}: runProfile: 'v8' runtimeRepoAlias: self @@ -82,6 +74,15 @@ extends: parameters: runtimeRepoAlias: self performanceRepoAlias: performance + monoMicro: + enabled: false + configs: [] + monoInterpreter: + enabled: false + configs: [] + monoAot: + enabled: false + configs: [] jobParameters: ${{ if parameters.onlySanityCheck }}: onlySanityCheck: true diff --git a/eng/pipelines/performance/runtime-wasm-perf.yml b/eng/pipelines/performance/runtime-wasm-perf.yml index ae838e58918ae3..613ff4534d87a8 100644 --- a/eng/pipelines/performance/runtime-wasm-perf.yml +++ b/eng/pipelines/performance/runtime-wasm-perf.yml @@ -38,6 +38,7 @@ extends: runtimeRepoAlias: self performanceRepoAlias: performance runProfile: 'v8' + runMono: false jobParameters: onlySanityCheck: true #downloadSpecificBuild: diff --git a/eng/pipelines/performance/templates/perf-build-jobs.yml b/eng/pipelines/performance/templates/perf-build-jobs.yml index b9d6caf9b66795..ef50d36618ef73 100644 --- a/eng/pipelines/performance/templates/perf-build-jobs.yml +++ b/eng/pipelines/performance/templates/perf-build-jobs.yml @@ -11,9 +11,3 @@ jobs: windows_x86: true android_arm64: true coreclr_r2r_interpreter: true - - # build mono for AOT - - template: /eng/pipelines/performance/templates/perf-mono-build-jobs.yml - parameters: - mono_x64: true - monoAot_x64: true diff --git a/eng/pipelines/performance/templates/perf-wasm-build-jobs.yml b/eng/pipelines/performance/templates/perf-wasm-build-jobs.yml index dc07129261067a..a5c3c2b3fa6a4a 100644 --- a/eng/pipelines/performance/templates/perf-wasm-build-jobs.yml +++ b/eng/pipelines/performance/templates/perf-wasm-build-jobs.yml @@ -1,26 +1,28 @@ +parameters: + runMono: false + jobs: -# Build Mono runtime for browser-wasm (used by default wasm benchmarks) -- template: /eng/pipelines/common/platform-matrix.yml - parameters: - jobTemplate: /eng/pipelines/common/global-build-job.yml - buildConfig: Release - runtimeFlavor: mono - platforms: - - browser_wasm - jobParameters: - buildArgs: -s mono+libs+host+packs -c $(_BuildConfig) /p:AotHostArchitecture=x64 /p:AotHostOS=$(_hostedOS) - nameSuffix: wasm - isOfficialBuild: false - # The wasm-tools workload manifest now includes the CoreCLR browser-wasm runtime pack, so the - # workload install below needs the CoreCLR runtime and Crossgen2 packs staged into the local - # feed. They're produced by the wasm_coreclr build job, so depend on it and download them. - dependsOn: - - build_browser_wasm_linux_Release_wasm_coreclr - postBuildSteps: - - template: /eng/pipelines/performance/templates/perf-wasm-prepare-artifacts-steps.yml - parameters: - configForBuild: Release - downloadCoreClrWorkloadPackages: true +# Build Mono only for explicitly selected performance builds. +- ${{ if parameters.runMono }}: + - template: /eng/pipelines/common/platform-matrix.yml + parameters: + jobTemplate: /eng/pipelines/common/global-build-job.yml + buildConfig: Release + runtimeFlavor: mono + platforms: + - browser_wasm + jobParameters: + buildArgs: -s mono+libs+host+packs -c $(_BuildConfig) /p:AotHostArchitecture=x64 /p:AotHostOS=$(_hostedOS) + nameSuffix: wasm + isOfficialBuild: false + # The wasm-tools workload manifest includes CoreCLR packs that the Mono build doesn't produce. + dependsOn: + - build_browser_wasm_linux_Release_wasm_coreclr + postBuildSteps: + - template: /eng/pipelines/performance/templates/perf-wasm-prepare-artifacts-steps.yml + parameters: + configForBuild: Release + downloadCoreClrWorkloadPackages: true # Build CoreCLR runtime for browser-wasm (used by --wasm-coreclr benchmarks) - template: /eng/pipelines/common/platform-matrix.yml @@ -38,8 +40,9 @@ jobs: - template: /eng/pipelines/performance/templates/perf-wasm-prepare-artifacts-steps.yml parameters: configForBuild: Release + runtimeFlavor: coreclr artifactName: BrowserWasmCoreCLR sdkDirName: dotnet-none includeRefPack: false includeCoreClrToolchainPacks: true - publishCoreClrWorkloadPackages: true + publishCoreClrWorkloadPackages: ${{ parameters.runMono }} From 7c40ead5642cf32385907884d2b3c16524ec0f42 Mon Sep 17 00:00:00 2001 From: Parker Bibus Date: Thu, 24 Sep 2026 12:37:53 -0700 Subject: [PATCH 2/4] Avoid duplicate WASM artifact runtime flavor parameter The global build adapter already forwards runtimeFlavor to post-build templates. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- eng/pipelines/performance/templates/perf-wasm-build-jobs.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/eng/pipelines/performance/templates/perf-wasm-build-jobs.yml b/eng/pipelines/performance/templates/perf-wasm-build-jobs.yml index a5c3c2b3fa6a4a..8fc7ea75b6cbf6 100644 --- a/eng/pipelines/performance/templates/perf-wasm-build-jobs.yml +++ b/eng/pipelines/performance/templates/perf-wasm-build-jobs.yml @@ -40,7 +40,6 @@ jobs: - template: /eng/pipelines/performance/templates/perf-wasm-prepare-artifacts-steps.yml parameters: configForBuild: Release - runtimeFlavor: coreclr artifactName: BrowserWasmCoreCLR sdkDirName: dotnet-none includeRefPack: false From 61d7faf36fa2204b1480e0061e49238ceca88daf Mon Sep 17 00:00:00 2001 From: Parker Bibus Date: Thu, 24 Sep 2026 12:41:49 -0700 Subject: [PATCH 3/4] Compare legacy Mono performance flag explicitly Require runMono to equal true so a nonempty false string does not select the Mono WASM build. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- eng/pipelines/performance/templates/perf-wasm-build-jobs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/pipelines/performance/templates/perf-wasm-build-jobs.yml b/eng/pipelines/performance/templates/perf-wasm-build-jobs.yml index 8fc7ea75b6cbf6..17618a419764d7 100644 --- a/eng/pipelines/performance/templates/perf-wasm-build-jobs.yml +++ b/eng/pipelines/performance/templates/perf-wasm-build-jobs.yml @@ -3,7 +3,7 @@ parameters: jobs: # Build Mono only for explicitly selected performance builds. -- ${{ if parameters.runMono }}: +- ${{ if eq(parameters.runMono, true) }}: - template: /eng/pipelines/common/platform-matrix.yml parameters: jobTemplate: /eng/pipelines/common/global-build-job.yml From 83d795e00fbec1e70ee22c872c382cda74d3ac61 Mon Sep 17 00:00:00 2001 From: Parker Bibus Date: Fri, 25 Sep 2026 13:34:12 -0700 Subject: [PATCH 4/4] Remove redundant disabled Mono performance configs Keep the enabled=false overrides; shared templates read configs only when those groups are enabled. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- eng/pipelines/performance/perf.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/eng/pipelines/performance/perf.yml b/eng/pipelines/performance/perf.yml index f36a032bf33e10..3db713a2168940 100644 --- a/eng/pipelines/performance/perf.yml +++ b/eng/pipelines/performance/perf.yml @@ -76,13 +76,10 @@ extends: performanceRepoAlias: performance monoMicro: enabled: false - configs: [] monoInterpreter: enabled: false - configs: [] monoAot: enabled: false - configs: [] jobParameters: ${{ if parameters.onlySanityCheck }}: onlySanityCheck: true