From e0f700aae8596e047bbb78487f527dcc05fa4742 Mon Sep 17 00:00:00 2001 From: Premek Vysoky Date: Thu, 14 May 2026 16:20:58 +0200 Subject: [PATCH 1/8] Enable Helix Job Monitor for the runtime pipeline --- .../build-runtime-tests-and-send-to-helix.yml | 2 + .../templates/runtimes/send-to-helix-step.yml | 12 +++- eng/pipelines/libraries/helix.yml | 60 ++++++++++--------- eng/pipelines/runtime.yml | 21 +++++++ 4 files changed, 65 insertions(+), 30 deletions(-) diff --git a/eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml b/eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml index f88692190cc221..7f22df6c95545d 100644 --- a/eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml +++ b/eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml @@ -13,6 +13,7 @@ parameters: nativeAotTest: false runtimeFlavor: 'mono' runtimeVariant: 'monointerpreter' + useHelixMonitor: false llvmAotStepContainer: '' scenarios: - normal @@ -105,6 +106,7 @@ steps: helixSource: $(_HelixSource) ${{ if ne(parameters.readyToRun, true) }}: helixType: 'test/functional/cli/' + useHelixMonitor: ${{ parameters.useHelixMonitor }} helixQueues: ${{ parameters.helixQueues }} # This tests whether an array is empty diff --git a/eng/pipelines/common/templates/runtimes/send-to-helix-step.yml b/eng/pipelines/common/templates/runtimes/send-to-helix-step.yml index 9e66956a3c2547..e959eba200b4cf 100644 --- a/eng/pipelines/common/templates/runtimes/send-to-helix-step.yml +++ b/eng/pipelines/common/templates/runtimes/send-to-helix-step.yml @@ -12,6 +12,7 @@ parameters: helixSource: '' helixQueues: '' helixType: '' + useHelixMonitor: false msbuildParallelism: '/maxcpucount' scenarios: '' timeoutPerTestCollectionInMinutes: '' @@ -42,7 +43,16 @@ steps: - template: send-to-helix-inner-step.yml parameters: osGroup: ${{ parameters.osGroup }} - sendParams: ${{ parameters.helixProjectArguments }} ${{ parameters.msbuildParallelism }} /bl:$(Build.SourcesDirectory)/artifacts/log/SendToHelix.binlog /p:TargetArchitecture=${{ parameters.archType }} /p:TargetOS=${{ parameters.osGroup }} /p:TargetOSSubgroup=${{ parameters.osSubgroup }} /p:Configuration=${{ parameters.buildConfig }} ${{ parameters.extraHelixArguments }} + sendParams: > + ${{ parameters.helixProjectArguments }} + ${{ parameters.msbuildParallelism }} + /bl:$(Build.SourcesDirectory)/artifacts/log/SendToHelix.binlog + /p:TargetArchitecture=${{ parameters.archType }} + /p:TargetOS=${{ parameters.osGroup }} + /p:TargetOSSubgroup=${{ parameters.osSubgroup }} + /p:Configuration=${{ parameters.buildConfig }} + /p:EnableHelixJobMonitor=${{ parameters.useHelixMonitor }} + ${{ parameters.extraHelixArguments }} condition: and(succeeded(), ${{ parameters.condition }}) shouldContinueOnError: ${{ parameters.shouldContinueOnError }} displayName: ${{ parameters.displayName }} diff --git a/eng/pipelines/libraries/helix.yml b/eng/pipelines/libraries/helix.yml index 03b3cf1ebaffca..ab8f1f02c6e324 100644 --- a/eng/pipelines/libraries/helix.yml +++ b/eng/pipelines/libraries/helix.yml @@ -12,39 +12,41 @@ parameters: condition: always() extraHelixArguments: '' shouldContinueOnError: false + useHelixMonitor: false scenarios: '' SuperPmiCollect: '' SuperPmiCollectionType: '' SuperPmiCollectionName: '' steps: - - script: $(_msbuildCommand) $(_warnAsErrorParamHelixOverride) -restore - $(Build.SourcesDirectory)/src/libraries/sendtohelix.proj - /p:RuntimeFlavor=${{ parameters.runtimeFlavor }} - /p:TargetArchitecture=${{ parameters.archType }} - /p:TargetRuntimeIdentifier=${{ parameters.targetRid }} - /p:Configuration=${{ parameters.buildConfig }} - /p:TargetOS=${{ parameters.osGroup }} - /p:MonoForceInterpreter=${{ parameters.interpreter }} - /p:TestScope=${{ parameters.testScope }} - /p:TestRunNamePrefixSuffix=${{ parameters.testRunNamePrefixSuffix }} - /p:HelixBuild=$(Build.BuildNumber) - ${{ parameters.extraHelixArguments }} - /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog - displayName: Send to Helix - condition: and(succeeded(), ${{ parameters.condition }}) - continueOnError: ${{ eq(parameters.shouldContinueOnError, true) }} - env: - SYSTEM_ACCESSTOKEN: $(System.AccessToken) # We need to set this env var to publish helix results to Azure Dev Ops - _Scenarios: ${{ join(',', parameters.scenarios) }} # Pass scenarios to MSBuild as env var to avoid need of escaping comma separated list - _SuperPmiCollect: ${{ parameters.SuperPmiCollect }} - _SuperPmiCollectionType: ${{ parameters.SuperPmiCollectionType }} - _SuperPmiCollectionName: ${{ parameters.SuperPmiCollectionName }} +- script: $(_msbuildCommand) $(_warnAsErrorParamHelixOverride) -restore + $(Build.SourcesDirectory)/src/libraries/sendtohelix.proj + /p:RuntimeFlavor=${{ parameters.runtimeFlavor }} + /p:TargetArchitecture=${{ parameters.archType }} + /p:TargetRuntimeIdentifier=${{ parameters.targetRid }} + /p:Configuration=${{ parameters.buildConfig }} + /p:TargetOS=${{ parameters.osGroup }} + /p:MonoForceInterpreter=${{ parameters.interpreter }} + /p:TestScope=${{ parameters.testScope }} + /p:TestRunNamePrefixSuffix=${{ parameters.testRunNamePrefixSuffix }} + /p:HelixBuild=$(Build.BuildNumber) + /p:EnableHelixJobMonitor=${{ parameters.useHelixMonitor }} + ${{ parameters.extraHelixArguments }} + /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog + displayName: Send to Helix + condition: and(succeeded(), ${{ parameters.condition }}) + continueOnError: ${{ eq(parameters.shouldContinueOnError, true) }} + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) # We need to set this env var to publish helix results to Azure Dev Ops + _Scenarios: ${{ join(',', parameters.scenarios) }} # Pass scenarios to MSBuild as env var to avoid need of escaping comma separated list + _SuperPmiCollect: ${{ parameters.SuperPmiCollect }} + _SuperPmiCollectionType: ${{ parameters.SuperPmiCollectionType }} + _SuperPmiCollectionName: ${{ parameters.SuperPmiCollectionName }} - ${{ if eq(variables['System.TeamProject'], 'internal') }}: - HelixAccessToken: $(HelixApiAccessToken) - HelixTargetQueues: ${{ replace(lower(join('+', parameters.helixQueues)), '.open', '') }} - Creator: '' - ${{ if eq(variables['System.TeamProject'], 'public') }}: - HelixTargetQueues: ${{ join('+', parameters.helixQueues) }} - Creator: ${{ parameters.creator }} + ${{ if eq(variables['System.TeamProject'], 'internal') }}: + HelixAccessToken: $(HelixApiAccessToken) + HelixTargetQueues: ${{ replace(lower(join('+', parameters.helixQueues)), '.open', '') }} + Creator: '' + ${{ if eq(variables['System.TeamProject'], 'public') }}: + HelixTargetQueues: ${{ join('+', parameters.helixQueues) }} + Creator: ${{ parameters.creator }} diff --git a/eng/pipelines/runtime.yml b/eng/pipelines/runtime.yml index 58f08f5f183f3c..b0288279952fc2 100644 --- a/eng/pipelines/runtime.yml +++ b/eng/pipelines/runtime.yml @@ -803,6 +803,7 @@ extends: parameters: creator: dotnet-bot testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig) + useHelixMonitor: true condition: >- or( eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_libraries.containsChange'], true), @@ -1099,6 +1100,7 @@ extends: parameters: creator: dotnet-bot testRunNamePrefixSuffix: Mono_$(_BuildConfig) + useHelixMonitor: true condition: >- or( eq(variables['librariesContainsChange'], true), @@ -1141,6 +1143,7 @@ extends: parameters: creator: dotnet-bot testRunNamePrefixSuffix: CoreCLR_$(_BuildConfig) + useHelixMonitor: true condition: >- or( eq(variables['librariesContainsChange'], true), @@ -1185,6 +1188,7 @@ extends: parameters: creator: dotnet-bot testRunNamePrefixSuffix: Mono_$(_BuildConfig) + useHelixMonitor: true extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true condition: >- or( @@ -1229,6 +1233,7 @@ extends: parameters: creator: dotnet-bot testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig) + useHelixMonitor: true extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true condition: >- or( @@ -1273,6 +1278,7 @@ extends: parameters: creator: dotnet-bot testRunNamePrefixSuffix: CoreCLR_$(_BuildConfig) + useHelixMonitor: true extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true condition: >- or( @@ -1316,6 +1322,7 @@ extends: parameters: creator: dotnet-bot testRunNamePrefixSuffix: Mono_$(_BuildConfig) + useHelixMonitor: true condition: >- or( eq(variables['librariesContainsChange'], true), @@ -1358,6 +1365,7 @@ extends: parameters: creator: dotnet-bot testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig) + useHelixMonitor: true extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true condition: >- or( @@ -1400,6 +1408,7 @@ extends: parameters: creator: dotnet-bot testRunNamePrefixSuffix: CoreCLR_$(_BuildConfig) + useHelixMonitor: true extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true condition: >- or( @@ -1523,6 +1532,7 @@ extends: parameters: creator: dotnet-bot testRunNamePrefixSuffix: NET481_$(_BuildConfig) + useHelixMonitor: true extraHelixArguments: /p:BuildTargetFramework=net481 condition: >- or( @@ -1681,6 +1691,7 @@ extends: parameters: creator: dotnet-bot testRunNamePrefixSuffix: Mono_Release + useHelixMonitor: true extraVariablesTemplates: - template: /eng/pipelines/common/templates/runtimes/test-variables.yml @@ -1717,6 +1728,7 @@ extends: parameters: creator: dotnet-bot testRunNamePrefixSuffix: Mono_Release + useHelixMonitor: true extraVariablesTemplates: - template: /eng/pipelines/common/templates/runtimes/test-variables.yml parameters: @@ -1755,6 +1767,7 @@ extends: parameters: creator: dotnet-bot testRunNamePrefixSuffix: Mono_Release + useHelixMonitor: true extraVariablesTemplates: - template: /eng/pipelines/common/templates/runtimes/test-variables.yml # @@ -1794,6 +1807,7 @@ extends: creator: dotnet-bot llvmAotStepContainer: linux_x64_llvmaot testRunNamePrefixSuffix: Mono_Release + useHelixMonitor: true extraVariablesTemplates: - template: /eng/pipelines/common/templates/runtimes/test-variables.yml @@ -2045,6 +2059,7 @@ extends: parameters: creator: dotnet-bot testRunNamePrefixSuffix: Mono_Interpreter_$(_BuildConfig) + useHelixMonitor: true interpreter: true condition: >- or( @@ -2077,8 +2092,14 @@ extends: parameters: creator: dotnet-bot testRunNamePrefixSuffix: Mono_Minijit_$(_BuildConfig) + useHelixMonitor: true condition: >- or( eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_libraries.containsChange'], true), eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_mono_excluding_wasm.containsChange'], true), eq(variables['isRollingBuild'], true)) + + - template: /eng/common/core-templates/job/helix-job-monitor.yml + parameters: + helixAccessToken: $(HelixApiAccessToken) + timeoutInMinutes: 540 From 83a190fe701af36040ea724dcaaa3892f9ad3960 Mon Sep 17 00:00:00 2001 From: Premek Vysoky Date: Thu, 14 May 2026 16:21:14 +0200 Subject: [PATCH 2/8] Temporarily add a general testing feed --- NuGet.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NuGet.config b/NuGet.config index 8d2d351914d014..6a926020b7209e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -22,6 +22,8 @@ + + From edd960467a9d2bd39507fad7790ee23d72e1e29c Mon Sep 17 00:00:00 2001 From: Premek Vysoky Date: Thu, 14 May 2026 16:42:36 +0200 Subject: [PATCH 3/8] Update Arcade with JobMonitor --- .config/dotnet-tools.json | 6 + eng/Version.Details.props | 244 +++++++++--------- eng/Version.Details.xml | 112 ++++---- eng/common/AGENTS.md | 5 + .../core-templates/job/helix-job-monitor.yml | 224 ++++++++++++++++ eng/common/core-templates/job/onelocbuild.yml | 3 + .../core-templates/steps/publish-logs.yml | 2 - eng/common/cross/toolchain.cmake | 12 +- eng/common/dotnet-install.ps1 | 6 +- eng/common/dotnet-install.sh | 6 +- eng/common/tools.ps1 | 38 +-- eng/common/tools.sh | 43 +-- global.json | 6 +- 13 files changed, 489 insertions(+), 218 deletions(-) create mode 100644 eng/common/AGENTS.md create mode 100644 eng/common/core-templates/job/helix-job-monitor.yml diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 9676702f28387f..de67bb4bdcc540 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -25,6 +25,12 @@ "commands": [ "slngen" ] + }, + "microsoft.dotnet.helix.jobmonitor": { + "version": "11.0.0-beta.26264.2", + "commands": [ + "dotnet-helix-job-monitor" + ] } } } diff --git a/eng/Version.Details.props b/eng/Version.Details.props index a35525c98f82e7..11f754d0597ac0 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -5,49 +5,9 @@ This file should be imported by eng/Versions.props --> - - 5.7.0-1.26257.113 - 5.7.0-1.26257.113 - 5.7.0-1.26257.113 - 11.0.100-preview.5.26257.113 - 11.0.100-preview.5.26257.113 - 11.0.0-beta.26257.113 - 11.0.0-beta.26257.113 - 11.0.0-beta.26257.113 - 11.0.0-beta.26257.113 - 11.0.0-beta.26257.113 - 11.0.0-beta.26257.113 - 11.0.0-beta.26257.113 - 11.0.0-beta.26257.113 - 0.11.5-preview.26257.113 - 11.0.0-beta.26257.113 - 11.0.0-beta.26257.113 - 11.0.0-beta.26257.113 - 11.0.0-beta.26257.113 - 11.0.0-beta.26257.113 - 11.0.0-beta.26257.113 - 11.0.0-beta.26257.113 - 11.0.0-beta.26257.113 - 3.2.2-beta.26257.113 - 2.9.3-beta.26257.113 - 11.0.0-beta.26257.113 - 5.7.0-1.26257.113 - 11.0.0-preview.5.26257.113 - 11.0.100-preview.5.26257.113 - 11.0.0-preview.5.26257.113 - 11.0.0-preview.5.26257.113 - 7.7.0-rc.25813 - 7.7.0-rc.25813 - 7.7.0-rc.25813 - 7.7.0-rc.25813 - 11.0.0-preview.5.26257.113 - 3.0.0-preview.5.26257.113 - 11.0.0-preview.5.26257.113 - 11.0.0-preview.5.26257.113 - 11.0.0-preview.5.26257.113 - + 11.0.0-alpha.1.26181.1 - + 19.1.0-alpha.1.26208.2 19.1.0-alpha.1.26208.2 19.1.0-alpha.1.26208.2 @@ -77,23 +37,49 @@ This file should be imported by eng/Versions.props 19.1.0-alpha.1.26208.2 19.1.0-alpha.1.26208.2 19.1.0-alpha.1.26208.2 - - 11.0.0-alpha.1.26208.5 - 11.0.0-alpha.1.26208.5 - 11.0.0-alpha.1.26208.5 - 11.0.0-alpha.1.26208.5 - 11.0.0-alpha.1.26208.5 - 11.0.0-alpha.1.26208.5 - 11.0.0-alpha.1.26208.5 - 11.0.0-alpha.1.26208.5 - - 1.0.0-prerelease.26080.1 - 1.0.0-prerelease.26080.1 - 1.0.0-prerelease.26080.1 - 1.0.0-prerelease.26080.1 - 1.0.0-prerelease.26080.1 - 1.0.0-prerelease.26080.1 - + + 5.7.0-1.26257.113 + 5.7.0-1.26257.113 + 5.7.0-1.26257.113 + 11.0.100-preview.5.26257.113 + 11.0.100-preview.5.26257.113 + 0.11.5-preview.26257.113 + 3.2.2-beta.26257.113 + 5.7.0-1.26257.113 + 11.0.0-preview.5.26257.113 + 11.0.100-preview.5.26257.113 + 11.0.0-preview.5.26257.113 + 11.0.0-preview.5.26257.113 + 7.7.0-rc.25813 + 7.7.0-rc.25813 + 7.7.0-rc.25813 + 7.7.0-rc.25813 + 11.0.0-preview.5.26257.113 + 3.0.0-preview.5.26257.113 + 11.0.0-preview.5.26257.113 + 11.0.0-preview.5.26257.113 + 11.0.0-preview.5.26257.113 + + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26264.2 + 2.9.3-beta.26264.2 + 11.0.0-beta.26264.2 + 11.0.0-beta.26180.1 11.0.0-beta.26180.1 11.0.0-beta.26180.1 @@ -110,56 +96,32 @@ This file should be imported by eng/Versions.props 11.0.0-beta.26180.1 11.0.0-beta.26180.1 11.0.0-beta.26180.1 - + 11.0.0-prerelease.26204.1 11.0.0-prerelease.26204.1 11.0.0-prerelease.26204.1 + + 1.0.0-prerelease.26080.1 + 1.0.0-prerelease.26080.1 + 1.0.0-prerelease.26080.1 + 1.0.0-prerelease.26080.1 + 1.0.0-prerelease.26080.1 + 1.0.0-prerelease.26080.1 + + 11.0.0-alpha.1.26208.5 + 11.0.0-alpha.1.26208.5 + 11.0.0-alpha.1.26208.5 + 11.0.0-alpha.1.26208.5 + 11.0.0-alpha.1.26208.5 + 11.0.0-alpha.1.26208.5 + 11.0.0-alpha.1.26208.5 + 11.0.0-alpha.1.26208.5 - - $(MicrosoftCodeAnalysisPackageVersion) - $(MicrosoftCodeAnalysisAnalyzersPackageVersion) - $(MicrosoftCodeAnalysisCSharpPackageVersion) - $(MicrosoftCodeAnalysisNetAnalyzersPackageVersion) - $(MicrosoftDotNetApiCompatTaskPackageVersion) - $(MicrosoftDotNetArcadeSdkPackageVersion) - $(MicrosoftDotNetBuildTasksArchivesPackageVersion) - $(MicrosoftDotNetBuildTasksFeedPackageVersion) - $(MicrosoftDotNetBuildTasksInstallersPackageVersion) - $(MicrosoftDotNetBuildTasksPackagingPackageVersion) - $(MicrosoftDotNetBuildTasksTargetFrameworkPackageVersion) - $(MicrosoftDotNetBuildTasksTemplatingPackageVersion) - $(MicrosoftDotNetBuildTasksWorkloadsPackageVersion) - $(MicrosoftDotNetCecilPackageVersion) - $(MicrosoftDotNetCodeAnalysisPackageVersion) - $(MicrosoftDotNetGenAPIPackageVersion) - $(MicrosoftDotNetGenFacadesPackageVersion) - $(MicrosoftDotNetHelixSdkPackageVersion) - $(MicrosoftDotNetPackageTestingPackageVersion) - $(MicrosoftDotNetRemoteExecutorPackageVersion) - $(MicrosoftDotNetSharedFrameworkSdkPackageVersion) - $(MicrosoftDotNetXliffTasksPackageVersion) - $(MicrosoftDotNetXUnitAssertPackageVersion) - $(MicrosoftDotNetXUnitConsoleRunnerPackageVersion) - $(MicrosoftDotNetXUnitExtensionsPackageVersion) - $(MicrosoftNetCompilersToolsetPackageVersion) - $(MicrosoftNETSdkILPackageVersion) - $(MicrosoftNETWorkloadEmscriptenCurrentManifest110100TransportPackageVersion) - $(MicrosoftNETCoreAppRefPackageVersion) - $(MicrosoftNETCoreILAsmPackageVersion) - $(NuGetFrameworksPackageVersion) - $(NuGetPackagingPackageVersion) - $(NuGetProjectModelPackageVersion) - $(NuGetVersioningPackageVersion) - $(runtimenativeSystemIOPortsPackageVersion) - $(SystemCommandLinePackageVersion) - $(SystemReflectionMetadataPackageVersion) - $(SystemReflectionMetadataLoadContextPackageVersion) - $(SystemTextJsonPackageVersion) - + $(MicrosoftNETCoreRuntimeICUTransportPackageVersion) - + $(runtimelinuxarm64MicrosoftNETCoreRuntimeJITToolsPackageVersion) $(runtimelinuxarm64MicrosoftNETCoreRuntimeMonoLLVMLibclangPackageVersion) $(runtimelinuxarm64MicrosoftNETCoreRuntimeMonoLLVMSdkPackageVersion) @@ -189,23 +151,49 @@ This file should be imported by eng/Versions.props $(runtimewinx64MicrosoftNETCoreRuntimeMonoLLVMLibclangPackageVersion) $(runtimewinx64MicrosoftNETCoreRuntimeMonoLLVMSdkPackageVersion) $(runtimewinx64MicrosoftNETCoreRuntimeMonoLLVMToolsPackageVersion) - - $(runtimelinuxarm64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) - $(runtimelinuxmuslarm64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) - $(runtimelinuxmuslx64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) - $(runtimelinuxx64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) - $(runtimeosxarm64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) - $(runtimeosxx64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) - $(runtimewinarm64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) - $(runtimewinx64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) - - $(optimizationlinuxarm64MIBCRuntimePackageVersion) - $(optimizationlinuxx64MIBCRuntimePackageVersion) - $(optimizationPGOCoreCLRPackageVersion) - $(optimizationwindows_ntarm64MIBCRuntimePackageVersion) - $(optimizationwindows_ntx64MIBCRuntimePackageVersion) - $(optimizationwindows_ntx86MIBCRuntimePackageVersion) - + + $(MicrosoftCodeAnalysisPackageVersion) + $(MicrosoftCodeAnalysisAnalyzersPackageVersion) + $(MicrosoftCodeAnalysisCSharpPackageVersion) + $(MicrosoftCodeAnalysisNetAnalyzersPackageVersion) + $(MicrosoftDotNetApiCompatTaskPackageVersion) + $(MicrosoftDotNetCecilPackageVersion) + $(MicrosoftDotNetXUnitAssertPackageVersion) + $(MicrosoftNetCompilersToolsetPackageVersion) + $(MicrosoftNETSdkILPackageVersion) + $(MicrosoftNETWorkloadEmscriptenCurrentManifest110100TransportPackageVersion) + $(MicrosoftNETCoreAppRefPackageVersion) + $(MicrosoftNETCoreILAsmPackageVersion) + $(NuGetFrameworksPackageVersion) + $(NuGetPackagingPackageVersion) + $(NuGetProjectModelPackageVersion) + $(NuGetVersioningPackageVersion) + $(runtimenativeSystemIOPortsPackageVersion) + $(SystemCommandLinePackageVersion) + $(SystemReflectionMetadataPackageVersion) + $(SystemReflectionMetadataLoadContextPackageVersion) + $(SystemTextJsonPackageVersion) + + $(MicrosoftDotNetArcadeSdkPackageVersion) + $(MicrosoftDotNetBuildTasksArchivesPackageVersion) + $(MicrosoftDotNetBuildTasksFeedPackageVersion) + $(MicrosoftDotNetBuildTasksInstallersPackageVersion) + $(MicrosoftDotNetBuildTasksPackagingPackageVersion) + $(MicrosoftDotNetBuildTasksTargetFrameworkPackageVersion) + $(MicrosoftDotNetBuildTasksTemplatingPackageVersion) + $(MicrosoftDotNetBuildTasksWorkloadsPackageVersion) + $(MicrosoftDotNetCodeAnalysisPackageVersion) + $(MicrosoftDotNetGenAPIPackageVersion) + $(MicrosoftDotNetGenFacadesPackageVersion) + $(MicrosoftDotNetHelixJobMonitorPackageVersion) + $(MicrosoftDotNetHelixSdkPackageVersion) + $(MicrosoftDotNetPackageTestingPackageVersion) + $(MicrosoftDotNetRemoteExecutorPackageVersion) + $(MicrosoftDotNetSharedFrameworkSdkPackageVersion) + $(MicrosoftDotNetXliffTasksPackageVersion) + $(MicrosoftDotNetXUnitConsoleRunnerPackageVersion) + $(MicrosoftDotNetXUnitExtensionsPackageVersion) + $(MicrosoftDotNetCilStripSourcesPackageVersion) $(MicrosoftDotnetFuzzingTestDataPackageVersion) $(MicrosoftNETHostModelTestDataPackageVersion) @@ -222,9 +210,25 @@ This file should be imported by eng/Versions.props $(SystemSecurityCryptographyX509CertificatesTestDataPackageVersion) $(SystemTextRegularExpressionsTestDataPackageVersion) $(SystemWindowsExtensionsTestDataPackageVersion) - + $(MicrosoftDotNetXHarnessCLIPackageVersion) $(MicrosoftDotNetXHarnessTestRunnersCommonPackageVersion) $(MicrosoftDotNetXHarnessTestRunnersXunitPackageVersion) + + $(optimizationlinuxarm64MIBCRuntimePackageVersion) + $(optimizationlinuxx64MIBCRuntimePackageVersion) + $(optimizationPGOCoreCLRPackageVersion) + $(optimizationwindows_ntarm64MIBCRuntimePackageVersion) + $(optimizationwindows_ntx64MIBCRuntimePackageVersion) + $(optimizationwindows_ntx86MIBCRuntimePackageVersion) + + $(runtimelinuxarm64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) + $(runtimelinuxmuslarm64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) + $(runtimelinuxmuslx64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) + $(runtimelinuxx64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) + $(runtimeosxarm64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) + $(runtimeosxx64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) + $(runtimewinarm64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) + $(runtimewinx64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a357698eefc928..7fc5a750e6fc20 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -51,77 +51,77 @@ - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 https://github.com/dotnet/dotnet 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 https://github.com/dotnet/runtime-assets @@ -299,9 +299,9 @@ https://github.com/dotnet/xharness 0668c80ec27851f3c7f1b3e4536110a1d39af587 - - https://github.com/dotnet/dotnet - 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf + + https://github.com/dotnet/arcade + a1b4c4521a692e4147595f3c0c77998506d2d398 https://dev.azure.com/dnceng/internal/_git/dotnet-optimization @@ -413,5 +413,9 @@ https://github.com/dotnet/runtime-assets 509fb52c027cd46fab093f10c89691cda982edc4 + + https://github.com/dotnet/arcade + 4f3ff9cd2ae04b357d169bcadee91d8c07f86bfe + diff --git a/eng/common/AGENTS.md b/eng/common/AGENTS.md new file mode 100644 index 00000000000000..a5ed8f72926d3d --- /dev/null +++ b/eng/common/AGENTS.md @@ -0,0 +1,5 @@ +# `eng/common` + +Files under `eng/common` come from [Arcade](https://github.com/dotnet/arcade). +Edits in `eng/common` will be overwritten by automation unless the changes are made directly in the Arcade repository. +For more information, see the [Arcade documentation](https://github.com/dotnet/arcade/tree/main/Documentation). diff --git a/eng/common/core-templates/job/helix-job-monitor.yml b/eng/common/core-templates/job/helix-job-monitor.yml new file mode 100644 index 00000000000000..0974dbbe6e9ff7 --- /dev/null +++ b/eng/common/core-templates/job/helix-job-monitor.yml @@ -0,0 +1,224 @@ +parameters: +# Maximum run time of the monitor job in minutes. Also used for --max-wait-minutes. +- name: timeoutInMinutes + type: number + default: 360 + +# Owner segment of the source repository (e.g. 'dotnet' for 'dotnet/runtime') passed via --organization. +# Defaults to the owner segment of BUILD_REPOSITORY_NAME when empty. +- name: organization + type: string + default: '' + +# Name of the source repository (e.g. 'runtime' for 'dotnet/runtime') passed via --repository. +# Defaults to the repo segment of BUILD_REPOSITORY_NAME when empty. +- name: repository + type: string + default: '' + +# Optional dependency list for the generated job. +- name: dependsOn + type: object + default: [] + +# Optional condition for the generated job. +- name: condition + type: string + default: '' + +# NuGet package id of the Helix job monitor tool. +- name: toolPackageId + type: string + default: Microsoft.DotNet.Helix.JobMonitor + +# Console command exposed by the installed tool package. +- name: toolCommand + type: string + default: dotnet-helix-job-monitor + +# Optional explicit tool version. Only honored when 'toolNupkgArtifactName' is set; in the +# default code path the version is taken from the consuming repo's .config/dotnet-tools.json. +- name: toolVersion + type: string + default: '' + +# Optional NuGet feed used as an additional source when installing the tool. Only honored +# when 'toolNupkgArtifactName' is set; in the default code path the tool is restored from +# the consuming repo's .config/dotnet-tools.json manifest and no extra feeds are consulted. +- name: toolSource + type: string + default: '' + +# Base URI for the Helix service (--helix-base-uri). +- name: helixBaseUri + type: string + default: https://helix.dot.net/ + +# Helix API access token forwarded to the tool via the HELIX_ACCESSTOKEN environment variable. +- name: helixAccessToken + type: string + default: '' + +# Polling interval in seconds (--polling-interval-seconds). +- name: pollingIntervalSeconds + type: number + default: 30 + +# Advanced: optional pipeline artifact (produced earlier in this run) that contains the tool +# nupkg. When set, the artifact is downloaded and the tool is installed from the nupkg into +# a local tool-path; this bypasses the repo's .config/dotnet-tools.json manifest and is +# primarily intended for the Arcade repository itself, where the Helix job monitor tool is +# built in the same pipeline that runs this template. +# +# When this parameter is empty (the default), the consuming repository must declare the tool +# in its .config/dotnet-tools.json manifest (alongside other local .NET tools); the template +# will check out the repo and run 'dotnet tool restore' to install the version pinned there. +- name: toolNupkgArtifactName + type: string + default: '' + +# Advanced: sub-path within the downloaded artifact where the tool nupkg is located. Defaults +# to the standard Arcade non-shipping packages location for a Release build (relative to the +# pipeline artifact root, which is itself the build's 'artifacts' directory). +- name: toolNupkgArtifactSubPath + type: string + default: 'packages/Release/NonShipping' + +jobs: +- job: HelixJobMonitor + displayName: Monitor Helix Jobs + timeoutInMinutes: ${{ parameters.timeoutInMinutes }} + ${{ if ne(length(parameters.dependsOn), 0) }}: + dependsOn: ${{ parameters.dependsOn }} + ${{ if ne(parameters.condition, '') }}: + condition: ${{ parameters.condition }} + pool: + ${{ if eq(variables['System.TeamProject'], 'public') }}: + name: $(DncEngPublicBuildPool) + demands: ImageOverride -equals build.azurelinux.3.amd64.open + ${{ else }}: + name: $(DncEngInternalBuildPool) + demands: ImageOverride -equals build.azurelinux.3.amd64 + steps: + - checkout: self + fetchDepth: 1 + + - ${{ if ne(parameters.toolNupkgArtifactName, '') }}: + - task: DownloadPipelineArtifact@2 + displayName: Download Helix Job Monitor artifact + inputs: + buildType: current + artifactName: ${{ parameters.toolNupkgArtifactName }} + itemPattern: '${{ parameters.toolNupkgArtifactSubPath }}/${{ parameters.toolPackageId }}.*.nupkg' + targetPath: $(Agent.TempDirectory)/helix-job-monitor-nupkg + + - bash: | + set -euo pipefail + + toolPath="$AGENT_TEMPDIRECTORY/helix-job-monitor-tool" + mkdir -p "$toolPath" + + packageId='${{ parameters.toolPackageId }}' + toolVersion='${{ parameters.toolVersion }}' + nupkgArtifactSubPath='${{ parameters.toolNupkgArtifactSubPath }}' + nupkgDir="$AGENT_TEMPDIRECTORY/helix-job-monitor-nupkg/$nupkgArtifactSubPath" + + if [ ! -d "$nupkgDir" ]; then + echo "Expected nupkg directory '$nupkgDir' was not produced by the artifact download." >&2 + exit 1 + fi + + nupkg=$(find "$nupkgDir" -maxdepth 1 -type f -name "$packageId.*.nupkg" | head -n 1) + if [ -z "$nupkg" ]; then + echo "No '$packageId.*.nupkg' found in '$nupkgDir'." >&2 + exit 1 + fi + + # Derive the version from the nupkg filename so the local package is selected + # deterministically instead of resolving against any other configured feed. + nupkgBase=$(basename "$nupkg" .nupkg) + derivedVersion="${nupkgBase#${packageId}.}" + if [ -z "$toolVersion" ]; then + toolVersion="$derivedVersion" + fi + + echo "Using locally built '$packageId' version '$toolVersion' from '$nupkgDir'." + + # Create a minimal NuGet.config that only references the local nupkg directory. + # This avoids conflicts with the repo's package source mapping which blocks --add-source. + toolNugetConfig="$AGENT_TEMPDIRECTORY/helix-job-monitor-nuget.config" + printf '\n\n \n \n \n \n\n' "$nupkgDir" > "$toolNugetConfig" + + pushd "$(Build.SourcesDirectory)" > /dev/null + ./eng/common/dotnet.sh tool install \ + --tool-path "$toolPath" "$packageId" \ + --version "$toolVersion" \ + --configfile "$toolNugetConfig" + + # Locate the tool DLL so the run step can invoke it via ./eng/common/dotnet.sh exec. + toolDll=$(find "$toolPath/.store" -path '*/tools/*/any/*.deps.json' -type f | head -n 1) + toolDll="${toolDll%.deps.json}.dll" + if [ ! -f "$toolDll" ]; then + echo "Could not find tool DLL in '$toolPath/.store'." >&2 + exit 1 + fi + + echo "Tool DLL: $toolDll" + echo "##vso[task.setvariable variable=HelixJobMonitorDll]$toolDll" + displayName: Install Helix Job Monitor + + - ${{ else }}: + - bash: ./eng/common/dotnet.sh tool restore + displayName: Restore Helix Job Monitor + + - bash: | + set -euo pipefail + + toolArgs=( + --helix-base-uri '${{ parameters.helixBaseUri }}' + --polling-interval-seconds '${{ parameters.pollingIntervalSeconds }}' + --max-wait-minutes "$((${{ parameters.timeoutInMinutes }} - 2))" # Set the tool's timeout slightly lower than the Azure DevOps job timeout to allow it to exit gracefully. + --stage-name '$(System.StageName)' + ) + + organization='${{ parameters.organization }}' + repository='${{ parameters.repository }}' + + # Fall back to Azure DevOps-provided environment variables when the caller did not + # supply organization / repository explicitly. BUILD_REPOSITORY_NAME is typically + # 'owner/repo' for GitHub-backed builds. + if [ -z "$organization" ] || [ -z "$repository" ]; then + buildRepoName="${BUILD_REPOSITORY_NAME:-}" + if [ -n "$buildRepoName" ] && [[ "$buildRepoName" == */* ]]; then + repoOwner="${buildRepoName%%/*}" + repoName="${buildRepoName#*/}" + if [ -z "$organization" ]; then organization="$repoOwner"; fi + if [ -z "$repository" ]; then repository="$repoName"; fi + fi + fi + + if [ -n "$organization" ]; then toolArgs+=( --organization "$organization" ); fi + if [ -n "$repository" ]; then toolArgs+=( --repository "$repository" ); fi + + # Build.Reason and Build.SourceBranch are required to derive the Helix source filter + # the same way the Helix SDK submitter does (PR -> 'pr', internal -> 'official', + # otherwise -> 'ci'). Without these, manually-queued / scheduled / CI builds would + # be looked up under the wrong source prefix and find zero jobs. + toolArgs+=( --build-reason "$(Build.Reason)" ) + toolArgs+=( --source-branch "$(Build.SourceBranch)" ) + + if [ -n '${{ parameters.toolNupkgArtifactName }}' ]; then + # Tool was installed from a local nupkg; run the DLL via the repo-local dotnet. + export DOTNET_ROOT="$(Build.SourcesDirectory)/.dotnet" + ./eng/common/dotnet.sh exec "$(HelixJobMonitorDll)" "${toolArgs[@]}" + else + # Tool was restored from the local .config/dotnet-tools.json manifest; invoke it + # through the manifest from the repo root. + pushd "$BUILD_SOURCESDIRECTORY" > /dev/null + trap 'popd > /dev/null' EXIT + ./eng/common/dotnet.sh tool run '${{ parameters.toolCommand }}' -- "${toolArgs[@]}" + fi + displayName: Monitor Helix Jobs + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + HELIX_ACCESSTOKEN: ${{ parameters.helixAccessToken }} diff --git a/eng/common/core-templates/job/onelocbuild.yml b/eng/common/core-templates/job/onelocbuild.yml index eefed3b667a4fb..86ea9f63504243 100644 --- a/eng/common/core-templates/job/onelocbuild.yml +++ b/eng/common/core-templates/job/onelocbuild.yml @@ -22,6 +22,7 @@ parameters: GitHubOrg: dotnet MirrorRepo: '' MirrorBranch: main + xLocCustomPowerShellScript: '' condition: '' JobNameSuffix: '' is1ESPipeline: '' @@ -97,6 +98,8 @@ jobs: gitHubOrganization: ${{ parameters.GitHubOrg }} mirrorRepo: ${{ parameters.MirrorRepo }} mirrorBranch: ${{ parameters.MirrorBranch }} + ${{ if ne(parameters.xLocCustomPowerShellScript, '') }}: + xLocCustomPowerShellScript: ${{ parameters.xLocCustomPowerShellScript }} condition: ${{ parameters.condition }} # Copy the locProject.json to the root of the Loc directory, then publish a pipeline artifact diff --git a/eng/common/core-templates/steps/publish-logs.yml b/eng/common/core-templates/steps/publish-logs.yml index 84a1922c73f392..5fc099a1143dff 100644 --- a/eng/common/core-templates/steps/publish-logs.yml +++ b/eng/common/core-templates/steps/publish-logs.yml @@ -33,8 +33,6 @@ steps: '$(publishing-dnceng-devdiv-code-r-build-re)' '$(dn-bot-all-orgs-artifact-feeds-rw)' '$(akams-client-id)' - '$(microsoft-symbol-server-pat)' - '$(symweb-symbol-server-pat)' '$(dnceng-symbol-server-pat)' '$(dn-bot-all-orgs-build-rw-code-rw)' '$(System.AccessToken)' diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake index ff2dfdb4a5bf60..99d6dfe82dde38 100644 --- a/eng/common/cross/toolchain.cmake +++ b/eng/common/cross/toolchain.cmake @@ -225,13 +225,19 @@ elseif(ILLUMOS) locate_toolchain_exec(g++ CMAKE_CXX_COMPILER) elseif(HAIKU) set(CMAKE_SYSROOT "${CROSS_ROOTFS}") - set(CMAKE_PROGRAM_PATH "${CMAKE_PROGRAM_PATH};${CROSS_ROOTFS}/cross-tools-x86_64/bin") set(CMAKE_SYSTEM_PREFIX_PATH "${CROSS_ROOTFS}") set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lssp") set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lssp") - locate_toolchain_exec(gcc CMAKE_C_COMPILER) - locate_toolchain_exec(g++ CMAKE_CXX_COMPILER) + if ($ENV{CCC_CC} MATCHES ".*gcc.*") + set(CMAKE_PROGRAM_PATH "${CMAKE_PROGRAM_PATH};${CROSS_ROOTFS}/cross-tools-x86_64/bin") + locate_toolchain_exec(gcc CMAKE_C_COMPILER) + locate_toolchain_exec(g++ CMAKE_CXX_COMPILER) + else() + set(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/cross-tools-x86_64") + set(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/cross-tools-x86_64") + set(CMAKE_ASM_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/cross-tools-x86_64") + endif() # let CMake set up the correct search paths include(Platform/Haiku) diff --git a/eng/common/dotnet-install.ps1 b/eng/common/dotnet-install.ps1 index 811f0f717f736a..50ae62737687c5 100644 --- a/eng/common/dotnet-install.ps1 +++ b/eng/common/dotnet-install.ps1 @@ -10,7 +10,11 @@ Param( . $PSScriptRoot\tools.ps1 -$dotnetRoot = Join-Path $RepoRoot '.dotnet' +if (-not [string]::IsNullOrEmpty($env:DOTNET_GLOBAL_INSTALL_DIR)) { + $dotnetRoot = $env:DOTNET_GLOBAL_INSTALL_DIR +} else { + $dotnetRoot = Join-Path $RepoRoot '.dotnet' +} $installdir = $dotnetRoot try { diff --git a/eng/common/dotnet-install.sh b/eng/common/dotnet-install.sh index 61f302bb677560..1cb3f5abac2864 100755 --- a/eng/common/dotnet-install.sh +++ b/eng/common/dotnet-install.sh @@ -80,7 +80,11 @@ case $cpuname in ;; esac -dotnetRoot="${repo_root}.dotnet" +if [[ -n "${DOTNET_GLOBAL_INSTALL_DIR:-}" ]]; then + dotnetRoot="$DOTNET_GLOBAL_INSTALL_DIR" +else + dotnetRoot="${repo_root}.dotnet" +fi if [[ $architecture != "" ]] && [[ $architecture != $buildarch ]]; then dotnetRoot="$dotnetRoot/$architecture" fi diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 65adefc7f26871..0e281df8cae5cd 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -168,6 +168,12 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { $env:DOTNET_CLI_TELEMETRY_OPTOUT=1 } + # Keep repo builds isolated from machine-installed SDK state and workload advertising. + # This avoids preview SDK builds picking up mismatched workloads on CI images. + $env:DOTNET_MULTILEVEL_LOOKUP = '0' + $env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = '1' + $env:DOTNET_CLI_WORKLOAD_UPDATE_NOTIFY_DISABLE = '1' + # Find the first path on %PATH% that contains the dotnet.exe if ($useInstalledDotNetCli -and (-not $globalJsonHasRuntimes) -and ($env:DOTNET_INSTALL_DIR -eq $null)) { $dotnetExecutable = GetExecutableFileName 'dotnet' @@ -230,6 +236,9 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { Write-PipelinePrependPath -Path $dotnetRoot Write-PipelineSetVariable -Name 'DOTNET_NOLOGO' -Value '1' + Write-PipelineSetVariable -Name 'DOTNET_MULTILEVEL_LOOKUP' -Value '0' + Write-PipelineSetVariable -Name 'DOTNET_SKIP_FIRST_TIME_EXPERIENCE' -Value '1' + Write-PipelineSetVariable -Name 'DOTNET_CLI_WORKLOAD_UPDATE_NOTIFY_DISABLE' -Value '1' return $global:_DotNetInstallDir = $dotnetRoot } @@ -619,11 +628,7 @@ function GetSdkTaskProject([string]$taskName) { if (Test-Path $proj) { return $proj } - # TODO: Remove this fallback once all supported versions use the new layout. - $legacyProj = Join-Path $toolsetDir "SdkTasks\$taskName.proj" - if (Test-Path $legacyProj) { - return $legacyProj - } + throw "Unable to find $taskName.proj in toolset at: $toolsetDir" } @@ -699,23 +704,14 @@ function InitializeToolset() { $packageDir = Join-Path $nugetCache (Join-Path 'microsoft.dotnet.arcade.sdk' $toolsetVersion) $packageToolsetDir = Join-Path $packageDir 'toolset' - $packageToolsDir = Join-Path $packageDir 'tools' - # TODO: Remove the tools/ check once all supported versions have the toolset folder. - if (!(Test-Path $packageToolsetDir) -and !(Test-Path $packageToolsDir)) { + if (!(Test-Path $packageToolsetDir)) { Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Arcade SDK package does not contain a toolset or tools folder: $packageDir" ExitWithExitCode 3 } New-Item -ItemType Directory -Path $toolsetToolsDir -Force | Out-Null - - # Copy toolset if present at the package root (new layout), otherwise fall back to tools - if (Test-Path $packageToolsetDir) { - Copy-Item -Path "$packageToolsetDir\*" -Destination $toolsetToolsDir -Recurse -Force - } else { - # TODO: Remove this fallback once all supported versions have the toolset folder. - Copy-Item -Path "$packageToolsDir\*" -Destination $toolsetToolsDir -Recurse -Force - } + Copy-Item -Path "$packageToolsetDir\*" -Destination $toolsetToolsDir -Recurse -Force if (Test-Path $buildProjPath) { $toolsetBuildProj = $buildProjPath @@ -842,6 +838,10 @@ function MSBuild-Core() { $cmdArgs = "$($buildTool.Command) /m /nologo /clp:Summary /v:$verbosity /nr:$nodeReuse /p:ContinuousIntegrationBuild=$ci" + if ($ci -and $buildTool.Tool -eq 'dotnet') { + $cmdArgs += ' /p:MSBuildEnableWorkloadResolver=false' + } + # Add -mt flag for MSBuild multithreaded mode if enabled via environment variable if ($env:MSBUILD_MT_ENABLED -eq "1") { $cmdArgs += ' -mt' @@ -952,6 +952,12 @@ Create-Directory $ToolsetDir Create-Directory $TempDir Create-Directory $LogDir +# Direct MSBuild crash diagnostics (MSB4166 failure.txt files) to a known location +# under artifacts/log so they are captured as build artifacts in CI. +if (-not $env:MSBUILDDEBUGPATH) { + $env:MSBUILDDEBUGPATH = Join-Path $LogDir 'MsbuildDebugLogs' +} + Write-PipelineSetVariable -Name 'Artifacts' -Value $ArtifactsDir Write-PipelineSetVariable -Name 'Artifacts.Toolset' -Value $ToolsetDir Write-PipelineSetVariable -Name 'Artifacts.Log' -Value $LogDir diff --git a/eng/common/tools.sh b/eng/common/tools.sh index 95c55ce9b4d914..5ff37cfb700010 100755 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -126,6 +126,12 @@ function InitializeDotNetCli { export DOTNET_CLI_TELEMETRY_OPTOUT=1 fi + # Keep repo builds isolated from machine-installed SDK state and workload advertising. + # This avoids preview SDK builds picking up mismatched workloads on CI images. + export DOTNET_MULTILEVEL_LOOKUP=0 + export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 + export DOTNET_CLI_WORKLOAD_UPDATE_NOTIFY_DISABLE=1 + # LTTNG is the logging infrastructure used by Core CLR. Need this variable set # so it doesn't output warnings to the console. export LTTNG_HOME="$HOME" @@ -171,6 +177,9 @@ function InitializeDotNetCli { Write-PipelinePrependPath -path "$dotnet_root" Write-PipelineSetVariable -name "DOTNET_NOLOGO" -value "1" + Write-PipelineSetVariable -name "DOTNET_MULTILEVEL_LOOKUP" -value "0" + Write-PipelineSetVariable -name "DOTNET_SKIP_FIRST_TIME_EXPERIENCE" -value "1" + Write-PipelineSetVariable -name "DOTNET_CLI_WORKLOAD_UPDATE_NOTIFY_DISABLE" -value "1" # return value _InitializeDotNetCli="$dotnet_root" @@ -449,21 +458,13 @@ function InitializeToolset { local package_dir="$_GetNuGetPackageCachePath/microsoft.dotnet.arcade.sdk/$toolset_version" - # TODO: Remove the tools/ check once all supported versions have the toolset folder. - if [[ ! -d "$package_dir/toolset" && ! -d "$package_dir/tools" ]]; then - Write-PipelineTelemetryError -category 'InitializeToolset' "Arcade SDK package does not contain a toolset or tools folder: $package_dir" + if [[ ! -d "$package_dir/toolset" ]]; then + Write-PipelineTelemetryError -category 'InitializeToolset' "Arcade SDK package does not contain a toolset folder: $package_dir" ExitWithExitCode 3 fi mkdir -p "$toolset_tools_dir" - - # Copy toolset if present at the package root (new layout), otherwise fall back to tools - if [[ -d "$package_dir/toolset" ]]; then - cp -r "$package_dir/toolset/." "$toolset_tools_dir" - else - # TODO: Remove this fallback once all supported versions have the toolset folder. - cp -r "$package_dir/tools/." "$toolset_tools_dir" - fi + cp -r "$package_dir/toolset/." "$toolset_tools_dir" if [[ -a "$toolset_tools_dir/Build.proj" ]]; then toolset_build_proj="$toolset_tools_dir/Build.proj" @@ -590,7 +591,12 @@ function MSBuild-Core { warnnotaserror_switch="/warnnotaserror:$warn_not_as_error /p:AdditionalWarningsNotAsErrors=$warn_not_as_error" fi - RunBuildTool "$_InitializeBuildToolCommand" /m /nologo /clp:Summary /v:$verbosity /nr:$node_reuse $warnaserror_switch $mt_switch $warnnotaserror_switch /p:TreatWarningsAsErrors=$warn_as_error /p:ContinuousIntegrationBuild=$ci "$@" + local workload_resolver_switch="" + if [[ "$ci" == true && -n "${_InitializeBuildToolCommand:-}" ]]; then + workload_resolver_switch="/p:MSBuildEnableWorkloadResolver=false" + fi + + RunBuildTool "$_InitializeBuildToolCommand" /m /nologo /clp:Summary /v:$verbosity /nr:$node_reuse $warnaserror_switch $mt_switch $warnnotaserror_switch $workload_resolver_switch /p:TreatWarningsAsErrors=$warn_as_error /p:ContinuousIntegrationBuild=$ci "$@" } function GetDarc { @@ -615,12 +621,7 @@ function GetSdkTaskProject { echo "$proj" return fi - # TODO: Remove this fallback once all supported versions use the new layout. - local legacyProj="$toolsetDir/SdkTasks/$taskName.proj" - if [[ -a "$legacyProj" ]]; then - echo "$legacyProj" - return - fi + Write-PipelineTelemetryError -category 'Build' "Unable to find $taskName.proj in toolset at: $toolsetDir" ExitWithExitCode 3 } @@ -660,6 +661,12 @@ mkdir -p "$toolset_dir" mkdir -p "$temp_dir" mkdir -p "$log_dir" +# Direct MSBuild crash diagnostics (MSB4166 failure.txt files) to a known location +# under artifacts/log so they are captured as build artifacts in CI. +if [[ -z "${MSBUILDDEBUGPATH:-}" ]]; then + export MSBUILDDEBUGPATH="$log_dir/MsbuildDebugLogs" +fi + Write-PipelineSetVariable -name "Artifacts" -value "$artifacts_dir" Write-PipelineSetVariable -name "Artifacts.Toolset" -value "$toolset_dir" Write-PipelineSetVariable -name "Artifacts.Log" -value "$log_dir" diff --git a/global.json b/global.json index 01f9d078a1fb65..2eefb7747aa1c7 100644 --- a/global.json +++ b/global.json @@ -13,9 +13,9 @@ "dotnet": "11.0.100-preview.5.26227.104" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26257.113", - "Microsoft.DotNet.Helix.Sdk": "11.0.0-beta.26257.113", - "Microsoft.DotNet.SharedFramework.Sdk": "11.0.0-beta.26257.113", + "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26264.2", + "Microsoft.DotNet.Helix.Sdk": "11.0.0-beta.26264.2", + "Microsoft.DotNet.SharedFramework.Sdk": "11.0.0-beta.26264.2", "Microsoft.Build.NoTargets": "3.7.0", "Microsoft.Build.Traversal": "3.4.0", "Microsoft.NET.Sdk.IL": "11.0.0-preview.5.26257.113" From 583ead83d0c68e660b6a97d22a0b79fec18cf598 Mon Sep 17 00:00:00 2001 From: Premek Vysoky Date: Fri, 15 May 2026 14:01:38 +0200 Subject: [PATCH 4/8] Update Helix Job Monitor --- .config/dotnet-tools.json | 2 +- eng/Version.Details.props | 36 +++++----- eng/Version.Details.xml | 72 +++++++++---------- eng/common/core-templates/job/onelocbuild.yml | 3 - .../core-templates/steps/publish-logs.yml | 2 + eng/common/cross/toolchain.cmake | 12 +--- eng/common/dotnet-install.ps1 | 6 +- eng/common/dotnet-install.sh | 6 +- eng/common/tools.ps1 | 38 +++++----- eng/common/tools.sh | 43 +++++------ global.json | 6 +- 11 files changed, 99 insertions(+), 127 deletions(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index de67bb4bdcc540..78132c6b85dd0f 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -27,7 +27,7 @@ ] }, "microsoft.dotnet.helix.jobmonitor": { - "version": "11.0.0-beta.26264.2", + "version": "11.0.0-beta.26265.3", "commands": [ "dotnet-helix-job-monitor" ] diff --git a/eng/Version.Details.props b/eng/Version.Details.props index 11f754d0597ac0..4b5acced21d453 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -60,25 +60,25 @@ This file should be imported by eng/Versions.props 11.0.0-preview.5.26257.113 11.0.0-preview.5.26257.113 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 - 11.0.0-beta.26264.2 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 + 11.0.0-beta.26265.3 2.9.3-beta.26264.2 - 11.0.0-beta.26264.2 + 11.0.0-beta.26265.3 11.0.0-beta.26180.1 11.0.0-beta.26180.1 diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 7fc5a750e6fc20..29d1e367d9026f 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -51,77 +51,77 @@ - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 https://github.com/dotnet/dotnet 0eae08ed2f094f44e0151e4815e7cdd1a334fcdf - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 https://github.com/dotnet/runtime-assets @@ -299,9 +299,9 @@ https://github.com/dotnet/xharness 0668c80ec27851f3c7f1b3e4536110a1d39af587 - + https://github.com/dotnet/arcade - a1b4c4521a692e4147595f3c0c77998506d2d398 + 674b66fb89fae22b8823c85c73e7b79a2346f8c5 https://dev.azure.com/dnceng/internal/_git/dotnet-optimization @@ -413,7 +413,7 @@ https://github.com/dotnet/runtime-assets 509fb52c027cd46fab093f10c89691cda982edc4 - + https://github.com/dotnet/arcade 4f3ff9cd2ae04b357d169bcadee91d8c07f86bfe diff --git a/eng/common/core-templates/job/onelocbuild.yml b/eng/common/core-templates/job/onelocbuild.yml index 86ea9f63504243..eefed3b667a4fb 100644 --- a/eng/common/core-templates/job/onelocbuild.yml +++ b/eng/common/core-templates/job/onelocbuild.yml @@ -22,7 +22,6 @@ parameters: GitHubOrg: dotnet MirrorRepo: '' MirrorBranch: main - xLocCustomPowerShellScript: '' condition: '' JobNameSuffix: '' is1ESPipeline: '' @@ -98,8 +97,6 @@ jobs: gitHubOrganization: ${{ parameters.GitHubOrg }} mirrorRepo: ${{ parameters.MirrorRepo }} mirrorBranch: ${{ parameters.MirrorBranch }} - ${{ if ne(parameters.xLocCustomPowerShellScript, '') }}: - xLocCustomPowerShellScript: ${{ parameters.xLocCustomPowerShellScript }} condition: ${{ parameters.condition }} # Copy the locProject.json to the root of the Loc directory, then publish a pipeline artifact diff --git a/eng/common/core-templates/steps/publish-logs.yml b/eng/common/core-templates/steps/publish-logs.yml index 5fc099a1143dff..84a1922c73f392 100644 --- a/eng/common/core-templates/steps/publish-logs.yml +++ b/eng/common/core-templates/steps/publish-logs.yml @@ -33,6 +33,8 @@ steps: '$(publishing-dnceng-devdiv-code-r-build-re)' '$(dn-bot-all-orgs-artifact-feeds-rw)' '$(akams-client-id)' + '$(microsoft-symbol-server-pat)' + '$(symweb-symbol-server-pat)' '$(dnceng-symbol-server-pat)' '$(dn-bot-all-orgs-build-rw-code-rw)' '$(System.AccessToken)' diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake index 99d6dfe82dde38..ff2dfdb4a5bf60 100644 --- a/eng/common/cross/toolchain.cmake +++ b/eng/common/cross/toolchain.cmake @@ -225,19 +225,13 @@ elseif(ILLUMOS) locate_toolchain_exec(g++ CMAKE_CXX_COMPILER) elseif(HAIKU) set(CMAKE_SYSROOT "${CROSS_ROOTFS}") + set(CMAKE_PROGRAM_PATH "${CMAKE_PROGRAM_PATH};${CROSS_ROOTFS}/cross-tools-x86_64/bin") set(CMAKE_SYSTEM_PREFIX_PATH "${CROSS_ROOTFS}") set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lssp") set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lssp") - if ($ENV{CCC_CC} MATCHES ".*gcc.*") - set(CMAKE_PROGRAM_PATH "${CMAKE_PROGRAM_PATH};${CROSS_ROOTFS}/cross-tools-x86_64/bin") - locate_toolchain_exec(gcc CMAKE_C_COMPILER) - locate_toolchain_exec(g++ CMAKE_CXX_COMPILER) - else() - set(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/cross-tools-x86_64") - set(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/cross-tools-x86_64") - set(CMAKE_ASM_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/cross-tools-x86_64") - endif() + locate_toolchain_exec(gcc CMAKE_C_COMPILER) + locate_toolchain_exec(g++ CMAKE_CXX_COMPILER) # let CMake set up the correct search paths include(Platform/Haiku) diff --git a/eng/common/dotnet-install.ps1 b/eng/common/dotnet-install.ps1 index 50ae62737687c5..811f0f717f736a 100644 --- a/eng/common/dotnet-install.ps1 +++ b/eng/common/dotnet-install.ps1 @@ -10,11 +10,7 @@ Param( . $PSScriptRoot\tools.ps1 -if (-not [string]::IsNullOrEmpty($env:DOTNET_GLOBAL_INSTALL_DIR)) { - $dotnetRoot = $env:DOTNET_GLOBAL_INSTALL_DIR -} else { - $dotnetRoot = Join-Path $RepoRoot '.dotnet' -} +$dotnetRoot = Join-Path $RepoRoot '.dotnet' $installdir = $dotnetRoot try { diff --git a/eng/common/dotnet-install.sh b/eng/common/dotnet-install.sh index 1cb3f5abac2864..61f302bb677560 100755 --- a/eng/common/dotnet-install.sh +++ b/eng/common/dotnet-install.sh @@ -80,11 +80,7 @@ case $cpuname in ;; esac -if [[ -n "${DOTNET_GLOBAL_INSTALL_DIR:-}" ]]; then - dotnetRoot="$DOTNET_GLOBAL_INSTALL_DIR" -else - dotnetRoot="${repo_root}.dotnet" -fi +dotnetRoot="${repo_root}.dotnet" if [[ $architecture != "" ]] && [[ $architecture != $buildarch ]]; then dotnetRoot="$dotnetRoot/$architecture" fi diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 0e281df8cae5cd..65adefc7f26871 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -168,12 +168,6 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { $env:DOTNET_CLI_TELEMETRY_OPTOUT=1 } - # Keep repo builds isolated from machine-installed SDK state and workload advertising. - # This avoids preview SDK builds picking up mismatched workloads on CI images. - $env:DOTNET_MULTILEVEL_LOOKUP = '0' - $env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = '1' - $env:DOTNET_CLI_WORKLOAD_UPDATE_NOTIFY_DISABLE = '1' - # Find the first path on %PATH% that contains the dotnet.exe if ($useInstalledDotNetCli -and (-not $globalJsonHasRuntimes) -and ($env:DOTNET_INSTALL_DIR -eq $null)) { $dotnetExecutable = GetExecutableFileName 'dotnet' @@ -236,9 +230,6 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { Write-PipelinePrependPath -Path $dotnetRoot Write-PipelineSetVariable -Name 'DOTNET_NOLOGO' -Value '1' - Write-PipelineSetVariable -Name 'DOTNET_MULTILEVEL_LOOKUP' -Value '0' - Write-PipelineSetVariable -Name 'DOTNET_SKIP_FIRST_TIME_EXPERIENCE' -Value '1' - Write-PipelineSetVariable -Name 'DOTNET_CLI_WORKLOAD_UPDATE_NOTIFY_DISABLE' -Value '1' return $global:_DotNetInstallDir = $dotnetRoot } @@ -628,7 +619,11 @@ function GetSdkTaskProject([string]$taskName) { if (Test-Path $proj) { return $proj } - + # TODO: Remove this fallback once all supported versions use the new layout. + $legacyProj = Join-Path $toolsetDir "SdkTasks\$taskName.proj" + if (Test-Path $legacyProj) { + return $legacyProj + } throw "Unable to find $taskName.proj in toolset at: $toolsetDir" } @@ -704,14 +699,23 @@ function InitializeToolset() { $packageDir = Join-Path $nugetCache (Join-Path 'microsoft.dotnet.arcade.sdk' $toolsetVersion) $packageToolsetDir = Join-Path $packageDir 'toolset' + $packageToolsDir = Join-Path $packageDir 'tools' - if (!(Test-Path $packageToolsetDir)) { + # TODO: Remove the tools/ check once all supported versions have the toolset folder. + if (!(Test-Path $packageToolsetDir) -and !(Test-Path $packageToolsDir)) { Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Arcade SDK package does not contain a toolset or tools folder: $packageDir" ExitWithExitCode 3 } New-Item -ItemType Directory -Path $toolsetToolsDir -Force | Out-Null - Copy-Item -Path "$packageToolsetDir\*" -Destination $toolsetToolsDir -Recurse -Force + + # Copy toolset if present at the package root (new layout), otherwise fall back to tools + if (Test-Path $packageToolsetDir) { + Copy-Item -Path "$packageToolsetDir\*" -Destination $toolsetToolsDir -Recurse -Force + } else { + # TODO: Remove this fallback once all supported versions have the toolset folder. + Copy-Item -Path "$packageToolsDir\*" -Destination $toolsetToolsDir -Recurse -Force + } if (Test-Path $buildProjPath) { $toolsetBuildProj = $buildProjPath @@ -838,10 +842,6 @@ function MSBuild-Core() { $cmdArgs = "$($buildTool.Command) /m /nologo /clp:Summary /v:$verbosity /nr:$nodeReuse /p:ContinuousIntegrationBuild=$ci" - if ($ci -and $buildTool.Tool -eq 'dotnet') { - $cmdArgs += ' /p:MSBuildEnableWorkloadResolver=false' - } - # Add -mt flag for MSBuild multithreaded mode if enabled via environment variable if ($env:MSBUILD_MT_ENABLED -eq "1") { $cmdArgs += ' -mt' @@ -952,12 +952,6 @@ Create-Directory $ToolsetDir Create-Directory $TempDir Create-Directory $LogDir -# Direct MSBuild crash diagnostics (MSB4166 failure.txt files) to a known location -# under artifacts/log so they are captured as build artifacts in CI. -if (-not $env:MSBUILDDEBUGPATH) { - $env:MSBUILDDEBUGPATH = Join-Path $LogDir 'MsbuildDebugLogs' -} - Write-PipelineSetVariable -Name 'Artifacts' -Value $ArtifactsDir Write-PipelineSetVariable -Name 'Artifacts.Toolset' -Value $ToolsetDir Write-PipelineSetVariable -Name 'Artifacts.Log' -Value $LogDir diff --git a/eng/common/tools.sh b/eng/common/tools.sh index 5ff37cfb700010..95c55ce9b4d914 100755 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -126,12 +126,6 @@ function InitializeDotNetCli { export DOTNET_CLI_TELEMETRY_OPTOUT=1 fi - # Keep repo builds isolated from machine-installed SDK state and workload advertising. - # This avoids preview SDK builds picking up mismatched workloads on CI images. - export DOTNET_MULTILEVEL_LOOKUP=0 - export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 - export DOTNET_CLI_WORKLOAD_UPDATE_NOTIFY_DISABLE=1 - # LTTNG is the logging infrastructure used by Core CLR. Need this variable set # so it doesn't output warnings to the console. export LTTNG_HOME="$HOME" @@ -177,9 +171,6 @@ function InitializeDotNetCli { Write-PipelinePrependPath -path "$dotnet_root" Write-PipelineSetVariable -name "DOTNET_NOLOGO" -value "1" - Write-PipelineSetVariable -name "DOTNET_MULTILEVEL_LOOKUP" -value "0" - Write-PipelineSetVariable -name "DOTNET_SKIP_FIRST_TIME_EXPERIENCE" -value "1" - Write-PipelineSetVariable -name "DOTNET_CLI_WORKLOAD_UPDATE_NOTIFY_DISABLE" -value "1" # return value _InitializeDotNetCli="$dotnet_root" @@ -458,13 +449,21 @@ function InitializeToolset { local package_dir="$_GetNuGetPackageCachePath/microsoft.dotnet.arcade.sdk/$toolset_version" - if [[ ! -d "$package_dir/toolset" ]]; then - Write-PipelineTelemetryError -category 'InitializeToolset' "Arcade SDK package does not contain a toolset folder: $package_dir" + # TODO: Remove the tools/ check once all supported versions have the toolset folder. + if [[ ! -d "$package_dir/toolset" && ! -d "$package_dir/tools" ]]; then + Write-PipelineTelemetryError -category 'InitializeToolset' "Arcade SDK package does not contain a toolset or tools folder: $package_dir" ExitWithExitCode 3 fi mkdir -p "$toolset_tools_dir" - cp -r "$package_dir/toolset/." "$toolset_tools_dir" + + # Copy toolset if present at the package root (new layout), otherwise fall back to tools + if [[ -d "$package_dir/toolset" ]]; then + cp -r "$package_dir/toolset/." "$toolset_tools_dir" + else + # TODO: Remove this fallback once all supported versions have the toolset folder. + cp -r "$package_dir/tools/." "$toolset_tools_dir" + fi if [[ -a "$toolset_tools_dir/Build.proj" ]]; then toolset_build_proj="$toolset_tools_dir/Build.proj" @@ -591,12 +590,7 @@ function MSBuild-Core { warnnotaserror_switch="/warnnotaserror:$warn_not_as_error /p:AdditionalWarningsNotAsErrors=$warn_not_as_error" fi - local workload_resolver_switch="" - if [[ "$ci" == true && -n "${_InitializeBuildToolCommand:-}" ]]; then - workload_resolver_switch="/p:MSBuildEnableWorkloadResolver=false" - fi - - RunBuildTool "$_InitializeBuildToolCommand" /m /nologo /clp:Summary /v:$verbosity /nr:$node_reuse $warnaserror_switch $mt_switch $warnnotaserror_switch $workload_resolver_switch /p:TreatWarningsAsErrors=$warn_as_error /p:ContinuousIntegrationBuild=$ci "$@" + RunBuildTool "$_InitializeBuildToolCommand" /m /nologo /clp:Summary /v:$verbosity /nr:$node_reuse $warnaserror_switch $mt_switch $warnnotaserror_switch /p:TreatWarningsAsErrors=$warn_as_error /p:ContinuousIntegrationBuild=$ci "$@" } function GetDarc { @@ -621,7 +615,12 @@ function GetSdkTaskProject { echo "$proj" return fi - + # TODO: Remove this fallback once all supported versions use the new layout. + local legacyProj="$toolsetDir/SdkTasks/$taskName.proj" + if [[ -a "$legacyProj" ]]; then + echo "$legacyProj" + return + fi Write-PipelineTelemetryError -category 'Build' "Unable to find $taskName.proj in toolset at: $toolsetDir" ExitWithExitCode 3 } @@ -661,12 +660,6 @@ mkdir -p "$toolset_dir" mkdir -p "$temp_dir" mkdir -p "$log_dir" -# Direct MSBuild crash diagnostics (MSB4166 failure.txt files) to a known location -# under artifacts/log so they are captured as build artifacts in CI. -if [[ -z "${MSBUILDDEBUGPATH:-}" ]]; then - export MSBUILDDEBUGPATH="$log_dir/MsbuildDebugLogs" -fi - Write-PipelineSetVariable -name "Artifacts" -value "$artifacts_dir" Write-PipelineSetVariable -name "Artifacts.Toolset" -value "$toolset_dir" Write-PipelineSetVariable -name "Artifacts.Log" -value "$log_dir" diff --git a/global.json b/global.json index 2eefb7747aa1c7..a5771df8a7075d 100644 --- a/global.json +++ b/global.json @@ -13,9 +13,9 @@ "dotnet": "11.0.100-preview.5.26227.104" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26264.2", - "Microsoft.DotNet.Helix.Sdk": "11.0.0-beta.26264.2", - "Microsoft.DotNet.SharedFramework.Sdk": "11.0.0-beta.26264.2", + "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26265.3", + "Microsoft.DotNet.Helix.Sdk": "11.0.0-beta.26265.3", + "Microsoft.DotNet.SharedFramework.Sdk": "11.0.0-beta.26265.3", "Microsoft.Build.NoTargets": "3.7.0", "Microsoft.Build.Traversal": "3.4.0", "Microsoft.NET.Sdk.IL": "11.0.0-preview.5.26257.113" From f87da94ee673a1974195dc3d8a64b2b0fa795ecf Mon Sep 17 00:00:00 2001 From: Premek Vysoky Date: Mon, 18 May 2026 16:14:34 +0200 Subject: [PATCH 5/8] Move the monitor job on top --- eng/pipelines/runtime.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/eng/pipelines/runtime.yml b/eng/pipelines/runtime.yml index b0288279952fc2..f0646d43097a78 100644 --- a/eng/pipelines/runtime.yml +++ b/eng/pipelines/runtime.yml @@ -67,6 +67,11 @@ extends: - stage: Build jobs: + - template: /eng/common/core-templates/job/helix-job-monitor.yml + parameters: + helixAccessToken: $(HelixApiAccessToken) + timeoutInMinutes: 540 + # # Build CoreCLR verticals where we don't run host tests # @@ -2098,8 +2103,3 @@ extends: eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_libraries.containsChange'], true), eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_mono_excluding_wasm.containsChange'], true), eq(variables['isRollingBuild'], true)) - - - template: /eng/common/core-templates/job/helix-job-monitor.yml - parameters: - helixAccessToken: $(HelixApiAccessToken) - timeoutInMinutes: 540 From 661391906a5fbfd7c0616a7f2ba59dcefec8b748 Mon Sep 17 00:00:00 2001 From: Premek Vysoky Date: Mon, 18 May 2026 16:21:19 +0200 Subject: [PATCH 6/8] Turn on Helix Monitor for the rest of the pipeline --- .../common/templates/browser-wasm-build-tests.yml | 2 ++ .../common/templates/browser-wasm-coreclr-build-tests.yml | 1 + eng/pipelines/common/templates/simple-wasm-build-tests.yml | 2 ++ .../common/templates/wasm-coreclr-library-tests.yml | 2 ++ eng/pipelines/common/templates/wasm-library-aot-tests.yml | 2 ++ eng/pipelines/common/templates/wasm-library-tests.yml | 2 ++ eng/pipelines/common/templates/wasm-runtime-tests.yml | 2 ++ eng/pipelines/runtime.yml | 7 +++++++ 8 files changed, 20 insertions(+) diff --git a/eng/pipelines/common/templates/browser-wasm-build-tests.yml b/eng/pipelines/common/templates/browser-wasm-build-tests.yml index 39fca50137411f..1a148ac8fc0c2d 100644 --- a/eng/pipelines/common/templates/browser-wasm-build-tests.yml +++ b/eng/pipelines/common/templates/browser-wasm-build-tests.yml @@ -7,6 +7,7 @@ parameters: platforms: [] shouldContinueOnError: false extraBuildArgs: '' + useHelixMonitor: false jobs: @@ -128,3 +129,4 @@ jobs: extraHelixArguments: /p:BrowserHost=$(_hostedOs) scenarios: - buildwasmapps + useHelixMonitor: ${{ parameters.useHelixMonitor }} diff --git a/eng/pipelines/common/templates/browser-wasm-coreclr-build-tests.yml b/eng/pipelines/common/templates/browser-wasm-coreclr-build-tests.yml index ac76b6332c3801..b25d3069528d73 100644 --- a/eng/pipelines/common/templates/browser-wasm-coreclr-build-tests.yml +++ b/eng/pipelines/common/templates/browser-wasm-coreclr-build-tests.yml @@ -141,3 +141,4 @@ jobs: extraHelixArguments: /p:BrowserHost=$(_hostedOs) scenarios: - buildwasmapps + useHelixMonitor: true diff --git a/eng/pipelines/common/templates/simple-wasm-build-tests.yml b/eng/pipelines/common/templates/simple-wasm-build-tests.yml index ec0678f6463e4b..459f5e74635e47 100644 --- a/eng/pipelines/common/templates/simple-wasm-build-tests.yml +++ b/eng/pipelines/common/templates/simple-wasm-build-tests.yml @@ -6,6 +6,7 @@ parameters: platforms: [] shouldContinueOnError: false extraBuildArgs: '' + useHelixMonitor: false jobs: @@ -50,4 +51,5 @@ jobs: extraHelixArguments: /p:BrowserHost=$(_hostedOs) scenarios: - buildwasmapps + useHelixMonitor: ${{ parameters.useHelixMonitor }} diff --git a/eng/pipelines/common/templates/wasm-coreclr-library-tests.yml b/eng/pipelines/common/templates/wasm-coreclr-library-tests.yml index bf8e7eccb9c91d..61bb488f777113 100644 --- a/eng/pipelines/common/templates/wasm-coreclr-library-tests.yml +++ b/eng/pipelines/common/templates/wasm-coreclr-library-tests.yml @@ -9,6 +9,7 @@ parameters: scenarios: ['WasmTestOnChrome'] shouldContinueOnError: false shouldRunSmokeOnly: false + useHelixMonitor: false jobs: @@ -100,3 +101,4 @@ jobs: testRunNamePrefixSuffix: CoreCLR_$(_BuildConfig) extraHelixArguments: /p:BrowserHost=$(_hostedOs) $(_wasmRunSmokeTestsOnlyArg) ${{ parameters.extraHelixArguments }} scenarios: ${{ parameters.scenarios }} + useHelixMonitor: ${{ parameters.useHelixMonitor }} diff --git a/eng/pipelines/common/templates/wasm-library-aot-tests.yml b/eng/pipelines/common/templates/wasm-library-aot-tests.yml index d3dbf8d8db6524..87679ac6d3f22a 100644 --- a/eng/pipelines/common/templates/wasm-library-aot-tests.yml +++ b/eng/pipelines/common/templates/wasm-library-aot-tests.yml @@ -11,6 +11,7 @@ parameters: shouldRunSmokeOnly: false shouldContinueOnError: false scenarios: [] + useHelixMonitor: false jobs: @@ -31,6 +32,7 @@ jobs: alwaysRun: ${{ parameters.alwaysRun }} shouldRunSmokeOnly: ${{ parameters.shouldRunSmokeOnly }} shouldContinueOnError: ${{ parameters.shouldContinueOnError }} + useHelixMonitor: ${{ parameters.useHelixMonitor }} scenarios: - ${{ if ne(parameters.scenarios[0], '') }}: - ${{ parameters.scenarios }} diff --git a/eng/pipelines/common/templates/wasm-library-tests.yml b/eng/pipelines/common/templates/wasm-library-tests.yml index 149215ea501937..b21c9c6a153fce 100644 --- a/eng/pipelines/common/templates/wasm-library-tests.yml +++ b/eng/pipelines/common/templates/wasm-library-tests.yml @@ -9,6 +9,7 @@ parameters: scenarios: ['WasmTestOnChrome'] shouldContinueOnError: false shouldRunSmokeOnly: false + useHelixMonitor: false jobs: @@ -99,3 +100,4 @@ jobs: testRunNamePrefixSuffix: Mono_$(_BuildConfig) extraHelixArguments: /p:BrowserHost=$(_hostedOs) $(_wasmRunSmokeTestsOnlyArg) ${{ parameters.extraHelixArguments }} scenarios: ${{ parameters.scenarios }} + useHelixMonitor: ${{ parameters.useHelixMonitor }} diff --git a/eng/pipelines/common/templates/wasm-runtime-tests.yml b/eng/pipelines/common/templates/wasm-runtime-tests.yml index 8f84bdb93038db..c1e1f4cf7d93f5 100644 --- a/eng/pipelines/common/templates/wasm-runtime-tests.yml +++ b/eng/pipelines/common/templates/wasm-runtime-tests.yml @@ -4,6 +4,7 @@ parameters: isWasmOnlyBuild: false platforms: [] extraBuildArgs: '' + useHelixMonitor: false jobs: @@ -48,5 +49,6 @@ jobs: creator: dotnet-bot testRunNamePrefixSuffix: Mono_$(_BuildConfig) testBuildArgs: /p:InstallV8ForTests=false + useHelixMonitor: ${{ parameters.useHelixMonitor }} extraVariablesTemplates: - template: /eng/pipelines/common/templates/runtimes/test-variables.yml diff --git a/eng/pipelines/runtime.yml b/eng/pipelines/runtime.yml index f0646d43097a78..523cbe155162e8 100644 --- a/eng/pipelines/runtime.yml +++ b/eng/pipelines/runtime.yml @@ -958,6 +958,7 @@ extends: scenarios: - WasmTestOnChrome - WasmTestOnFirefox + useHelixMonitor: true - template: /eng/pipelines/common/templates/wasm-library-tests.yml parameters: @@ -967,6 +968,7 @@ extends: extraBuildArgs: /p:AotHostArchitecture=x64 /p:AotHostOS=$(_hostedOS) scenarios: - WasmTestOnChrome + useHelixMonitor: true # WebAssembly CoreCLR - template: /eng/pipelines/common/templates/wasm-coreclr-library-tests.yml @@ -977,6 +979,7 @@ extends: extraBuildArgs: /p:AotHostArchitecture=x64 /p:AotHostOS=$(_hostedOS) scenarios: - WasmTestOnChrome + useHelixMonitor: true # WebAssembly CoreCLR - smoke tests only on Firefox and V8 - template: /eng/pipelines/common/templates/wasm-coreclr-library-tests.yml @@ -990,6 +993,7 @@ extends: scenarios: - WasmTestOnFirefox - WasmTestOnV8 + useHelixMonitor: true # EAT Library tests - only run on linux - template: /eng/pipelines/common/templates/wasm-library-aot-tests.yml @@ -1002,6 +1006,7 @@ extends: shouldRunSmokeOnly: false alwaysRun: ${{ variables.isRollingBuild }} extraBuildArgs: /p:AotHostArchitecture=x64 /p:AotHostOS=$(_hostedOS) /maxcpucount:2 + useHelixMonitor: true # AOT Library tests - template: /eng/pipelines/common/templates/wasm-library-aot-tests.yml @@ -1015,6 +1020,7 @@ extends: shouldRunSmokeOnly: true alwaysRun: ${{ variables.isRollingBuild }} extraBuildArgs: /p:AotHostArchitecture=x64 /p:AotHostOS=$(_hostedOS) + useHelixMonitor: true # For Wasm.Build.Tests - runtime pack builds - template: /eng/pipelines/common/templates/wasm-build-only.yml @@ -1047,6 +1053,7 @@ extends: - browser_wasm_win alwaysRun: ${{ variables.isRollingBuild }} extraBuildArgs: /p:AotHostArchitecture=x64 /p:AotHostOS=$(_hostedOS) + useHelixMonitor: true # Wasm runtime tests - template: /eng/pipelines/common/templates/wasm-runtime-tests.yml From a202213e1fc5ce6a84416f87a3ae66201e765256 Mon Sep 17 00:00:00 2001 From: Premek Vysoky Date: Mon, 18 May 2026 16:37:05 +0200 Subject: [PATCH 7/8] One more leg --- eng/pipelines/runtime.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/eng/pipelines/runtime.yml b/eng/pipelines/runtime.yml index 523cbe155162e8..7ee008745ba7e3 100644 --- a/eng/pipelines/runtime.yml +++ b/eng/pipelines/runtime.yml @@ -1062,6 +1062,7 @@ extends: - browser_wasm alwaysRun: ${{ variables.isRollingBuild }} extraBuildArgs: /p:AotHostArchitecture=x64 /p:AotHostOS=$(_hostedOS) + useHelixMonitor: true # WASI/WASM From 10cd5cf0910d1361434784f2fe173cd02c3eed5b Mon Sep 17 00:00:00 2001 From: Premek Vysoky Date: Tue, 19 May 2026 13:00:34 +0200 Subject: [PATCH 8/8] Bump jobmonitor --- .config/dotnet-tools.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 78132c6b85dd0f..01b20fb26d988b 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -27,7 +27,7 @@ ] }, "microsoft.dotnet.helix.jobmonitor": { - "version": "11.0.0-beta.26265.3", + "version": "11.0.0-beta.26269.4", "commands": [ "dotnet-helix-job-monitor" ]