diff --git a/NuGet.config b/NuGet.config
index a0aef486d231a..58277f76a142d 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -9,7 +9,7 @@
-
+
diff --git a/eng/Subsets.props b/eng/Subsets.props
index eb4151f3a185d..a35f99ef759b7 100644
--- a/eng/Subsets.props
+++ b/eng/Subsets.props
@@ -504,7 +504,7 @@
-
+
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index fe35dc0997ea2..c2d1b0ca3f6dd 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -90,13 +90,13 @@
45dd3a73dd5b64b010c4251303b3664bb30df029
-
+
https://github.com/dotnet/emsdk
- 71359b18c2d83c01a68bf155244a65962a7e8c8e
+ a1cd44fdc64aa1f1c4630ddcd95580800d229180
-
+
https://github.com/dotnet/emsdk
- 71359b18c2d83c01a68bf155244a65962a7e8c8e
+ a1cd44fdc64aa1f1c4630ddcd95580800d229180
@@ -104,9 +104,9 @@
79827eed138fd2575a8b24820b4f385ee4ffb6e6
-
+
https://github.com/dotnet/source-build-externals
- 300e99190e6ae1983681694dbdd5f75f0c692081
+ 908177a58a41532b3302c17f1e1a8cf1c1234545
@@ -354,9 +354,9 @@
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
67613417f5e1af250e6ddfba79f8f2885d8e90fb
-
+
https://github.com/dotnet/hotreload-utils
- 85d6e21ac1d4e0977dfd1321131be0c912d70d80
+ 61f137aacabdbd8f279415287a2dd70e150f5eb1
https://github.com/dotnet/runtime-assets
diff --git a/eng/Versions.props b/eng/Versions.props
index bb6bc30992a14..ba8e464d4f35e 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -7,8 +7,8 @@
0
6
8.0.100
- 7.0.$([MSBuild]::Add($(PatchVersion),14))
- 6.0.$([MSBuild]::Add($([System.Version]::Parse('$(PackageVersionNet7)').Build),11))
+ 7.0.19
+ 6.0.$([MSBuild]::Add($(PatchVersion),25))
servicing
@@ -186,7 +186,7 @@
8.0.0-prerelease.24208.4
8.0.0-prerelease.24208.4
8.0.0-prerelease.24208.4
- 8.0.0-alpha.0.24210.1
+ 8.0.0-alpha.0.24229.2
2.4.2
1.0.0
2.4.5
@@ -240,7 +240,7 @@
Note: when the name is updated, make sure to update dependency name in eng/pipelines/common/xplat-setup.yml
like - DarcDependenciesChanged.Microsoft_NET_Workload_Emscripten_Current_Manifest-8_0_100_Transport
-->
- 8.0.5
+ 8.0.6
$(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version)
1.1.87-gba258badda
diff --git a/eng/build.sh b/eng/build.sh
index 772d7ac8be82c..4d0d17a220447 100755
--- a/eng/build.sh
+++ b/eng/build.sh
@@ -32,7 +32,7 @@ usage()
echo " [Default: Debug]"
echo " --os Target operating system: windows, linux, freebsd, osx, maccatalyst, tvos,"
echo " tvossimulator, ios, iossimulator, android, browser, wasi, netbsd, illumos, solaris"
- echo " linux-musl, linux-bionic or haiku."
+ echo " linux-musl, linux-bionic, tizen, or haiku."
echo " [Default: Your machine's OS.]"
echo " --outputrid Optional argument that overrides the target rid name."
echo " --projects Project or solution file(s) to build."
diff --git a/eng/collect_vsinfo.ps1 b/eng/collect_vsinfo.ps1
new file mode 100644
index 0000000000000..e2178fe4b24f8
--- /dev/null
+++ b/eng/collect_vsinfo.ps1
@@ -0,0 +1,65 @@
+<#
+.PARAMETER ArchiveRunName
+Name of the run for vs logs
+
+.NOTES
+Returns 0 if succeeds, 1 otherwise
+#>
+[CmdletBinding(PositionalBinding=$false)]
+Param (
+ [Parameter(Mandatory=$True)]
+ [string] $ArchiveRunName
+)
+
+. $PSScriptRoot/common/tools.ps1
+
+$ProgressPreference = "SilentlyContinue"
+$LogDir = Join-Path $LogDir $ArchiveRunName
+mkdir $LogDir
+
+$vscollect_uri="http://aka.ms/vscollect.exe"
+$vscollect="$env:TEMP\vscollect.exe"
+
+if (-not (Test-Path $vscollect)) {
+ Retry({
+ Write-Host "GET $vscollect_uri"
+ Invoke-WebRequest $vscollect_uri -OutFile $vscollect -UseBasicParsing
+ })
+
+ if (-not (Test-Path $vscollect)) {
+ Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Unable to download vscollect."
+ exit 1
+ }
+}
+
+&"$vscollect"
+Move-Item $env:TEMP\vslogs.zip "$LogDir"
+
+$vswhere = "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe"
+if (-not (Test-Path -Path "$vswhere" -PathType Leaf))
+{
+ Write-Error "Couldn't locate vswhere at $vswhere"
+ exit 1
+}
+
+&"$vswhere" -all -prerelease -products * | Tee-Object -FilePath "$LogDir\vs_where.log"
+
+$vsdir = &"$vswhere" -latest -prerelease -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath
+
+if (-not (Test-Path $vsdir))
+{
+ $procDumpDir = Join-Path $ToolsDir "procdump"
+ $procDumpToolPath = Join-Path $procDumpDir "procdump.exe"
+ $procdump_uri = "https://download.sysinternals.com/files/Procdump.zip"
+
+ if (-not (Test-Path $procDumpToolPath)) {
+ Retry({
+ Write-Host "GET $procdump_uri"
+ Invoke-WebRequest $procdump_uri -OutFile "$TempDir\Procdump.zip" -UseBasicParsing
+ })
+
+ Expand-Archive -Path "$TempDir\Procdump.zip" $procDumpDir
+ }
+
+ &"$procDumpToolPath" -ma -accepteula VSIXAutoUpdate.exe "$LogDir"
+}
diff --git a/eng/disable_vsupdate.ps1 b/eng/disable_vsupdate.ps1
new file mode 100644
index 0000000000000..d8d365f057710
--- /dev/null
+++ b/eng/disable_vsupdate.ps1
@@ -0,0 +1,23 @@
+schtasks /change /tn "\Microsoft\VisualStudio\VSIX Auto Update" /disable
+
+$vswhere = "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe"
+if (-not (Test-Path -Path "$vswhere" -PathType Leaf))
+{
+ Write-Error "Couldn't locate vswhere at $vswhere"
+ exit 1
+}
+
+$vsdir = &"$vswhere" -latest -prerelease -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath
+$vsregedit = "$vsdir\Common7\IDE\VsRegEdit.exe"
+
+if (-not (Test-Path -Path "$vsregedit" ))
+{
+ Write-Error "VSWhere returned path: $vsdir, but regedit $vsregedit doesn't exist."
+ exit 1
+}
+
+Write-Output "VSWhere returned path: $vsdir, using regedit $vsregedit"
+Write-Output "Disabling updates through VS Registry:"
+
+&"$vsdir\Common7\IDE\VsRegEdit.exe" set local HKCU ExtensionManager AutomaticallyCheckForUpdates2Override dword 0
+&"$vsdir\Common7\IDE\VsRegEdit.exe" read local HKCU ExtensionManager AutomaticallyCheckForUpdates2Override dword
diff --git a/eng/empty.csproj b/eng/empty.csproj
deleted file mode 100644
index 55eefdef1ada4..0000000000000
--- a/eng/empty.csproj
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
- $(NetCoreAppToolCurrent)
-
-
-
-
-
diff --git a/eng/native/init-vs-env.cmd b/eng/native/init-vs-env.cmd
index 273f49b3392c2..befe98ab407f7 100644
--- a/eng/native/init-vs-env.cmd
+++ b/eng/native/init-vs-env.cmd
@@ -26,6 +26,8 @@ if defined VisualStudioVersion goto :VSDetected
set "__VSWhere=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
set "__VSCOMNTOOLS="
+if not exist "%__VSWhere%" goto :VSWhereMissing
+
if exist "%__VSWhere%" (
for /f "tokens=*" %%p in (
'"%__VSWhere%" -latest -prerelease -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath'
@@ -56,6 +58,10 @@ echo %__MsgPrefix%Error: Visual Studio 2022 with C++ tools required. ^
Please see https://github.com/dotnet/runtime/blob/main/docs/workflow/requirements/windows-requirements.md for build requirements.
exit /b 1
+:VSWhereMissing
+echo %__MsgPrefix%Error: vswhere couldn not be found in Visual Studio Installer directory at "%__VSWhere%"
+exit /b 1
+
:SetVCEnvironment
if "%__VCBuildArch%"=="" exit /b 0
diff --git a/eng/pipelines/common/global-build-job.yml b/eng/pipelines/common/global-build-job.yml
index 39e7d9b5c53ce..cdda8c99dc519 100644
--- a/eng/pipelines/common/global-build-job.yml
+++ b/eng/pipelines/common/global-build-job.yml
@@ -14,7 +14,6 @@ parameters:
dependsOn: []
pool: ''
platform: ''
- pgoType: ''
condition: true
useContinueOnErrorDuringBuild: false
shouldContinueOnError: false
@@ -27,8 +26,7 @@ parameters:
helixQueues: ''
enablePublishTestResults: false
testResultsFormat: ''
- extraStepsTemplate: ''
- extraStepsParameters: {}
+ postBuildSteps: []
extraVariablesTemplates: []
isManualCodeQLBuild: false
preBuildSteps: []
@@ -134,7 +132,6 @@ jobs:
targetRid: ${{ parameters.targetRid }}
nameSuffix: ${{ parameters.nameSuffix }}
platform: ${{ parameters.platform }}
- pgoType: ${{ parameters.pgoType }}
shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
${{ if ne(variableTemplate.forwardedParameters, '') }}:
${{ each parameter in variableTemplate.forwardedParameters }}:
@@ -211,7 +208,28 @@ jobs:
- ${{ if ne(parameters.preBuildSteps,'') }}:
- ${{ each preBuildStep in parameters.preBuildSteps }}:
- - ${{ preBuildStep }}
+ - ${{ if ne(preBuildStep.template, '') }}:
+ - template: ${{ preBuildStep.template }}
+ parameters:
+ osGroup: ${{ parameters.osGroup }}
+ osSubgroup: ${{ parameters.osSubgroup }}
+ archType: ${{ parameters.archType }}
+ buildConfig: ${{ parameters.buildConfig }}
+ runtimeFlavor: ${{ parameters.runtimeFlavor }}
+ runtimeVariant: ${{ parameters.runtimeVariant }}
+ helixQueues: ${{ parameters.helixQueues }}
+ targetRid: ${{ parameters.targetRid }}
+ nameSuffix: ${{ parameters.nameSuffix }}
+ platform: ${{ parameters.platform }}
+ pgoType: ${{ parameters.pgoType }}
+ shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
+ ${{ if ne(preBuildStep.forwardedParameters, '') }}:
+ ${{ each parameter in preBuildStep.forwardedParameters }}:
+ ${{ parameter }}: ${{ parameters[parameter] }}
+ ${{ if ne(preBuildStep.parameters, '') }}:
+ ${{ insert }}: ${{ preBuildStep.parameters }}
+ - ${{ else }}:
+ - ${{ preBuildStep }}
# Build
- ${{ if eq(parameters.isSourceBuild, false) }}:
@@ -237,22 +255,34 @@ jobs:
condition: always()
# If intended to send extra steps after regular build add them here.
- - ${{ if ne(parameters.extraStepsTemplate, '') }}:
- - template: ${{ parameters.extraStepsTemplate }}
- parameters:
- osGroup: ${{ parameters.osGroup }}
- osSubgroup: ${{ parameters.osSubgroup }}
- archType: ${{ parameters.archType }}
- buildConfig: ${{ parameters.buildConfig }}
- runtimeFlavor: ${{ parameters.runtimeFlavor }}
- runtimeVariant: ${{ parameters.runtimeVariant }}
- helixQueues: ${{ parameters.helixQueues }}
- targetRid: ${{ parameters.targetRid }}
- nameSuffix: ${{ parameters.nameSuffix }}
- platform: ${{ parameters.platform }}
- pgoType: ${{ parameters.pgoType }}
- shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
- ${{ insert }}: ${{ parameters.extraStepsParameters }}
+ - ${{ if ne(parameters.postBuildSteps,'') }}:
+ - ${{ each postBuildStep in parameters.postBuildSteps }}:
+ - ${{ if ne(postBuildStep.template, '') }}:
+ - template: ${{ postBuildStep.template }}
+ parameters:
+ osGroup: ${{ parameters.osGroup }}
+ osSubgroup: ${{ parameters.osSubgroup }}
+ archType: ${{ parameters.archType }}
+ buildConfig: ${{ parameters.buildConfig }}
+ runtimeFlavor: ${{ parameters.runtimeFlavor }}
+ runtimeVariant: ${{ parameters.runtimeVariant }}
+ helixQueues: ${{ parameters.helixQueues }}
+ targetRid: ${{ parameters.targetRid }}
+ nameSuffix: ${{ parameters.nameSuffix }}
+ platform: ${{ parameters.platform }}
+ shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
+ ${{ if ne(postBuildStep.forwardedParameters, '') }}:
+ ${{ each parameter in postBuildStep.forwardedParameters }}:
+ ${{ parameter }}: ${{ parameters[parameter] }}
+ ${{ if ne(postBuildStep.parameters, '') }}:
+ ${{ insert }}: ${{ postBuildStep.parameters }}
+ - ${{ else }}:
+ - ${{ postBuildStep }}
+
+ - ${{ if and(eq(parameters.isOfficialBuild, true), eq(parameters.osGroup, 'windows')) }}:
+ - powershell: ./eng/collect_vsinfo.ps1 -ArchiveRunName postbuild_log
+ displayName: Collect vslogs on exit
+ condition: always()
- task: PublishBuildArtifacts@1
displayName: Publish Logs
@@ -260,8 +290,8 @@ jobs:
PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/'
PublishLocation: Container
${{ if notin(parameters.osGroup, 'browser', 'wasi') }}:
- ArtifactName: Logs_Build_${{ parameters.osGroup }}_${{ parameters.osSubGroup }}_${{ parameters.archType }}_${{ parameters.buildConfig }}_${{ parameters.nameSuffix }}
+ ArtifactName: Logs_Build_Attempt$(System.JobAttempt)_${{ parameters.osGroup }}_${{ parameters.osSubGroup }}_${{ parameters.archType }}_${{ parameters.buildConfig }}_${{ parameters.nameSuffix }}
${{ if in(parameters.osGroup, 'browser', 'wasi') }}:
- ArtifactName: Logs_Build_${{ parameters.osGroup }}_${{ parameters.archType }}_${{ parameters.hostedOs }}_${{ parameters.buildConfig }}_${{ parameters.nameSuffix }}
+ ArtifactName: Logs_Build_Attempt$(System.JobAttempt)_${{ parameters.osGroup }}_${{ parameters.archType }}_${{ parameters.hostedOs }}_${{ parameters.buildConfig }}_${{ parameters.nameSuffix }}
continueOnError: true
condition: always()
diff --git a/eng/pipelines/common/platform-matrix.yml b/eng/pipelines/common/platform-matrix.yml
index 8399c82ecd769..c2f754d6ee238 100644
--- a/eng/pipelines/common/platform-matrix.yml
+++ b/eng/pipelines/common/platform-matrix.yml
@@ -883,7 +883,7 @@ jobs:
jobTemplate: ${{ parameters.jobTemplate }}
helixQueuesTemplate: ${{ parameters.helixQueuesTemplate }}
variables: ${{ parameters.variables }}
- osGroup: tizen
+ osGroup: linux # Our build scripts don't support Tizen and have always used Linux as the OS parameter.
archType: armel
targetRid: tizen-armel
platform: tizen_armel
diff --git a/eng/pipelines/common/templates/browser-wasm-build-tests.yml b/eng/pipelines/common/templates/browser-wasm-build-tests.yml
index 742ad88de1c80..29a3f85472473 100644
--- a/eng/pipelines/common/templates/browser-wasm-build-tests.yml
+++ b/eng/pipelines/common/templates/browser-wasm-build-tests.yml
@@ -117,10 +117,11 @@ jobs:
eq(variables['isDefaultPipeline'], variables['shouldRunWasmBuildTestsOnDefaultPipeline']))
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)_$(_hostedOs)
- extraHelixArguments: /p:BrowserHost=$(_hostedOs)
- scenarios:
- - buildwasmapps
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)_$(_hostedOs)
+ extraHelixArguments: /p:BrowserHost=$(_hostedOs)
+ scenarios:
+ - buildwasmapps
diff --git a/eng/pipelines/common/templates/pipeline-with-resources.yml b/eng/pipelines/common/templates/pipeline-with-resources.yml
index 02242394fba67..edba5767b612c 100644
--- a/eng/pipelines/common/templates/pipeline-with-resources.yml
+++ b/eng/pipelines/common/templates/pipeline-with-resources.yml
@@ -55,9 +55,9 @@ resources:
- container: linux_x64_dev_innerloop
image: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04
- # We use a CentOS Stream 8 image here to test building from source on CentOS Stream 8.
+ # We use a CentOS Stream 9 image here to test building from source on CentOS Stream 9.
- container: SourceBuild_centos_x64
- image: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream8
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream9
# AlmaLinux 8 is a RHEL 8 rebuild, so we use it to test building from source on RHEL 8.
- container: SourceBuild_linux_x64
@@ -82,7 +82,7 @@ resources:
image: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-12-gcc13-amd64
- container: linux_x64_llvmaot
- image: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream8
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream9
- container: browser_wasm
image: mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-webassembly-20230913040940-1edc1c6
diff --git a/eng/pipelines/common/templates/runtimes/build-test-job.yml b/eng/pipelines/common/templates/runtimes/build-test-job.yml
index 2b9871f183f76..e249e8ac922a7 100644
--- a/eng/pipelines/common/templates/runtimes/build-test-job.yml
+++ b/eng/pipelines/common/templates/runtimes/build-test-job.yml
@@ -14,7 +14,6 @@ parameters:
dependsOn: []
dependOnEvaluatePaths: false
crossBuild: false
- pgoType: ''
### Build managed test components (native components are getting built as part
### of the product build job).
@@ -149,6 +148,6 @@ jobs:
displayName: Publish Logs
inputs:
targetPath: $(Build.SourcesDirectory)/artifacts/log
- artifactName: '${{ parameters.runtimeFlavor }}_Common_Runtime_TestBuildLogs_AnyOS_AnyCPU_$(buildConfig)_${{ parameters.testGroup }}'
+ artifactName: '${{ parameters.runtimeFlavor }}_Common_Runtime_TestBuildLogs_Attempt$(System.JobAttempt)_AnyOS_AnyCPU_$(buildConfig)_${{ parameters.testGroup }}'
continueOnError: true
condition: always()
diff --git a/eng/pipelines/common/templates/runtimes/run-test-job.yml b/eng/pipelines/common/templates/runtimes/run-test-job.yml
index a137b7c796e6b..759011b02e3d1 100644
--- a/eng/pipelines/common/templates/runtimes/run-test-job.yml
+++ b/eng/pipelines/common/templates/runtimes/run-test-job.yml
@@ -341,11 +341,7 @@ jobs:
timeoutPerTestInMinutes: $(timeoutPerTestInMinutes)
timeoutPerTestCollectionInMinutes: $(timeoutPerTestCollectionInMinutes)
-
runCrossGen2: ${{ eq(parameters.readyToRun, true) }}
- ${{ if and(ne(parameters.testGroup, 'innerloop'), eq(parameters.runtimeFlavor, 'coreclr')) }}:
- runPALTestsDir: '$(coreClrProductRootFolderPath)/paltests'
-
compositeBuildMode: ${{ parameters.compositeBuildMode }}
runInUnloadableContext: ${{ parameters.runInUnloadableContext }}
tieringTest: ${{ parameters.tieringTest }}
@@ -603,7 +599,7 @@ jobs:
displayName: Publish Logs
inputs:
targetPath: $(Build.SourcesDirectory)/artifacts/log
- artifactName: '${{ parameters.runtimeFlavor }}_${{ parameters.runtimeVariant }}_$(LogNamePrefix)_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)_${{ parameters.testGroup }}'
+ artifactName: '${{ parameters.runtimeFlavor }}_${{ parameters.runtimeVariant }}_$(LogNamePrefix)_Attempt$(System.JobAttempt)_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)_${{ parameters.testGroup }}'
continueOnError: true
condition: always()
diff --git a/eng/pipelines/common/templates/runtimes/send-to-helix-inner-step.yml b/eng/pipelines/common/templates/runtimes/send-to-helix-inner-step.yml
index bd147de7e7726..12e3f68baafb9 100644
--- a/eng/pipelines/common/templates/runtimes/send-to-helix-inner-step.yml
+++ b/eng/pipelines/common/templates/runtimes/send-to-helix-inner-step.yml
@@ -1,6 +1,5 @@
parameters:
osGroup: ''
- restoreParams: ''
sendParams: ''
condition: ''
displayName: ''
@@ -9,28 +8,14 @@ parameters:
steps:
- ${{ if eq(parameters.osGroup, 'windows') }}:
- # TODO: Remove and consolidate this when we move to arcade via init-tools.cmd.
- - powershell: $(Build.SourcesDirectory)\eng\common\build.ps1 -ci -warnaserror 0 ${{ parameters.restoreParams }}
- displayName: Restore blob feed tasks (Windows)
- condition: and(succeeded(), ${{ and(ne(parameters.condition, false), ne(parameters.restoreParams, '')) }})
-
- - powershell: $(Build.SourcesDirectory)\eng\common\msbuild.ps1 -ci -warnaserror 0 ${{ parameters.sendParams }}
+ - powershell: $(Build.SourcesDirectory)\eng\common\msbuild.ps1 --restore -ci -warnaserror 0 ${{ parameters.sendParams }}
displayName: ${{ parameters.displayName }} (Windows)
condition: and(succeeded(), ${{ and(ne(parameters.condition, false), ne(parameters.sendParams, '')) }})
env: ${{ parameters.environment }}
continueOnError: ${{ eq(parameters.shouldContinueOnError, true) }}
- ${{ if ne(parameters.osGroup, 'windows') }}:
- # TODO: Remove and consolidate this when we move to arcade via init-tools.sh.
- - script: $(Build.SourcesDirectory)/eng/common/build.sh --ci --warnaserror false ${{ parameters.restoreParams }}
- displayName: Restore blob feed tasks (Unix)
- condition: and(succeeded(), ${{ and(ne(parameters.condition, false), ne(parameters.restoreParams, '')) }})
- ${{ if eq(parameters.osGroup, 'freebsd') }}:
- env:
- # Arcade uses this SDK instead of trying to restore one.
- DotNetCoreSdkDir: /usr/local/dotnet
-
- - script: $(Build.SourcesDirectory)/eng/common/msbuild.sh --ci --warnaserror false ${{ parameters.sendParams }}
+ - script: $(Build.SourcesDirectory)/eng/common/msbuild.sh --restore --ci --warnaserror false ${{ parameters.sendParams }}
displayName: ${{ parameters.displayName }} (Unix)
condition: and(succeeded(), ${{ and(ne(parameters.condition, false), ne(parameters.sendParams, '')) }})
env: ${{ parameters.environment }}
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 37b455b19d830..4be1378ab3c45 100644
--- a/eng/pipelines/common/templates/runtimes/send-to-helix-step.yml
+++ b/eng/pipelines/common/templates/runtimes/send-to-helix-step.yml
@@ -17,7 +17,6 @@ parameters:
timeoutPerTestCollectionInMinutes: ''
timeoutPerTestInMinutes: ''
runCrossGen2: ''
- runPALTestsDir: ''
compositeBuildMode: false
helixProjectArguments: ''
runInUnloadableContext: ''
@@ -38,7 +37,6 @@ steps:
- template: send-to-helix-inner-step.yml
parameters:
osGroup: ${{ parameters.osGroup }}
- restoreParams: /p:DotNetPublishToBlobFeed=true -restore -projects $(Build.SourcesDirectory)$(dir)eng$(dir)empty.csproj
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 }}
condition: and(succeeded(), ${{ parameters.condition }})
shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
@@ -59,7 +57,6 @@ steps:
_LongRunningGcTests: ${{ parameters.longRunningGcTests }}
_GcSimulatorTests: ${{ parameters.gcSimulatorTests }}
_Scenarios: ${{ join(',', parameters.scenarios) }}
- _PALTestsDir: ${{ parameters.runPALTestsDir }}
_TimeoutPerTestCollectionInMinutes: ${{ parameters.timeoutPerTestCollectionInMinutes }}
_TimeoutPerTestInMinutes: ${{ parameters.timeoutPerTestInMinutes }}
RuntimeFlavor: ${{ parameters.runtimeFlavor }}
diff --git a/eng/pipelines/common/templates/simple-wasm-build-tests.yml b/eng/pipelines/common/templates/simple-wasm-build-tests.yml
index dcba5522f441b..7a593f4f9be20 100644
--- a/eng/pipelines/common/templates/simple-wasm-build-tests.yml
+++ b/eng/pipelines/common/templates/simple-wasm-build-tests.yml
@@ -41,11 +41,12 @@ jobs:
eq(variables['alwaysRunVar'], true),
eq(variables['isDefaultPipeline'], variables['shouldRunWasmBuildTestsOnDefaultPipeline']))
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)_$(_hostedOs)
- extraHelixArguments: /p:BrowserHost=$(_hostedOs)
- scenarios:
- - buildwasmapps
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)_$(_hostedOs)
+ extraHelixArguments: /p:BrowserHost=$(_hostedOs)
+ scenarios:
+ - buildwasmapps
diff --git a/eng/pipelines/common/templates/wasm-build-only.yml b/eng/pipelines/common/templates/wasm-build-only.yml
index 9e9b0cb332c8f..4f2588e498569 100644
--- a/eng/pipelines/common/templates/wasm-build-only.yml
+++ b/eng/pipelines/common/templates/wasm-build-only.yml
@@ -38,7 +38,8 @@ jobs:
buildArgs: -s mono+libs+packs+libs.tests$(workloadSubsetArg) -c $(_BuildConfig) /p:BrowserHost=$(_hostedOs) ${{ parameters.extraBuildArgs }} /p:TestAssemblies=false $(extraBuildArgs)
timeoutInMinutes: 120
condition: ${{ parameters.condition }}
- extraStepsTemplate: /eng/pipelines/common/wasm-post-build-steps.yml
- extraStepsParameters:
- publishArtifactsForWorkload: ${{ parameters.publishArtifactsForWorkload }}
- publishWBT: ${{ parameters.publishWBT }}
+ postBuildSteps:
+ - template: /eng/pipelines/common/wasm-post-build-steps.yml
+ parameters:
+ publishArtifactsForWorkload: ${{ parameters.publishArtifactsForWorkload }}
+ publishWBT: ${{ parameters.publishWBT }}
diff --git a/eng/pipelines/common/templates/wasm-debugger-tests.yml b/eng/pipelines/common/templates/wasm-debugger-tests.yml
index fd19fe5385cbb..17c0f415cf1b4 100644
--- a/eng/pipelines/common/templates/wasm-debugger-tests.yml
+++ b/eng/pipelines/common/templates/wasm-debugger-tests.yml
@@ -52,10 +52,11 @@ jobs:
and(
eq(variables['isDefaultPipeline'], variables['shouldRunOnDefaultPipelines']),
eq(${{ parameters.isWasmOnlyBuild }}, ${{ parameters.runOnlyOnWasmOnlyPipelines }})))
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_${{ parameters.browser }}_$(_BuildConfig)
- extraHelixArguments: /p:BrowserHost=$(_hostedOs) /p:_DebuggerHosts=${{ parameters.browser }}
- scenarios:
- - wasmdebuggertests
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_${{ parameters.browser }}_$(_BuildConfig)
+ extraHelixArguments: /p:BrowserHost=$(_hostedOs) /p:_DebuggerHosts=${{ parameters.browser }}
+ scenarios:
+ - wasmdebuggertests
diff --git a/eng/pipelines/common/templates/wasm-library-tests.yml b/eng/pipelines/common/templates/wasm-library-tests.yml
index a848e25e1a28a..4260e56ba2cb4 100644
--- a/eng/pipelines/common/templates/wasm-library-tests.yml
+++ b/eng/pipelines/common/templates/wasm-library-tests.yml
@@ -62,9 +62,10 @@ jobs:
eq(variables['alwaysRunVar'], true),
eq(variables['isDefaultPipeline'], variables['shouldRunOnDefaultPipelines']))
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
- extraHelixArguments: /p:BrowserHost=$(_hostedOs) $(_wasmRunSmokeTestsOnlyArg) ${{ parameters.extraHelixArgs }}
- scenarios: ${{ parameters.scenarios }}
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ extraHelixArguments: /p:BrowserHost=$(_hostedOs) $(_wasmRunSmokeTestsOnlyArg) ${{ parameters.extraHelixArgs }}
+ scenarios: ${{ parameters.scenarios }}
diff --git a/eng/pipelines/common/templates/wasm-runtime-tests.yml b/eng/pipelines/common/templates/wasm-runtime-tests.yml
index 43671a546ba00..2b006bb2db3cc 100644
--- a/eng/pipelines/common/templates/wasm-runtime-tests.yml
+++ b/eng/pipelines/common/templates/wasm-runtime-tests.yml
@@ -42,9 +42,10 @@ jobs:
or(
eq(variables['alwaysRunVar'], true),
eq(variables['isDefaultPipeline'], variables['shouldRunOnDefaultPipelines']))
- extraStepsTemplate: //eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
extraVariablesTemplates:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
diff --git a/eng/pipelines/coreclr/ci.yml b/eng/pipelines/coreclr/ci.yml
index adf052b014f45..afff0abf00b5d 100644
--- a/eng/pipelines/coreclr/ci.yml
+++ b/eng/pipelines/coreclr/ci.yml
@@ -155,3 +155,24 @@ extends:
readyToRun: true
displayNameArgs: R2R_CG2
liveLibrariesBuildConfig: Release
+
+ #
+ # PAL Tests
+ #
+ - template: /eng/pipelines/common/platform-matrix.yml
+ parameters:
+ helixQueuesTemplate: /eng/pipelines/coreclr/templates/helix-queues-setup.yml
+ jobTemplate: /eng/pipelines/common/global-build-job.yml
+ buildConfig: Debug
+ platforms:
+ - linux_x64
+ - linux_musl_x64
+ - linux_arm64
+ - linux_musl_arm64
+ - osx_x64
+ - osx_arm64
+ jobParameters:
+ buildArgs: -s clr.paltests+clr.paltestlist
+ nameSuffix: PALTests
+ postBuildSteps:
+ - template: /eng/pipelines/coreclr/templates/run-paltests-step.yml
diff --git a/eng/pipelines/coreclr/perf-non-wasm-jobs.yml b/eng/pipelines/coreclr/perf-non-wasm-jobs.yml
index b7f87d7cf89d9..3e28bb7bcae69 100644
--- a/eng/pipelines/coreclr/perf-non-wasm-jobs.yml
+++ b/eng/pipelines/coreclr/perf-non-wasm-jobs.yml
@@ -48,15 +48,16 @@ jobs:
buildArgs: -s mono+libs+host+packs -c $(_BuildConfig) /p:BuildMonoAOTCrossCompiler=true /p:MonoLibClang="/usr/local/lib/libclang.so.16" /p:AotHostArchitecture=x64 /p:AotHostOS=linux
nameSuffix: AOT
isOfficialBuild: false
- extraStepsTemplate: /eng/pipelines/common/upload-artifact-step.yml
- extraStepsParameters:
- rootFolder: '$(Build.SourcesDirectory)/artifacts/'
- includeRootFolder: true
- displayName: AOT Mono Artifacts
- artifactName: LinuxMonoAOTx64
- archiveExtension: '.tar.gz'
- archiveType: tar
- tarCompression: gz
+ postBuildSteps:
+ - template: /eng/pipelines/common/upload-artifact-step.yml
+ parameters:
+ rootFolder: '$(Build.SourcesDirectory)/artifacts/'
+ includeRootFolder: true
+ displayName: AOT Mono Artifacts
+ artifactName: LinuxMonoAOTx64
+ archiveExtension: '.tar.gz'
+ archiveType: tar
+ tarCompression: gz
# build mono Android scenarios
- template: /eng/pipelines/common/platform-matrix.yml
@@ -70,15 +71,16 @@ jobs:
buildArgs: -s mono+libs+host+packs -c $(_BuildConfig)
nameSuffix: AndroidMono
isOfficialBuild: false
- extraStepsTemplate: /eng/pipelines/coreclr/templates/build-perf-sample-apps.yml
- extraStepsParameters:
- rootFolder: '$(Build.SourcesDirectory)/artifacts/'
- includeRootFolder: true
- displayName: Android Mono Artifacts
- artifactName: AndroidMonoarm64
- archiveExtension: '.tar.gz'
- archiveType: tar
- tarCompression: gz
+ postBuildSteps:
+ - template: /eng/pipelines/coreclr/templates/build-perf-sample-apps.yml
+ parameters:
+ rootFolder: '$(Build.SourcesDirectory)/artifacts/'
+ includeRootFolder: true
+ displayName: Android Mono Artifacts
+ artifactName: AndroidMonoarm64
+ archiveExtension: '.tar.gz'
+ archiveType: tar
+ tarCompression: gz
# build mono iOS scenarios
- template: /eng/pipelines/common/platform-matrix.yml
@@ -92,15 +94,16 @@ jobs:
buildArgs: -s mono+libs+host+packs -c $(_BuildConfig)
nameSuffix: iOSMono
isOfficialBuild: false
- extraStepsTemplate: /eng/pipelines/coreclr/templates/build-perf-sample-apps.yml
- extraStepsParameters:
- rootFolder: '$(Build.SourcesDirectory)/artifacts/'
- includeRootFolder: true
- displayName: iOS Mono Artifacts
- artifactName: iOSMonoarm64
- archiveExtension: '.tar.gz'
- archiveType: tar
- tarCompression: gz
+ postBuildSteps:
+ - template: /eng/pipelines/coreclr/templates/build-perf-sample-apps.yml
+ parameters:
+ rootFolder: '$(Build.SourcesDirectory)/artifacts/'
+ includeRootFolder: true
+ displayName: iOS Mono Artifacts
+ artifactName: iOSMonoarm64
+ archiveExtension: '.tar.gz'
+ archiveType: tar
+ tarCompression: gz
# build NativeAOT iOS scenarios
- template: /eng/pipelines/common/platform-matrix.yml
@@ -114,15 +117,16 @@ jobs:
buildArgs: --cross -s clr.alljits+clr.tools+clr.nativeaotruntime+clr.nativeaotlibs+libs -c $(_BuildConfig)
nameSuffix: iOSNativeAOT
isOfficialBuild: false
- extraStepsTemplate: /eng/pipelines/coreclr/templates/build-perf-sample-apps.yml
- extraStepsParameters:
- rootFolder: '$(Build.SourcesDirectory)/artifacts/'
- includeRootFolder: true
- displayName: iOS NativeAOT Artifacts
- artifactName: iOSNativeAOTarm64
- archiveExtension: '.tar.gz'
- archiveType: tar
- tarCompression: gz
+ postBuildSteps:
+ - template: /eng/pipelines/coreclr/templates/build-perf-sample-apps.yml
+ parameters:
+ rootFolder: '$(Build.SourcesDirectory)/artifacts/'
+ includeRootFolder: true
+ displayName: iOS NativeAOT Artifacts
+ artifactName: iOSNativeAOTarm64
+ archiveExtension: '.tar.gz'
+ archiveType: tar
+ tarCompression: gz
# build mono
- template: /eng/pipelines/common/platform-matrix.yml
@@ -409,9 +413,10 @@ jobs:
buildArgs: -s mono+libs+host+packs -c $(_BuildConfig)
nameSuffix: Mono_Packs
isOfficialBuild: false
- extraStepsTemplate: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
- extraStepsParameters:
- name: MonoRuntimePacks
+ postBuildSteps:
+ - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
+ parameters:
+ name: MonoRuntimePacks
# build PerfBDN app
- template: /eng/pipelines/common/platform-matrix.yml
@@ -429,12 +434,13 @@ jobs:
isOfficialBuild: false
pool:
vmImage: 'macos-12'
- extraStepsTemplate: /eng/pipelines/coreclr/templates/build-perf-bdn-app.yml
- extraStepsParameters:
- rootFolder: '$(Build.SourcesDirectory)/artifacts/'
- includeRootFolder: true
- displayName: Android BDN App Artifacts
- artifactName: PerfBDNAppArm
- archiveExtension: '.tar.gz'
- archiveType: tar
- tarCompression: gz
+ postBuildSteps:
+ - template: /eng/pipelines/coreclr/templates/build-perf-bdn-app.yml
+ parameters:
+ rootFolder: '$(Build.SourcesDirectory)/artifacts/'
+ includeRootFolder: true
+ displayName: Android BDN App Artifacts
+ artifactName: PerfBDNAppArm
+ archiveExtension: '.tar.gz'
+ archiveType: tar
+ tarCompression: gz
diff --git a/eng/pipelines/coreclr/perf-wasm-jobs.yml b/eng/pipelines/coreclr/perf-wasm-jobs.yml
index 7758eac4d12cb..bbfba48834756 100644
--- a/eng/pipelines/coreclr/perf-wasm-jobs.yml
+++ b/eng/pipelines/coreclr/perf-wasm-jobs.yml
@@ -25,9 +25,10 @@ jobs:
buildArgs: -s mono+libs+host+packs -c $(_BuildConfig) /p:AotHostArchitecture=x64 /p:AotHostOS=$(_hostedOS)
nameSuffix: wasm
isOfficialBuild: false
- extraStepsTemplate: /eng/pipelines/coreclr/perf-wasm-prepare-artifacts-steps.yml
- extraStepsParameters:
- configForBuild: Release
+ postBuildSteps:
+ - template: /eng/pipelines/coreclr/perf-wasm-prepare-artifacts-steps.yml
+ parameters:
+ configForBuild: Release
#run mono wasm microbenchmarks perf job
- template: /eng/pipelines/common/platform-matrix.yml
@@ -94,9 +95,10 @@ jobs:
buildArgs: -s mono+libs+host+packs -c $(_BuildConfig) /p:AotHostArchitecture=x64 /p:AotHostOS=$(_hostedOS)
nameSuffix: wasm
isOfficialBuild: false
- extraStepsTemplate: /eng/pipelines/coreclr/perf-wasm-prepare-artifacts-steps.yml
- extraStepsParameters:
- configForBuild: Release
+ postBuildSteps:
+ - template: /eng/pipelines/coreclr/perf-wasm-prepare-artifacts-steps.yml
+ parameters:
+ configForBuild: Release
# run mono wasm interpreter (default) microbenchmarks perf job
- template: /eng/pipelines/common/platform-matrix.yml
diff --git a/eng/pipelines/coreclr/perf_slow.yml b/eng/pipelines/coreclr/perf_slow.yml
index 91e3ad34f38c8..d6124364554b0 100644
--- a/eng/pipelines/coreclr/perf_slow.yml
+++ b/eng/pipelines/coreclr/perf_slow.yml
@@ -143,15 +143,16 @@ extends:
buildArgs: -s mono+libs+host+packs -c $(_BuildConfig) /p:MonoAOTEnableLLVM=true /p:MonoBundleLLVMOptimizer=true /p:BuildMonoAOTCrossCompiler=true /p:MonoLibClang="/usr/local/lib/libclang.so.16" /p:AotHostArchitecture=arm64 /p:AotHostOS=linux
nameSuffix: AOT
isOfficialBuild: false
- extraStepsTemplate: /eng/pipelines/common/upload-artifact-step.yml
- extraStepsParameters:
- rootFolder: '$(Build.SourcesDirectory)/artifacts/'
- includeRootFolder: true
- displayName: AOT Mono Artifacts
- artifactName: LinuxMonoAOTarm64
- archiveExtension: '.tar.gz'
- archiveType: tar
- tarCompression: gz
+ postBuildSteps:
+ - template: /eng/pipelines/common/upload-artifact-step.yml
+ parameters:
+ rootFolder: '$(Build.SourcesDirectory)/artifacts/'
+ includeRootFolder: true
+ displayName: AOT Mono Artifacts
+ artifactName: LinuxMonoAOTarm64
+ archiveExtension: '.tar.gz'
+ archiveType: tar
+ tarCompression: gz
# run mono aot microbenchmarks perf job
- template: /eng/pipelines/common/platform-matrix.yml
diff --git a/eng/pipelines/coreclr/templates/build-jit-job.yml b/eng/pipelines/coreclr/templates/build-jit-job.yml
index 5566f228b2f0e..2f78d87bf8163 100644
--- a/eng/pipelines/coreclr/templates/build-jit-job.yml
+++ b/eng/pipelines/coreclr/templates/build-jit-job.yml
@@ -132,6 +132,6 @@ jobs:
displayName: Publish Logs
inputs:
targetPath: $(Build.SourcesDirectory)/artifacts/log
- artifactName: '$(publishLogsArtifactPrefix)_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
+ artifactName: '$(publishLogsArtifactPrefix)_Attempt$(System.JobAttempt)_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
continueOnError: true
condition: always()
diff --git a/eng/pipelines/coreclr/templates/build-job.yml b/eng/pipelines/coreclr/templates/build-job.yml
index 365c1432aa41a..e995e626a5699 100644
--- a/eng/pipelines/coreclr/templates/build-job.yml
+++ b/eng/pipelines/coreclr/templates/build-job.yml
@@ -17,7 +17,6 @@ parameters:
testGroup: ''
timeoutInMinutes: ''
variables: {}
- pgoType: ''
### Product build
jobs:
@@ -36,21 +35,18 @@ jobs:
dependOnEvaluatePaths: ${{ parameters.dependOnEvaluatePaths }}
disableComponentGovernance: ${{ parameters.disableComponentGovernance }}
disableClrTest: ${{ parameters.disableClrTest }}
- pgoType: ${{ parameters.pgoType }}
# Compute job name from template parameters
- name: ${{ format('coreclr_{0}_product_build_{1}{2}_{3}_{4}{5}',
+ name: ${{ format('coreclr_{0}_product_build_{1}{2}_{3}_{4}',
parameters.runtimeVariant,
parameters.osGroup,
parameters.osSubgroup,
parameters.archType,
- parameters.buildConfig,
- parameters.pgoType) }}
- displayName: ${{ format('CoreCLR {0} Product Build {1}{2} {3} {4} {5}',
+ parameters.buildConfig) }}
+ displayName: ${{ format('CoreCLR {0} Product Build {1}{2} {3} {4}',
parameters.runtimeVariant, parameters.osGroup, parameters.osSubgroup,
parameters.archType,
- parameters.buildConfig,
- parameters.pgoType) }}
+ parameters.buildConfig) }}
# Run all steps in the container.
# Note that the containers are defined in platform-matrix.yml
@@ -70,15 +66,6 @@ jobs:
value: ''
- name: publishLogsArtifactPrefix
value: 'BuildLogs_CoreCLR'
- - ${{ if and(ne(variables['System.TeamProject'], 'public'), ne(variables['Build.Reason'], 'PullRequest')) }}:
- # Variables used to publish packages to blob feed
- - name: dotnetfeedUrl
- value: https://dotnetfeed.blob.core.windows.net/dotnet-coreclr/index.json
- - name: dotnetfeedPAT
- value: $(dotnetfeed-storage-access-key-1)
- # Variables used by arcade to gather asset manifests
- - name: _DotNetPublishToBlobFeed
- value: true
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- group: AzureDevOps-Artifact-Feeds-Pats
- name: officialBuildIdArg
@@ -89,7 +76,7 @@ jobs:
- name: enforcePgoArg
value: ''
# The EnforcePGO script is only supported on Windows and is not supported on arm64.
- - ${{ if and(eq(parameters.buildConfig, 'Release'), and(eq(parameters.osGroup, 'windows'), ne(parameters.archType, 'arm64')), ne(parameters.pgoType, 'pgo')) }}:
+ - ${{ if and(eq(parameters.buildConfig, 'Release'), and(eq(parameters.osGroup, 'windows'), ne(parameters.archType, 'arm64'))) }}:
- name: enforcePgoArg
value: '-enforcepgo'
@@ -103,26 +90,11 @@ jobs:
value: ''
- ${{ if ne(parameters.testGroup, 'innerloop') }}:
- name: clrRuntimeComponentsBuildArg
- value: '-component runtime -component alljits -component paltests -component nativeaot -component spmi '
- - ${{ if and(eq(parameters.osGroup, 'linux'), eq(parameters.archType, 'x86')) }}:
- - name: clrRuntimeComponentsBuildArg
- value: '-component runtime -component jit -component iltools -component spmi '
-
- - name: pgoInstrumentArg
- value: ''
- - ${{ if eq(parameters.pgoType, 'PGO' )}}:
- - name: pgoInstrumentArg
- value: '-pgoinstrument '
+ value: '-component runtime -component alljits -component nativeaot -component spmi '
- name: SignType
value: $[ coalesce(variables.OfficialSignType, 'real') ]
- - name: clrRuntimePortableBuildArg
- value: ''
- - ${{ if eq(parameters.osGroup, 'tizen') }}:
- - name: clrRuntimePortableBuildArg
- value: '-portablebuild=false'
-
# Set a default empty argument for the pgo path.
# This will be set during the 'native prerequisites' step if PGO optimization is enabled.
- name: CoreClrPgoDataArg
@@ -137,7 +109,6 @@ jobs:
- ${{ parameters.variables }}
steps:
-
# Install native dependencies
# Linux builds use docker images with dependencies preinstalled,
# and FreeBSD builds use a build agent with dependencies
@@ -194,14 +165,14 @@ jobs:
# Build CoreCLR Runtime
- ${{ if ne(parameters.osGroup, 'windows') }}:
- - script: $(Build.SourcesDirectory)/src/coreclr/build-runtime$(scriptExt) $(buildConfig) $(archType) $(crossArg) $(osArg) -ci $(compilerArg) $(clrRuntimeComponentsBuildArg) $(pgoInstrumentArg) $(officialBuildIdArg) $(clrInterpreterBuildArg) $(clrRuntimePortableBuildArg) $(CoreClrPgoDataArg) $(nativeSymbols)
+ - script: $(Build.SourcesDirectory)/src/coreclr/build-runtime$(scriptExt) $(buildConfig) $(archType) $(crossArg) $(osArg) -ci $(compilerArg) $(clrRuntimeComponentsBuildArg) $(officialBuildIdArg) $(clrInterpreterBuildArg) $(CoreClrPgoDataArg) $(nativeSymbols)
displayName: Build CoreCLR Runtime
- ${{ if eq(parameters.osGroup, 'windows') }}:
- - script: $(Build.SourcesDirectory)/src/coreclr/build-runtime$(scriptExt) $(buildConfig) $(archType) -ci $(enforcePgoArg) $(pgoInstrumentArg) $(officialBuildIdArg) $(clrInterpreterBuildArg) $(CoreClrPgoDataArg)
+ - script: $(Build.SourcesDirectory)/src/coreclr/build-runtime$(scriptExt) $(buildConfig) $(archType) -ci $(enforcePgoArg) $(officialBuildIdArg) $(clrInterpreterBuildArg) $(CoreClrPgoDataArg)
displayName: Build CoreCLR Runtime
- ${{ if or(eq(parameters.crossBuild, 'true'), ne(parameters.archType, 'x64')) }}:
- - script: $(Build.SourcesDirectory)/src/coreclr/build-runtime$(scriptExt) $(buildConfig) $(archType) -hostarch x64 $(osArg) -ci $(compilerArg) -component crosscomponents -cmakeargs "-DCLR_CROSS_COMPONENTS_BUILD=1" $(officialBuildIdArg) $(clrRuntimePortableBuildArg)
+ - script: $(Build.SourcesDirectory)/src/coreclr/build-runtime$(scriptExt) $(buildConfig) $(archType) -hostarch x64 $(osArg) -ci $(compilerArg) -component crosscomponents -cmakeargs "-DCLR_CROSS_COMPONENTS_BUILD=1" $(officialBuildIdArg)
displayName: Build CoreCLR Cross-Arch Tools (Tools that run on x64 targeting x86)
- ${{ if in(parameters.osGroup, 'osx', 'ios', 'tvos') }}:
@@ -211,12 +182,8 @@ jobs:
displayName: Disk Usage after Build
# Build CoreCLR Managed Components
- - ${{ if or(ne(parameters.osGroup, 'linux'), ne(parameters.archType, 'x86')) }}:
- - script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) -subset clr.corelib+clr.nativecorelib+clr.nativeaotlibs+clr.tools+clr.packages+clr.paltestlist $(crossArg) $(compilerArg) -arch $(archType) $(osArg) -c $(buildConfig) $(pgoInstrumentArg) $(officialBuildIdArg) -ci
- displayName: Build managed product components and packages
- - ${{ if and(eq(parameters.osGroup, 'linux'), eq(parameters.archType, 'x86')) }}:
- - script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) -subset clr.corelib $(crossArg) -arch $(archType) $(osArg) -c $(buildConfig) $(pgoInstrumentArg) $(officialBuildIdArg) -ci
- displayName: Build managed product components and packages
+ - script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) -subset clr.corelib+clr.nativecorelib+clr.nativeaotlibs+clr.tools+clr.packages $(crossArg) $(compilerArg) -arch $(archType) $(osArg) -c $(buildConfig) $(officialBuildIdArg) -ci
+ displayName: Build managed product components and packages
# Build native test components
- ${{ if and(ne(parameters.isOfficialBuild, true), ne(parameters.disableClrTest, true)) }}:
@@ -264,7 +231,7 @@ jobs:
artifactName: $(buildProductArtifactName)
displayName: 'product build'
- - ${{ if and(in(parameters.osGroup, 'windows', 'linux'), ne(parameters.archType, 'x86'), eq(parameters.pgoType, '')) }}:
+ - ${{ if and(in(parameters.osGroup, 'windows', 'linux'), ne(parameters.archType, 'x86')) }}:
- template: /eng/pipelines/coreclr/templates/crossdac-build.yml
parameters:
archType: ${{ parameters.archType }}
@@ -276,7 +243,7 @@ jobs:
${{ else }}:
hostArchType: x64
- - ${{ if and(in(parameters.osGroup, 'windows'), eq(parameters.archType, 'x86'), eq(parameters.pgoType, '')) }}:
+ - ${{ if and(in(parameters.osGroup, 'windows'), eq(parameters.archType, 'x86')) }}:
- template: /eng/pipelines/coreclr/templates/crossdac-build.yml
parameters:
archType: arm
@@ -287,7 +254,7 @@ jobs:
- ${{ if and(ne(parameters.testGroup, ''), ne(parameters.disableClrTest, true)) }}:
# Publish test native components for consumption by test execution.
- - ${{ if and(ne(parameters.isOfficialBuild, true), eq(parameters.pgoType, '')) }}:
+ - ${{ if ne(parameters.isOfficialBuild, true) }}:
- template: /eng/pipelines/common/upload-artifact-step.yml
parameters:
rootFolder: $(nativeTestArtifactRootFolderPath)
@@ -298,25 +265,23 @@ jobs:
artifactName: $(nativeTestArtifactName)
displayName: 'native test components'
- # Get key vault secrets for publishing
- - ${{ if and(ne(variables['System.TeamProject'], 'public'), ne(variables['Build.Reason'], 'PullRequest')) }}:
- - task: AzureKeyVault@1
- inputs:
- azureSubscription: 'DotNet-Engineering-Services_KeyVault'
- KeyVaultName: EngKeyVault
- SecretsFilter: 'dotnetfeed-storage-access-key-1,microsoft-symbol-server-pat,symweb-symbol-server-pat'
-
# Save packages using the prepare-signed-artifacts format.
- - ${{ if and(eq(parameters.isOfficialBuild, true), eq(parameters.pgoType, '')) }}:
+ - ${{ if eq(parameters.isOfficialBuild, true) }}:
- template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
parameters:
name: ${{ parameters.platform }}
+ - ${{ if and(eq(parameters.isOfficialBuild, true), eq(parameters.osGroup, 'windows')) }}:
+ - powershell: ./eng/collect_vsinfo.ps1 -ArchiveRunName postbuild_log
+ displayName: Collect vslogs on exit
+ condition: always()
+
+
# Publish Logs
- task: PublishPipelineArtifact@1
displayName: Publish Logs
inputs:
targetPath: $(Build.SourcesDirectory)/artifacts/log
- artifactName: '$(publishLogsArtifactPrefix)${{ parameters.pgoType }}_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
+ artifactName: '$(publishLogsArtifactPrefix)_Attempt$(System.JobAttempt)_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
continueOnError: true
condition: always()
diff --git a/eng/pipelines/coreclr/templates/crossdac-pack.yml b/eng/pipelines/coreclr/templates/crossdac-pack.yml
index 7489ceeedad05..520eb65fb337e 100644
--- a/eng/pipelines/coreclr/templates/crossdac-pack.yml
+++ b/eng/pipelines/coreclr/templates/crossdac-pack.yml
@@ -70,6 +70,6 @@ jobs:
displayName: Publish Logs
inputs:
targetPath: $(Build.SourcesDirectory)/artifacts/log
- artifactName: 'CrossDacPackagingLogs'
+ artifactName: 'CrossDacPackagingLogs_Attempt$(System.JobAttempt)'
continueOnError: true
condition: always()
diff --git a/eng/pipelines/coreclr/templates/helix-queues-setup.yml b/eng/pipelines/coreclr/templates/helix-queues-setup.yml
index 9a57f32f5e60d..378396bc323a3 100644
--- a/eng/pipelines/coreclr/templates/helix-queues-setup.yml
+++ b/eng/pipelines/coreclr/templates/helix-queues-setup.yml
@@ -52,7 +52,7 @@ jobs:
# Browser wasm
- ${{ if eq(parameters.platform, 'browser_wasm') }}:
- - (Ubuntu.1804.Amd64)Ubuntu.1804.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-webassembly
+ - (Ubuntu.1804.Amd64)Ubuntu.2204.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-webassembly
# iOS devices
- ${{ if in(parameters.platform, 'ios_arm64') }}:
@@ -65,16 +65,16 @@ jobs:
# Linux arm
- ${{ if eq(parameters.platform, 'linux_arm') }}:
- ${{ if eq(variables['System.TeamProject'], 'public') }}:
- - (Ubuntu.1804.Arm32.Open)Ubuntu.1804.Armarch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-arm32v7
+ - (Ubuntu.1804.Arm32.Open)Ubuntu.2204.Armarch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-arm32v7
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- - (Ubuntu.1804.Arm32)Ubuntu.1804.Armarch@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-arm32v7
+ - (Ubuntu.1804.Arm32)Ubuntu.2204.Armarch@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-arm32v7
# Linux arm64
- ${{ if eq(parameters.platform, 'linux_arm64') }}:
- ${{ if eq(variables['System.TeamProject'], 'public') }}:
- - (Ubuntu.1804.Arm64.Open)Ubuntu.1804.Armarch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-arm64v8
+ - (Ubuntu.2204.Arm64.Open)Ubuntu.2204.Armarch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-helix-arm64v8
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- - (Ubuntu.1804.Arm64)Ubuntu.1804.ArmArch@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-arm64v8
+ - (Ubuntu.1804.Arm64)Ubuntu.2204.ArmArch@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-arm64v8
# Linux musl x64
- ${{ if eq(parameters.platform, 'linux_musl_x64') }}:
@@ -100,9 +100,9 @@ jobs:
# Linux x64
- ${{ if eq(parameters.platform, 'linux_x64') }}:
- ${{ if eq(variables['System.TeamProject'], 'public') }}:
- - Ubuntu.1804.Amd64.Open
+ - Ubuntu.2004.Amd64.Open
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- - Ubuntu.1804.Amd64
+ - Ubuntu.2004.Amd64
# OSX arm64
- ${{ if eq(parameters.platform, 'osx_arm64') }}:
diff --git a/eng/pipelines/coreclr/templates/run-paltests-step.yml b/eng/pipelines/coreclr/templates/run-paltests-step.yml
new file mode 100644
index 0000000000000..3b3881986f7d1
--- /dev/null
+++ b/eng/pipelines/coreclr/templates/run-paltests-step.yml
@@ -0,0 +1,23 @@
+parameters:
+ continueOnError: 'false' # optional -- determines whether to continue the build if the step errors
+ helixQueues: '' # required -- Helix queues
+ buildConfig: '' # required -- build configuration
+ archType: '' # required -- targeting CPU architecture
+ osGroup: '' # required -- operating system for the job
+ osSubgroup: '' # optional -- operating system subgroup
+ dependOnEvaluatePaths: false
+
+steps:
+ - template: /eng/pipelines/common/templates/runtimes/send-to-helix-step.yml
+ parameters:
+ displayName: 'Send job to Helix'
+ helixBuild: $(Build.BuildNumber)
+ helixSource: $(_HelixSource)
+ helixType: 'build/tests/'
+ helixQueues: ${{ parameters.helixQueues }}
+ creator: dotnet-bot
+ helixProjectArguments: '$(Build.SourcesDirectory)/src/coreclr/scripts/paltests.proj'
+ BuildConfig: ${{ parameters.buildConfig }}
+ osGroup: ${{ parameters.osGroup }}
+ archType: ${{ parameters.archType }}
+ shouldContinueOnError: ${{ parameters.continueOnError }}
diff --git a/eng/pipelines/coreclr/templates/superpmi-asmdiffs-checked-release-job.yml b/eng/pipelines/coreclr/templates/superpmi-asmdiffs-checked-release-job.yml
index 396fe5077f598..659483c9bc302 100644
--- a/eng/pipelines/coreclr/templates/superpmi-asmdiffs-checked-release-job.yml
+++ b/eng/pipelines/coreclr/templates/superpmi-asmdiffs-checked-release-job.yml
@@ -34,7 +34,7 @@ jobs:
- name: releaseProductRootFolderPath
value: '$(Build.SourcesDirectory)/artifacts/bin/coreclr/$(osGroup).$(archType).Release'
- name: releaseProductArtifactName
- value: 'CoreCLRProduct_${{ parameters.pgoType }}_${{ parameters.runtimeVariant }}_$(osGroup)$(osSubgroup)_$(archType)_release'
+ value: 'CoreCLRProduct_${{ parameters.runtimeVariant }}_$(osGroup)$(osSubgroup)_$(archType)_release'
steps:
diff --git a/eng/pipelines/coreclr/templates/superpmi-diffs-job.yml b/eng/pipelines/coreclr/templates/superpmi-diffs-job.yml
index aace201eb9661..9c2290c43a3d3 100644
--- a/eng/pipelines/coreclr/templates/superpmi-diffs-job.yml
+++ b/eng/pipelines/coreclr/templates/superpmi-diffs-job.yml
@@ -49,7 +49,7 @@ jobs:
- name: releaseProductRootFolderPath
value: '$(Build.SourcesDirectory)/artifacts/bin/coreclr/$(osGroup).$(archType).Release'
- name: releaseProductArtifactName
- value: 'CoreCLRProduct_${{ parameters.pgoType }}_${{ parameters.runtimeVariant }}_$(osGroup)$(osSubgroup)_$(archType)_release'
+ value: 'CoreCLRProduct_${{ parameters.runtimeVariant }}_$(osGroup)$(osSubgroup)_$(archType)_release'
steps:
diff --git a/eng/pipelines/coreclr/templates/xplat-pipeline-job.yml b/eng/pipelines/coreclr/templates/xplat-pipeline-job.yml
index 83347d78b8b1c..162f5e9f0ed1c 100644
--- a/eng/pipelines/coreclr/templates/xplat-pipeline-job.yml
+++ b/eng/pipelines/coreclr/templates/xplat-pipeline-job.yml
@@ -38,7 +38,6 @@ jobs:
crossBuild: ${{ parameters.crossBuild }}
strategy: ${{ parameters.strategy }}
pool: ${{ parameters.pool }}
- pgoType: ${{ parameters.pgoType }}
# arcade-specific parameters
condition: and(succeeded(), ${{ parameters.condition }})
@@ -65,7 +64,7 @@ jobs:
# Build product defines what we are trying to build, either coreclr or mono
- name: buildProductArtifactName
- value: 'CoreCLRProduct_${{ parameters.pgoType }}_${{ parameters.runtimeVariant }}_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
+ value: 'CoreCLRProduct_${{ parameters.runtimeVariant }}_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
- name: buildProductRootFolderPath
value: '$(Build.SourcesDirectory)/artifacts/bin/coreclr/$(osGroup).$(archType).$(buildConfigUpper)'
@@ -78,13 +77,13 @@ jobs:
# We need this because both mono and coreclr build currently depends on CoreClr
- name: coreClrProductArtifactName
- value: 'CoreCLRProduct_${{ parameters.pgoType }}_${{ parameters.runtimeVariant }}_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
+ value: 'CoreCLRProduct_${{ parameters.runtimeVariant }}_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
- name: coreClrProductRootFolderPath
value: '$(Build.SourcesDirectory)/artifacts/bin/coreclr/$(osGroup).$(archType).$(buildConfigUpper)'
- name: corelibProductArtifactName
- value: 'CoreLib_${{ parameters.pgoType }}_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
+ value: 'CoreLib_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
- name: managedGenericTestArtifactName
value: 'CoreCLRManagedTestArtifacts_AnyOS_AnyCPU_$(buildConfig)'
diff --git a/eng/pipelines/extra-platforms/runtime-extra-platforms-android.yml b/eng/pipelines/extra-platforms/runtime-extra-platforms-android.yml
index 23c57b87fe538..9fd1769fe18fa 100644
--- a/eng/pipelines/extra-platforms/runtime-extra-platforms-android.yml
+++ b/eng/pipelines/extra-platforms/runtime-extra-platforms-android.yml
@@ -44,10 +44,11 @@ jobs:
# Turn off the testing for now, until https://github.com/dotnet/runtime/issues/60128 gets resolved
# ${{ if eq(variables['isRollingBuild'], true) }}:
# # extra steps, run tests
- # extraStepsTemplate: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
- # extraStepsParameters:
- # creator: dotnet-bot
- # testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ # postBuildSteps:
+ # - template: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
+ # parameters:
+ # creator: dotnet-bot
+ # testRunNamePrefixSuffix: Mono_$(_BuildConfig)
# extraVariablesTemplates:
# - template: /eng/pipelines/common/templates/runtimes/test-variables.yml
@@ -77,7 +78,8 @@ jobs:
buildArgs: -s mono+libs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true $(_runSmokeTestsOnlyArg) /p:EnableAdditionalTimezoneChecks=true
timeoutInMinutes: 480
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
diff --git a/eng/pipelines/extra-platforms/runtime-extra-platforms-androidemulator.yml b/eng/pipelines/extra-platforms/runtime-extra-platforms-androidemulator.yml
index 65a890976e739..a114b1b744a13 100644
--- a/eng/pipelines/extra-platforms/runtime-extra-platforms-androidemulator.yml
+++ b/eng/pipelines/extra-platforms/runtime-extra-platforms-androidemulator.yml
@@ -40,10 +40,11 @@ jobs:
buildArgs: -s mono+libs -c $(_BuildConfig)
timeoutInMinutes: 240
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
extraVariablesTemplates:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
@@ -78,10 +79,11 @@ jobs:
buildArgs: -s mono+libs -c $(_BuildConfig)
timeoutInMinutes: 240
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
extraVariablesTemplates:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
@@ -111,7 +113,8 @@ jobs:
buildArgs: -s mono+libs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true $(_runSmokeTestsOnlyArg)
timeoutInMinutes: 180
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
diff --git a/eng/pipelines/extra-platforms/runtime-extra-platforms-ioslike.yml b/eng/pipelines/extra-platforms/runtime-extra-platforms-ioslike.yml
index 84477d2c25a8a..ef0425042b5e6 100644
--- a/eng/pipelines/extra-platforms/runtime-extra-platforms-ioslike.yml
+++ b/eng/pipelines/extra-platforms/runtime-extra-platforms-ioslike.yml
@@ -38,11 +38,12 @@ jobs:
buildArgs: -s mono+libs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true /p:DevTeamProvisioning=- /p:RunAOTCompilation=true $(_runSmokeTestsOnlyArg) /p:BuildTestsOnHelix=true /p:EnableAdditionalTimezoneChecks=true /p:UsePortableRuntimePack=true /p:BuildDarwinFrameworks=true /p:IsManualOrRollingBuild=true
timeoutInMinutes: 480
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
- extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true
#
# iOS/tvOS devices
@@ -80,14 +81,15 @@ jobs:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
parameters:
testGroup: innerloop
- extraStepsTemplate: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- compileOnHelix: true
- interpreter: true
- testBuildArgs: /p:ArchiveTests=true /p:DevTeamProvisioning=- /p:RunAOTCompilation=true /p:MonoForceInterpreter=true /p:BuildTestsOnHelix=true
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
- extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true
+ postBuildSteps:
+ - template: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
+ parameters:
+ creator: dotnet-bot
+ compileOnHelix: true
+ interpreter: true
+ testBuildArgs: /p:ArchiveTests=true /p:DevTeamProvisioning=- /p:RunAOTCompilation=true /p:MonoForceInterpreter=true /p:BuildTestsOnHelix=true
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true
#
# iOS/tvOS devices
@@ -116,11 +118,12 @@ jobs:
buildArgs: --cross -s clr.alljits+clr.tools+clr.nativeaotruntime+clr.nativeaotlibs+libs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true /p:RunSmokeTestsOnly=true /p:DevTeamProvisioning=- /p:BuildTestsOnHelix=true /p:UseNativeAOTRuntime=true /p:RunAOTCompilation=false /p:ContinuousIntegrationBuild=true
timeoutInMinutes: 180
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
- extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
+ extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true
#
# Build the whole product using NativeAOT for iOS/tvOS and run runtime tests with iOS/tvOS devices
@@ -151,8 +154,9 @@ jobs:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
parameters:
testGroup: innerloop
- extraStepsTemplate: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testBuildArgs: tree nativeaot/SmokeTests /p:BuildNativeAOTRuntimePack=true
- testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
+ parameters:
+ creator: dotnet-bot
+ testBuildArgs: tree nativeaot/SmokeTests /p:BuildNativeAOTRuntimePack=true
+ testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
diff --git a/eng/pipelines/extra-platforms/runtime-extra-platforms-ioslikesimulator.yml b/eng/pipelines/extra-platforms/runtime-extra-platforms-ioslikesimulator.yml
index c7bcfc15e132b..b11b4be72ed6e 100644
--- a/eng/pipelines/extra-platforms/runtime-extra-platforms-ioslikesimulator.yml
+++ b/eng/pipelines/extra-platforms/runtime-extra-platforms-ioslikesimulator.yml
@@ -40,11 +40,12 @@ jobs:
buildArgs: -s mono+libs+host+packs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true $(_runSmokeTestsOnlyArg) /p:RunAOTCompilation=true /p:MonoForceInterpreter=true /p:BuildDarwinFrameworks=true
timeoutInMinutes: 180
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- interpreter: true
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ interpreter: true
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
#
# Build the whole product using Mono for iOSSimulator/tvOSSimulator and run runtime tests with iOS/tvOS simulators
@@ -84,14 +85,15 @@ jobs:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
parameters:
testGroup: innerloop
- extraStepsTemplate: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- compileOnHelix: true
- interpreter: true
- testBuildArgs: /p:ArchiveTests=true /p:DevTeamProvisioning=- /p:RunAOTCompilation=true /p:MonoForceInterpreter=true /p:BuildTestsOnHelix=true
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
- extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true
+ postBuildSteps:
+ - template: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
+ parameters:
+ creator: dotnet-bot
+ compileOnHelix: true
+ interpreter: true
+ testBuildArgs: /p:ArchiveTests=true /p:DevTeamProvisioning=- /p:RunAOTCompilation=true /p:MonoForceInterpreter=true /p:BuildTestsOnHelix=true
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true
#
# Build the whole product using Native AOT for iOSSimulator/tvOSSimulator and run runtime tests with iOS/tvOS simulators
@@ -131,8 +133,9 @@ jobs:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
parameters:
testGroup: innerloop
- extraStepsTemplate: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testBuildArgs: tree nativeaot/SmokeTests /p:BuildNativeAOTRuntimePack=true
- testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
+ parameters:
+ creator: dotnet-bot
+ testBuildArgs: tree nativeaot/SmokeTests /p:BuildNativeAOTRuntimePack=true
+ testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
diff --git a/eng/pipelines/extra-platforms/runtime-extra-platforms-linuxbionic.yml b/eng/pipelines/extra-platforms/runtime-extra-platforms-linuxbionic.yml
index 352eabe9d22d4..7eb5fa47f8082 100644
--- a/eng/pipelines/extra-platforms/runtime-extra-platforms-linuxbionic.yml
+++ b/eng/pipelines/extra-platforms/runtime-extra-platforms-linuxbionic.yml
@@ -42,7 +42,8 @@ jobs:
buildArgs: -s mono+libs+host+packs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true
timeoutInMinutes: 480
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)_LinuxBionic
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)_LinuxBionic
diff --git a/eng/pipelines/extra-platforms/runtime-extra-platforms-maccatalyst.yml b/eng/pipelines/extra-platforms/runtime-extra-platforms-maccatalyst.yml
index 736bf0516dfdf..936fe60bb4833 100644
--- a/eng/pipelines/extra-platforms/runtime-extra-platforms-maccatalyst.yml
+++ b/eng/pipelines/extra-platforms/runtime-extra-platforms-maccatalyst.yml
@@ -37,10 +37,11 @@ jobs:
buildArgs: -s mono+libs+host+packs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true /p:DevTeamProvisioning=adhoc /p:RunAOTCompilation=true /p:MonoForceInterpreter=true /p:BuildDarwinFrameworks=true
timeoutInMinutes: 180
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
#
# MacCatalyst interp - requires AOT Compilation and Interp flags
@@ -70,8 +71,9 @@ jobs:
buildArgs: -s mono+libs+host+packs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true $(_runSmokeTestsOnlyArg) /p:DevTeamProvisioning=adhoc /p:RunAOTCompilation=true /p:MonoForceInterpreter=true /p:BuildDarwinFrameworks=true /p:EnableAppSandbox=true
timeoutInMinutes: 180
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- interpreter: true
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ interpreter: true
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
diff --git a/eng/pipelines/extra-platforms/runtime-extra-platforms-other.yml b/eng/pipelines/extra-platforms/runtime-extra-platforms-other.yml
index c279c318e34d5..ee481119ad960 100644
--- a/eng/pipelines/extra-platforms/runtime-extra-platforms-other.yml
+++ b/eng/pipelines/extra-platforms/runtime-extra-platforms-other.yml
@@ -279,15 +279,16 @@ jobs:
eq(dependencies.evaluate_paths.outputs['SetPathVars_installer.containsChange'], true),
eq(variables['isRollingBuild'], true))
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
- condition: >-
- or(
- eq(variables['librariesContainsChange'], true),
- eq(variables['monoContainsChange'], true),
- eq(variables['isRollingBuild'], true))
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ condition: >-
+ or(
+ eq(variables['librariesContainsChange'], true),
+ eq(variables['monoContainsChange'], true),
+ eq(variables['isRollingBuild'], true))
#
# Build the whole product using Mono and run runtime tests
@@ -380,11 +381,12 @@ jobs:
eq(dependencies.evaluate_paths.outputs['SetPathVars_mono_excluding_wasm.containsChange'], true),
eq(dependencies.evaluate_paths.outputs['SetPathVars_runtimetests.containsChange'], true),
eq(variables['isRollingBuild'], true))
- extraStepsTemplate: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- llvmAotStepContainer: linux_x64_llvmaot
- testRunNamePrefixSuffix: Mono_Release
+ postBuildSteps:
+ - template: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
+ parameters:
+ creator: dotnet-bot
+ llvmAotStepContainer: linux_x64_llvmaot
+ testRunNamePrefixSuffix: Mono_Release
extraVariablesTemplates:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
diff --git a/eng/pipelines/installer/jobs/build-job.yml b/eng/pipelines/installer/jobs/build-job.yml
index 1d89cfad70eb2..1c45b437c8013 100644
--- a/eng/pipelines/installer/jobs/build-job.yml
+++ b/eng/pipelines/installer/jobs/build-job.yml
@@ -19,7 +19,6 @@ parameters:
displayName: ''
runtimeVariant: ''
pool: ''
- pgoType: ''
runOnlyIfDependenciesSucceeded: false
# The target names here should match container names in the resources section in our pipelines, like runtime.yml
@@ -59,11 +58,10 @@ jobs:
dependOnEvaluatePaths: ${{ parameters.dependOnEvaluatePaths }}
disableClrTest: ${{ parameters.disableClrTest }}
- pgoType: ${{ parameters.pgoType }}
# Compute job name from template parameters
- name: ${{ format('installer_{0}_{1}_{2}_{3}_{4}_', parameters.pgoType, parameters.runtimeFlavor, parameters.runtimeVariant, coalesce(parameters.name, parameters.platform), parameters.buildConfig) }}
- displayName: ${{ format('{0} Installer Build and Test {1} {2} {3} {4}', parameters.pgoType, parameters.runtimeFlavor, parameters.runtimeVariant, coalesce(parameters.name, parameters.platform), parameters.buildConfig) }}
+ name: ${{ format('installer_{0}_{1}_{2}_{3}_', parameters.runtimeFlavor, parameters.runtimeVariant, coalesce(parameters.name, parameters.platform), parameters.buildConfig) }}
+ displayName: ${{ format('Installer Build and Test {0} {1} {2} {3}', parameters.runtimeFlavor, parameters.runtimeVariant, coalesce(parameters.name, parameters.platform), parameters.buildConfig) }}
# Run all steps in the container.
# Note that the containers are defined in platform-matrix.yml
@@ -86,30 +84,31 @@ jobs:
- name: OfficialBuildArg
value: ''
+ # Explicitly enable tests for linux even though it is a cross build using mariner
+ # They still work in this configuration and until they run on Helix, it is our only
+ # linux test coverage in the installer pipeline
- name: SkipTests
value: ${{ or(
not(in(parameters.archType, 'x64', 'x86')),
eq(parameters.runtimeFlavor, 'mono'),
eq(parameters.isOfficialBuild, true),
- eq(parameters.crossBuild, true),
- eq(parameters.pgoType, 'PGO')) }}
+ and(
+ eq(parameters.crossBuild, true),
+ not(and(
+ eq(parameters.osGroup, 'linux'),
+ eq(parameters.osSubgroup, ''))
+ ))) }}
- name: BuildAction
value: -test
- - ${{ if eq(or(not(in(parameters.archType, 'x64', 'x86')), eq(parameters.runtimeFlavor, 'mono'), eq(parameters.isOfficialBuild, true), eq(parameters.crossBuild, true), eq(parameters.pgoType, 'PGO')), true) }}:
+ - ${{ if eq(or(not(in(parameters.archType, 'x64', 'x86')), eq(parameters.runtimeFlavor, 'mono'), eq(parameters.isOfficialBuild, true), and(eq(parameters.crossBuild, true), not(and(eq(parameters.osGroup, 'linux'), eq(parameters.osSubgroup, ''))))), true) }}:
- name: BuildAction
value: ''
- name: SignType
value: test
- - name: pgoInstrumentArg
- value: ''
- - ${{ if eq(parameters.pgoType, 'PGO' )}}:
- - name: pgoInstrumentArg
- value: '-pgoinstrument '
-
# Set up non-PR build from internal project
- ${{ if eq(parameters.isOfficialBuild, true) }}:
- name: SignType
@@ -145,7 +144,6 @@ jobs:
build.cmd -subset host+packs -ci
$(BuildAction)
-configuration $(_BuildConfig)
- $(pgoInstrumentArg)
$(LiveOverridePathArgs)
$(CommonMSBuildArgs)
$(MsbuildSigningArguments)
@@ -217,7 +215,6 @@ jobs:
/p:CrossBuild=${{ parameters.crossBuild }}
/p:PortableBuild=$(_PortableBuild)
/p:SkipTests=$(SkipTests)
- $(pgoInstrumentArg)
$(LiveOverridePathArgs)
$(CommonMSBuildArgs)
@@ -257,7 +254,7 @@ jobs:
/p:RuntimeArtifactsPath=$(buildCommandSourcesDirectory)$(RuntimeDownloadPath)
/p:RuntimeConfiguration=${{ parameters.liveRuntimeBuildConfig }}
- name: RuntimeArtifactName
- value: $(runtimeFlavorName)Product_${{ parameters.pgoType }}_${{ parameters.runtimeVariant }}_$(liveRuntimeLegName)
+ value: $(runtimeFlavorName)Product_${{ parameters.runtimeVariant }}_$(liveRuntimeLegName)
- ${{ if ne(parameters.liveLibrariesBuildConfig, '') }}:
- name: liveLibrariesLegName
@@ -278,14 +275,13 @@ jobs:
- evaluate_paths
- ${{ parameters.dependsOn }}
- ${{ if ne(parameters.liveRuntimeBuildConfig, '') }}:
- - ${{ format('{0}_{1}_product_build_{2}{3}_{4}_{5}{6}',
+ - ${{ format('{0}_{1}_product_build_{2}{3}_{4}_{5}',
parameters.runtimeFlavor,
parameters.runtimeVariant,
parameters.osGroup,
parameters.osSubgroup,
parameters.archType,
- parameters.liveRuntimeBuildConfig,
- parameters.pgoType) }}
+ parameters.liveRuntimeBuildConfig) }}
- ${{ if ne(parameters.liveLibrariesBuildConfig, '') }}:
- libraries_build_${{ format('{0}{1}_{2}_{3}',
parameters.osGroup,
@@ -370,6 +366,12 @@ jobs:
displayName: Build and Package
continueOnError: ${{ and(eq(variables.SkipTests, false), eq(parameters.shouldContinueOnError, true)) }}
+ - ${{ if and(eq(parameters.isOfficialBuild, true), eq(parameters.osGroup, 'windows')) }}:
+ - powershell: ./eng/collect_vsinfo.ps1 -ArchiveRunName postbuild_log
+ displayName: Collect vslogs on exit
+ condition: always()
+
+
- ${{ if in(parameters.osGroup, 'osx', 'ios', 'tvos') }}:
- script: |
du -sh $(Build.SourcesDirectory)/*
@@ -377,7 +379,7 @@ jobs:
displayName: Disk Usage after Build
# Only in glibc leg, we produce RPMs and Debs
- - ${{ if and(eq(parameters.runtimeFlavor, 'coreclr'), or(eq(parameters.platform, 'linux_x64'), eq(parameters.platform, 'linux_arm64')), eq(parameters.osSubgroup, ''), eq(parameters.pgoType, ''))}}:
+ - ${{ if and(eq(parameters.runtimeFlavor, 'coreclr'), or(eq(parameters.platform, 'linux_x64'), eq(parameters.platform, 'linux_arm64')), eq(parameters.osSubgroup, ''))}}:
- ${{ each packageBuild in parameters.packageDistroList }}:
# This leg's RID matches the build image. Build its distro-dependent packages, as well as
# the distro-independent installers. (There's no particular reason to build the distro-
@@ -398,7 +400,7 @@ jobs:
runtimeFlavor: ${{ parameters.runtimeFlavor }}
runtimeVariant: ${{ parameters.runtimeVariant }}
isOfficialBuild: ${{ eq(parameters.isOfficialBuild, true) }}
- pgoType: ${{ parameters.pgoType }}
+ skipTests: ${{ eq(variables.SkipTests, true) }}
- ${{ if ne(parameters.osGroup, 'windows') }}:
- script: set -x && df -h
diff --git a/eng/pipelines/installer/jobs/steps/upload-job-artifacts.yml b/eng/pipelines/installer/jobs/steps/upload-job-artifacts.yml
index 6029ba0057197..4012b9a4fa34c 100644
--- a/eng/pipelines/installer/jobs/steps/upload-job-artifacts.yml
+++ b/eng/pipelines/installer/jobs/steps/upload-job-artifacts.yml
@@ -3,7 +3,6 @@ parameters:
runtimeFlavor: 'coreclr'
runtimeVariant: ''
isOfficialBuild: false
- pgoType: ''
steps:
# Upload build artifacts (packages) to pipeline only if official, to save storage space.
@@ -51,7 +50,7 @@ steps:
displayName: Publish binaries
inputs:
pathtoPublish: '$(Build.StagingDirectory)/corehost-bin-${{ parameters.name }}-$(_BuildConfig)$(archiveExtension)'
- artifactName: Installer-Binaries-${{parameters.pgoType }}${{ parameters.runtimeFlavor }}-${{ parameters.runtimeVariant }}-${{ parameters.name }}-$(_BuildConfig)
+ artifactName: Installer-Binaries-${{ parameters.runtimeFlavor }}-${{ parameters.runtimeVariant }}-${{ parameters.name }}-$(_BuildConfig)
continueOnError: true
condition: failed()
@@ -71,6 +70,6 @@ steps:
displayName: Publish BuildLogs
inputs:
targetPath: '$(Build.StagingDirectory)/BuildLogs'
- artifactName: Installer-Logs-${{parameters.pgoType }}${{ parameters.runtimeFlavor }}-${{ parameters.runtimeVariant }}-${{ parameters.name }}-$(_BuildConfig)
+ artifactName: Installer-Logs_Attempt$(System.JobAttempt)-${{ parameters.runtimeFlavor }}-${{ parameters.runtimeVariant }}-${{ parameters.name }}-$(_BuildConfig)
continueOnError: true
condition: always()
diff --git a/eng/pipelines/libraries/base-job.yml b/eng/pipelines/libraries/base-job.yml
index 2448124a7bc62..54fe98e7d85bb 100644
--- a/eng/pipelines/libraries/base-job.yml
+++ b/eng/pipelines/libraries/base-job.yml
@@ -23,7 +23,6 @@ parameters:
testScope: ''
pool: ''
runTests: false
- pgoType: ''
jobs:
- template: /eng/common/templates/job/job.yml
@@ -98,7 +97,7 @@ jobs:
- _runtimeDownloadPath: '$(Build.SourcesDirectory)/artifacts/transport/${{ parameters.runtimeFlavor }}'
- _runtimeConfigurationArg: -rc ${{ parameters.liveRuntimeBuildConfig }}
- ${{ if eq(parameters.runTests, true) }}:
- - _runtimeArtifactName: '$(runtimeFlavorName)Product_${{ parameters.pgoType }}_${{ parameters.runtimeVariant}}_${{ parameters.osGroup }}${{ parameters.osSubgroup }}_${{ parameters.archType }}_${{ parameters.liveRuntimeBuildConfig }}'
+ - _runtimeArtifactName: '$(runtimeFlavorName)Product_${{ parameters.runtimeVariant}}_${{ parameters.osGroup }}${{ parameters.osSubgroup }}_${{ parameters.archType }}_${{ parameters.liveRuntimeBuildConfig }}'
- _runtimeArtifactsPathArg: ' /p:RuntimeArtifactsPath=$(_runtimeDownloadPath)'
- ${{ if eq(parameters.testDisplayName, '') }}:
- _testRunNamePrefixSuffix: $(runtimeFlavorName)_${{ parameters.liveRuntimeBuildConfig }}
diff --git a/eng/pipelines/libraries/helix-queues-setup.yml b/eng/pipelines/libraries/helix-queues-setup.yml
index be98c70f16130..d3d7e7b2e64f8 100644
--- a/eng/pipelines/libraries/helix-queues-setup.yml
+++ b/eng/pipelines/libraries/helix-queues-setup.yml
@@ -28,21 +28,21 @@ jobs:
# Linux arm
- ${{ if eq(parameters.platform, 'linux_arm') }}:
- ${{ if or(eq(parameters.jobParameters.isExtraPlatforms, true), eq(parameters.jobParameters.includeAllPlatforms, true)) }}:
- - (Debian.11.Arm32.Open)Ubuntu.1804.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-arm32v7
+ - (Debian.11.Arm32.Open)Ubuntu.2204.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-arm32v7
# Linux armv6
- ${{ if eq(parameters.platform, 'linux_armv6') }}:
# - ${{ if eq(parameters.jobParameters.isFullMatrix, true) }}:
- - (Raspbian.10.Armv6.Open)Ubuntu.1804.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:raspbian-10-helix-arm32v6
+ - (Raspbian.10.Armv6.Open)Ubuntu.2204.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:raspbian-10-helix-arm32v6
# Linux arm64
- ${{ if eq(parameters.platform, 'linux_arm64') }}:
- ${{ if or(eq(parameters.jobParameters.isExtraPlatforms, true), eq(parameters.jobParameters.includeAllPlatforms, true)) }}:
- - (Ubuntu.2204.Arm64.Open)Ubuntu.1804.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-helix-arm64v8
+ - (Ubuntu.2204.Arm64.Open)Ubuntu.2204.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-helix-arm64v8
- ${{ if or(ne(parameters.jobParameters.isExtraPlatforms, true), eq(parameters.jobParameters.includeAllPlatforms, true)) }}:
- - (Ubuntu.1804.Arm64.Open)Ubuntu.1804.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-arm64v8
+ - (Ubuntu.1804.Arm64.Open)Ubuntu.2204.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-arm64v8
- ${{ if or(ne(parameters.jobParameters.isExtraPlatforms, true), eq(parameters.jobParameters.includeAllPlatforms, true)) }}:
- - (Debian.11.Arm64.Open)Ubuntu.1804.Armarch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-arm64v8
+ - (Debian.11.Arm64.Open)Ubuntu.2204.Armarch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-arm64v8
# Linux musl x64
- ${{ if eq(parameters.platform, 'linux_musl_x64') }}:
@@ -61,25 +61,25 @@ jobs:
- ${{ if and(eq(parameters.jobParameters.interpreter, ''), ne(parameters.jobParameters.isSingleFile, true)) }}:
- ${{ if and(eq(parameters.jobParameters.testScope, 'outerloop'), eq(parameters.jobParameters.runtimeFlavor, 'mono')) }}:
- SLES.15.Amd64.Open
- - (Centos.8.Amd64.Open)Ubuntu.1804.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream8-helix
- - (Fedora.38.Amd64.Open)Ubuntu.1804.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-38-helix
- - (Ubuntu.2204.Amd64.Open)Ubuntu.1804.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-helix-amd64
+ - (Centos.9.Amd64.Open)Ubuntu.2204.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream9-helix
+ - (Fedora.39.Amd64.Open)Ubuntu.2204.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-39-helix
+ - (Ubuntu.2204.Amd64.Open)Ubuntu.2204.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-helix-amd64
- (Debian.11.Amd64.Open)Ubuntu.2204.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-amd64
- ${{ if or(ne(parameters.jobParameters.testScope, 'outerloop'), ne(parameters.jobParameters.runtimeFlavor, 'mono')) }}:
- ${{ if or(eq(parameters.jobParameters.isExtraPlatforms, true), eq(parameters.jobParameters.includeAllPlatforms, true)) }}:
- SLES.15.Amd64.Open
- - (Fedora.38.Amd64.Open)ubuntu.1804.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-38-helix
+ - (Fedora.39.Amd64.Open)Ubuntu.2204.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-39-helix
- Ubuntu.2204.Amd64.Open
- - (Debian.11.Amd64.Open)Ubuntu.1804.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-amd64
- - (Mariner.2.0.Amd64.Open)ubuntu.1804.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-helix-amd64
- - (openSUSE.15.2.Amd64.Open)ubuntu.1804.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:opensuse-15.2-helix-amd64
+ - (Debian.11.Amd64.Open)Ubuntu.2204.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-amd64
+ - (Mariner.2.0.Amd64.Open)Ubuntu.2204.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-helix-amd64
+ - (openSUSE.15.2.Amd64.Open)Ubuntu.2204.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:opensuse-15.2-helix-amd64
- ${{ if or(ne(parameters.jobParameters.isExtraPlatforms, true), eq(parameters.jobParameters.includeAllPlatforms, true)) }}:
- - (Centos.8.Amd64.Open)Ubuntu.1804.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream8-helix
- - (Debian.11.Amd64.Open)Ubuntu.1804.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-amd64
+ - (Centos.9.Amd64.Open)Ubuntu.2204.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream9-helix
+ - (Debian.11.Amd64.Open)Ubuntu.2204.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-amd64
- Ubuntu.1804.Amd64.Open
- ${{ if or(eq(parameters.jobParameters.interpreter, 'true'), eq(parameters.jobParameters.isSingleFile, true)) }}:
# Limiting interp runs as we don't need as much coverage.
- - (Debian.11.Amd64.Open)Ubuntu.1804.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-amd64
+ - (Debian.11.Amd64.Open)Ubuntu.2204.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-amd64
# Linux s390x
- ${{ if eq(parameters.platform, 'linux_s390x') }}:
@@ -152,7 +152,6 @@ jobs:
- ${{ if notIn(parameters.jobParameters.framework, 'net48') }}:
# mono outerloop
- ${{ if and(eq(parameters.jobParameters.testScope, 'outerloop'), eq(parameters.jobParameters.runtimeFlavor, 'mono')) }}:
- - Windows.7.Amd64.Open
- Windows.11.Amd64.Client.Open
# libraries on coreclr (outerloop and innerloop), or libraries on mono innerloop
- ${{ if or(ne(parameters.jobParameters.testScope, 'outerloop'), ne(parameters.jobParameters.runtimeFlavor, 'mono')) }}:
@@ -161,7 +160,6 @@ jobs:
- Windows.Amd64.Server2022.Open
- ${{ if or(ne(parameters.jobParameters.isExtraPlatforms, true), eq(parameters.jobParameters.includeAllPlatforms, true)) }}:
- Windows.Amd64.Server2022.Open
- - Windows.7.Amd64.Open
# .NETFramework
- ${{ if eq(parameters.jobParameters.framework, 'net48') }}:
@@ -173,15 +171,15 @@ jobs:
# WASI
- ${{ if eq(parameters.platform, 'wasi_wasm') }}:
- - (Ubuntu.2004.Amd64)Ubuntu.2004.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-20.04-helix-wasm-amd64
+ - (Ubuntu.2004.Amd64)Ubuntu.2204.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-20.04-helix-wasm-amd64
# Browser WebAssembly
- ${{ if eq(parameters.platform, 'browser_wasm') }}:
- - (Ubuntu.1804.Amd64)Ubuntu.1804.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-webassembly
+ - (Ubuntu.1804.Amd64)Ubuntu.2204.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-webassembly
# Browser WebAssembly Firefox
- ${{ if eq(parameters.platform, 'browser_wasm_firefox') }}:
- - (Ubuntu.1804.Amd64)Ubuntu.1804.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-webassembly
+ - (Ubuntu.1804.Amd64)Ubuntu.2204.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-webassembly
# Browser WebAssembly windows
- ${{ if in(parameters.platform, 'browser_wasm_win', 'wasi_wasm_win') }}:
diff --git a/eng/pipelines/libraries/outerloop-mono.yml b/eng/pipelines/libraries/outerloop-mono.yml
index e15fc35f9d41c..34b1af3c71b56 100644
--- a/eng/pipelines/libraries/outerloop-mono.yml
+++ b/eng/pipelines/libraries/outerloop-mono.yml
@@ -39,11 +39,12 @@ extends:
timeoutInMinutes: 180
includeAllPlatforms: ${{ variables['isRollingBuild'] }}
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- testScope: outerloop
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ testScope: outerloop
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
@@ -60,10 +61,11 @@ extends:
timeoutInMinutes: 180
includeAllPlatforms: ${{ variables['isRollingBuild'] }}
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- scenarios:
- - normal
- testScope: outerloop
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ scenarios:
+ - normal
+ testScope: outerloop
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
diff --git a/eng/pipelines/libraries/outerloop.yml b/eng/pipelines/libraries/outerloop.yml
index 121d405fc7c7c..597f298c37a3e 100644
--- a/eng/pipelines/libraries/outerloop.yml
+++ b/eng/pipelines/libraries/outerloop.yml
@@ -45,11 +45,12 @@ extends:
timeoutInMinutes: 180
includeAllPlatforms: ${{ variables['isRollingBuild'] }}
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- testScope: outerloop
- creator: dotnet-bot
- testRunNamePrefixSuffix: CoreCLR_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ testScope: outerloop
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: CoreCLR_$(_BuildConfig)
- ${{ if eq(variables['isRollingBuild'], false) }}:
- template: /eng/pipelines/common/platform-matrix.yml
@@ -73,11 +74,12 @@ extends:
timeoutInMinutes: 180
includeAllPlatforms: ${{ variables['isRollingBuild'] }}
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- testScope: outerloop
- creator: dotnet-bot
- testRunNamePrefixSuffix: CoreCLR_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ testScope: outerloop
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: CoreCLR_$(_BuildConfig)
- ${{ if eq(variables['includeWindowsOuterloop'], true) }}:
- template: /eng/pipelines/common/platform-matrix.yml
@@ -97,8 +99,9 @@ extends:
timeoutInMinutes: 180
includeAllPlatforms: ${{ variables['isRollingBuild'] }}
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- testScope: outerloop
- creator: dotnet-bot
- extraHelixArguments: /p:BuildTargetFramework=net48
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ testScope: outerloop
+ creator: dotnet-bot
+ extraHelixArguments: /p:BuildTargetFramework=net48
diff --git a/eng/pipelines/mono/templates/build-job.yml b/eng/pipelines/mono/templates/build-job.yml
index b1ac9c1cc6554..86e0813c7c7e5 100644
--- a/eng/pipelines/mono/templates/build-job.yml
+++ b/eng/pipelines/mono/templates/build-job.yml
@@ -15,7 +15,6 @@ parameters:
dependsOn: []
monoCrossAOTTargetOS: []
dependOnEvaluatePaths: false
- pgoType: ''
### Product build
jobs:
@@ -171,30 +170,15 @@ jobs:
- script: build$(scriptExt) -subset mono+clr.hosts -c $(buildConfig) -arch $(archType) $(osOverride) -ci $(officialBuildIdArg) $(aotCrossParameter) $(llvmParameter) -pack $(OutputRidArg)
displayName: Build nupkg
- # Publish official build
- - ${{ if eq(parameters.publishToBlobFeed, 'true') }}:
- - ${{ if ne(parameters.osGroup, 'windows') }}:
- - script: $(Build.SourcesDirectory)/eng/common/build.sh --ci --restore --publish --configuration $(_BuildConfig) /p:DotNetPublishUsingPipelines=true /p:DotNetPublishToBlobFeed=true /p:DotNetPublishBlobFeedUrl=$(dotnetfeedUrl) /p:DotNetPublishBlobFeedKey=$(dotnetfeedPAT) /p:Configuration=$(_BuildConfig) /p:TargetArchitecture=$(archType) /p:TargetOS=$(osGroup) /p:OSIdentifier=$(osGroup)$(osSubgroup) /bl:"$(Build.SourcesDirectory)/artifacts/log/publish-pkgs.binlog" --projects $(Build.SourcesDirectory)/eng/empty.csproj
- displayName: Publish packages to blob feed
- env:
- # TODO: remove NUGET_PACKAGES once https://github.com/dotnet/arcade/issues/1578 is fixed
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- ${{ if eq(parameters.osGroup, 'freebsd') }}:
- # Arcade uses this SDK instead of trying to restore one.
- DotNetCoreSdkDir: /usr/local/dotnet
- - ${{ if eq(parameters.osGroup, 'windows') }}:
- # TODO: pass publish feed url and access token in from the internal pipeline
- - powershell: eng\common\build.ps1 -ci -restore -publish -configuration $(_BuildConfig) /p:DotNetPublishUsingPipelines=true /p:DotNetPublishToBlobFeed=true /p:DotNetPublishBlobFeedUrl=$(dotnetfeedUrl) /p:DotNetPublishBlobFeedKey=$(dotnetfeedPAT) /p:Configuration=$(_BuildConfig) /p:TargetArchitecture=$(archType) /p:TargetOS=$(osGroup) /p:OSIdentifier=$(osGroup)$(osSubgroup) /bl:"$(Build.SourcesDirectory)\artifacts\log\publish-pkgs.binlog" -projects $(Build.SourcesDirectory)\eng\empty.csproj
- displayName: Publish packages to blob feed
- env:
- # TODO: remove NUGET_PACKAGES once https://github.com/dotnet/arcade/issues/1578 is fixed
- NUGET_PACKAGES: $(Build.SourcesDirectory)\.packages
-
+ - ${{ if and(eq(parameters.isOfficialBuild, true), eq(parameters.osGroup, 'windows')) }}:
+ - powershell: ./eng/collect_vsinfo.ps1 -ArchiveRunName postbuild_log
+ displayName: Collect vslogs on exit
+ condition: always()
# Publish Logs
- task: PublishPipelineArtifact@1
displayName: Publish Logs
inputs:
targetPath: $(Build.SourcesDirectory)/artifacts/log
- artifactName: 'BuildLogs_Mono_${{ parameters.runtimeVariant }}_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
+ artifactName: 'BuildLogs_Attempt$(System.JobAttempt)_Mono_${{ parameters.runtimeVariant }}_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
continueOnError: true
condition: always()
diff --git a/eng/pipelines/mono/templates/generate-offsets.yml b/eng/pipelines/mono/templates/generate-offsets.yml
index ddc67f0cc0b7b..c68adfe67a9e6 100644
--- a/eng/pipelines/mono/templates/generate-offsets.yml
+++ b/eng/pipelines/mono/templates/generate-offsets.yml
@@ -87,6 +87,6 @@ jobs:
displayName: Publish Logs
inputs:
targetPath: $(Build.SourcesDirectory)/artifacts/log
- artifactName: 'BuildLogs_Mono_Offsets_$(osGroup)$(osSubGroup)'
+ artifactName: 'BuildLogs_Attempt$(System.JobAttempt)_Mono_Offsets_$(osGroup)$(osSubGroup)'
continueOnError: true
condition: always()
diff --git a/eng/pipelines/mono/templates/workloads-build.yml b/eng/pipelines/mono/templates/workloads-build.yml
index b962dcb65d178..4a50ed665e24e 100644
--- a/eng/pipelines/mono/templates/workloads-build.yml
+++ b/eng/pipelines/mono/templates/workloads-build.yml
@@ -96,7 +96,7 @@ jobs:
displayName: Publish Logs
inputs:
targetPath: $(Build.SourcesDirectory)/artifacts/log
- artifactName: 'WorkloadLogs'
+ artifactName: 'WorkloadLogs_Attempt$(System.JobAttempt)'
continueOnError: true
condition: always()
diff --git a/eng/pipelines/mono/templates/xplat-pipeline-job.yml b/eng/pipelines/mono/templates/xplat-pipeline-job.yml
index 2c369f71f30bb..1ca84d9caac1b 100644
--- a/eng/pipelines/mono/templates/xplat-pipeline-job.yml
+++ b/eng/pipelines/mono/templates/xplat-pipeline-job.yml
@@ -52,22 +52,22 @@ jobs:
variables:
- name: coreClrProductArtifactName
- value: 'CoreCLRProduct___$(osGroup)$(osSubgroup)_$(archType)_${{ parameters.liveRuntimeBuildConfig }}'
+ value: 'CoreCLRProduct__$(osGroup)$(osSubgroup)_$(archType)_${{ parameters.liveRuntimeBuildConfig }}'
- name: coreClrProductRootFolderPath
value: '$(Build.SourcesDirectory)/artifacts/bin/coreclr/$(osGroup).$(archType).$(liveRuntimeBuildConfigUpper)'
- name: buildProductArtifactName
- value: 'MonoProduct__${{ parameters.runtimeVariant }}_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
+ value: 'MonoProduct_${{ parameters.runtimeVariant }}_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
# minijit and monointerpreter do not use separate product builds.
- ${{ if or(eq(parameters.runtimeVariant, 'minijit'), eq(parameters.runtimeVariant, 'monointerpreter')) }}:
- name : buildProductArtifactName
- value : 'MonoProduct___$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
+ value : 'MonoProduct__$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
- ${{ if eq(parameters.runtimeVariant, 'llvmfullaot') }}:
- name : buildProductArtifactName
- value : 'MonoProduct__llvmaot_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
+ value : 'MonoProduct_llvmaot_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
- name: binTestsPath
value: '$(Build.SourcesDirectory)/artifacts/tests/coreclr'
diff --git a/eng/pipelines/runtime-android-grpc-client-tests.yml b/eng/pipelines/runtime-android-grpc-client-tests.yml
index 00e51f766d95c..707b1d78ebc0e 100644
--- a/eng/pipelines/runtime-android-grpc-client-tests.yml
+++ b/eng/pipelines/runtime-android-grpc-client-tests.yml
@@ -43,8 +43,9 @@ extends:
buildArgs: -s mono+libs+host+packs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true /p:RunGrpcTestsOnly=true /p:BuildGrpcServerDockerImage=true
timeoutInMinutes: 180
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- extraHelixArguments: /p:RunGrpcTestsOnly=true /p:BuildGrpcServerDockerImage=true
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ extraHelixArguments: /p:RunGrpcTestsOnly=true /p:BuildGrpcServerDockerImage=true
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
diff --git a/eng/pipelines/runtime-community.yml b/eng/pipelines/runtime-community.yml
index bab086f75c23d..a91388e244b0b 100644
--- a/eng/pipelines/runtime-community.yml
+++ b/eng/pipelines/runtime-community.yml
@@ -71,15 +71,16 @@ extends:
eq(dependencies.evaluate_paths.outputs['SetPathVars_mono_excluding_wasm.containsChange'], true),
eq(variables['isRollingBuild'], true))
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
- condition: >-
- or(
- eq(variables['librariesContainsChange'], true),
- eq(variables['monoContainsChange'], true),
- eq(variables['isRollingBuild'], true))
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ condition: >-
+ or(
+ eq(variables['librariesContainsChange'], true),
+ eq(variables['monoContainsChange'], true),
+ eq(variables['isRollingBuild'], true))
#
# Build the whole product using Mono
@@ -138,7 +139,8 @@ extends:
eq(variables['isRollingBuild'], true))
${{ if eq(variables['isRollingBuild'], true) }}:
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
diff --git a/eng/pipelines/runtime-linker-tests.yml b/eng/pipelines/runtime-linker-tests.yml
index 9db2062a953d3..1cb0f8428ef7b 100644
--- a/eng/pipelines/runtime-linker-tests.yml
+++ b/eng/pipelines/runtime-linker-tests.yml
@@ -103,7 +103,8 @@ extends:
eq(dependencies.evaluate_paths.outputs['SetPathVars_non_mono_and_wasm.containsChange'], true),
eq(variables['isRollingBuild'], true))
buildArgs: -s clr+libs+tools.illink -c $(_BuildConfig)
- extraStepsTemplate: /eng/pipelines/libraries/execute-trimming-tests-steps.yml
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/execute-trimming-tests-steps.yml
#
# Build Release config vertical for Browser-wasm
@@ -126,6 +127,7 @@ extends:
eq(dependencies.evaluate_paths.outputs['SetPathVars_wasm_specific_except_wbt_dbg.containsChange'], true),
eq(dependencies.evaluate_paths.outputs['SetPathVars_tools_illink.containsChange'], true),
eq(dependencies.evaluate_paths.outputs['DarcDependenciesChanged.Microsoft_NET_ILLink_Tasks'], true))
- extraStepsTemplate: /eng/pipelines/libraries/execute-trimming-tests-steps.yml
- extraStepsParameters:
- extraTestArgs: '/p:WasmBuildNative=false'
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/execute-trimming-tests-steps.yml
+ parameters:
+ extraTestArgs: '/p:WasmBuildNative=false'
diff --git a/eng/pipelines/runtime-official.yml b/eng/pipelines/runtime-official.yml
index 3a9fd8d89ac4b..3138f18ebd734 100644
--- a/eng/pipelines/runtime-official.yml
+++ b/eng/pipelines/runtime-official.yml
@@ -124,9 +124,10 @@ extends:
buildArgs: -s clr.nativeaotlibs+clr.nativeaotruntime+libs+packs -c $(_BuildConfig) /p:BuildNativeAOTRuntimePack=true /p:SkipLibrariesNativeRuntimePackages=true
nameSuffix: AllSubsets_NativeAOT
isOfficialBuild: ${{ variables.isOfficialBuild }}
- extraStepsTemplate: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
- extraStepsParameters:
- name: NativeAOTRuntimePacks
+ postBuildSteps:
+ - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
+ parameters:
+ name: NativeAOTRuntimePacks
#
# Build Mono runtime packs
@@ -166,9 +167,10 @@ extends:
buildArgs: -s mono+libs+host+packs -c $(_BuildConfig) /p:BuildMonoAOTCrossCompiler=false
nameSuffix: AllSubsets_Mono
isOfficialBuild: ${{ variables.isOfficialBuild }}
- extraStepsTemplate: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
- extraStepsParameters:
- name: MonoRuntimePacks
+ postBuildSteps:
+ - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
+ parameters:
+ name: MonoRuntimePacks
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
@@ -182,9 +184,10 @@ extends:
buildArgs: -s mono+libs+host+packs -c $(_BuildConfig) /p:AotHostArchitecture=x64 /p:AotHostOS=$(_hostedOS)
nameSuffix: AllSubsets_Mono
isOfficialBuild: ${{ variables.isOfficialBuild }}
- extraStepsTemplate: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
- extraStepsParameters:
- name: MonoRuntimePacks
+ postBuildSteps:
+ - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
+ parameters:
+ name: MonoRuntimePacks
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
@@ -198,9 +201,10 @@ extends:
nameSuffix: AllSubsets_Mono_multithread
isOfficialBuild: ${{ variables.isOfficialBuild }}
runtimeVariant: multithread
- extraStepsTemplate: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
- extraStepsParameters:
- name: MonoRuntimePacks
+ postBuildSteps:
+ - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
+ parameters:
+ name: MonoRuntimePacks
# Build Mono AOT offset headers once, for consumption elsewhere
#
@@ -242,9 +246,10 @@ extends:
- android
- browser
isOfficialBuild: ${{ variables.isOfficialBuild }}
- extraStepsTemplate: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
- extraStepsParameters:
- name: MonoRuntimePacks
+ postBuildSteps:
+ - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
+ parameters:
+ name: MonoRuntimePacks
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
@@ -265,9 +270,10 @@ extends:
- android
- browser
isOfficialBuild: ${{ variables.isOfficialBuild }}
- extraStepsTemplate: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
- extraStepsParameters:
- name: MonoRuntimePacks
+ postBuildSteps:
+ - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
+ parameters:
+ name: MonoRuntimePacks
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
@@ -295,9 +301,10 @@ extends:
- ios
- maccatalyst
isOfficialBuild: ${{ variables.isOfficialBuild }}
- extraStepsTemplate: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
- extraStepsParameters:
- name: MonoRuntimePacks
+ postBuildSteps:
+ - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
+ parameters:
+ name: MonoRuntimePacks
#
# Build Mono LLVM runtime packs
@@ -325,9 +332,10 @@ extends:
nameSuffix: AllSubsets_Mono_LLVMJIT
runtimeVariant: LLVMJIT
isOfficialBuild: ${{ variables.isOfficialBuild }}
- extraStepsTemplate: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
- extraStepsParameters:
- name: MonoRuntimePacks
+ postBuildSteps:
+ - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
+ parameters:
+ name: MonoRuntimePacks
#LLVMAOT
- jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: release
@@ -338,9 +346,10 @@ extends:
nameSuffix: AllSubsets_Mono_LLVMAOT
runtimeVariant: LLVMAOT
isOfficialBuild: ${{ variables.isOfficialBuild }}
- extraStepsTemplate: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
- extraStepsParameters:
- name: MonoRuntimePacks
+ postBuildSteps:
+ - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
+ parameters:
+ name: MonoRuntimePacks
#
# Build libraries using live CoreLib from CoreCLR
@@ -395,9 +404,10 @@ extends:
- SourceBuild_linux_x64
jobParameters:
nameSuffix: PortableSourceBuild
- extraStepsTemplate: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
- extraStepsParameters:
- name: SourceBuildPackages
+ postBuildSteps:
+ - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
+ parameters:
+ name: SourceBuildPackages
timeoutInMinutes: 95
#
@@ -425,12 +435,13 @@ extends:
- windows_arm64
#
- # Build PGO CoreCLR release
+ # Build PGO Instrumented CoreCLR Release
#
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
- jobTemplate: /eng/pipelines/coreclr/templates/build-job.yml
- buildConfig: release
+ jobTemplate: /eng/pipelines/common/global-build-job.yml
+ buildConfig: Release
+ helixQueueGroup: ci
platforms:
- windows_x64
- windows_x86
@@ -438,29 +449,13 @@ extends:
- windows_arm64
- linux_arm64
jobParameters:
+ buildArgs: -s clr.native+clr.corelib+clr.tools+clr.nativecorelib+libs+host+packs -c $(_BuildConfig) -pgoinstrument
isOfficialBuild: ${{ variables.isOfficialBuild }}
- signBinaries: false
- testGroup: innerloop
- pgoType: 'PGO'
-
- #
- # PGO Build
- #
- - template: /eng/pipelines/common/platform-matrix.yml
- parameters:
- jobTemplate: /eng/pipelines/installer/jobs/build-job.yml
- buildConfig: Release
- jobParameters:
- isOfficialBuild: ${{ variables.isOfficialBuild }}
- liveRuntimeBuildConfig: release
- liveLibrariesBuildConfig: Release
- pgoType: 'PGO'
- platforms:
- - windows_x64
- - windows_x86
- - linux_x64
- - windows_arm64
- - linux_arm64
+ nameSuffix: PGO
+ extraStepsTemplate: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
+ extraStepsParameters:
+ name: PGO
+ timeoutInMinutes: 95
#
# Build Workloads
@@ -490,9 +485,9 @@ extends:
- Build_tvossimulator_arm64_release_AllSubsets_Mono
- Build_tvossimulator_x64_release_AllSubsets_Mono
- Build_windows_x64_release_CrossAOT_Mono
- - installer__coreclr__windows_x64_Release_
- - installer__coreclr__windows_x86_Release_
- - installer__coreclr__windows_arm64_Release_
+ - installer_coreclr__windows_x64_Release_
+ - installer_coreclr__windows_x86_Release_
+ - installer_coreclr__windows_arm64_Release_
- ${{ if eq(variables.isOfficialBuild, true) }}:
- template: /eng/pipelines/official/stages/publish.yml
diff --git a/eng/pipelines/runtime-sanitized.yml b/eng/pipelines/runtime-sanitized.yml
index 3bc49fec69083..5db421762ed0d 100644
--- a/eng/pipelines/runtime-sanitized.yml
+++ b/eng/pipelines/runtime-sanitized.yml
@@ -38,13 +38,14 @@ extends:
buildArgs: -s clr+libs -c $(_BuildConfig) $(_nativeSanitizersArg)
timeoutInMinutes: 300
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: CoreCLR_$(_BuildConfig)
- scenarios:
- - normal
- - no_tiered_compilation
+ postBuildSteps:
+ - template: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: CoreCLR_$(_BuildConfig)
+ scenarios:
+ - normal
+ - no_tiered_compilation
extraVariablesTemplates:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
parameters:
@@ -72,12 +73,13 @@ extends:
buildArgs: -s clr+libs+libs.tests -c $(_BuildConfig) -rc Checked $(_nativeSanitizersArg) /p:ArchiveTests=true
timeoutInMinutes: 180
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Libraries_$(_BuildConfig)
- scenarios:
- - normal
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Libraries_$(_BuildConfig)
+ scenarios:
+ - normal
#
# NativeAOT release build and smoke tests with AddressSanitizer
@@ -98,11 +100,12 @@ extends:
timeoutInMinutes: 120
nameSuffix: NativeAOT
buildArgs: -s clr.aot+host.native+libs -rc $(_BuildConfig) -lc Release -hc Release $(_nativeSanitizersArg)
- extraStepsTemplate: /eng/pipelines/coreclr/nativeaot-post-build-steps.yml
- extraStepsParameters:
- creator: dotnet-bot
- testBuildArgs: nativeaot tree nativeaot
- liveLibrariesBuildConfig: Release
+ postBuildSteps:
+ - template: /eng/pipelines/coreclr/nativeaot-post-build-steps.yml
+ parameters:
+ creator: dotnet-bot
+ testBuildArgs: nativeaot tree nativeaot
+ liveLibrariesBuildConfig: Release
extraVariablesTemplates:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
parameters:
diff --git a/eng/pipelines/runtime.yml b/eng/pipelines/runtime.yml
index 3aa0b6504819a..c83a76993e60d 100644
--- a/eng/pipelines/runtime.yml
+++ b/eng/pipelines/runtime.yml
@@ -70,7 +70,6 @@ extends:
jobTemplate: /eng/pipelines/coreclr/templates/build-job.yml
buildConfig: checked
platforms:
- - linux_x86
- linux_x64
- linux_arm
- linux_arm64
@@ -79,7 +78,6 @@ extends:
- linux_musl_arm64
- linux_musl_x64
- osx_arm64
- - tizen_armel
- windows_x86
- windows_x64
- windows_arm64
@@ -105,9 +103,10 @@ extends:
testGroup: innerloop
nameSuffix: Native_GCC
buildArgs: -s clr.native+libs.native+mono+host.native -c $(_BuildConfig) -gcc
- extraStepsTemplate: /eng/pipelines/common/templates/runtimes/build-runtime-tests.yml
- extraStepsParameters:
- testBuildArgs: skipmanaged skipgeneratelayout skiprestorepackages -gcc
+ postBuildSteps:
+ - template: /eng/pipelines/common/templates/runtimes/build-runtime-tests.yml
+ parameters:
+ testBuildArgs: skipmanaged skipgeneratelayout skiprestorepackages -gcc
condition: >-
or(
eq(dependencies.evaluate_paths.outputs['SetPathVars_coreclr.containsChange'], true),
@@ -188,6 +187,48 @@ extends:
eq(dependencies.evaluate_paths.outputs['SetPathVars_coreclr_jit.containsChange'], true),
eq(variables['isRollingBuild'], true)))
+ #
+ # Build CoreCLR with no R2R
+ #
+ - template: /eng/pipelines/common/platform-matrix.yml
+ parameters:
+ jobTemplate: /eng/pipelines/common/global-build-job.yml
+ helixQueuesTemplate: /eng/pipelines/libraries/helix-queues-setup.yml
+ buildConfig: checked
+ runtimeFlavor: coreclr
+ platforms:
+ - linux_x86
+ jobParameters:
+ testScope: innerloop
+ nameSuffix: CoreCLR_NoR2R
+ buildArgs: -s clr.runtime+clr.jit+clr.iltools+clr.spmi+clr.corelib -c $(_BuildConfig)
+ timeoutInMinutes: 120
+ condition: >-
+ or(
+ eq(dependencies.evaluate_paths.outputs['SetPathVars_coreclr.containsChange'], true),
+ eq(variables['isRollingBuild'], true))
+
+ #
+ # Build CoreCLR as a non-portable build
+ #
+ - template: /eng/pipelines/common/platform-matrix.yml
+ parameters:
+ jobTemplate: /eng/pipelines/common/global-build-job.yml
+ helixQueuesTemplate: /eng/pipelines/libraries/helix-queues-setup.yml
+ buildConfig: checked
+ runtimeFlavor: coreclr
+ platforms:
+ - tizen_armel
+ jobParameters:
+ testScope: innerloop
+ nameSuffix: CoreCLR_NonPortable
+ buildArgs: -s clr.native+clr.tools+clr.corelib+clr.nativecorelib+clr.aot+clr.packages -c $(_BuildConfig) /p:PortableBuild=false
+ timeoutInMinutes: 120
+ condition: >-
+ or(
+ eq(dependencies.evaluate_paths.outputs['SetPathVars_coreclr.containsChange'], true),
+ eq(variables['isRollingBuild'], true))
+
#
# CoreCLR NativeAOT debug build and smoke tests
# Only when CoreCLR is changed
@@ -209,12 +250,13 @@ extends:
timeoutInMinutes: 120
nameSuffix: NativeAOT
buildArgs: -s clr.aot+host.native+libs -rc $(_BuildConfig) -lc Release -hc Release
- extraStepsTemplate: /eng/pipelines/coreclr/nativeaot-post-build-steps.yml
- extraStepsParameters:
- creator: dotnet-bot
- testBuildArgs: nativeaot tree nativeaot
- liveLibrariesBuildConfig: Release
- testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/coreclr/nativeaot-post-build-steps.yml
+ parameters:
+ creator: dotnet-bot
+ testBuildArgs: nativeaot tree nativeaot
+ liveLibrariesBuildConfig: Release
+ testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
extraVariablesTemplates:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
parameters:
@@ -246,12 +288,13 @@ extends:
timeoutInMinutes: 180
nameSuffix: NativeAOT
buildArgs: -s clr.aot+host.native+libs -rc $(_BuildConfig) -lc Release -hc Release
- extraStepsTemplate: /eng/pipelines/coreclr/nativeaot-post-build-steps.yml
- extraStepsParameters:
- creator: dotnet-bot
- testBuildArgs: 'nativeaot tree ";nativeaot;Loader;Interop;tracing;" /p:BuildNativeAotFrameworkObjects=true'
- liveLibrariesBuildConfig: Release
- testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/coreclr/nativeaot-post-build-steps.yml
+ parameters:
+ creator: dotnet-bot
+ testBuildArgs: 'nativeaot tree ";nativeaot;Loader;Interop;tracing;" /p:BuildNativeAotFrameworkObjects=true'
+ liveLibrariesBuildConfig: Release
+ testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
extraVariablesTemplates:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
parameters:
@@ -289,12 +332,13 @@ extends:
timeoutInMinutes: 120
nameSuffix: NativeAOT
buildArgs: -s clr.aot+host.native+libs+tools.illink -c $(_BuildConfig) -rc $(_BuildConfig) -lc Release -hc Release
- extraStepsTemplate: /eng/pipelines/coreclr/nativeaot-post-build-steps.yml
- extraStepsParameters:
- creator: dotnet-bot
- testBuildArgs: 'nativeaot tree ";nativeaot;tracing/eventpipe/providervalidation;"'
- liveLibrariesBuildConfig: Release
- testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/coreclr/nativeaot-post-build-steps.yml
+ parameters:
+ creator: dotnet-bot
+ testBuildArgs: 'nativeaot tree ";nativeaot;tracing/eventpipe/providervalidation;"'
+ liveLibrariesBuildConfig: Release
+ testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
extraVariablesTemplates:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
parameters:
@@ -326,10 +370,11 @@ extends:
buildArgs: -s clr.aot+host.native+libs+libs.tests -c $(_BuildConfig) /p:TestNativeAot=true /p:RunSmokeTestsOnly=true /p:ArchiveTests=true
timeoutInMinutes: 240 # Doesn't actually take long, but we've seen the ARM64 Helix queue often get backlogged for 2+ hours
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
condition: >-
or(
eq(dependencies.evaluate_paths.outputs['SetPathVars_libraries.containsChange'], true),
@@ -587,15 +632,16 @@ extends:
eq(dependencies.evaluate_paths.outputs['SetPathVars_installer.containsChange'], true),
eq(variables['isRollingBuild'], true))
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
- condition: >-
- or(
- eq(variables['librariesContainsChange'], true),
- eq(variables['monoContainsChange'], true),
- eq(variables['isRollingBuild'], true))
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ condition: >-
+ or(
+ eq(variables['librariesContainsChange'], true),
+ eq(variables['monoContainsChange'], true),
+ eq(variables['isRollingBuild'], true))
#
# iOS/tvOS devices - Full AOT + AggressiveTrimming to reduce size
@@ -628,16 +674,17 @@ extends:
eq(dependencies.evaluate_paths.outputs['SetPathVars_installer.containsChange'], true),
eq(variables['isRollingBuild'], true))
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
- extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true
- condition: >-
- or(
- eq(variables['librariesContainsChange'], true),
- eq(variables['monoContainsChange'], true),
- eq(variables['isRollingBuild'], true))
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true
+ condition: >-
+ or(
+ eq(variables['librariesContainsChange'], true),
+ eq(variables['monoContainsChange'], true),
+ eq(variables['isRollingBuild'], true))
#
# iOS/tvOS devices
@@ -670,16 +717,17 @@ extends:
eq(dependencies.evaluate_paths.outputs['SetPathVars_installer.containsChange'], true),
eq(variables['isRollingBuild'], true))
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
- extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true
- condition: >-
- or(
- eq(variables['librariesContainsChange'], true),
- eq(variables['coreclrContainsChange'], true),
- eq(variables['isRollingBuild'], true))
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: NativeAOT_$(_BuildConfig)
+ extraHelixArguments: /p:NeedsToBuildAppsOnHelix=true
+ condition: >-
+ or(
+ eq(variables['librariesContainsChange'], true),
+ eq(variables['coreclrContainsChange'], true),
+ eq(variables['isRollingBuild'], true))
#
# MacCatalyst interp - requires AOT Compilation and Interp flags
@@ -713,15 +761,16 @@ extends:
eq(dependencies.evaluate_paths.outputs['SetPathVars_installer.containsChange'], true),
eq(variables['isRollingBuild'], true))
# extra steps, run tests
- extraStepsTemplate: /eng/pipelines/libraries/helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)
- condition: >-
- or(
- eq(variables['librariesContainsChange'], true),
- eq(variables['monoContainsChange'], true),
- eq(variables['isRollingBuild'], true))
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_$(_BuildConfig)
+ condition: >-
+ or(
+ eq(variables['librariesContainsChange'], true),
+ eq(variables['monoContainsChange'], true),
+ eq(variables['isRollingBuild'], true))
#
# Build Mono and Installer on LLVMJIT mode
@@ -1033,32 +1082,45 @@ extends:
condition: >-
eq(dependencies.evaluate_paths.outputs['SetPathVars_coreclr.containsChange'], true)
+ #
+ # Build and test libraries for .NET Framework
+ #
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
- jobTemplate: /eng/pipelines/libraries/build-job.yml
+ jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: Release
platforms:
- windows_x86
helixQueuesTemplate: /eng/pipelines/libraries/helix-queues-setup.yml
jobParameters:
framework: net48
- runTests: true
- testScope: innerloop
+ buildArgs: -s tools+libs+libs.tests -framework net48 -c $(_BuildConfig) -testscope innerloop /p:ArchiveTests=true
+ nameSuffix: Libraries_NET48
+ timeoutInMinutes: 150
+ postBuildSteps:
+ - template: /eng/pipelines/libraries/helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: NET48_$(_BuildConfig)
+ extraHelixArguments: /p:BuildTargetFramework=net48
condition: >-
or(
eq(dependencies.evaluate_paths.outputs['SetPathVars_libraries.containsChange'], true),
eq(variables['isRollingBuild'], true))
+ #
+ # Build and test libraries AllConfigurations
+ #
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
- jobTemplate: /eng/pipelines/libraries/build-job.yml
+ jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: ${{ variables.debugOnPrReleaseOnRolling }}
platforms:
- windows_x64
jobParameters:
- framework: allConfigurations
- runTests: true
- useHelix: false
+ buildArgs: -test -s tools+libs+libs.tests -allConfigurations -c $(_BuildConfig) /p:TestAssemblies=false /p:TestPackages=true
+ nameSuffix: Libraries_AllConfigurations
+ timeoutInMinutes: 150
condition: >-
or(
eq(dependencies.evaluate_paths.outputs['SetPathVars_libraries.containsChange'], true),
@@ -1254,10 +1316,11 @@ extends:
eq(dependencies.evaluate_paths.outputs['SetPathVars_runtimetests.containsChange'], true),
eq(variables['isRollingBuild'], true))
- extraStepsTemplate: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_Release
+ postBuildSteps:
+ - template: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_Release
extraVariablesTemplates:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
@@ -1289,10 +1352,11 @@ extends:
eq(dependencies.evaluate_paths.outputs['SetPathVars_mono_excluding_wasm.containsChange'], true),
eq(dependencies.evaluate_paths.outputs['SetPathVars_runtimetests.containsChange'], true),
eq(variables['isRollingBuild'], true))
- extraStepsTemplate: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_Release
+ postBuildSteps:
+ - template: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
+ parameters:
+ creator: dotnet-bot
+ testRunNamePrefixSuffix: Mono_Release
extraVariablesTemplates:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
#
@@ -1326,11 +1390,12 @@ extends:
eq(dependencies.evaluate_paths.outputs['SetPathVars_mono_excluding_wasm.containsChange'], true),
eq(dependencies.evaluate_paths.outputs['SetPathVars_runtimetests.containsChange'], true),
eq(variables['isRollingBuild'], true))
- extraStepsTemplate: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
- extraStepsParameters:
- creator: dotnet-bot
- llvmAotStepContainer: linux_x64_llvmaot
- testRunNamePrefixSuffix: Mono_Release
+ postBuildSteps:
+ - template: /eng/pipelines/common/templates/runtimes/build-runtime-tests-and-send-to-helix.yml
+ parameters:
+ creator: dotnet-bot
+ llvmAotStepContainer: linux_x64_llvmaot
+ testRunNamePrefixSuffix: Mono_Release
extraVariablesTemplates:
- template: /eng/pipelines/common/templates/runtimes/test-variables.yml
@@ -1525,8 +1590,6 @@ extends:
- SourceBuild_centos8_x64
jobParameters:
nameSuffix: centos8SourceBuild
- extraStepsParameters:
- name: SourceBuildPackages
timeoutInMinutes: 95
condition: eq(variables['isRollingBuild'], true)
@@ -1539,7 +1602,5 @@ extends:
- SourceBuild_banana24_x64
jobParameters:
nameSuffix: banana24SourceBuild
- extraStepsParameters:
- name: SourceBuildPackages
timeoutInMinutes: 95
condition: eq(variables['isRollingBuild'], true)
diff --git a/eng/pipelines/runtimelab.yml b/eng/pipelines/runtimelab.yml
index a5c4e03343311..7c34126757d73 100644
--- a/eng/pipelines/runtimelab.yml
+++ b/eng/pipelines/runtimelab.yml
@@ -65,9 +65,10 @@ extends:
timeoutInMinutes: 100
testGroup: innerloop
buildArgs: -s clr+libs+host+packs -c debug -runtimeConfiguration Checked
- extraStepsTemplate: /eng/pipelines/runtimelab/runtimelab-post-build-steps.yml
- extraStepsParameters:
- uploadRuntimeTests: true
+ postBuildSteps:
+ - template: /eng/pipelines/runtimelab/runtimelab-post-build-steps.yml
+ parameters:
+ uploadRuntimeTests: true
#
# Build with Release config and Release runtimeConfiguration
@@ -83,10 +84,11 @@ extends:
timeoutInMinutes: 100
isOfficialBuild: ${{ variables.isOfficialBuild }}
testGroup: innerloop
- extraStepsTemplate: /eng/pipelines/runtimelab/runtimelab-post-build-steps.yml
- extraStepsParameters:
- uploadLibrariesTests: ${{ eq(variables.isOfficialBuild, false) }}
- uploadIntermediateArtifacts: false
+ postBuildSteps:
+ - template: /eng/pipelines/runtimelab/runtimelab-post-build-steps.yml
+ parameters:
+ uploadLibrariesTests: ${{ eq(variables.isOfficialBuild, false) }}
+ uploadIntermediateArtifacts: false
${{ if eq(variables.isOfficialBuild, false) }}:
buildArgs: -s clr+libs+libs.tests+host+packs -c $(_BuildConfig) /p:ArchiveTests=true
${{ if eq(variables.isOfficialBuild, true) }}:
@@ -107,11 +109,12 @@ extends:
nameSuffix: AllConfigurations
buildArgs: -s libs -c $(_BuildConfig) -allConfigurations
${{ if eq(variables.isOfficialBuild, true) }}:
- extraStepsTemplate: /eng/pipelines/runtimelab/runtimelab-post-build-steps.yml
- extraStepsParameters:
- uploadIntermediateArtifacts: true
- isOfficialBuild: true
- librariesBinArtifactName: libraries_bin_official_allconfigurations
+ postBuildSteps:
+ - template: /eng/pipelines/runtimelab/runtimelab-post-build-steps.yml
+ parameters:
+ uploadIntermediateArtifacts: true
+ isOfficialBuild: true
+ librariesBinArtifactName: libraries_bin_official_allconfigurations
# Installer official builds need to build installers and need the libraries all configurations build
- ${{ if eq(variables.isOfficialBuild, true) }}:
diff --git a/eng/pipelines/runtimelab/runtimelab-post-build-steps.yml b/eng/pipelines/runtimelab/runtimelab-post-build-steps.yml
index a6187638cd346..97c007ba4b307 100644
--- a/eng/pipelines/runtimelab/runtimelab-post-build-steps.yml
+++ b/eng/pipelines/runtimelab/runtimelab-post-build-steps.yml
@@ -5,7 +5,6 @@ parameters:
osSubgroup: ''
nameSuffix: ''
platform: ''
- pgoType: ''
runtimeVariant: ''
librariesBinArtifactName: ''
isOfficialBuild: false
@@ -32,7 +31,7 @@ steps:
tarCompression: $(tarCompression)
includeRootFolder: false
archiveExtension: $(archiveExtension)
- artifactName: CoreCLRProduct_${{ parameters.pgoType }}_${{ parameters.runtimeVariant }}_${{ parameters.osGroup }}${{ parameters.osSubgroup }}_${{ parameters.archType }}_${{ parameters.buildConfig }}
+ artifactName: CoreCLRProduct_${{ parameters.runtimeVariant }}_${{ parameters.osGroup }}${{ parameters.osSubgroup }}_${{ parameters.archType }}_${{ parameters.buildConfig }}
displayName: 'CoreCLR product build'
# Zip Test Build
diff --git a/eng/testing/performance/performance-setup.ps1 b/eng/testing/performance/performance-setup.ps1
index c18445bff8aae..2ce32b70c59b5 100644
--- a/eng/testing/performance/performance-setup.ps1
+++ b/eng/testing/performance/performance-setup.ps1
@@ -14,7 +14,7 @@ Param(
[string] $Kind="micro",
[switch] $LLVM,
[switch] $MonoInterpreter,
- [switch] $MonoAOT,
+ [switch] $MonoAOT,
[switch] $Internal,
[switch] $Compare,
[string] $MonoDotnet="",
@@ -47,14 +47,14 @@ $Queue = ""
if ($Internal) {
switch ($LogicalMachine) {
- "perftiger" { $Queue = "Windows.10.Amd64.19H1.Tiger.Perf" }
- "perftiger_crossgen" { $Queue = "Windows.10.Amd64.19H1.Tiger.Perf" }
- "perfowl" { $Queue = "Windows.10.Amd64.20H2.Owl.Perf" }
- "perfsurf" { $Queue = "Windows.10.Arm64.Perf.Surf" }
+ "perftiger" { $Queue = "Windows.11.Amd64.Tiger.Perf" }
+ "perftiger_crossgen" { $Queue = "Windows.11.Amd64.Tiger.Perf" }
+ "perfowl" { $Queue = "Windows.11.Amd64.Owl.Perf" }
+ "perfsurf" { $Queue = "Windows.11.Arm64.Surf.Perf" }
"perfpixel4a" { $Queue = "Windows.11.Amd64.Pixel.Perf" }
"perfampere" { $Queue = "Windows.Server.Arm64.Perf" }
"cloudvm" { $Queue = "Windows.10.Amd64" }
- Default { $Queue = "Windows.10.Amd64.19H1.Tiger.Perf" }
+ Default { $Queue = "Windows.11.Amd64.Tiger.Perf" }
}
$PerfLabArguments = "--upload-to-perflab-container"
$ExtraBenchmarkDotNetArguments = ""
@@ -124,7 +124,7 @@ if ($UseLocalCommitTime) {
if ($RunFromPerformanceRepo) {
$SetupArguments = "--perf-hash $CommitSha $CommonSetupArguments"
-
+
robocopy $SourceDirectory $PerformanceDirectory /E /XD $PayloadDirectory $SourceDirectory\artifacts $SourceDirectory\.git
}
else {
diff --git a/eng/testing/performance/performance-setup.sh b/eng/testing/performance/performance-setup.sh
index 4853f0e6fb3bd..eb49d3ea13d05 100755
--- a/eng/testing/performance/performance-setup.sh
+++ b/eng/testing/performance/performance-setup.sh
@@ -264,7 +264,7 @@ benchmark_directory=$payload_directory/BenchmarkDotNet
workitem_directory=$source_directory/workitem
extra_benchmark_dotnet_arguments="--iterationCount 1 --warmupCount 0 --invocationCount 1 --unrollFactor 1 --strategy ColdStart --stopOnFirstError true"
perflab_arguments=
-queue=Ubuntu.1804.Amd64.Open
+queue=Ubuntu.2204.Amd64.Open
creator=$BUILD_DEFINITIONNAME
helix_source_prefix="pr"
@@ -277,14 +277,16 @@ if [[ "$internal" == true ]]; then
if [[ "$logical_machine" == "perfiphone12mini" ]]; then
queue=OSX.13.Amd64.Iphone.Perf
elif [[ "$logical_machine" == "perfampere" ]]; then
- queue=Ubuntu.2004.Arm64.Perf
+ queue=Ubuntu.2204.Arm64.Perf
+ elif [[ "$logical_machine" == "perfviper" ]]; then
+ queue=Ubuntu.2204.Amd64.Viper.Perf
elif [[ "$logical_machine" == "cloudvm" ]]; then
- queue=Ubuntu.1804.Amd64
+ queue=Ubuntu.2204.Amd64
elif [[ "$architecture" == "arm64" ]]; then
queue=Ubuntu.1804.Arm64.Perf
else
if [[ "$logical_machine" == "perfowl" ]]; then
- queue=Ubuntu.1804.Amd64.Owl.Perf
+ queue=Ubuntu.2204.Amd64.Owl.Perf
elif [[ "$logical_machine" == "perftiger_crossgen" ]]; then
queue=Ubuntu.1804.Amd64.Tiger.Perf
else
@@ -299,7 +301,7 @@ else
if [[ "$architecture" == "arm64" ]]; then
queue=ubuntu.1804.armarch.open
else
- queue=Ubuntu.1804.Amd64.Open
+ queue=Ubuntu.2204.Amd64.Open
fi
if [[ "$alpine" == "true" ]]; then
diff --git a/src/coreclr/debug/createdump/crashinfo.cpp b/src/coreclr/debug/createdump/crashinfo.cpp
index 996f3a81935d0..d1d1b0ea0218b 100644
--- a/src/coreclr/debug/createdump/crashinfo.cpp
+++ b/src/coreclr/debug/createdump/crashinfo.cpp
@@ -803,7 +803,7 @@ CrashInfo::PageMappedToPhysicalMemory(uint64_t start)
}
uint64_t pagemapOffset = (start / PAGE_SIZE) * sizeof(uint64_t);
- uint64_t seekResult = lseek64(m_fdPagemap, (off64_t) pagemapOffset, SEEK_SET);
+ uint64_t seekResult = lseek(m_fdPagemap, (off_t) pagemapOffset, SEEK_SET);
if (seekResult != pagemapOffset)
{
int seekErrno = errno;
diff --git a/src/coreclr/debug/createdump/crashinfounix.cpp b/src/coreclr/debug/createdump/crashinfounix.cpp
index 24b975e3d6555..2f4ea079de3b5 100644
--- a/src/coreclr/debug/createdump/crashinfounix.cpp
+++ b/src/coreclr/debug/createdump/crashinfounix.cpp
@@ -516,7 +516,7 @@ CrashInfo::ReadProcessMemory(void* address, void* buffer, size_t size, size_t* r
// performance optimization.
m_canUseProcVmReadSyscall = false;
assert(m_fdMem != -1);
- *read = pread64(m_fdMem, buffer, size, (off64_t)address);
+ *read = pread(m_fdMem, buffer, size, (off_t)address);
}
if (*read == (size_t)-1)
diff --git a/src/coreclr/jit/optcse.cpp b/src/coreclr/jit/optcse.cpp
index 4e7fc81df64bc..505352250f4ec 100644
--- a/src/coreclr/jit/optcse.cpp
+++ b/src/coreclr/jit/optcse.cpp
@@ -3066,8 +3066,11 @@ class CSE_Heuristic
assert(vnStore->IsVNCompareCheckedBoundArith(oldCmpVN));
vnStore->GetCompareCheckedBoundArithInfo(oldCmpVN, &info);
- newCmpArgVN = vnStore->VNForFunc(vnStore->TypeOfVN(info.arrOp), (VNFunc)info.arrOper,
- info.arrOp, theConservativeVN);
+ ValueNum arrOp1 = info.arrOpLHS ? info.arrOp : theConservativeVN;
+ ValueNum arrOp2 = info.arrOpLHS ? theConservativeVN : info.arrOp;
+
+ newCmpArgVN =
+ vnStore->VNForFunc(vnStore->TypeOfVN(info.arrOp), (VNFunc)info.arrOper, arrOp1, arrOp2);
}
ValueNum newCmpVN = vnStore->VNForFunc(vnStore->TypeOfVN(oldCmpVN), (VNFunc)info.cmpOper,
info.cmpOp, newCmpArgVN);
diff --git a/src/coreclr/jit/utils.cpp b/src/coreclr/jit/utils.cpp
index 4c9fe6479eca4..2e1c0a52a3d81 100644
--- a/src/coreclr/jit/utils.cpp
+++ b/src/coreclr/jit/utils.cpp
@@ -3192,11 +3192,6 @@ uint32_t BitOperations::Log2(uint64_t value)
// Return Value:
// The population count (number of bits set) of value
//
-#if defined(_MSC_VER)
-// Disable optimizations for PopCount to avoid the compiler from generating intrinsics
-// not supported on all platforms.
-#pragma optimize("", off)
-#endif // _MSC_VER
uint32_t BitOperations::PopCount(uint32_t value)
{
#if defined(_MSC_VER)
@@ -3249,9 +3244,6 @@ uint32_t BitOperations::PopCount(uint64_t value)
return static_cast(result);
#endif
}
-#if defined(_MSC_VER)
-#pragma optimize("", on)
-#endif // _MSC_VER
//------------------------------------------------------------------------
// BitOperations::ReverseBits: Reverses the bits in an integer value
diff --git a/src/coreclr/jit/valuenum.cpp b/src/coreclr/jit/valuenum.cpp
index fa60633afbc23..fbc80330eb92f 100644
--- a/src/coreclr/jit/valuenum.cpp
+++ b/src/coreclr/jit/valuenum.cpp
@@ -6576,15 +6576,17 @@ void ValueNumStore::GetCheckedBoundArithInfo(ValueNum vn, CompareCheckedBoundAri
bool isOp1CheckedBound = IsVNCheckedBound(funcArith.m_args[1]);
if (isOp1CheckedBound)
{
- info->arrOper = funcArith.m_func;
- info->arrOp = funcArith.m_args[0];
- info->vnBound = funcArith.m_args[1];
+ info->arrOper = funcArith.m_func;
+ info->arrOp = funcArith.m_args[0];
+ info->vnBound = funcArith.m_args[1];
+ info->arrOpLHS = true;
}
else
{
- info->arrOper = funcArith.m_func;
- info->arrOp = funcArith.m_args[1];
- info->vnBound = funcArith.m_args[0];
+ info->arrOper = funcArith.m_func;
+ info->arrOp = funcArith.m_args[1];
+ info->vnBound = funcArith.m_args[0];
+ info->arrOpLHS = false;
}
}
diff --git a/src/coreclr/jit/valuenum.h b/src/coreclr/jit/valuenum.h
index 04fed7bfbc1f6..af6ba52901483 100644
--- a/src/coreclr/jit/valuenum.h
+++ b/src/coreclr/jit/valuenum.h
@@ -920,9 +920,10 @@ class ValueNumStore
ValueNum vnBound;
unsigned arrOper;
ValueNum arrOp;
+ bool arrOpLHS; // arrOp is on the left side of cmpOp expression
unsigned cmpOper;
ValueNum cmpOp;
- CompareCheckedBoundArithInfo() : vnBound(NoVN), arrOper(GT_NONE), arrOp(NoVN), cmpOper(GT_NONE), cmpOp(NoVN)
+ CompareCheckedBoundArithInfo() : vnBound(NoVN), arrOper(GT_NONE), arrOp(NoVN), arrOpLHS(false), cmpOper(GT_NONE), cmpOp(NoVN)
{
}
#ifdef DEBUG
diff --git a/src/coreclr/scripts/paltests.proj b/src/coreclr/scripts/paltests.proj
new file mode 100644
index 0000000000000..167208f4ecb08
--- /dev/null
+++ b/src/coreclr/scripts/paltests.proj
@@ -0,0 +1,44 @@
+
+
+ true
+ $(_Creator)
+ $(_HelixAccessToken)
+ $(_HelixBuild)
+ $(_HelixSource)
+ $(_HelixTargetQueues)
+ $(_HelixType)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @(PalTestArchive)
+ ./runpaltestshelix.sh
+ 0:10
+
+
+
+
diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp
index 1cc6c37e09c22..67e127bf91ea6 100644
--- a/src/coreclr/vm/jitinterface.cpp
+++ b/src/coreclr/vm/jitinterface.cpp
@@ -11881,23 +11881,6 @@ HRESULT CEEJitInfo::allocPgoInstrumentationBySchema(
JIT_TO_EE_TRANSITION();
- // We need to know the code size. Typically we can get the code size
- // from m_ILHeader. For dynamic methods, m_ILHeader will be NULL, so
- // for that case we need to use DynamicResolver to get the code size.
-
- unsigned codeSize = 0;
- if (m_pMethodBeingCompiled->IsDynamicMethod())
- {
- unsigned stackSize, ehSize;
- CorInfoOptions options;
- DynamicResolver * pResolver = m_pMethodBeingCompiled->AsDynamicMethodDesc()->GetResolver();
- pResolver->GetCodeInfo(&codeSize, &stackSize, &options, &ehSize);
- }
- else
- {
- codeSize = m_ILHeader->GetCodeSize();
- }
-
#ifdef FEATURE_PGO
hr = PgoManager::allocPgoInstrumentationBySchema(m_pMethodBeingCompiled, pSchema, countSchemaItems, pInstrumentationData);
#else
diff --git a/src/installer/tests/HostActivation.Tests/DependencyResolution/RidAssetResolution.cs b/src/installer/tests/HostActivation.Tests/DependencyResolution/RidAssetResolution.cs
index cb924267ca254..afbf30a0ba4fa 100644
--- a/src/installer/tests/HostActivation.Tests/DependencyResolution/RidAssetResolution.cs
+++ b/src/installer/tests/HostActivation.Tests/DependencyResolution/RidAssetResolution.cs
@@ -29,7 +29,23 @@ public class TestSetup
// Expected behaviour of the test based on above settings
public bool ShouldUseRidGraph => UseRidGraph == true;
- public bool ShouldUseFallbackRid => ShouldUseRidGraph && (Rid == UnknownRid || !HasRidGraph);
+
+ public bool? ShouldUseFallbackRid
+ {
+ get
+ {
+ if (!ShouldUseRidGraph)
+ return false;
+
+ if (Rid == UnknownRid || !HasRidGraph)
+ return true;
+
+ // We use the product RID graph for testing (for cases with a RID graph). If the test is running
+ // on a platform that isn't in that RID graph, we may end up with the fallback even when the RID
+ // graph is used and RID is not unknown. Value of null indicates this state.
+ return null;
+ }
+ }
public override string ToString() => $"""
{nameof(Rid)}: {(Rid ?? "")}
@@ -623,18 +639,20 @@ protected override void RunTest(
UpdateAppConfigForTest(app, setup, copyOnUpdate: false);
- dotnet.Exec(app.AppDll)
+ var result = dotnet.Exec(app.AppDll)
.EnableTracingAndCaptureOutputs()
.RuntimeId(setup.Rid)
- .Execute()
- .Should().Pass()
+ .Execute();
+ result.Should().Pass()
.And.HaveResolvedAssembly(expected.IncludedAssemblyPaths, app)
.And.NotHaveResolvedAssembly(expected.ExcludedAssemblyPaths, app)
.And.HaveResolvedNativeLibraryPath(expected.IncludedNativeLibraryPaths, app)
.And.NotHaveResolvedNativeLibraryPath(expected.ExcludedNativeLibraryPaths, app)
.And.HaveReadRidGraph(setup.ShouldUseRidGraph)
- .And.HaveUsedFallbackRid(setup.ShouldUseFallbackRid)
.And.HaveUsedFrameworkProbe(dotnet.GreatestVersionSharedFxPath, level: 1);
+
+ if (setup.ShouldUseFallbackRid.HasValue)
+ result.Should().HaveUsedFallbackRid(setup.ShouldUseFallbackRid.Value);
}
}
}
@@ -674,17 +692,19 @@ protected override void RunTest(
TestApp app = UpdateAppConfigForTest(SharedState.FrameworkReferenceApp, setup, copyOnUpdate: true);
- SharedState.RunComponentResolutionTest(component.AppDll, app, dotnet.GreatestVersionHostFxrPath, command => command
- .RuntimeId(setup.Rid))
- .Should().Pass()
+ var result = SharedState.RunComponentResolutionTest(component.AppDll, app, dotnet.GreatestVersionHostFxrPath, command => command
+ .RuntimeId(setup.Rid));
+ result.Should().Pass()
.And.HaveSuccessfullyResolvedComponentDependencies()
.And.HaveResolvedComponentDependencyAssembly(expected.IncludedAssemblyPaths, component)
.And.NotHaveResolvedComponentDependencyAssembly(expected.ExcludedAssemblyPaths, component)
.And.HaveResolvedComponentDependencyNativeLibraryPath(expected.IncludedNativeLibraryPaths, component)
.And.NotHaveResolvedComponentDependencyNativeLibraryPath(expected.ExcludedNativeLibraryPaths, component)
.And.HaveReadRidGraph(setup.ShouldUseRidGraph)
- .And.HaveUsedFallbackRid(setup.ShouldUseFallbackRid)
.And.NotHaveUsedFrameworkProbe(dotnet.GreatestVersionSharedFxPath);
+
+ if (setup.ShouldUseFallbackRid.HasValue)
+ result.Should().HaveUsedFallbackRid(setup.ShouldUseFallbackRid.Value);
}
}
@@ -723,16 +743,18 @@ protected override void RunTest(
app = UpdateAppConfigForTest(app, setup, copyOnUpdate: true);
- SharedState.RunComponentResolutionTest(component.AppDll, app, app.Location, command => command
- .RuntimeId(setup.Rid))
- .Should().Pass()
+ var result = SharedState.RunComponentResolutionTest(component.AppDll, app, app.Location, command => command
+ .RuntimeId(setup.Rid));
+ result.Should().Pass()
.And.HaveSuccessfullyResolvedComponentDependencies()
.And.HaveResolvedComponentDependencyAssembly(expected.IncludedAssemblyPaths, component)
.And.NotHaveResolvedComponentDependencyAssembly(expected.ExcludedAssemblyPaths, component)
.And.HaveResolvedComponentDependencyNativeLibraryPath(expected.IncludedNativeLibraryPaths, component)
.And.NotHaveResolvedComponentDependencyNativeLibraryPath(expected.ExcludedNativeLibraryPaths, component)
- .And.HaveReadRidGraph(setup.ShouldUseRidGraph)
- .And.HaveUsedFallbackRid(setup.ShouldUseFallbackRid);
+ .And.HaveReadRidGraph(setup.ShouldUseRidGraph);
+
+ if (setup.ShouldUseFallbackRid.HasValue)
+ result.Should().HaveUsedFallbackRid(setup.ShouldUseFallbackRid.Value);
}
public class ComponentSharedTestState : ComponentSharedTestStateBase
diff --git a/src/libraries/Common/src/Interop/OSX/Interop.Libraries.cs b/src/libraries/Common/src/Interop/OSX/Interop.Libraries.cs
index 36cdea9e1bd9a..40423ae3d2083 100644
--- a/src/libraries/Common/src/Interop/OSX/Interop.Libraries.cs
+++ b/src/libraries/Common/src/Interop/OSX/Interop.Libraries.cs
@@ -11,6 +11,7 @@ internal static partial class Libraries
internal const string libobjc = "/usr/lib/libobjc.dylib";
internal const string libproc = "/usr/lib/libproc.dylib";
internal const string Odbc32 = "libodbc.2.dylib";
+ internal const string libSystem = "libSystem.dylib";
internal const string OpenLdap = "libldap.dylib";
internal const string SystemConfigurationLibrary = "/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration";
internal const string AppleCryptoNative = "libSystem.Security.Cryptography.Native.Apple";
diff --git a/src/libraries/Common/src/Interop/OSX/Interop.libSystem.cs b/src/libraries/Common/src/Interop/OSX/Interop.libSystem.cs
new file mode 100644
index 0000000000000..e8662da28e709
--- /dev/null
+++ b/src/libraries/Common/src/Interop/OSX/Interop.libSystem.cs
@@ -0,0 +1,22 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+
+internal static partial class Interop
+{
+ internal static partial class libSystem
+ {
+ [LibraryImport(Interop.Libraries.libSystem)]
+ public static unsafe partial int mach_timebase_info(mach_timebase_info_data_t* info);
+ public struct mach_timebase_info_data_t
+ {
+ public uint numer;
+ public uint denom;
+ }
+ }
+}
diff --git a/src/libraries/Common/src/Interop/Windows/SspiCli/SecuritySafeHandles.cs b/src/libraries/Common/src/Interop/Windows/SspiCli/SecuritySafeHandles.cs
index 9195286988376..272232f414ac9 100644
--- a/src/libraries/Common/src/Interop/Windows/SspiCli/SecuritySafeHandles.cs
+++ b/src/libraries/Common/src/Interop/Windows/SspiCli/SecuritySafeHandles.cs
@@ -312,13 +312,12 @@ internal sealed class SafeFreeCredential_SECURITY : SafeFreeCredentials
{
#pragma warning disable 0649
// This is used only by SslStream but it is included elsewhere
- public X509Certificate? LocalCertificate;
+ public bool HasLocalCertificate;
#pragma warning restore 0649
public SafeFreeCredential_SECURITY() : base() { }
protected override bool ReleaseHandle()
{
- LocalCertificate?.Dispose();
return Interop.SspiCli.FreeCredentialsHandle(ref _handle) == 0;
}
}
diff --git a/src/libraries/Microsoft.Extensions.Configuration.Binder/gen/ConfigurationBindingGenerator.Parser.cs b/src/libraries/Microsoft.Extensions.Configuration.Binder/gen/ConfigurationBindingGenerator.Parser.cs
index 2f6a221de9092..9522eeb83983d 100644
--- a/src/libraries/Microsoft.Extensions.Configuration.Binder/gen/ConfigurationBindingGenerator.Parser.cs
+++ b/src/libraries/Microsoft.Extensions.Configuration.Binder/gen/ConfigurationBindingGenerator.Parser.cs
@@ -654,6 +654,12 @@ private ObjectSpec CreateObjectSpec(TypeParseInfo typeParseInfo)
if (member is IPropertySymbol { IsIndexer: false, IsImplicitlyDeclared: false } property && !IsUnsupportedType(property.Type))
{
string propertyName = property.Name;
+
+ if (property.IsOverride || properties?.ContainsKey(propertyName) is true)
+ {
+ continue;
+ }
+
TypeRef propertyTypeRef = EnqueueTransitiveType(typeParseInfo, property.Type, DiagnosticDescriptors.PropertyNotSupported, propertyName);
AttributeData? attributeData = property.GetAttributes().FirstOrDefault(a => SymbolEqualityComparer.Default.Equals(a.AttributeClass, _typeSymbols.ConfigurationKeyNameAttribute));
diff --git a/src/libraries/Microsoft.Extensions.Configuration.Binder/src/Microsoft.Extensions.Configuration.Binder.csproj b/src/libraries/Microsoft.Extensions.Configuration.Binder/src/Microsoft.Extensions.Configuration.Binder.csproj
index 4d20115e2f710..8ac03929b0740 100644
--- a/src/libraries/Microsoft.Extensions.Configuration.Binder/src/Microsoft.Extensions.Configuration.Binder.csproj
+++ b/src/libraries/Microsoft.Extensions.Configuration.Binder/src/Microsoft.Extensions.Configuration.Binder.csproj
@@ -4,8 +4,8 @@
$(NetCoreAppCurrent);$(NetCoreAppPrevious);$(NetCoreAppMinimum);netstandard2.0;$(NetFrameworkMinimum)
true
true
- false
- 1
+ true
+ 2
Provides the functionality to bind an object to data in configuration providers for Microsoft.Extensions.Configuration. This package enables you to represent the configuration data as strongly-typed classes defined in the application code. To bind a configuration, use the Microsoft.Extensions.Configuration.ConfigurationBinder.Get extension method on the IConfiguration object. To use this package, you also need to install a package for the configuration provider, for example, Microsoft.Extensions.Configuration.Json for the JSON provider.
diff --git a/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.cs b/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.cs
index 9aad9566463af..02f3a74f317b1 100644
--- a/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.cs
+++ b/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.cs
@@ -930,5 +930,64 @@ public class SimplePoco
public string B { get; set; }
}
+ public class BaseForHiddenMembers
+ {
+ public string A { get; set; }
+ public string B { get; set; }
+ public TestSettingsEnum E {get; set;}
+
+ public virtual string C { get => CBase; set => CBase = value; }
+
+ public string CBase;
+
+ public virtual string D { get; }
+
+ public virtual string F { get => FBase; set => FBase = value; }
+ public string FBase;
+
+
+ public virtual int X { get => XBase; set => XBase = value; }
+ public int XBase;
+ }
+
+ public enum TestSettingsEnum2
+ {
+ // Note - the reflection binder will try to bind to every member
+ Option1 = TestSettingsEnum.Option1,
+ Option2 = TestSettingsEnum.Option2,
+ }
+
+ public class IntermediateDerivedClass : BaseForHiddenMembers
+ {
+ public new virtual string D { get => DBase; set => DBase = value; }
+ public string DBase;
+
+ public override string F { get => "IF"; }
+
+ }
+
+ public class DerivedClassWithHiddenMembers : IntermediateDerivedClass
+ {
+ public new string A { get; } = "ADerived";
+ public new int B { get; set; }
+ public new TestSettingsEnum2 E
+ {
+ get => (TestSettingsEnum2)base.E;
+ set => base.E = (TestSettingsEnum)value;
+ }
+
+ // only override get
+ public override string C { get => "DC"; }
+
+ // override new only get
+ public override string D { get => "DD"; }
+
+ // two overrides of only get
+ public override string F { get => "DF"; }
+
+ // override only set
+ public override int X { set => base.X = value + 1; }
+ }
+
}
}
diff --git a/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.cs b/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.cs
index 2103749861348..c45ce4d836bec 100644
--- a/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.cs
+++ b/src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.cs
@@ -2486,5 +2486,67 @@ public MockConfigurationRoot(IList providers) : base(pro
IConfigurationSection IConfiguration.GetSection(string key) =>
this[key] is null ? null : new ConfigurationSection(this, key);
}
+
+ [Fact]
+ public void CanBindToClassWithNewProperties()
+ {
+ /// the source generator will bind to the most derived property only.
+ /// the reflection binder will bind the same data to all properties (including hidden).
+
+ var config = TestHelpers.GetConfigurationFromJsonString("""
+ {
+ "A": "AVal",
+ "B": "5",
+ "C": "CVal",
+ "D": "DVal",
+ "E": "Option2",
+ "F": "FVal",
+ "X": "52"
+ }
+ """);
+ var obj = new DerivedClassWithHiddenMembers();
+
+ config.Bind(obj);
+
+ BaseForHiddenMembers baseObj = obj;
+ IntermediateDerivedClass intermediateObj = obj;
+
+ Assert.Equal("ADerived", obj.A);
+#if BUILDING_SOURCE_GENERATOR_TESTS
+ // source generator will not set hidden property
+ Assert.Null(baseObj.A);
+#else
+ // reflection binder will set hidden property
+ Assert.Equal("AVal", baseObj.A);
+#endif
+
+ Assert.Equal(5, obj.B);
+#if BUILDING_SOURCE_GENERATOR_TESTS
+ // source generator will not set hidden property
+ Assert.Null(baseObj.B);
+#else
+ // reflection binder will set hidden property
+ Assert.Equal("5", baseObj.B);
+#endif
+
+ Assert.Equal(TestSettingsEnum2.Option2, obj.E);
+ Assert.Equal(TestSettingsEnum.Option2, baseObj.E);
+
+ Assert.Equal("DC", obj.C);
+ // The setter should still be called, even when only getter is overridden.
+ Assert.Equal("CVal", obj.CBase);
+
+ // can hide a readonly property with r/w property
+ Assert.Null(baseObj.D);
+ Assert.Equal("DD", obj.D);
+ // The setter should still be called, even when only getter is overridden.
+ Assert.Equal("DVal", obj.DBase);
+
+ Assert.Equal("DF", obj.F);
+ Assert.Equal("FVal", obj.FBase);
+
+ Assert.Equal(53, obj.X);
+ Assert.Equal(53, obj.XBase);
+ }
}
}
diff --git a/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationExtensions.cs b/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationExtensions.cs
index 77ac387d09607..f84c5c10eea77 100644
--- a/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationExtensions.cs
+++ b/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationExtensions.cs
@@ -29,9 +29,6 @@ public static IConfigurationBuilder SetFileProvider(this IConfigurationBuilder b
return builder;
}
- internal static IFileProvider? GetUserDefinedFileProvider(this IConfigurationBuilder builder)
- => builder.Properties.TryGetValue(FileProviderKey, out object? provider) ? (IFileProvider)provider : null;
-
///
/// Gets the default to be used for file-based providers.
///
@@ -41,7 +38,12 @@ public static IFileProvider GetFileProvider(this IConfigurationBuilder builder)
{
ThrowHelper.ThrowIfNull(builder);
- return GetUserDefinedFileProvider(builder) ?? new PhysicalFileProvider(AppContext.BaseDirectory ?? string.Empty);
+ if (builder.Properties.TryGetValue(FileProviderKey, out object? provider))
+ {
+ return (IFileProvider)provider;
+ }
+
+ return new PhysicalFileProvider(AppContext.BaseDirectory ?? string.Empty);
}
///
diff --git a/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs b/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs
index c0d8c9f341278..d226051b1ab83 100644
--- a/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs
+++ b/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs
@@ -162,11 +162,6 @@ private void HandleException(ExceptionDispatchInfo info)
protected virtual void Dispose(bool disposing)
{
_changeTokenRegistration?.Dispose();
-
- if (Source.OwnsFileProvider)
- {
- (Source.FileProvider as IDisposable)?.Dispose();
- }
}
}
}
diff --git a/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationSource.cs b/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationSource.cs
index 60555b2c67255..d58c265f406a9 100644
--- a/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationSource.cs
+++ b/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationSource.cs
@@ -18,11 +18,6 @@ public abstract class FileConfigurationSource : IConfigurationSource
///
public IFileProvider? FileProvider { get; set; }
- ///
- /// Set to true when was not provided by user and can be safely disposed.
- ///
- internal bool OwnsFileProvider { get; private set; }
-
///
/// The path to the file.
///
@@ -63,11 +58,6 @@ public abstract class FileConfigurationSource : IConfigurationSource
/// The .
public void EnsureDefaults(IConfigurationBuilder builder)
{
- if (FileProvider is null && builder.GetUserDefinedFileProvider() is null)
- {
- OwnsFileProvider = true;
- }
-
FileProvider ??= builder.GetFileProvider();
OnLoadException ??= builder.GetFileLoadExceptionHandler();
}
@@ -91,7 +81,6 @@ public void ResolveFileProvider()
}
if (Directory.Exists(directory))
{
- OwnsFileProvider = true;
FileProvider = new PhysicalFileProvider(directory);
Path = pathToFile;
}
diff --git a/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/Microsoft.Extensions.Configuration.FileExtensions.csproj b/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/Microsoft.Extensions.Configuration.FileExtensions.csproj
index 124b99b6338bc..1a60e9897515a 100644
--- a/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/Microsoft.Extensions.Configuration.FileExtensions.csproj
+++ b/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/Microsoft.Extensions.Configuration.FileExtensions.csproj
@@ -4,6 +4,8 @@
$(NetCoreAppCurrent);$(NetCoreAppPrevious);$(NetCoreAppMinimum);netstandard2.0;$(NetFrameworkMinimum)
true
true
+ true
+ 1
Provides a base class for file-based configuration providers used with Microsoft.Extensions.Configuration and extension methods for configuring them.
diff --git a/src/libraries/Microsoft.Extensions.Configuration.Json/tests/JsonConfigurationTest.cs b/src/libraries/Microsoft.Extensions.Configuration.Json/tests/JsonConfigurationTest.cs
index 4b08c918fb898..08d59e30ea6eb 100644
--- a/src/libraries/Microsoft.Extensions.Configuration.Json/tests/JsonConfigurationTest.cs
+++ b/src/libraries/Microsoft.Extensions.Configuration.Json/tests/JsonConfigurationTest.cs
@@ -222,56 +222,26 @@ public void ThrowFormatExceptionWhenFileIsEmpty()
Assert.Contains("Could not parse the JSON file.", exception.Message);
}
- [Theory]
- [InlineData(true)]
- [InlineData(false)]
- public void AddJsonFile_FileProvider_Gets_Disposed_When_It_Was_Not_Created_By_The_User(bool disposeConfigRoot)
+ [Fact]
+ public void AddJsonFile_FileProvider_Is_Not_Disposed_When_SourcesGetReloaded()
{
- string filePath = Path.Combine(Path.GetTempPath(), $"{nameof(AddJsonFile_FileProvider_Gets_Disposed_When_It_Was_Not_Created_By_The_User)}.json");
+ string filePath = Path.Combine(Path.GetTempPath(), $"{nameof(AddJsonFile_FileProvider_Is_Not_Disposed_When_SourcesGetReloaded)}.json");
File.WriteAllText(filePath, @"{ ""some"": ""value"" }");
- IConfigurationRoot config = new ConfigurationBuilder().AddJsonFile(filePath, optional: false).Build();
- JsonConfigurationProvider jsonConfigurationProvider = config.Providers.OfType().Single();
-
- Assert.NotNull(jsonConfigurationProvider.Source.FileProvider);
- PhysicalFileProvider fileProvider = (PhysicalFileProvider)jsonConfigurationProvider.Source.FileProvider;
- Assert.False(GetIsDisposed(fileProvider));
-
- if (disposeConfigRoot)
- {
- (config as IDisposable).Dispose(); // disposing ConfigurationRoot
- }
- else
- {
- jsonConfigurationProvider.Dispose(); // disposing JsonConfigurationProvider
- }
-
- Assert.True(GetIsDisposed(fileProvider));
- }
+ IConfigurationBuilder builder = new ConfigurationManager();
- [Fact]
- public void AddJsonFile_FileProvider_Is_Not_Disposed_When_It_Is_Owned_By_The_User()
- {
- string filePath = Path.Combine(Path.GetTempPath(), $"{nameof(AddJsonFile_FileProvider_Is_Not_Disposed_When_It_Is_Owned_By_The_User)}.json");
- File.WriteAllText(filePath, @"{ ""some"": ""value"" }");
+ builder.AddJsonFile(filePath, optional: false);
- PhysicalFileProvider fileProvider = new(Path.GetDirectoryName(filePath));
- JsonConfigurationProvider configurationProvider = new(new JsonConfigurationSource()
- {
- Path = filePath,
- FileProvider = fileProvider
- });
- IConfigurationRoot config = new ConfigurationBuilder().AddJsonFile(configurationProvider.Source.FileProvider, filePath, optional: true, reloadOnChange: false).Build();
+ FileConfigurationSource fileConfigurationSource = (FileConfigurationSource)builder.Sources.Last();
+ PhysicalFileProvider fileProvider = (PhysicalFileProvider)fileConfigurationSource.FileProvider;
Assert.False(GetIsDisposed(fileProvider));
- (config as IDisposable).Dispose(); // disposing ConfigurationRoot that does not own the provider
- Assert.False(GetIsDisposed(fileProvider));
+ builder.Properties.Add("simplest", "repro");
- configurationProvider.Dispose(); // disposing JsonConfigurationProvider that does not own the provider
Assert.False(GetIsDisposed(fileProvider));
- fileProvider.Dispose(); // disposing PhysicalFileProvider itself
+ fileProvider.Dispose();
Assert.True(GetIsDisposed(fileProvider));
}
diff --git a/src/libraries/Microsoft.Extensions.Configuration.Xml/tests/XmlConfigurationTest.cs b/src/libraries/Microsoft.Extensions.Configuration.Xml/tests/XmlConfigurationTest.cs
index d248d96d9d464..4012d775afa5f 100644
--- a/src/libraries/Microsoft.Extensions.Configuration.Xml/tests/XmlConfigurationTest.cs
+++ b/src/libraries/Microsoft.Extensions.Configuration.Xml/tests/XmlConfigurationTest.cs
@@ -3,13 +3,11 @@
using System;
using System.IO;
-using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Tests;
using System.Xml;
using Microsoft.Extensions.Configuration.Test;
-using Microsoft.Extensions.FileProviders;
using Xunit;
namespace Microsoft.Extensions.Configuration.Xml.Test
@@ -781,64 +779,5 @@ public void LoadKeyValuePairsFromValidEncryptedXml()
Assert.Equal("AnotherTestConnectionString", xmlConfigSrc.Get("data.setting:inventory:connectionstring"));
Assert.Equal("MySql", xmlConfigSrc.Get("Data.setting:Inventory:Provider"));
}
-
- [Theory]
- [InlineData(true)]
- [InlineData(false)]
- public void AddXmlFile_FileProvider_Gets_Disposed_When_It_Was_Not_Created_By_The_User(bool disposeConfigRoot)
- {
- string filePath = Path.Combine(Path.GetTempPath(), $"{nameof(AddXmlFile_FileProvider_Gets_Disposed_When_It_Was_Not_Created_By_The_User)}.xml");
- File.WriteAllText(filePath, @"Settings");
-
- IConfigurationRoot config = new ConfigurationBuilder().AddXmlFile(filePath, optional: false).Build();
- XmlConfigurationProvider xmlConfigurationProvider = config.Providers.OfType().Single();
-
- Assert.NotNull(xmlConfigurationProvider.Source.FileProvider);
- PhysicalFileProvider fileProvider = (PhysicalFileProvider)xmlConfigurationProvider.Source.FileProvider;
- Assert.False(GetIsDisposed(fileProvider));
-
- if (disposeConfigRoot)
- {
- (config as IDisposable).Dispose(); // disposing ConfigurationRoot
- }
- else
- {
- xmlConfigurationProvider.Dispose(); // disposing XmlConfigurationProvider
- }
-
- Assert.True(GetIsDisposed(fileProvider));
- }
-
- [Fact]
- public void AddXmlFile_FileProvider_Is_Not_Disposed_When_It_Is_Owned_By_The_User()
- {
- string filePath = Path.Combine(Path.GetTempPath(), $"{nameof(AddXmlFile_FileProvider_Is_Not_Disposed_When_It_Is_Owned_By_The_User)}.xml");
- File.WriteAllText(filePath, @"Settings");
-
- PhysicalFileProvider fileProvider = new(Path.GetDirectoryName(filePath));
- XmlConfigurationProvider configurationProvider = new(new XmlConfigurationSource()
- {
- Path = filePath,
- FileProvider = fileProvider
- });
- IConfigurationRoot config = new ConfigurationBuilder().AddXmlFile(configurationProvider.Source.FileProvider, filePath, optional: true, reloadOnChange: false).Build();
-
- Assert.False(GetIsDisposed(fileProvider));
-
- (config as IDisposable).Dispose(); // disposing ConfigurationRoot that does not own the provider
- Assert.False(GetIsDisposed(fileProvider));
-
- configurationProvider.Dispose(); // disposing XmlConfigurationProvider
- Assert.False(GetIsDisposed(fileProvider));
-
- fileProvider.Dispose(); // disposing PhysicalFileProvider itself
- Assert.True(GetIsDisposed(fileProvider));
- }
-
- private static bool GetIsDisposed(PhysicalFileProvider fileProvider)
- {
- System.Reflection.FieldInfo isDisposedField = typeof(PhysicalFileProvider).GetField("_disposed", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
- return (bool)isDisposedField.GetValue(fileProvider);
- }
}
}
diff --git a/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs b/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs
index 2efd53e6223ae..948e3f4b386f3 100644
--- a/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs
+++ b/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs
@@ -28,7 +28,12 @@ public sealed class TypeDescriptor
// class load anyway.
private static readonly WeakHashtable s_providerTable = new WeakHashtable(); // mapping of type or object hash to a provider list
private static readonly Hashtable s_providerTypeTable = new Hashtable(); // A direct mapping from type to provider.
- private static readonly Hashtable s_defaultProviders = new Hashtable(); // A table of type -> default provider to track DefaultTypeDescriptionProviderAttributes.
+
+ private static readonly Hashtable s_defaultProviderInitialized = new Hashtable(); // A table of type -> object to track DefaultTypeDescriptionProviderAttributes.
+ // A value of `null` indicates initialization is in progress.
+ // A value of s_initializedDefaultProvider indicates the provider is initialized.
+ private static readonly object s_initializedDefaultProvider = new object();
+
private static WeakHashtable? s_associationTable;
private static int s_metadataVersion; // a version stamp for our metadata. Used by property descriptors to know when to rebuild attributes.
@@ -75,8 +80,6 @@ public sealed class TypeDescriptor
Guid.NewGuid() // events
};
- private static readonly object s_internalSyncObject = new object();
-
private TypeDescriptor()
{
}
@@ -262,32 +265,43 @@ public static void AddProviderTransparent(TypeDescriptionProvider provider, obje
///
private static void CheckDefaultProvider(Type type)
{
- if (s_defaultProviders.ContainsKey(type))
+ if (s_defaultProviderInitialized[type] == s_initializedDefaultProvider)
{
return;
}
- lock (s_internalSyncObject)
+ // Lock on s_providerTable even though s_providerTable is not modified here.
+ // Using a single lock prevents deadlocks since other methods that call into or are called
+ // by this method also lock on s_providerTable and the ordering of the locks may be different.
+ lock (s_providerTable)
{
- if (s_defaultProviders.ContainsKey(type))
- {
- return;
- }
+ AddDefaultProvider(type);
+ }
+ }
- // Immediately clear this. If we find a default provider
- // and it starts messing around with type information,
- // this could infinitely recurse.
- s_defaultProviders[type] = null;
+ ///
+ /// Add the default provider, if it exists.
+ /// For threading, this is always called under a 'lock (s_providerTable)'.
+ ///
+ private static void AddDefaultProvider(Type type)
+ {
+ bool providerAdded = false;
+
+ if (s_defaultProviderInitialized.ContainsKey(type))
+ {
+ // Either another thread finished initializing for this type, or we are recursing on the same thread.
+ return;
}
- // Always use core reflection when checking for
- // the default provider attribute. If there is a
- // provider, we probably don't want to build up our
- // own cache state against the type. There shouldn't be
- // more than one of these, but walk anyway. Walk in
- // reverse order so that the most derived takes precidence.
+ // Immediately set this to null to indicate we are in progress setting the default provider for a type.
+ // This prevents re-entrance to this method.
+ s_defaultProviderInitialized[type] = null;
+
+ // Always use core reflection when checking for the default provider attribute.
+ // If there is a provider, we probably don't want to build up our own cache state against the type.
+ // There shouldn't be more than one of these, but walk anyway.
+ // Walk in reverse order so that the most derived takes precedence.
object[] attrs = type.GetCustomAttributes(typeof(TypeDescriptionProviderAttribute), false);
- bool providerAdded = false;
for (int idx = attrs.Length - 1; idx >= 0; idx--)
{
TypeDescriptionProviderAttribute pa = (TypeDescriptionProviderAttribute)attrs[idx];
@@ -306,17 +320,19 @@ private static void CheckDefaultProvider(Type type)
Type? baseType = type.BaseType;
if (baseType != null && baseType != type)
{
- CheckDefaultProvider(baseType);
+ AddDefaultProvider(baseType);
}
}
+
+ s_defaultProviderInitialized[type] = s_initializedDefaultProvider;
}
///
- /// The CreateAssocation method creates an association between two objects.
+ /// The CreateAssociation method creates an association between two objects.
/// Once an association is created, a designer or other filtering mechanism
/// can add properties that route to either object into the primary object's
/// property set. When a property invocation is made against the primary
- /// object, GetAssocation will be called to resolve the actual object
+ /// object, GetAssociation will be called to resolve the actual object
/// instance that is related to its type parameter.
///
[EditorBrowsable(EditorBrowsableState.Advanced)]
diff --git a/src/libraries/System.ComponentModel.TypeConverter/tests/TypeDescriptorTests.cs b/src/libraries/System.ComponentModel.TypeConverter/tests/TypeDescriptorTests.cs
index 299d73cfe3150..c8d85842d86d0 100644
--- a/src/libraries/System.ComponentModel.TypeConverter/tests/TypeDescriptorTests.cs
+++ b/src/libraries/System.ComponentModel.TypeConverter/tests/TypeDescriptorTests.cs
@@ -5,6 +5,10 @@
using System.Collections.Generic;
using System.ComponentModel.Design;
using System.Globalization;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.DotNet.RemoteExecutor;
using Moq;
using Xunit;
@@ -1231,5 +1235,248 @@ protected DerivedCultureInfo() : base("hello")
class TwiceDerivedCultureInfo : DerivedCultureInfo
{
}
+
+ private long _concurrentError = 0;
+ private bool ConcurrentError
+ {
+ get => Interlocked.Read(ref _concurrentError) == 1;
+ set => Interlocked.Exchange(ref _concurrentError, value ? 1 : 0);
+ }
+
+ private void ConcurrentTest(TypeWithProperty instance)
+ {
+ var properties = TypeDescriptor.GetProperties(instance);
+ Thread.Sleep(10);
+ if (properties.Count > 0)
+ {
+ ConcurrentError = true;
+ }
+ }
+
+ [SkipOnPlatform(TestPlatforms.Browser, "Thread.Start is not supported on browsers.")]
+ [Fact]
+ public void ConcurrentGetProperties_ReturnsExpected()
+ {
+ const int Timeout = 60000;
+ int concurrentCount = Environment.ProcessorCount * 2;
+
+ using var finished = new CountdownEvent(concurrentCount);
+
+ var instances = new TypeWithProperty[concurrentCount];
+ for (int i = 0; i < concurrentCount; i++)
+ {
+ instances[i] = new TypeWithProperty();
+ }
+
+ for (int i = 0; i < concurrentCount; i++)
+ {
+ int i2 = i;
+ new Thread(() =>
+ {
+ ConcurrentTest(instances[i2]);
+ finished.Signal();
+ }).Start();
+ }
+
+ finished.Wait(Timeout);
+
+ if (finished.CurrentCount != 0)
+ {
+ Assert.Fail("Timeout. Possible deadlock.");
+ }
+ else
+ {
+ Assert.False(ConcurrentError, "Fallback type descriptor is used. Possible race condition.");
+ }
+ }
+
+ [SkipOnPlatform(TestPlatforms.Browser, "Thread.Start is not supported on browsers.")]
+ [ConditionalFact(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))]
+ public static void ConcurrentAddProviderAndGetProvider()
+ {
+ // Use a timeout value lower than RemoteExecutor in order to get a nice Fail message.
+ const int Timeout = 50000;
+
+ RemoteInvokeOptions options = new()
+ {
+ TimeOut = 60000
+ };
+
+ RemoteExecutor.Invoke(() =>
+ {
+ using var finished = new CountdownEvent(2);
+ Thread t1 = new Thread(() =>
+ {
+ ConcurrentAddProvider();
+ finished.Signal();
+ });
+ Thread t2 = new Thread(() =>
+ {
+ ConcurrentGetProvider();
+ finished.Signal();
+ });
+ t1.Start();
+ t2.Start();
+ finished.Wait(Timeout);
+ if (finished.CurrentCount != 0)
+ {
+ Assert.Fail("Timeout. Possible deadlock.");
+ }
+ }, options).Dispose();
+
+ static void ConcurrentAddProvider()
+ {
+ var provider = new EmptyPropertiesTypeProvider();
+ TypeDescriptor.AddProvider(provider, typeof(MyClass));
+
+ // This test primarily verifies no deadlock, but verify the values anyway.
+ Assert.True(TypeDescriptor.GetProvider(typeof(MyClass)).IsSupportedType(typeof(MyClass)));
+ }
+
+ static void ConcurrentGetProvider()
+ {
+ TypeDescriptionProvider provider = TypeDescriptor.GetProvider(typeof(TypeWithProperty));
+
+ // This test primarily verifies no deadlock, but verify the values anyway.
+ Assert.True(provider.IsSupportedType(typeof(TypeWithProperty)));
+ }
+ }
+
+ public sealed class EmptyPropertiesTypeProvider : TypeDescriptionProvider
+ {
+ private sealed class EmptyPropertyListDescriptor : ICustomTypeDescriptor
+ {
+ public AttributeCollection GetAttributes() => AttributeCollection.Empty;
+
+ public string? GetClassName() => null;
+
+ public string? GetComponentName() => null;
+
+ public TypeConverter? GetConverter() => new TypeConverter();
+
+ public EventDescriptor? GetDefaultEvent() => null;
+
+ public PropertyDescriptor? GetDefaultProperty() => null;
+
+ public object? GetEditor(Type editorBaseType) => null;
+
+ public EventDescriptorCollection GetEvents() => EventDescriptorCollection.Empty;
+
+ public EventDescriptorCollection GetEvents(Attribute[]? attributes) => GetEvents();
+
+ public PropertyDescriptorCollection GetProperties() => PropertyDescriptorCollection.Empty;
+
+ public PropertyDescriptorCollection GetProperties(Attribute[]? attributes) => GetProperties();
+
+ public object? GetPropertyOwner(PropertyDescriptor? pd) => null;
+ }
+ public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object? instance)
+ {
+ return new EmptyPropertyListDescriptor();
+ }
+ }
+
+ [TypeDescriptionProvider(typeof(EmptyPropertiesTypeProvider))]
+ public sealed class TypeWithProperty
+ {
+ public int OneProperty { get; set; }
+ }
+
+ public static IEnumerable
diff --git a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.OSX.cs b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.OSX.cs
index da44fc1ed3426..07f55780d82de 100644
--- a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.OSX.cs
+++ b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.OSX.cs
@@ -10,6 +10,7 @@ namespace System.Diagnostics
public partial class Process
{
private const int NanosecondsTo100NanosecondsFactor = 100;
+ private static volatile uint s_timeBase_numer, s_timeBase_denom;
private const int MicrosecondsToSecondsFactor = 1_000_000;
@@ -23,7 +24,7 @@ public TimeSpan PrivilegedProcessorTime
{
EnsureState(State.HaveNonExitedId);
Interop.libproc.rusage_info_v3 info = Interop.libproc.proc_pid_rusage(_processId);
- return new TimeSpan(Convert.ToInt64(info.ri_system_time / NanosecondsTo100NanosecondsFactor));
+ return MapTime(info.ri_system_time);
}
}
@@ -65,7 +66,7 @@ public TimeSpan TotalProcessorTime
{
EnsureState(State.HaveNonExitedId);
Interop.libproc.rusage_info_v3 info = Interop.libproc.proc_pid_rusage(_processId);
- return new TimeSpan(Convert.ToInt64((info.ri_system_time + info.ri_user_time) / NanosecondsTo100NanosecondsFactor));
+ return MapTime(info.ri_system_time + info.ri_user_time);
}
}
@@ -82,7 +83,7 @@ public TimeSpan UserProcessorTime
{
EnsureState(State.HaveNonExitedId);
Interop.libproc.rusage_info_v3 info = Interop.libproc.proc_pid_rusage(_processId);
- return new TimeSpan(Convert.ToInt64(info.ri_user_time / NanosecondsTo100NanosecondsFactor));
+ return MapTime(info.ri_user_time);
}
}
@@ -109,5 +110,35 @@ private static Interop.libproc.rusage_info_v3 GetCurrentProcessRUsage()
{
return Interop.libproc.proc_pid_rusage(Environment.ProcessId);
}
+
+ private static TimeSpan MapTime(ulong sysTime)
+ {
+ uint denom = s_timeBase_denom;
+ if (denom == default)
+ {
+ Interop.libSystem.mach_timebase_info_data_t timeBase = GetTimeBase();
+ s_timeBase_numer = timeBase.numer;
+ s_timeBase_denom = denom = timeBase.denom;
+ }
+ uint numer = s_timeBase_numer;
+
+ // By dividing by NanosecondsTo100NanosecondsFactor first, we lose some precision, but increase the range
+ // where no overflow will happen.
+ return new TimeSpan(Convert.ToInt64(sysTime / NanosecondsTo100NanosecondsFactor * numer / denom));
+ }
+
+ private static unsafe Interop.libSystem.mach_timebase_info_data_t GetTimeBase()
+ {
+ Interop.libSystem.mach_timebase_info_data_t timeBase = default;
+ var returnCode = Interop.libSystem.mach_timebase_info(&timeBase);
+ Debug.Assert(returnCode == 0, $"Non-zero exit code from mach_timebase_info: {returnCode}");
+ if (returnCode != 0)
+ {
+ // Fallback: let's assume that the time values are in nanoseconds,
+ // i.e. the time base is 1/1.
+ timeBase.numer = timeBase.denom = 1;
+ }
+ return timeBase;
+ }
}
}
diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs
index 2085fddbb5d20..79ad7ec01f0a1 100644
--- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs
+++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs
@@ -851,6 +851,39 @@ static void ExecuteChildProcess(string filename, string flags)
}
}
+ [Fact]
+ [PlatformSpecific(TestPlatforms.OSX)]
+ public unsafe void TestTotalProcessorTimeMacOs()
+ {
+ var rUsage = Interop.libproc.proc_pid_rusage(Environment.ProcessId);
+ var timeBase = new Interop.libSystem.mach_timebase_info_data_t();
+ Interop.libSystem.mach_timebase_info(&timeBase);
+
+ var nativeUserUs = rUsage.ri_user_time / 1000 * timeBase.numer / timeBase.denom;
+ var nativeSystemUs = rUsage.ri_system_time / 1000 * timeBase.numer / timeBase.denom;
+ var nativeTotalUs = nativeSystemUs + nativeUserUs;
+
+ var nativeUserTime = TimeSpan.FromMicroseconds(nativeUserUs);
+ var nativeSystemTime = TimeSpan.FromMicroseconds(nativeSystemUs);
+ var nativeTotalTime = TimeSpan.FromMicroseconds(nativeTotalUs);
+
+ var process = Process.GetCurrentProcess();
+ var managedUserTime = process.UserProcessorTime;
+ var managedSystemTime = process.PrivilegedProcessorTime;
+ var managedTotalTime = process.TotalProcessorTime;
+
+ AssertTime(managedUserTime, nativeUserTime, "user");
+ AssertTime(managedSystemTime, nativeSystemTime, "system");
+ AssertTime(managedTotalTime, nativeTotalTime, "total");
+
+ void AssertTime(TimeSpan managed, TimeSpan native, string label)
+ {
+ Assert.True(
+ managed >= native,
+ $"Time '{label}' returned by managed API ({managed}) should be greated or equal to the time returned by native API ({native}).");
+ }
+ }
+
[ConditionalTheory(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))]
[InlineData(true)]
[InlineData(false)]
diff --git a/src/libraries/System.Diagnostics.Process/tests/Resources/Strings.resx b/src/libraries/System.Diagnostics.Process/tests/Resources/Strings.resx
index 4fd9192b919e1..d443842f56cbc 100644
--- a/src/libraries/System.Diagnostics.Process/tests/Resources/Strings.resx
+++ b/src/libraries/System.Diagnostics.Process/tests/Resources/Strings.resx
@@ -120,4 +120,10 @@
The argv[0] argument cannot include a double quote.
+
+ Could not get all running Process IDs.
+
+
+ Failed to set or retrieve rusage information. See the error code for OS-specific error information.
+
\ No newline at end of file
diff --git a/src/libraries/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj b/src/libraries/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj
index c3f01adc3bc67..889e34344048a 100644
--- a/src/libraries/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj
+++ b/src/libraries/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj
@@ -63,6 +63,12 @@
+
+
+
diff --git a/src/libraries/System.Globalization/tests/DateTimeFormatInfo/DateTimeFormatInfoShortDatePattern.cs b/src/libraries/System.Globalization/tests/DateTimeFormatInfo/DateTimeFormatInfoShortDatePattern.cs
index 815533bd1d807..7d4b146b9decc 100644
--- a/src/libraries/System.Globalization/tests/DateTimeFormatInfo/DateTimeFormatInfoShortDatePattern.cs
+++ b/src/libraries/System.Globalization/tests/DateTimeFormatInfo/DateTimeFormatInfoShortDatePattern.cs
@@ -8,6 +8,13 @@ namespace System.Globalization.Tests
{
public class DateTimeFormatInfoShortDatePattern
{
+ public static IEnumerable ShortDatePattern_Get_TestData()
+ {
+ yield return new object[] { DateTimeFormatInfo.InvariantInfo, "MM/dd/yyyy", "invariant" };
+ yield return new object[] { new CultureInfo("en-US").DateTimeFormat, "M/d/yyyy", "en-US" };
+ yield return new object[] { new CultureInfo("fr-FR").DateTimeFormat, "dd/MM/yyyy", "fr-FR" };
+ }
+
public static IEnumerable ShortDatePattern_Get_TestData_HybridGlobalization()
{
// see the comments on the right to check the non-Hybrid result, if it differs
@@ -131,7 +138,6 @@ public static IEnumerable ShortDatePattern_Get_TestData_HybridGlobaliz
yield return new object[] { new CultureInfo("en-ZA").DateTimeFormat, "yyyy/MM/dd" };
yield return new object[] { new CultureInfo("en-ZM").DateTimeFormat, "dd/MM/yyyy" };
yield return new object[] { new CultureInfo("en-ZW").DateTimeFormat, "d/M/yyyy" };
- yield return new object[] { new CultureInfo("en-US").DateTimeFormat, "M/d/yyyy" };
yield return new object[] { new CultureInfo("es-419").DateTimeFormat, "d/M/yyyy" };
yield return new object[] { new CultureInfo("es-ES").DateTimeFormat, "d/M/yyyy" };
yield return new object[] { new CultureInfo("es-MX").DateTimeFormat, "dd/MM/yyyy" };
@@ -200,6 +206,13 @@ public static IEnumerable ShortDatePattern_Get_TestData_HybridGlobaliz
yield return new object[] { new CultureInfo("zh-TW").DateTimeFormat, "yyyy/M/d" };
}
+ [ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsHybridGlobalizationOnOSX))]
+ [MemberData(nameof(ShortDatePattern_Get_TestData))]
+ public void ShortDatePattern_Get_ReturnsExpected(DateTimeFormatInfo format, string expected, string cultureName)
+ {
+ Assert.True(expected == format.ShortDatePattern, $"Failed for culture: {cultureName}. Expected: {expected}, Actual: {format.ShortDatePattern}");
+ }
+
[ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsHybridGlobalizationOnBrowser))]
[MemberData(nameof(ShortDatePattern_Get_TestData_HybridGlobalization))]
public void ShortDatePattern_Get_ReturnsExpected_HybridGlobalization(DateTimeFormatInfo format, string expected)
diff --git a/src/libraries/System.Net.Security/src/System/Net/CertificateValidationPal.Windows.cs b/src/libraries/System.Net.Security/src/System/Net/CertificateValidationPal.Windows.cs
index f0e58802dbda5..083c661661093 100644
--- a/src/libraries/System.Net.Security/src/System/Net/CertificateValidationPal.Windows.cs
+++ b/src/libraries/System.Net.Security/src/System/Net/CertificateValidationPal.Windows.cs
@@ -105,7 +105,7 @@ internal static bool IsLocalCertificateUsed(SafeFreeCredentials? _credentialsHan
// This is TLS Resumed session. Windows can fail to query the local cert bellow.
// Instead, we will determine the usage form used credentials.
SafeFreeCredential_SECURITY creds = (SafeFreeCredential_SECURITY)_credentialsHandle!;
- return creds.LocalCertificate != null;
+ return creds.HasLocalCertificate;
}
SafeFreeCertContext? localContext = null;
diff --git a/src/libraries/System.Net.Security/src/System/Net/Security/SslStreamPal.Windows.cs b/src/libraries/System.Net.Security/src/System/Net/Security/SslStreamPal.Windows.cs
index 45e77f49b6ecd..3ee2c8ac5612b 100644
--- a/src/libraries/System.Net.Security/src/System/Net/Security/SslStreamPal.Windows.cs
+++ b/src/libraries/System.Net.Security/src/System/Net/Security/SslStreamPal.Windows.cs
@@ -231,8 +231,7 @@ public static SafeFreeCredentials AcquireCredentialsHandle(SslAuthenticationOpti
if (newCredentialsRequested && sslAuthenticationOptions.CertificateContext != null)
{
SafeFreeCredential_SECURITY handle = (SafeFreeCredential_SECURITY)cred;
- // We need to create copy to avoid Disposal issue.
- handle.LocalCertificate = new X509Certificate2(sslAuthenticationOptions.CertificateContext.TargetCertificate);
+ handle.HasLocalCertificate = true;
}
return cred;
diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Tasks.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Tasks.cs
index e1891bef916f4..3ba24e90cf101 100644
--- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Tasks.cs
+++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Tasks.cs
@@ -677,7 +677,6 @@ public ValueTask SendToAsync(ReadOnlyMemory buffer, SocketFlags socke
Debug.Assert(saea.BufferList == null);
saea.SetBuffer(MemoryMarshal.AsMemory(buffer));
saea.SocketFlags = socketFlags;
- saea._socketAddress = null;
saea.RemoteEndPoint = remoteEP;
saea.WrapExceptionsForNetworkStream = false;
return saea.SendToAsync(this, cancellationToken);
@@ -709,8 +708,17 @@ public ValueTask SendToAsync(ReadOnlyMemory buffer, SocketFlags socke
saea.SetBuffer(MemoryMarshal.AsMemory(buffer));
saea.SocketFlags = socketFlags;
saea._socketAddress = socketAddress;
+ saea.RemoteEndPoint = null;
saea.WrapExceptionsForNetworkStream = false;
- return saea.SendToAsync(this, cancellationToken);
+ try
+ {
+ return saea.SendToAsync(this, cancellationToken);
+ }
+ finally
+ {
+ // detach user provided SA so we do not accidentally stomp on it later.
+ saea._socketAddress = null;
+ }
}
///
diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs
index 414b0baa86e68..2a88a70f5941e 100644
--- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs
+++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs
@@ -3095,14 +3095,22 @@ private bool SendToAsync(SocketAsyncEventArgs e, CancellationToken cancellationT
ArgumentNullException.ThrowIfNull(e);
EndPoint? endPointSnapshot = e.RemoteEndPoint;
- if (e._socketAddress == null)
+
+ // RemoteEndPoint should be set unless somebody used SendTo with their own SA.
+ // In that case RemoteEndPoint will be null and we take provided SA as given.
+ if (endPointSnapshot == null && e._socketAddress == null)
{
- if (endPointSnapshot == null)
- {
- throw new ArgumentException(SR.Format(SR.InvalidNullArgument, "e.RemoteEndPoint"), nameof(e));
- }
+ throw new ArgumentException(SR.Format(SR.InvalidNullArgument, "e.RemoteEndPoint"), nameof(e));
+ }
- // Prepare SocketAddress
+ if (e._socketAddress != null && endPointSnapshot is IPEndPoint ipep && e._socketAddress.Family == endPointSnapshot?.AddressFamily)
+ {
+ // we have matching SocketAddress. Since this is only used internally, it is ok to overwrite it without
+ ipep.Serialize(e._socketAddress.Buffer.Span);
+ }
+ else if (endPointSnapshot != null)
+ {
+ // Prepare new SocketAddress
e._socketAddress = Serialize(ref endPointSnapshot);
}
diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.cs
index e94d862571a0f..78dd22e5eda7b 100644
--- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.cs
+++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.cs
@@ -923,7 +923,12 @@ internal void FinishOperationSyncSuccess(int bytesTransferred, SocketFlags flags
case SocketAsyncOperation.ReceiveFrom:
// Deal with incoming address.
UpdateReceivedSocketAddress(_socketAddress!);
- if (_remoteEndPoint != null && !SocketAddressExtensions.Equals(_socketAddress!, _remoteEndPoint))
+ if (_remoteEndPoint == null)
+ {
+ // detach user provided SA as it was updated in place.
+ _socketAddress = null;
+ }
+ else if (!SocketAddressExtensions.Equals(_socketAddress!, _remoteEndPoint))
{
try
{
diff --git a/src/libraries/System.Net.Sockets/tests/FunctionalTests/SendTo.cs b/src/libraries/System.Net.Sockets/tests/FunctionalTests/SendTo.cs
index bf0ad14658869..7a3c33b64bf79 100644
--- a/src/libraries/System.Net.Sockets/tests/FunctionalTests/SendTo.cs
+++ b/src/libraries/System.Net.Sockets/tests/FunctionalTests/SendTo.cs
@@ -173,6 +173,35 @@ public void SendToAsync_NullAsyncEventArgs_Throws_ArgumentNullException()
public sealed class SendTo_Task : SendTo
{
public SendTo_Task(ITestOutputHelper output) : base(output) { }
+
+ [Theory]
+ [InlineData(false)]
+ [InlineData(true)]
+ public async Task SendTo_DifferentEP_Success(bool ipv4)
+ {
+ IPAddress address = ipv4 ? IPAddress.Loopback : IPAddress.IPv6Loopback;
+ IPEndPoint remoteEp = new IPEndPoint(address, 0);
+
+ using Socket receiver1 = new Socket(address.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
+ using Socket receiver2 = new Socket(address.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
+ using Socket sender = new Socket(address.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
+
+ receiver1.BindToAnonymousPort(address);
+ receiver2.BindToAnonymousPort(address);
+
+ byte[] sendBuffer = new byte[32];
+ var receiveInternalBuffer = new byte[sendBuffer.Length];
+ ArraySegment receiveBuffer = new ArraySegment(receiveInternalBuffer, 0, receiveInternalBuffer.Length);
+
+
+ await sender.SendToAsync(sendBuffer, SocketFlags.None, receiver1.LocalEndPoint);
+ SocketReceiveFromResult result = await ReceiveFromAsync(receiver1, receiveBuffer, remoteEp).WaitAsync(TestSettings.PassingTestTimeout);
+ Assert.Equal(sendBuffer.Length, result.ReceivedBytes);
+
+ await sender.SendToAsync(sendBuffer, SocketFlags.None, receiver2.LocalEndPoint);
+ result = await ReceiveFromAsync(receiver2, receiveBuffer, remoteEp).WaitAsync(TestSettings.PassingTestTimeout);
+ Assert.Equal(sendBuffer.Length, result.ReceivedBytes);
+ }
}
public sealed class SendTo_CancellableTask : SendTo
diff --git a/src/libraries/System.Net.Sockets/tests/FunctionalTests/SocketAsyncEventArgsTest.cs b/src/libraries/System.Net.Sockets/tests/FunctionalTests/SocketAsyncEventArgsTest.cs
index ded34276f322f..3d865cb864570 100644
--- a/src/libraries/System.Net.Sockets/tests/FunctionalTests/SocketAsyncEventArgsTest.cs
+++ b/src/libraries/System.Net.Sockets/tests/FunctionalTests/SocketAsyncEventArgsTest.cs
@@ -895,5 +895,52 @@ void CreateSocketAsyncEventArgs() // separated out so that JIT doesn't extend li
return cwt.Count() == 0; // validate that the cwt becomes empty
}, 30_000));
}
+
+ [Theory]
+ [InlineData(false)]
+ [InlineData(true)]
+ public async Task SendTo_DifferentEP_Success(bool ipv4)
+ {
+ IPAddress address = ipv4 ? IPAddress.Loopback : IPAddress.IPv6Loopback;
+ IPEndPoint remoteEp = new IPEndPoint(address, 0);
+
+ using Socket receiver1 = new Socket(address.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
+ using Socket receiver2 = new Socket(address.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
+ using Socket sender = new Socket(address.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
+
+ receiver1.BindToAnonymousPort(address);
+ receiver2.BindToAnonymousPort(address);
+
+ byte[] sendBuffer = new byte[32];
+ var receiveInternalBuffer = new byte[sendBuffer.Length];
+ ArraySegment receiveBuffer = new ArraySegment(receiveInternalBuffer, 0, receiveInternalBuffer.Length);
+
+ using SocketAsyncEventArgs saea = new SocketAsyncEventArgs();
+ ManualResetEventSlim mres = new ManualResetEventSlim(false);
+
+ saea.SetBuffer(sendBuffer);
+ saea.RemoteEndPoint = receiver1.LocalEndPoint;
+ saea.Completed += delegate { mres.Set(); };
+ if (sender.SendToAsync(saea))
+ {
+ // did not finish synchronously.
+ mres.Wait();
+ }
+
+ SocketReceiveFromResult result = await receiver1.ReceiveFromAsync(receiveBuffer, remoteEp).WaitAsync(TestSettings.PassingTestTimeout);
+ Assert.Equal(sendBuffer.Length, result.ReceivedBytes);
+ mres.Reset();
+
+
+ saea.RemoteEndPoint = receiver2.LocalEndPoint;
+ if (sender.SendToAsync(saea))
+ {
+ // did not finish synchronously.
+ mres.Wait();
+ }
+
+ result = await receiver2.ReceiveFromAsync(receiveBuffer, remoteEp).WaitAsync(TestSettings.PassingTestTimeout);
+ Assert.Equal(sendBuffer.Length, result.ReceivedBytes);
+ }
}
}
diff --git a/src/libraries/System.Private.CoreLib/src/System/Globalization/CalendarData.iOS.cs b/src/libraries/System.Private.CoreLib/src/System/Globalization/CalendarData.iOS.cs
index 46bfb3d481ca2..98925284412ad 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Globalization/CalendarData.iOS.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Globalization/CalendarData.iOS.cs
@@ -18,6 +18,15 @@ private bool LoadCalendarDataFromNative(string localeName, CalendarId calendarId
sNativeName = GetCalendarInfoNative(localeName, calendarId, CalendarDataType.NativeName);
sMonthDay = GetCalendarInfoNative(localeName, calendarId, CalendarDataType.MonthDay);
saShortDates = GetCalendarInfoNative(localeName, calendarId, CalendarDataType.ShortDates).Split("||");
+ // Handle ShortDatePattern to have "yyyy" year format
+ List shortDatePatternList = new List(saShortDates);
+ for (int i = 0; i < shortDatePatternList.Count; i++)
+ {
+ shortDatePatternList[i] = NormalizeDatePattern(shortDatePatternList[i]);
+ }
+ FixDefaultShortDatePattern(shortDatePatternList);
+ saShortDates = shortDatePatternList.ToArray();
+
saLongDates = GetCalendarInfoNative(localeName, calendarId, CalendarDataType.LongDates).Split("||");
saYearMonths = GetCalendarInfoNative(localeName, calendarId, CalendarDataType.YearMonths).Split("||");
saDayNames = GetCalendarInfoNative(localeName, calendarId, CalendarDataType.DayNames).Split("||");
diff --git a/src/libraries/System.Security.Cryptography/src/Resources/Strings.resx b/src/libraries/System.Security.Cryptography/src/Resources/Strings.resx
index 1bd529a087a6a..4bcfdcfd3454f 100644
--- a/src/libraries/System.Security.Cryptography/src/Resources/Strings.resx
+++ b/src/libraries/System.Security.Cryptography/src/Resources/Strings.resx
@@ -273,6 +273,9 @@
The specified CipherMode '{0}' is not supported.
+
+ Concurrent operations from multiple threads on this type are not supported.
+
This key is for algorithm '{0}'. Expected '{1}'.
diff --git a/src/libraries/System.Security.Cryptography/src/System.Security.Cryptography.csproj b/src/libraries/System.Security.Cryptography/src/System.Security.Cryptography.csproj
index 691235d0de290..591ae21cfd716 100644
--- a/src/libraries/System.Security.Cryptography/src/System.Security.Cryptography.csproj
+++ b/src/libraries/System.Security.Cryptography/src/System.Security.Cryptography.csproj
@@ -817,6 +817,7 @@
+
@@ -977,6 +978,7 @@
+
diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/ConcurrencyBlock.NoOp.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/ConcurrencyBlock.NoOp.cs
new file mode 100644
index 0000000000000..18736cacfc273
--- /dev/null
+++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/ConcurrencyBlock.NoOp.cs
@@ -0,0 +1,25 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Threading;
+
+namespace System.Security.Cryptography
+{
+ internal struct ConcurrencyBlock
+ {
+ internal static Scope Enter(ref ConcurrencyBlock block)
+ {
+ _ = block;
+ return default;
+ }
+
+ internal ref struct Scope
+ {
+#pragma warning disable CA1822 // Member can be marked static
+ internal void Dispose()
+ {
+ }
+#pragma warning restore CA1822
+ }
+ }
+}
diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/ConcurrencyBlock.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/ConcurrencyBlock.cs
new file mode 100644
index 0000000000000..c0eafe849da90
--- /dev/null
+++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/ConcurrencyBlock.cs
@@ -0,0 +1,40 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Threading;
+
+namespace System.Security.Cryptography
+{
+ internal struct ConcurrencyBlock
+ {
+ private int _count;
+
+ internal static Scope Enter(ref ConcurrencyBlock block)
+ {
+ int count = Interlocked.Increment(ref block._count);
+
+ if (count != 1)
+ {
+ Interlocked.Decrement(ref block._count);
+ throw new CryptographicException(SR.Cryptography_ConcurrentUseNotSupported);
+ }
+
+ return new Scope(ref block._count);
+ }
+
+ internal ref struct Scope
+ {
+ private ref int _parentCount;
+
+ internal Scope(ref int parentCount)
+ {
+ _parentCount = ref parentCount;
+ }
+
+ internal void Dispose()
+ {
+ Interlocked.Decrement(ref _parentCount);
+ }
+ }
+ }
+}
diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/HashProviderDispenser.OpenSsl.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/HashProviderDispenser.OpenSsl.cs
index a048496fc3f78..ef15a1736b6bc 100644
--- a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/HashProviderDispenser.OpenSsl.cs
+++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/HashProviderDispenser.OpenSsl.cs
@@ -102,6 +102,7 @@ private sealed class EvpHashProvider : HashProvider
{
private readonly LiteHash _liteHash;
private bool _running;
+ private ConcurrencyBlock _block;
public EvpHashProvider(string hashAlgorithmId)
{
@@ -110,21 +111,30 @@ public EvpHashProvider(string hashAlgorithmId)
public override void AppendHashData(ReadOnlySpan data)
{
- _liteHash.Append(data);
- _running = true;
+ using (ConcurrencyBlock.Enter(ref _block))
+ {
+ _liteHash.Append(data);
+ _running = true;
+ }
}
public override int FinalizeHashAndReset(Span destination)
{
- int written = _liteHash.Finalize(destination);
- _liteHash.Reset();
- _running = false;
- return written;
+ using (ConcurrencyBlock.Enter(ref _block))
+ {
+ int written = _liteHash.Finalize(destination);
+ _liteHash.Reset();
+ _running = false;
+ return written;
+ }
}
public override int GetCurrentHash(Span destination)
{
- return _liteHash.Current(destination);
+ using (ConcurrencyBlock.Enter(ref _block))
+ {
+ return _liteHash.Current(destination);
+ }
}
public override int HashSizeInBytes => _liteHash.HashSizeInBytes;
@@ -139,10 +149,13 @@ public override void Dispose(bool disposing)
public override void Reset()
{
- if (_running)
+ using (ConcurrencyBlock.Enter(ref _block))
{
- _liteHash.Reset();
- _running = false;
+ if (_running)
+ {
+ _liteHash.Reset();
+ _running = false;
+ }
}
}
}
@@ -151,6 +164,7 @@ private sealed class HmacHashProvider : HashProvider
{
private readonly LiteHmac _liteHmac;
private bool _running;
+ private ConcurrencyBlock _block;
public HmacHashProvider(string hashAlgorithmId, ReadOnlySpan key)
{
@@ -159,21 +173,30 @@ public HmacHashProvider(string hashAlgorithmId, ReadOnlySpan key)
public override void AppendHashData(ReadOnlySpan data)
{
- _liteHmac.Append(data);
- _running = true;
+ using (ConcurrencyBlock.Enter(ref _block))
+ {
+ _liteHmac.Append(data);
+ _running = true;
+ }
}
public override int FinalizeHashAndReset(Span destination)
{
- int written = _liteHmac.Finalize(destination);
- _liteHmac.Reset();
- _running = false;
- return written;
+ using (ConcurrencyBlock.Enter(ref _block))
+ {
+ int written = _liteHmac.Finalize(destination);
+ _liteHmac.Reset();
+ _running = false;
+ return written;
+ }
}
public override int GetCurrentHash(Span destination)
{
- return _liteHmac.Current(destination);
+ using (ConcurrencyBlock.Enter(ref _block))
+ {
+ return _liteHmac.Current(destination);
+ }
}
public override int HashSizeInBytes => _liteHmac.HashSizeInBytes;
@@ -188,10 +211,13 @@ public override void Dispose(bool disposing)
public override void Reset()
{
- if (_running)
+ using (ConcurrencyBlock.Enter(ref _block))
{
- _liteHmac.Reset();
- _running = false;
+ if (_running)
+ {
+ _liteHmac.Reset();
+ _running = false;
+ }
}
}
}
diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c
index c7d47719714de..620dc135d50f2 100644
--- a/src/mono/mono/mini/interp/interp.c
+++ b/src/mono/mono/mini/interp/interp.c
@@ -4016,6 +4016,8 @@ mono_interp_exec_method (InterpFrame *frame, ThreadContext *context, FrameClause
// Not created from interpreted code
g_assert (del->method);
del_imethod = mono_interp_get_imethod (del->method);
+ if (del->target && m_method_is_virtual (del->method))
+ del_imethod = get_virtual_method (del_imethod, del->target->vtable);
del->interp_method = del_imethod;
del->interp_invoke_impl = del_imethod;
} else {
diff --git a/src/mono/mono/mini/jit-icalls.c b/src/mono/mono/mini/jit-icalls.c
index 24ec1b65dcf56..be43a91fdba75 100644
--- a/src/mono/mono/mini/jit-icalls.c
+++ b/src/mono/mono/mini/jit-icalls.c
@@ -1450,7 +1450,8 @@ mono_gsharedvt_constrained_call (gpointer mp, MonoMethod *cmethod, MonoClass *kl
break;
case MONO_GSHAREDVT_CONSTRAINT_CALL_TYPE_REF:
/* Calling a ref method with a ref receiver */
- this_arg = *(gpointer*)mp;
+ /* Static calls don't have this arg */
+ this_arg = m_method_is_static (cmethod) ? NULL : *(gpointer*)mp;
m = info->method;
break;
default:
diff --git a/src/mono/mono/mini/method-to-ir.c b/src/mono/mono/mini/method-to-ir.c
index eb0ab5f4e296c..2dbb57653f302 100644
--- a/src/mono/mono/mini/method-to-ir.c
+++ b/src/mono/mono/mini/method-to-ir.c
@@ -3884,13 +3884,8 @@ handle_constrained_gsharedvt_call (MonoCompile *cfg, MonoMethod *cmethod, MonoMe
int addr_reg;
if (mini_is_gsharedvt_type (fsig->params [i])) {
- MonoInst *is_deref;
- int deref_arg_reg;
ins = mini_emit_get_gsharedvt_info_klass (cfg, mono_class_from_mono_type_internal (fsig->params [i]), MONO_RGCTX_INFO_CLASS_BOX_TYPE);
- deref_arg_reg = alloc_preg (cfg);
- /* deref_arg = BOX_TYPE != MONO_GSHAREDVT_BOX_TYPE_VTYPE */
- EMIT_NEW_BIALU_IMM (cfg, is_deref, OP_ISUB_IMM, deref_arg_reg, ins->dreg, 1);
- MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREI1_MEMBASE_REG, is_gsharedvt_ins->dreg, i, is_deref->dreg);
+ MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREI1_MEMBASE_REG, is_gsharedvt_ins->dreg, i, ins->dreg);
} else if (has_gsharedvt) {
MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STOREI1_MEMBASE_IMM, is_gsharedvt_ins->dreg, i, 0);
}
diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/BuildEnvironment.cs b/src/mono/wasm/Wasm.Build.Tests/Common/BuildEnvironment.cs
index 21feaea66f28e..0674991bc1d3a 100644
--- a/src/mono/wasm/Wasm.Build.Tests/Common/BuildEnvironment.cs
+++ b/src/mono/wasm/Wasm.Build.Tests/Common/BuildEnvironment.cs
@@ -30,7 +30,7 @@ public class BuildEnvironment
public static readonly string RelativeTestAssetsPath = @"..\testassets\";
public static readonly string TestAssetsPath = Path.Combine(AppContext.BaseDirectory, "testassets");
public static readonly string TestDataPath = Path.Combine(AppContext.BaseDirectory, "data");
- public static readonly string TmpPath = Path.Combine(AppContext.BaseDirectory, "wbt");
+ public static readonly string TmpPath = Path.Combine(AppContext.BaseDirectory, "wbt artifacts");
public static readonly string DefaultRuntimeIdentifier =
#if TARGET_WASI
diff --git a/src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs b/src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs
index ac71dafe0eb30..329ecbe0b49ca 100644
--- a/src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs
+++ b/src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs
@@ -32,6 +32,6 @@ public void ConfigSrcAbsolutePath(BuildArgs buildArgs, RunHost host, string id)
string bundleDir = Path.Combine(binDir, "AppBundle");
string configSrc = Path.GetFullPath(Path.Combine(bundleDir, "_framework", "blazor.boot.json"));
- RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, extraXHarnessMonoArgs: $"--config-src={configSrc}");
+ RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, extraXHarnessMonoArgs: $"--config-src=\"{configSrc}\"");
}
}
diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs
index 0ea7aaf7bfa8f..3d30a5c841152 100644
--- a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs
+++ b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs
@@ -70,7 +70,7 @@ public void IntermediateBitcodeToObjectFilesAreNotLLVMIR(BuildArgs buildArgs, st
{
string printFileTypeTarget = @"
-
diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs
index 08488d487a615..821fd528e2247 100644
--- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs
+++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs
@@ -277,7 +277,7 @@ private async Task BrowserRunTwiceWithAndThenWithoutBuildAsync(string config, st
.WithWorkingDirectory(workingDir);
await using var runner = new BrowserRunner(_testOutput);
- var page = await runner.RunAsync(runCommand, $"run --no-silent -c {config} --project {projectFile} --forward-console");
+ var page = await runner.RunAsync(runCommand, $"run --no-silent -c {config} --project \"{projectFile}\" --forward-console");
await runner.WaitForExitMessageAsync(TimeSpan.FromMinutes(2));
Assert.Contains("Hello, Browser!", string.Join(Environment.NewLine, runner.OutputLines));
}
@@ -287,7 +287,7 @@ private async Task BrowserRunTwiceWithAndThenWithoutBuildAsync(string config, st
.WithWorkingDirectory(workingDir);
await using var runner = new BrowserRunner(_testOutput);
- var page = await runner.RunAsync(runCommand, $"run --no-silent -c {config} --no-build --project {projectFile} --forward-console");
+ var page = await runner.RunAsync(runCommand, $"run --no-silent -c {config} --no-build --project \"{projectFile}\" --forward-console");
await runner.WaitForExitMessageAsync(TimeSpan.FromMinutes(2));
Assert.Contains("Hello, Browser!", string.Join(Environment.NewLine, runner.OutputLines));
}
@@ -307,7 +307,7 @@ private Task ConsoleRunWithAndThenWithoutBuildAsync(string config, string extraP
string workingDir = runOutsideProjectDirectory ? BuildEnvironment.TmpPath : _projectDir!;
{
- string runArgs = $"run --no-silent -c {config} --project {projectFile}";
+ string runArgs = $"run --no-silent -c {config} --project \"{projectFile}\"";
runArgs += " x y z";
using var cmd = new RunCommand(s_buildEnv, _testOutput, label: id)
.WithWorkingDirectory(workingDir)
@@ -323,7 +323,7 @@ private Task ConsoleRunWithAndThenWithoutBuildAsync(string config, string extraP
{
// Run with --no-build
- string runArgs = $"run --no-silent -c {config} --project {projectFile} --no-build";
+ string runArgs = $"run --no-silent -c {config} --project \"{projectFile}\" --no-build";
runArgs += " x y z";
using var cmd = new RunCommand(s_buildEnv, _testOutput, label: id)
.WithWorkingDirectory(workingDir);
diff --git a/src/mono/wasm/build/WasmApp.Native.targets b/src/mono/wasm/build/WasmApp.Native.targets
index 73e5720abb01e..52b2988f8dd3d 100644
--- a/src/mono/wasm/build/WasmApp.Native.targets
+++ b/src/mono/wasm/build/WasmApp.Native.targets
@@ -415,7 +415,7 @@
-
-
-
+
+
<_HasDotnetWasm Condition="'%(WasmNativeAsset.FileName)%(WasmNativeAsset.Extension)' == 'dotnet.native.wasm'">true
<_HasDotnetJsWorker Condition="'%(WasmNativeAsset.FileName)%(WasmNativeAsset.Extension)' == 'dotnet.native.worker.js'">true
@@ -415,7 +415,7 @@
Outputs="$(WasmAppDir)\.stamp"
Condition="'$(WasmGenerateAppBundle)' == 'true'"
DependsOnTargets="_WasmGenerateRuntimeConfig;_GetWasmGenerateAppBundleDependencies">
-
+
<_WasmAppIncludeThreadsWorker Condition="'$(WasmEnableThreads)' == 'true' or '$(MonoWasmBuildVariant)' == 'multithread'">true
@@ -473,7 +473,7 @@
-
+
-
+
diff --git a/src/tasks/AotCompilerTask/MonoAOTCompiler.cs b/src/tasks/AotCompilerTask/MonoAOTCompiler.cs
index 9e52322770b04..0a761b44a4c8f 100644
--- a/src/tasks/AotCompilerTask/MonoAOTCompiler.cs
+++ b/src/tasks/AotCompilerTask/MonoAOTCompiler.cs
@@ -951,7 +951,7 @@ private PrecompileArguments GetPrecompileArgumentsFor(ITaskItem assemblyItem, st
if (isDedup)
{
foreach (var aItem in _assembliesToCompile!)
- processArgs.Add(aItem.ItemSpec);
+ processArgs.Add($"\"{aItem.ItemSpec}\"");
}
else
{
diff --git a/src/tests/Common/helixpublishwitharcade.proj b/src/tests/Common/helixpublishwitharcade.proj
index db4ce658d6c76..a439693adf213 100644
--- a/src/tests/Common/helixpublishwitharcade.proj
+++ b/src/tests/Common/helixpublishwitharcade.proj
@@ -46,7 +46,6 @@
<_RuntimeVariant>
BundledNETCoreAppPackageVersion
- <_PALTestsDir>
<_SuperPmiCollect>false
@@ -105,7 +104,6 @@
RuntimeVariant=$(_RuntimeVariant);
BundledNETCoreAppPackageVersion=$(BundledNETCoreAppPackageVersion);
HelixRuntimeRid=$(HelixRuntimeRid);
- PALTestsDir=$(_PALTestsDir);
SuperPmiCollect=$(_SuperPmiCollect)
@@ -132,7 +130,6 @@
-
<_Scenarios Include="$(_Scenarios.Split(','))" />
@@ -324,12 +321,6 @@
-
-
-
-
@@ -929,12 +920,6 @@
$(AppleTestTarget)
$([System.TimeSpan]::FromMinutes($(TimeoutPerTestCollectionInMinutes)))
-
-
- $(LegacyPayloadsRootDirectory)paltests.tar.gz
- $(_WorkaroundForNuGetMigrationsForPrepending) ./runpaltestshelix.sh
- $([System.TimeSpan]::FromMinutes($(TimeoutPerTestCollectionInMinutes)))
-
diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_100809/Runtime_100809.cs b/src/tests/JIT/Regression/JitBlue/Runtime_100809/Runtime_100809.cs
new file mode 100644
index 0000000000000..e7c94f11ac2dc
--- /dev/null
+++ b/src/tests/JIT/Regression/JitBlue/Runtime_100809/Runtime_100809.cs
@@ -0,0 +1,23 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Runtime.CompilerServices;
+using Xunit;
+
+public static class Runtime_100809
+{
+ [Fact]
+ public static int TestEntryPoint()
+ {
+ return AlwaysFalse(96) ? -1 : 100;
+ }
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ private static bool AlwaysFalse(int x)
+ {
+ var result = new byte[x];
+ int count = result.Length - 2;
+ return (x < 0 || result.Length - count < 0);
+ }
+}
\ No newline at end of file
diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_100809/Runtime_100809.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_100809/Runtime_100809.csproj
new file mode 100644
index 0000000000000..197767e2c4e24
--- /dev/null
+++ b/src/tests/JIT/Regression/JitBlue/Runtime_100809/Runtime_100809.csproj
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_94467/Runtime_94467.cs b/src/tests/JIT/Regression/JitBlue/Runtime_94467/Runtime_94467.cs
new file mode 100644
index 0000000000000..85aa6e62655d2
--- /dev/null
+++ b/src/tests/JIT/Regression/JitBlue/Runtime_94467/Runtime_94467.cs
@@ -0,0 +1,44 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using Xunit;
+
+public static class Runtime_94467
+{
+ public interface ITypeChecker
+ {
+ static abstract bool Test(T value);
+ }
+
+ public interface IHandler
+ {
+ bool Test(T value);
+ }
+
+ public struct TypeChecker : ITypeChecker
+ {
+ public static bool Test(T value) => true;
+ }
+
+ public class Handler : IHandler where TChecker : ITypeChecker
+ {
+ public bool Test(T value) => TChecker.Test(value);
+ }
+
+ public static IHandler GetHandler() => new Handler();
+
+ [Fact]
+ public static int Test()
+ {
+ try {
+ var handler = GetHandler();
+ if (handler.Test(true) && handler.Test(true))
+ return 100;
+ else
+ return 101;
+ } catch (Exception) {
+ return -1;
+ }
+ }
+}
diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_94467/Runtime_94467.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_94467/Runtime_94467.csproj
new file mode 100644
index 0000000000000..15edd99711a1a
--- /dev/null
+++ b/src/tests/JIT/Regression/JitBlue/Runtime_94467/Runtime_94467.csproj
@@ -0,0 +1,8 @@
+
+
+ True
+
+
+
+
+
\ No newline at end of file