diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml
index 52dfafa0..ebd53881 100644
--- a/.github/workflows/copilot-setup-steps.yml
+++ b/.github/workflows/copilot-setup-steps.yml
@@ -26,7 +26,7 @@ jobs:
# You can define any steps you want, and they will run before the agent starts.
# If you do not check out your code, Copilot will do this for you.
steps:
- - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
fetch-depth: 0 # avoid shallow clone so nbgv can do its work.
- name: โ Install prerequisites
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index d7842636..b1ba5680 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -24,7 +24,7 @@ jobs:
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
fetch-depth: 0 # avoid shallow clone so nbgv can do its work.
- name: โ Install prerequisites
@@ -40,4 +40,4 @@ jobs:
- name: Deploy to GitHub Pages
id: deployment
- uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
+ uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5
diff --git a/.github/workflows/docs_validate.yml b/.github/workflows/docs_validate.yml
index c3e76e55..1b6565df 100644
--- a/.github/workflows/docs_validate.yml
+++ b/.github/workflows/docs_validate.yml
@@ -13,7 +13,7 @@ jobs:
name: ๐ Doc validation
runs-on: ubuntu-24.04
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
fetch-depth: 0 # avoid shallow clone so nbgv can do its work.
- name: ๐ Markup Link Checker (mlc)
diff --git a/.github/workflows/libtemplate-update.yml b/.github/workflows/libtemplate-update.yml
index 1f64e09d..0b111a60 100644
--- a/.github/workflows/libtemplate-update.yml
+++ b/.github/workflows/libtemplate-update.yml
@@ -17,7 +17,7 @@ jobs:
contents: write
pull-requests: write
steps:
- - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
fetch-depth: 0 # avoid shallow clone so nbgv can do its work.
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 5f225fb8..cbe90a6b 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -4,6 +4,7 @@
true
true
+ 2.0.2
2.0.208
@@ -12,10 +13,12 @@
-
+
+
+
+
-
-
+
diff --git a/azure-pipelines/Merge-CodeCoverage.ps1 b/azure-pipelines/Merge-CodeCoverage.ps1
index 32438237..c552d25f 100644
--- a/azure-pipelines/Merge-CodeCoverage.ps1
+++ b/azure-pipelines/Merge-CodeCoverage.ps1
@@ -28,6 +28,7 @@ try {
if ($reports) {
$reports |% { $_.FullName } |% {
# In addition to replacing {reporoot}, we also normalize on one kind of slash so that the report aggregates data for a file whether data was collected on Windows or not.
+ Write-Verbose "Processing $_"
$xml = [xml](Get-Content -LiteralPath $_)
$xml.coverage.packages.package.classes.class |? { $_.filename} |% {
$_.filename = $_.filename.Replace('{reporoot}', $RepoRoot).Replace([IO.Path]::AltDirectorySeparatorChar, [IO.Path]::DirectorySeparatorChar)
diff --git a/azure-pipelines/OptProf.yml b/azure-pipelines/OptProf.yml
deleted file mode 100644
index 515e72a3..00000000
--- a/azure-pipelines/OptProf.yml
+++ /dev/null
@@ -1,125 +0,0 @@
-trigger: none
-pr: none
-schedules:
-- cron: "0 3 * * Fri" # Thu @ 8 or 9 PM Mountain Time (depending on DST)
- displayName: Weekly OptProf run
- branches:
- include:
- - 'v*.*'
- - main
- always: true # we must keep data fresh since optimizationdata drops are purged after 30 days
-
-# Avoid errant CI builds: https://developercommunity.visualstudio.com/content/problem/1154409/azure-pipeline-is-triggering-due-to-events-that-ne.html
-#resources:
-# repositories:
-# - repository: scripts
-# type: git
-# name: DeploymentScripts
-# ref: refs/heads/test
-
-parameters:
- - name: ShouldSkipOptimize
- displayName: Skip OptProf optimization
- type: boolean
- default: false # Should usually be false so that optprof LKG can apply when tests fail, but may need to be set to true in a manually queued pipeline run if all drops have expired.
-
-variables:
-- template: GlobalVariables.yml
-- name: PublicRelease
- value: false # avoid using nice version since we're building a preliminary/unoptimized package
-- name: IsOptProf
- value: true
-- name: MicroBuild_NuPkgSigningEnabled
- value: false # test-signed nuget packages fail to restore in the VS insertion PR validations. Just don't sign them *at all*.
-
-stages:
-- stage: Library
- variables:
- - name: OptProf
- value: true
- - template: BuildStageVariables.yml
- jobs:
- - template: build.yml
- parameters:
- Is1ESPT: false
- RealSign: false
- windowsPool: VSEngSS-MicroBuild2022-1ES
- EnableMacOSBuild: false
- ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
- IsOptProf: true
- RunTests: false
- SkipCodesignVerify: true
-- stage: QueueVSBuild
- jobs:
- - job: QueueOptProf
- pool: VSEngSS-MicroBuild2022-1ES
- variables:
- InsertPayloadName: LibraryName
- InsertTopicBranch: team/VS-IDE/LibraryName-OptProf-run-$(Build.BuildId)
- steps:
- - checkout: none # We don't need source from our own repo
- clean: true
-
- # Pipeline YAML does not yet support checking out other repos. So we'll do it by hand.
-# - checkout: scripts # We DO need source from the DeploymentScripts repo
-# clean: true
-# path: $(Agent.TempDirectory)/DeploymentScripts
-# fetchDepth: 1
- - script: 'git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" clone https://devdiv.visualstudio.com/DevDiv/_git/DeploymentScripts --depth 1 --branch test "$(Agent.TempDirectory)/DeploymentScripts"'
- displayName: Download DeploymentScripts repo
-
- - task: DownloadBuildArtifacts@0
- displayName: Download insertion artifacts
- inputs:
- artifactName: VSInsertion-Windows
- downloadPath: $(Agent.TempDirectory)
- - task: DownloadBuildArtifacts@0
- displayName: Download variables artifacts
- inputs:
- artifactName: Variables-Windows
- downloadPath: $(Agent.TempDirectory)
- - task: PowerShell@2
- displayName: Set pipeline variables based on artifacts
- inputs:
- targetType: filePath
- filePath: $(Agent.TempDirectory)/Variables-Windows/_define.ps1
- - task: NuGetCommand@2
- displayName: Push VS-repo packages to VS feed
- inputs:
- command: push
- packagesToPush: $(Agent.TempDirectory)/VSInsertion-Windows/*.nupkg
- publishVstsFeed: 97a41293-2972-4f48-8c0e-05493ae82010 # VS feed
- allowPackageConflicts: true
- - task: MicroBuildInsertVsPayload@5
- displayName: Insert VS Payload
- inputs:
- TeamName: $(TeamName)
- TeamEmail: $(TeamEmail)
- SkipCreatePR: true
- CustomScriptExecutionCommand: src\VSSDK\NuGet\AllowUnstablePackages.ps1
- ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
- ConnectedVSDropServiceName: 'VSEng-VSDrop-MI'
- env:
- SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- - task: benjhuser.tfs-extensions-build-tasks.trigger-build-task.TriggerBuild@3
- displayName: Trigger a new build of DD-CB-TestSignVS-devCI
- inputs:
- buildDefinition: DD-CB-TestSignVS-devCI
- useSameBranch: false
- branchToUse: $(InsertTopicBranch)
- storeInEnvironmentVariable: true
- queueBuildForUserThatTriggeredBuild: false
- authenticationMethod: OAuth Token
- password: $(System.AccessToken)
- - task: PowerShell@2
- displayName: Associate InsertionOutputs artifacts with CloudBuild
- inputs:
- targetType: filePath
- filePath: $(Agent.TempDirectory)/DeploymentScripts/Scripts/Insertion/WriteArtifact.ps1
- arguments: '-oldBuildID $(Build.BuildId) -newBuildID $(TriggeredBuildIds) -artifactName "InsertionOutputs" -accessToken $(System.AccessToken)'
- - task: PowerShell@2
- displayName: Tag the build with LibraryName-insertion
- inputs:
- targetType: filePath
- filePath: $(Agent.TempDirectory)/DeploymentScripts/Scripts/Insertion/TagBuild.ps1
- arguments: '-buildID $(TriggeredBuildIds) -tagName "LibraryName-insertion" -accessToken $(System.AccessToken)'
diff --git a/azure-pipelines/OptProf_part2.yml b/azure-pipelines/OptProf_part2.yml
deleted file mode 100644
index c59d6999..00000000
--- a/azure-pipelines/OptProf_part2.yml
+++ /dev/null
@@ -1,91 +0,0 @@
-trigger: none
-pr: none
-
-resources:
- pipelines:
- - pipeline: VisualStudioBuildUnderTest
- source: DD-CB-TestSignVS-devCI
- trigger:
- tags:
- - LibraryName-insertion
- - pipeline: DartLab
- source: DartLab
- branch: main
- - pipeline: DartLab.OptProf
- source: DartLab.OptProf
- branch: main
- tags:
- - production
- repositories:
- - repository: DartLabTemplates
- type: git
- name: DartLab.Templates
- ref: refs/heads/main
- - repository: DartLabOptProfTemplates
- type: git
- name: DartLab.OptProf
- ref: refs/tags/Production
-
-parameters:
-
-# The prefix naming of the OptimizationInputs drop
-- name: optimizationDropPrefix
- type: string
- default: OptimizationInputs/$(System.TeamProject)/$(Build.Repository.Name)
-
-stages:
-- template: \templates\stages\visual-studio\single-runsettings.yml@DartLabOptProfTemplates
- parameters:
- ##### Required #####
- runSettingsURI: $(Pipeline.Workspace)\VisualStudioBuildUnderTest\BuildArtifacts\runsettings\LibraryName.OptProf.runsettings
- visualStudioBootstrapperURI: https://vsdrop.corp.microsoft.com/file/v1/$(VisualStudio.BuildUnderTest.ProductsDropName);bootstrappers/Enterprise/vs_enterprise.exe
- ##### Optional #####
- name: OptProfProfilingWorkflow
- displayName: OptProf Profiling Workflow
- optOptimizationInputsDropName: $(OptimizationInputsDropName)
- previousOptimizationInputsDropName: $(PreviousOptimizationInputsDropName)
- testLabPoolName: VS-Platform
- ##### Step Hooks #####
- preTestMachineConfigurationStepList:
- - download: VisualStudioBuildUnderTest
- - task: PowerShell@2
- name: SetProductsDropName
- displayName: Set 'VisualStudio.BuildUnderTest.ProductsDropName'
- inputs:
- filePath: $(DartLab.Path)\Scripts\VisualStudio\Build\Get-VisualStudioDropName.ps1
- arguments: -DropNamePrefix 'Products' -VstsDropUrlsJson '$(Pipeline.Workspace)\VisualStudioBuildUnderTest\BuildArtifacts\VstsDropUrls.json' -OutVariableName 'VisualStudio.BuildUnderTest.ProductsDropName'
- preDeployAndRunTestsStepList:
- - download: VisualStudioBuildUnderTest
- prePublishOptimizationInputsDropStepList:
- # Set parameter for PreviousOptimizationInputsDropName, MicroBuildCommitID, and OptimizationInputsDropName
- - powershell: |
- try {
- $artifactName = 'InsertionOutputs'
- $BuildID = $(resources.pipeline.VisualStudioBuildUnderTest.runID)
- $artifact = Get-BuildArtifact -InstanceURL 'https://dev.azure.com/devdiv' -ProjectName 'DevDiv' -BuildID $BuildID -ArtifactName $artifactName -OAuthAccessToken (ConvertTo-SecureString '$(System.AccessToken)' -AsPlainText -Force)
- $containerName = $artifact.Resource.Data -Split '/' | Select-Object -Last 1
- $fileName = Join-Path $containerName 'Metadata.json'
- $jsonString = Read-BuildArtifactFile -InstanceURL 'https://dev.azure.com/devdiv' -ProjectName 'DevDiv' -BuildID $BuildID -ArtifactName $artifactName -FileName $fileName -OAuthAccessToken (ConvertTo-SecureString '$(System.AccessToken)' -AsPlainText -Force)
- $json = $jsonString | ConvertFrom-Json
-
- Write-Host "The content of the metadata.json file was $json"
-
- $dropname = $json.OptimizationData
- $commitID = $json.CommitID
- $OptimizationInputsDropName = "${{parameters.optimizationDropPrefix}}/$($commitID)/$(Build.BuildId)/$(System.StageId)/$(System.StageAttempt)"
-
- Write-Host "PreviousOptimizationInputsDropName: $dropname"
- Set-AzurePipelinesVariable 'PreviousOptimizationInputsDropName' $dropname
-
- Write-Host "MicroBuildCommitID: $commitID"
- Set-AzurePipelinesVariable 'MicroBuildCommitID' $commitID
-
- Write-Host "OptimizationInputsDropName: $OptimizationInputsDropName"
- Set-AzurePipelinesVariable 'OptimizationInputsDropName' $OptimizationInputsDropName
- }
- catch {
- Write-Host $_
- Write-Error "Failed to set OptimizationInputsDropName pipeline variable"
- throw
- }
- displayName: Set MicroBuildCommitID, PreviousOptimizationInputsDropName, and OptimizationInputsDropName
diff --git a/azure-pipelines/archive-sourcecode.yml b/azure-pipelines/archive-sourcecode.yml
index 7f35de40..ee349e5b 100644
--- a/azure-pipelines/archive-sourcecode.yml
+++ b/azure-pipelines/archive-sourcecode.yml
@@ -38,7 +38,7 @@ extends:
settings:
networkIsolationPolicy: Permissive,CFSClean
sdl:
- sourceAnalysisPool: VSEngSS-MicroBuild2022-1ES
+ sourceAnalysisPool: VSEng-MicroBuildVSStable
stages:
- stage: archive
diff --git a/azure-pipelines/build.yml b/azure-pipelines/build.yml
index 36f258cf..7134e749 100644
--- a/azure-pipelines/build.yml
+++ b/azure-pipelines/build.yml
@@ -69,12 +69,6 @@ parameters:
type: boolean
default: false
-# Whether this particular run is an OptProf profiling run.
-# This is used to skip unit tests and other non-essential work to improve reliability of the OptProf pipeline.
-- name: IsOptProf
- type: boolean
- default: false
-
- name: RunTests
type: boolean
default: true
@@ -104,15 +98,15 @@ parameters:
- name: windowsPool
type: object
default:
- vmImage: windows-2022
+ vmImage: windows-2025
- name: linuxPool
type: object
default:
- vmImage: ubuntu-22.04
+ vmImage: ubuntu-24.04
- name: macOSPool
type: object
default:
- vmImage: macOS-14
+ vmImage: macOS-15
jobs:
- job: Windows
@@ -139,8 +133,11 @@ jobs:
optprof:
enabled: ${{ parameters.EnableOptProf }}
ProfilingInputsDropName: $(ProfilingInputsDropName)
- OptimizationInputsLookupMethod: DropPrefix
- DropNamePrefix: OptimizationInputs/$(System.TeamProject)/$(Build.Repository.Name)
+ GeneratePropsFile: true
+ PropsPath: $(Build.ArtifactStagingDirectory)/InsertionOutputs/$(ProfilingInputsPropsName)
+ OptimizationInputsLookupMethod: GitTagRepo
+ GitTagProject: DevDiv
+ GitTagRepo: VS
ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
AccessToken: $(System.AccessToken)
mbpresteps:
@@ -148,8 +145,10 @@ jobs:
fetchDepth: 0 # avoid shallow clone so nbgv can do its work.
clean: true
- ${{ if parameters.EnableOptProf }}:
- - powershell: Write-Host "##vso[task.setvariable variable=PROFILINGINPUTSDROPNAME]$(tools/variables/ProfilingInputsDropName.ps1)"
- displayName: โ Set ProfilingInputsDropName for optprof
+ - powershell: |
+ Write-Host "##vso[task.setvariable variable=PROFILINGINPUTSDROPNAME]$(tools/variables/ProfilingInputsDropName.ps1)"
+ Write-Host "##vso[task.setvariable variable=PROFILINGINPUTSPROPSNAME]$(tools/variables/ProfilingInputsPropsName.ps1)"
+ displayName: โ Setting variables for optprof
sdl:
binskim:
analyzeTargetGlob: $(Build.ArtifactStagingDirectory)\symbols-Windows\**
@@ -185,6 +184,15 @@ jobs:
displayName: ๐ข Publish APIScanInputs
targetPath: $(Build.ArtifactStagingDirectory)/APIScanInputs-Windows
artifactName: APIScanInputs
+ - ${{ if parameters.EnableOptProf }}:
+ - output: artifactsDrop
+ displayName: ๐ข Publish to Artifact Services - ProfilingInputs
+ dropServiceURI: https://devdiv.artifacts.visualstudio.com
+ buildNumber: $(ProfilingInputsDropName)
+ sourcePath: $(Build.ArtifactStagingDirectory)\OptProf\ProfilingInputs
+ toLowerCase: false
+ retentionDays: 500
+ condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
steps:
- ${{ if not(parameters.Is1ESPT) }}:
- checkout: self
@@ -204,7 +212,6 @@ jobs:
- template: microbuild.before.yml
parameters:
EnableLocalization: ${{ parameters.EnableLocalization }}
- IsOptProf: ${{ parameters.IsOptProf }}
ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
RealSign: ${{ parameters.RealSign }}
@@ -212,7 +219,6 @@ jobs:
parameters:
Is1ESPT: ${{ parameters.Is1ESPT }}
RunTests: ${{ parameters.RunTests }}
- IsOptProf: ${{ parameters.IsOptProf }}
- ${{ if and(parameters.EnableDotNetFormatCheck, not(parameters.EnableLinuxBuild)) }}:
- script: dotnet format --verify-no-changes
@@ -223,54 +229,52 @@ jobs:
- ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
- template: microbuild.after.yml
parameters:
- IsOptProf: ${{ parameters.IsOptProf }}
SkipCodesignVerify: ${{ parameters.SkipCodesignVerify }}
-- ${{ if not(parameters.IsOptProf) }}:
- - ${{ if parameters.EnableLinuxBuild }}:
- - job: Linux
- pool: ${{ parameters.linuxPool }}
- ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
- templateContext:
- mb:
- ${{ if parameters.RealSign }}:
- signing:
- enabled: false # enable when building unique artifacts on this agent that must be signed
- signType: real
- signWithProd: true
- outputParentDirectory: $(Build.ArtifactStagingDirectory)
- outputs:
- - ${{ each artifact in parameters.artifact_names }}:
- - ${{ if or(ne(artifact.testOnly, 'true'), parameters.RunTests) }}:
- - output: pipelineArtifact
- displayName: ๐ข Publish ${{ artifact.name }}-Linux
- targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Linux
- artifactName: ${{ artifact.name }}-Linux
- ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
- sbomEnabled: true
- - output: pipelineArtifact
- displayName: ๐ข Publish ${{ artifact.name }}-Linux (for failed attempts)
- targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Linux
- artifactName: ${{ artifact.name }}-Linux-$(System.PhaseAttempt)
- ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
- sbomEnabled: true
- condition: failed()
- steps:
- - checkout: self
- fetchDepth: 0 # avoid shallow clone so nbgv can do its work.
- clean: true
- - template: install-dependencies.yml
- - template: dotnet.yml
- parameters:
- Is1ESPT: ${{ parameters.Is1ESPT }}
- RunTests: ${{ parameters.RunTests }}
- BuildRequiresAccessToken: ${{ parameters.RealSign }} # Real signing on non-Windows machines requires passing through access token to build steps that sign
- - ${{ if parameters.EnableDotNetFormatCheck }}:
- - script: dotnet format --verify-no-changes
- displayName: ๐
Verify formatted code
- env:
- dotnetformat: true # part of a workaround for https://github.com/dotnet/sdk/issues/44951
-
+- ${{ if parameters.EnableLinuxBuild }}:
+ - job: Linux
+ pool: ${{ parameters.linuxPool }}
+ ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
+ templateContext:
+ mb:
+ ${{ if parameters.RealSign }}:
+ signing:
+ enabled: false # enable when building unique artifacts on this agent that must be signed
+ signType: real
+ signWithProd: true
+ outputParentDirectory: $(Build.ArtifactStagingDirectory)
+ outputs:
+ - ${{ each artifact in parameters.artifact_names }}:
+ - ${{ if or(ne(artifact.testOnly, 'true'), parameters.RunTests) }}:
+ - output: pipelineArtifact
+ displayName: ๐ข Publish ${{ artifact.name }}-Linux
+ targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Linux
+ artifactName: ${{ artifact.name }}-Linux
+ ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
+ sbomEnabled: true
+ - output: pipelineArtifact
+ displayName: ๐ข Publish ${{ artifact.name }}-Linux (for failed attempts)
+ targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Linux
+ artifactName: ${{ artifact.name }}-Linux-$(System.PhaseAttempt)
+ ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
+ sbomEnabled: true
+ condition: failed()
+ steps:
+ - checkout: self
+ fetchDepth: 0 # avoid shallow clone so nbgv can do its work.
+ clean: true
+ - template: install-dependencies.yml
+ - template: dotnet.yml
+ parameters:
+ Is1ESPT: ${{ parameters.Is1ESPT }}
+ RunTests: ${{ parameters.RunTests }}
+ BuildRequiresAccessToken: ${{ parameters.RealSign }} # Real signing on non-Windows machines requires passing through access token to build steps that sign
+ - ${{ if parameters.EnableDotNetFormatCheck }}:
+ - script: dotnet format --verify-no-changes
+ displayName: ๐
Verify formatted code
+ env:
+ dotnetformat: true # part of a workaround for https://github.com/dotnet/sdk/issues/44951
+
- ${{ if parameters.EnableMacOSBuild }}:
- job: macOS
pool: ${{ parameters.macOSPool }}
@@ -309,52 +313,52 @@ jobs:
Is1ESPT: ${{ parameters.Is1ESPT }}
RunTests: ${{ parameters.RunTests }}
BuildRequiresAccessToken: ${{ parameters.RealSign }} # Real signing on non-Windows machines requires passing through access token to build steps that sign
-
- - job: WrapUp
- dependsOn:
- - Windows
- - ${{ if parameters.EnableLinuxBuild }}:
- - Linux
- - ${{ if parameters.EnableMacOSBuild }}:
- - macOS
- pool: ${{ parameters.windowsPool }} # Use Windows agent because PublishSymbols task requires it (https://github.com/microsoft/azure-pipelines-tasks/issues/13821).
- condition: succeededOrFailed()
- variables:
- ONEES_ENFORCED_CODEQL_ENABLED: false # CodeQL runs on build jobs, we don't need it here
- ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
- templateContext:
- ${{ if not(parameters.RealSign) }}:
- mb:
- signing: # if the build is test-signed, install the signing plugin so that CSVTestSignPolicy.xml is available
- enabled: true
- zipSources: false
- signType: test
- outputParentDirectory: $(Build.ArtifactStagingDirectory)
- outputs:
- - output: pipelineArtifact
- displayName: ๐ข Publish symbols-legacy
- targetPath: $(Build.ArtifactStagingDirectory)/symbols-legacy
- artifactName: symbols-legacy
- condition: succeededOrFailed()
- steps:
- - checkout: self
- fetchDepth: 0 # avoid shallow clone so nbgv can do its work.
- clean: true
- - template: install-dependencies.yml
- parameters:
- initArgs: -NoRestore
- - template: publish-symbols.yml
+
+- job: WrapUp
+ dependsOn:
+ - Windows
+ - ${{ if parameters.EnableLinuxBuild }}:
+ - Linux
+ - ${{ if parameters.EnableMacOSBuild }}:
+ - macOS
+ pool: ${{ parameters.windowsPool }} # Use Windows agent because PublishSymbols task requires it (https://github.com/microsoft/azure-pipelines-tasks/issues/13821).
+ condition: succeededOrFailed()
+ variables:
+ ONEES_ENFORCED_CODEQL_ENABLED: false # CodeQL runs on build jobs, we don't need it here
+ ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
+ templateContext:
+ ${{ if not(parameters.RealSign) }}:
+ mb:
+ signing: # if the build is test-signed, install the signing plugin so that CSVTestSignPolicy.xml is available
+ enabled: true
+ zipSources: false
+ signType: test
+ outputParentDirectory: $(Build.ArtifactStagingDirectory)
+ outputs:
+ - output: pipelineArtifact
+ displayName: ๐ข Publish symbols-legacy
+ targetPath: $(Build.ArtifactStagingDirectory)/symbols-legacy
+ artifactName: symbols-legacy
+ condition: succeededOrFailed()
+ steps:
+ - checkout: self
+ fetchDepth: 0 # avoid shallow clone so nbgv can do its work.
+ clean: true
+ - template: install-dependencies.yml
+ parameters:
+ initArgs: -NoRestore
+ - template: publish-symbols.yml
+ parameters:
+ EnableLinuxBuild: ${{ parameters.EnableLinuxBuild }}
+ EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}
+ - ${{ if and(parameters.RunTests, parameters.PublishCodeCoverage) }}:
+ - template: publish-codecoverage.yml
parameters:
EnableLinuxBuild: ${{ parameters.EnableLinuxBuild }}
EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}
- - ${{ if and(parameters.RunTests, parameters.PublishCodeCoverage) }}:
- - template: publish-codecoverage.yml
- parameters:
- EnableLinuxBuild: ${{ parameters.EnableLinuxBuild }}
- EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}
- - ${{ if parameters.EnableAPIScan }}:
- - template: apiscan.yml
- parameters:
- windowsPool: ${{ parameters.windowsPool }}
- RealSign: ${{ parameters.RealSign }}
+- ${{ if parameters.EnableAPIScan }}:
+ - template: apiscan.yml
+ parameters:
+ windowsPool: ${{ parameters.windowsPool }}
+ RealSign: ${{ parameters.RealSign }}
diff --git a/azure-pipelines/dotnet.yml b/azure-pipelines/dotnet.yml
index b1f7625d..b67b4a62 100644
--- a/azure-pipelines/dotnet.yml
+++ b/azure-pipelines/dotnet.yml
@@ -1,8 +1,5 @@
parameters:
- name: RunTests
-- name: IsOptProf
- type: boolean
- default: false
- name: Is1ESPT
type: boolean
- name: BuildRequiresAccessToken
@@ -17,14 +14,9 @@ steps:
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
-- ${{ if not(parameters.IsOptProf) }}:
- - powershell: tools/dotnet-test-cloud.ps1 -Configuration $(BuildConfiguration) -Agent $(Agent.JobName) -PublishResults
- displayName: ๐งช dotnet test
- condition: and(succeeded(), ${{ parameters.RunTests }})
-
-- ${{ if parameters.IsOptProf }}:
- - script: dotnet pack src\VSInsertionMetadata -c $(BuildConfiguration) -warnaserror /bl:"$(Build.ArtifactStagingDirectory)/build_logs/VSInsertion-Pack.binlog"
- displayName: ๐ง dotnet pack VSInsertionMetadata
+- powershell: tools/dotnet-test-cloud.ps1 -Configuration $(BuildConfiguration) -Agent $(Agent.JobName) -PublishResults
+ displayName: ๐งช dotnet test
+ condition: and(succeeded(), ${{ parameters.RunTests }})
- powershell: tools/variables/_define.ps1
failOnStderr: true
diff --git a/azure-pipelines/microbuild.after.yml b/azure-pipelines/microbuild.after.yml
index 67ba9008..c0e1e7bd 100644
--- a/azure-pipelines/microbuild.after.yml
+++ b/azure-pipelines/microbuild.after.yml
@@ -1,7 +1,4 @@
parameters:
-- name: IsOptProf
- type: boolean
- default: false
- name: SkipCodesignVerify
type: boolean
@@ -15,21 +12,3 @@ steps:
TargetFolders: |
$(Build.SourcesDirectory)/bin/Packages/$(BuildConfiguration)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
-
-- ${{ if parameters.IsOptProf }}:
- - task: ms-vscs-artifact.build-tasks.artifactDropTask-1.artifactDropTask@0
- inputs:
- dropServiceURI: https://devdiv.artifacts.visualstudio.com
- buildNumber: $(ProfilingInputsDropName)
- sourcePath: $(Build.ArtifactStagingDirectory)\OptProf\ProfilingInputs
- toLowerCase: false
- usePat: true
- displayName: ๐ข Publish to Artifact Services - ProfilingInputs
- condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
-
- - task: PublishBuildArtifacts@1
- inputs:
- PathtoPublish: $(Build.ArtifactStagingDirectory)/InsertionOutputs
- ArtifactName: InsertionOutputs
- ArtifactType: Container
- displayName: ๐ข Publish InsertionOutputs as Azure DevOps artifacts
diff --git a/azure-pipelines/microbuild.before.yml b/azure-pipelines/microbuild.before.yml
index fd47d1bb..29823532 100644
--- a/azure-pipelines/microbuild.before.yml
+++ b/azure-pipelines/microbuild.before.yml
@@ -2,9 +2,6 @@ parameters:
- name: EnableLocalization
type: boolean
default: false
-- name: IsOptProf
- type: boolean
- default: false
- name: ShouldSkipOptimize
type: boolean
default: false
@@ -12,7 +9,7 @@ parameters:
type: boolean
steps:
-- ${{ if and(not(parameters.IsOptProf), ne(variables['Build.Reason'], 'PullRequest')) }}:
+- ${{ if ne(variables['Build.Reason'], 'PullRequest') }}:
# notice@0 requires CG detection to run first, and non-default branches don't inject it automatically.
# default branch injection (main) is happening too late for notice@0 to run successfully. Adding this as a workaround.
- task: ComponentGovernanceComponentDetection@0
@@ -25,26 +22,3 @@ steps:
outputformat: text
retryCountOnTaskFailure: 10 # fails when the cloud service is overloaded
continueOnError: ${{ not(parameters.RealSign) }} # Tolerate failures when we're not building something that may ship.
-
-- ${{ if parameters.IsOptProf }}:
- # We have to install these plugins ourselves for Optprof runs because those pipelines haven't migrated to 1ES PT yet.
- - task: MicroBuildOptProfPlugin@6
- inputs:
- ProfilingInputsDropName: $(ProfilingInputsDropName)
- OptimizationInputsLookupMethod: DropPrefix
- DropNamePrefix: OptimizationInputs/$(System.TeamProject)/$(Build.Repository.Name)
- ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
- AccessToken: $(System.AccessToken)
- displayName: ๐ง Install OptProf Plugin
-
- - task: MicroBuildSigningPlugin@4
- inputs:
- signType: Test
- zipSources: false
- displayName: ๐ง Install MicroBuild Signing Plugin
-
- - ${{ if parameters.EnableLocalization }}:
- - task: MicroBuildLocalizationPlugin@4
- inputs:
- languages: $(LocLanguages)
- displayName: ๐ง Install MicroBuild Localization Plugin
diff --git a/azure-pipelines/official.yml b/azure-pipelines/official.yml
index 00ecdeda..1e47369c 100644
--- a/azure-pipelines/official.yml
+++ b/azure-pipelines/official.yml
@@ -50,11 +50,11 @@ extends:
settings:
networkIsolationPolicy: Permissive,CFSClean
sdl:
- sourceAnalysisPool: VSEngSS-MicroBuild2022-1ES
+ sourceAnalysisPool: VSEng-MicroBuildVSStable
codeSignValidation:
enabled: true
break: true
- additionalTargetsGlobPattern: -|Variables-*\*.ps1;-|LocBin-*\**;-|APIScanInputs-*\**;-|test_symbols-*\**;-|MicroBuild\**
+ additionalTargetsGlobPattern: -|Variables-*\*.ps1;-|LocBin-*\**;-|APIScanInputs-*\**;-|test_symbols-*\**;-|MicroBuild\**;-|$(Build.ArtifactStagingDirectory)\VSInsertion-Windows\vs-insertion-script.ps1
policheck:
enabled: true
exclusionsFile: $(System.DefaultWorkingDirectory)\azure-pipelines\PoliCheckExclusions.xml
@@ -74,7 +74,7 @@ extends:
RealSign: true
# ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
EnableAPIScan: ${{ parameters.EnableAPIScan }}
- windowsPool: VSEngSS-MicroBuild2022-1ES
+ windowsPool: VSEng-MicroBuildVSStable
linuxPool:
name: AzurePipelines-EO
demands:
@@ -82,7 +82,7 @@ extends:
os: Linux
macOSPool:
name: Azure Pipelines
- vmImage: macOS-14
+ vmImage: macOS-15
os: macOS
EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}
RunTests: ${{ parameters.RunTests }}
diff --git a/azure-pipelines/prepare-insertion-stages.yml b/azure-pipelines/prepare-insertion-stages.yml
index c06c242b..3d67fff1 100644
--- a/azure-pipelines/prepare-insertion-stages.yml
+++ b/azure-pipelines/prepare-insertion-stages.yml
@@ -17,7 +17,7 @@ stages:
- ${{ if parameters.ArchiveSymbols }}:
- job: symbol_archive
displayName: Archive symbols
- pool: VSEngSS-MicroBuild2022-1ES
+ pool: VSEng-MicroBuildVSStable
variables:
ONEES_ENFORCED_CODEQL_ENABLED: false # CodeQL runs on build stages, we don't need it here
steps:
diff --git a/azure-pipelines/release.yml b/azure-pipelines/release.yml
index 7ca3b70b..69a72390 100644
--- a/azure-pipelines/release.yml
+++ b/azure-pipelines/release.yml
@@ -23,7 +23,7 @@ extends:
settings:
networkIsolationPolicy: Permissive,CFSClean
sdl:
- sourceAnalysisPool: VSEngSS-MicroBuild2022-1ES
+ sourceAnalysisPool: VSEng-MicroBuildVSStable
stages:
- stage: release
diff --git a/azure-pipelines/unofficial.yml b/azure-pipelines/unofficial.yml
index ac41f9a5..f55bf7d1 100644
--- a/azure-pipelines/unofficial.yml
+++ b/azure-pipelines/unofficial.yml
@@ -57,7 +57,7 @@ extends:
settings:
networkIsolationPolicy: Permissive,CFSClean
sdl:
- sourceAnalysisPool: VSEngSS-MicroBuild2022-1ES
+ sourceAnalysisPool: VSEng-MicroBuildVSStable
credscan:
enabled: false
suppression:
@@ -66,7 +66,7 @@ extends:
codeSignValidation:
enabled: ${{ parameters.EnableProductionSDL }}
break: true
- additionalTargetsGlobPattern: -|Variables-*\*.ps1;-|APIScanInputs-*\**;-|test_symbols-*\**;-|MicroBuild\**
+ additionalTargetsGlobPattern: -|Variables-*\*.ps1;-|APIScanInputs-*\**;-|test_symbols-*\**;-|MicroBuild\**;-|$(Build.ArtifactStagingDirectory)\VSInsertion-Windows\vs-insertion-script.ps1
policyFile: $(MBSIGN_APPFOLDER)\CSVTestSignPolicy.xml
policheck:
enabled: ${{ parameters.EnableProductionSDL }}
@@ -84,7 +84,7 @@ extends:
RealSign: false
# ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
EnableAPIScan: ${{ parameters.EnableAPIScan }}
- windowsPool: VSEngSS-MicroBuild2022-1ES
+ windowsPool: VSEng-MicroBuildVSStable
linuxPool:
name: AzurePipelines-EO
demands:
@@ -92,7 +92,7 @@ extends:
os: Linux
macOSPool:
name: Azure Pipelines
- vmImage: macOS-14
+ vmImage: macOS-15
os: macOS
EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}
RunTests: ${{ parameters.RunTests }}
diff --git a/azure-pipelines/vs-insertion-script.ps1 b/azure-pipelines/vs-insertion-script.ps1
new file mode 100644
index 00000000..53076254
--- /dev/null
+++ b/azure-pipelines/vs-insertion-script.ps1
@@ -0,0 +1,17 @@
+# List of build artifact files [Source => Destination] to be committed into the VS repo.
+$FilesToCommit = @{
+ "$env:PROFILINGINPUTSPROPSNAME" = "src/Tests/config/runsettings/Official/OptProf/External/$env:PROFILINGINPUTSPROPSNAME";
+}
+
+foreach ($File in $FilesToCommit.GetEnumerator()) {
+ $SourcePath = Join-Path $PSScriptRoot $File.Key
+ if (Test-Path $SourcePath) {
+ $DestinationPath = Join-Path (Get-Location) $File.Value
+ Write-Host "Copying $SourcePath to $DestinationPath"
+ Copy-Item -Path $SourcePath -Destination $DestinationPath
+ git add $DestinationPath
+ }
+ else {
+ Write-Host "$SourcePath is not present, skipping"
+ }
+}
diff --git a/azure-pipelines/vs-insertion.yml b/azure-pipelines/vs-insertion.yml
index c74cd254..0478062c 100644
--- a/azure-pipelines/vs-insertion.yml
+++ b/azure-pipelines/vs-insertion.yml
@@ -25,14 +25,16 @@ extends:
settings:
networkIsolationPolicy: Permissive,CFSClean
sdl:
- sourceAnalysisPool: VSEngSS-MicroBuild2022-1ES
+ sourceAnalysisPool: VSEng-MicroBuildVSStable
+ sbom:
+ enabled: false
stages:
- stage: insertion
jobs:
- job: insertion
displayName: VS insertion
- pool: VSEngSS-MicroBuild2022-1ES
+ pool: VSEng-MicroBuildVSStable
templateContext:
outputParentDirectory: $(Pipeline.Workspace)/CI
steps:
@@ -65,6 +67,7 @@ extends:
InsertionPayloadName: $(Build.Repository.Name) $(Build.BuildNumber)
InsertionBuildPolicies: Request Perf DDRITs
InsertionReviewers: $(Build.RequestedFor),Andrew Arnott
+ CustomScriptExecutionCommand: $(Pipeline.Workspace)\CI\VSInsertion-Windows\vs-insertion-script.ps1
AutoCompletePR: true
AutoCompleteMergeStrategy: Squash
ShallowClone: true
diff --git a/azure-pipelines/vs-validation.yml b/azure-pipelines/vs-validation.yml
index bd6a0aaf..d150fee6 100644
--- a/azure-pipelines/vs-validation.yml
+++ b/azure-pipelines/vs-validation.yml
@@ -29,7 +29,7 @@ extends:
settings:
networkIsolationPolicy: Permissive,CFSClean
sdl:
- sourceAnalysisPool: VSEngSS-MicroBuild2022-1ES
+ sourceAnalysisPool: VSEng-MicroBuildVSStable
credscan:
enabled: false
@@ -46,7 +46,7 @@ extends:
Is1ESPT: true
RealSign: false
# ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
- windowsPool: VSEngSS-MicroBuild2022-1ES
+ windowsPool: VSEng-MicroBuildVSStable
linuxPool:
name: AzurePipelines-EO
demands:
@@ -54,7 +54,7 @@ extends:
os: Linux
macOSPool:
name: Azure Pipelines
- vmImage: macOS-14
+ vmImage: macOS-15
os: macOS
EnableMacOSBuild: false
RunTests: false
@@ -70,7 +70,7 @@ extends:
jobs:
- job: insertion
displayName: VS insertion
- pool: VSEngSS-MicroBuild2022-1ES
+ pool: VSEng-MicroBuildVSStable
steps:
- checkout: self
clean: true
@@ -105,7 +105,7 @@ extends:
InsertionPayloadName: $(Build.Repository.Name) VALIDATION BUILD $(Build.BuildNumber) ($(Build.SourceBranch)) [Skip-SymbolCheck] [Skip-HashCheck] [Skip-SignCheck]
InsertionDescription: |
This PR is for **validation purposes only** for !$(System.PullRequest.PullRequestId). **Do not complete**.
- CustomScriptExecutionCommand: src/VSSDK/NuGet/AllowUnstablePackages.ps1
+ CustomScriptExecutionCommand: $(Pipeline.Workspace)\VSInsertion-Windows\vs-insertion-script.ps1; src\VSSDK\NuGet\AllowUnstablePackages.ps1
InsertionBuildPolicies: Request Perf DDRITs
InsertionReviewers: $(Build.RequestedFor)
DraftPR: false # set to true and update InsertionBuildPolicy when we can specify all the validations we want to run (https://dev.azure.com/devdiv/DevDiv/_workitems/edit/2224288)
diff --git a/global.json b/global.json
index 1868a1d6..e07dd5af 100644
--- a/global.json
+++ b/global.json
@@ -1,9 +1,12 @@
{
"sdk": {
- "version": "10.0.100",
+ "version": "10.0.101",
"rollForward": "patch",
"allowPrerelease": false
},
+ "test": {
+ "runner": "Microsoft.Testing.Platform"
+ },
"msbuild-sdks": {
"Microsoft.Build.NoTargets": "3.7.134"
}
diff --git a/src/OptProf.targets b/src/OptProf.targets
index d0167d7c..0b6cc92c 100644
--- a/src/OptProf.targets
+++ b/src/OptProf.targets
@@ -5,11 +5,8 @@
Common7\IDE\PrivateAssemblies\$(TargetFileName)
/ExeConfig:"%VisualStudio.InstallationUnderTest.Path%\Common7\IDE\vsn.exe"
-
-
-
+
-
diff --git a/src/VSInsertionMetadata/Microsoft.VisualStudio.Validation.VSInsertionMetadata.proj b/src/VSInsertionMetadata/Microsoft.VisualStudio.Validation.VSInsertionMetadata.proj
deleted file mode 100644
index 0caaedb9..00000000
--- a/src/VSInsertionMetadata/Microsoft.VisualStudio.Validation.VSInsertionMetadata.proj
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
- netstandard2.0
- true
- $(RepoRootPath)bin\Packages\$(Configuration)\VSRepo\
- false
- false
- Contains metadata for insertion into VS.
-
-
-
diff --git a/src/VSInsertionMetadata/ProfilingInputs.props b/src/VSInsertionMetadata/ProfilingInputs.props
deleted file mode 100644
index fb19d604..00000000
--- a/src/VSInsertionMetadata/ProfilingInputs.props
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/src/VSInsertionMetadata/VSInsertionMetadata.targets b/src/VSInsertionMetadata/VSInsertionMetadata.targets
deleted file mode 100644
index 84ebb5a8..00000000
--- a/src/VSInsertionMetadata/VSInsertionMetadata.targets
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- $(TargetsForTfmSpecificContentInPackage);
- SubstituteProfilingInputsMacro;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- $(PackageVersion).$(Build_BuildId)
-
-
-
-
-
-
diff --git a/test/Directory.Build.props b/test/Directory.Build.props
index 395359dd..466be54e 100644
--- a/test/Directory.Build.props
+++ b/test/Directory.Build.props
@@ -5,6 +5,7 @@
false
true
+ true
diff --git a/test/Directory.Build.targets b/test/Directory.Build.targets
index 9f32cd06..3758bb8c 100644
--- a/test/Directory.Build.targets
+++ b/test/Directory.Build.targets
@@ -1,5 +1,11 @@
+
+
+
+
+
+
diff --git a/test/Microsoft.VisualStudio.Validation.Tests/Microsoft.VisualStudio.Validation.Tests.csproj b/test/Microsoft.VisualStudio.Validation.Tests/Microsoft.VisualStudio.Validation.Tests.csproj
index 99b5bad5..f919c0a9 100644
--- a/test/Microsoft.VisualStudio.Validation.Tests/Microsoft.VisualStudio.Validation.Tests.csproj
+++ b/test/Microsoft.VisualStudio.Validation.Tests/Microsoft.VisualStudio.Validation.Tests.csproj
@@ -5,10 +5,8 @@
Exe
-
-
-
+
diff --git a/tools/Install-DotNetSdk.ps1 b/tools/Install-DotNetSdk.ps1
index 3d13e817..590581e2 100755
--- a/tools/Install-DotNetSdk.ps1
+++ b/tools/Install-DotNetSdk.ps1
@@ -125,14 +125,14 @@ Function Get-InstallerExe(
}
if ($TypedVersion.Build -eq -1) {
- $versionInfo = -Split (Invoke-WebRequest -Uri "https://dotnetcli.blob.core.windows.net/dotnet/$sku/$Version/latest.version" -UseBasicParsing)
+ $versionInfo = -Split (Invoke-WebRequest -Uri "https://builds.dotnet.microsoft.com/dotnet/$sku/$Version/latest.version" -UseBasicParsing)
$Version = $versionInfo[-1]
}
$majorMinor = "$($TypedVersion.Major).$($TypedVersion.Minor)"
$ReleasesFile = Join-Path $DotNetInstallScriptRoot "$majorMinor\releases.json"
if (!(Test-Path $ReleasesFile)) {
- Get-FileFromWeb -Uri "https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/$majorMinor/releases.json" -OutDir (Split-Path $ReleasesFile) | Out-Null
+ Get-FileFromWeb -Uri "https://builds.dotnet.microsoft.com/dotnet/release-metadata/$majorMinor/releases.json" -OutDir (Split-Path $ReleasesFile) | Out-Null
}
$releases = Get-Content $ReleasesFile | ConvertFrom-Json
diff --git a/tools/artifacts/VSInsertion.ps1 b/tools/artifacts/VSInsertion.ps1
index a5b940b5..700b24f6 100644
--- a/tools/artifacts/VSInsertion.ps1
+++ b/tools/artifacts/VSInsertion.ps1
@@ -19,6 +19,10 @@ if (!$BuildConfiguration) {
$PackagesRoot = "$RepoRoot/bin/Packages/$BuildConfiguration"
$NuGetPackages = "$PackagesRoot/NuGet"
$VsixPackages = "$PackagesRoot/Vsix"
+$AzurePipelinesPath = "$RepoRoot/azure-pipelines"
+if ($env:BUILD_ARTIFACTSTAGINGDIRECTORY) {
+ $InsertionOutputs = "$env:BUILD_ARTIFACTSTAGINGDIRECTORY/InsertionOutputs"
+}
if (!(Test-Path $NuGetPackages) -and !(Test-Path $VsixPackages)) {
Write-Warning "Skipping because NuGet and VSIX packages haven't been built yet."
@@ -26,16 +30,16 @@ if (!(Test-Path $NuGetPackages) -and !(Test-Path $VsixPackages)) {
}
$result = @{
- "$NuGetPackages" = (Get-ChildItem $NuGetPackages -Recurse)
+ "$AzurePipelinesPath" = (Get-ChildItem "$AzurePipelinesPath/vs-insertion-script.ps1");
+ "$NuGetPackages" = (Get-ChildItem $NuGetPackages -Recurse);
}
if (Test-Path $VsixPackages) {
$result["$PackagesRoot"] += Get-ChildItem $VsixPackages -Recurse
}
-if ($env:IsOptProf) {
- $VSRepoPackages = "$PackagesRoot/VSRepo"
- $result["$VSRepoPackages"] = (Get-ChildItem "$VSRepoPackages\*.VSInsertionMetadata.*.nupkg");
+if ($InsertionOutputs -and $env:PROFILINGINPUTSPROPSNAME -and (Test-Path "$InsertionOutputs/$env:PROFILINGINPUTSPROPSNAME")) {
+ $result[$InsertionOutputs] = (Get-ChildItem "$InsertionOutputs/$env:PROFILINGINPUTSPROPSNAME"); # OptProf ProfilingInputs
}
$result
diff --git a/tools/artifacts/coverageResults.ps1 b/tools/artifacts/coverageResults.ps1
index 8c68216e..1aadbb74 100644
--- a/tools/artifacts/coverageResults.ps1
+++ b/tools/artifacts/coverageResults.ps1
@@ -1,25 +1,26 @@
-$RepoRoot = [System.IO.Path]::GetFullPath("$PSScriptRoot\..\..")
+$RepoRoot = Resolve-Path "$PSScriptRoot\..\.."
-$coverageFiles = @(Get-ChildItem "$RepoRoot/test/*.cobertura.xml" -Recurse | Where {$_.FullName -notlike "*/In/*" -and $_.FullName -notlike "*\In\*" })
+$coverageFilesUnderRoot = @(Get-ChildItem "$RepoRoot/*.cobertura.xml" -Recurse | Where-Object {$_.FullName -notlike "*/In/*" -and $_.FullName -notlike "*\In\*" })
+
+# Under MTP, coverage files are written directly to the artifacts output directory,
+# so we need to look there too.
+$ArtifactStagingFolder = & "$PSScriptRoot/../Get-ArtifactsStagingDirectory.ps1"
+$directTestLogs = Join-Path $ArtifactStagingFolder test_logs
+$coverageFilesUnderArtifacts = if (Test-Path $directTestLogs) { @(Get-ChildItem "$directTestLogs/*.cobertura.xml" -Recurse) } else { @() }
# Prepare code coverage reports for merging on another machine
-$repoRoot = $env:SYSTEM_DEFAULTWORKINGDIRECTORY
-if (!$repoRoot) { $repoRoot = $env:GITHUB_WORKSPACE }
-if ($repoRoot) {
- Write-Host "Substituting $repoRoot with `"{reporoot}`""
- $coverageFiles |% {
- $content = Get-Content -LiteralPath $_ |% { $_ -Replace [regex]::Escape($repoRoot), "{reporoot}" }
- Set-Content -LiteralPath $_ -Value $content -Encoding UTF8
- }
-} else {
- Write-Warning "coverageResults: Cloud build not detected. Machine-neutral token replacement skipped."
+Write-Host "Substituting $repoRoot with `"{reporoot}`""
+@($coverageFilesUnderRoot + $coverageFilesUnderArtifacts) |? { $_ }|% {
+ $content = Get-Content -LiteralPath $_ |% { $_ -Replace [regex]::Escape($repoRoot), "{reporoot}" }
+ Set-Content -LiteralPath $_ -Value $content -Encoding UTF8
}
if (!((Test-Path $RepoRoot\bin) -and (Test-Path $RepoRoot\obj))) { return }
@{
+ $directTestLogs = $coverageFilesUnderArtifacts;
$RepoRoot = (
- $coverageFiles +
+ $coverageFilesUnderRoot +
(Get-ChildItem "$RepoRoot\obj\*.cs" -Recurse)
);
}
diff --git a/tools/artifacts/testResults.ps1 b/tools/artifacts/testResults.ps1
index 5310fb52..a841967e 100644
--- a/tools/artifacts/testResults.ps1
+++ b/tools/artifacts/testResults.ps1
@@ -4,7 +4,8 @@ Param(
$result = @{}
-$testRoot = Resolve-Path "$PSScriptRoot\..\..\test"
+$RepoRoot = Resolve-Path "$PSScriptRoot\..\.."
+$testRoot = Join-Path $RepoRoot test
$result[$testRoot] = (Get-ChildItem "$testRoot\TestResults" -Recurse -Directory | Get-ChildItem -Recurse -File)
$artifactStaging = & "$PSScriptRoot/../Get-ArtifactsStagingDirectory.ps1"
diff --git a/tools/dotnet-test-cloud.ps1 b/tools/dotnet-test-cloud.ps1
index 02891d97..9b48178c 100644
--- a/tools/dotnet-test-cloud.ps1
+++ b/tools/dotnet-test-cloud.ps1
@@ -25,6 +25,7 @@ Param(
$RepoRoot = (Resolve-Path "$PSScriptRoot/..").Path
$ArtifactStagingFolder = & "$PSScriptRoot/Get-ArtifactsStagingDirectory.ps1"
+$OnCI = ($env:CI -or $env:TF_BUILD)
$dotnet = 'dotnet'
if ($x86) {
@@ -45,23 +46,55 @@ if ($x86) {
}
$testBinLog = Join-Path $ArtifactStagingFolder (Join-Path build_logs test.binlog)
-$testDiagLog = Join-Path $ArtifactStagingFolder (Join-Path test_logs diag.log)
+$testLogs = Join-Path $ArtifactStagingFolder test_logs
-& $dotnet test $RepoRoot `
- --no-build `
- -c $Configuration `
- --filter "TestCategory!=FailsInCloudTest" `
- --collect "Code Coverage;Format=cobertura" `
- --settings "$PSScriptRoot/test.runsettings" `
- --blame-hang-timeout 60s `
- --blame-crash `
- -bl:"$testBinLog" `
- --diag "$testDiagLog;TraceLevel=info" `
- --logger trx `
+$globalJson = Get-Content $PSScriptRoot/../global.json | ConvertFrom-Json
+$isMTP = $globalJson.test.runner -eq 'Microsoft.Testing.Platform'
+if ($isMTP) {
+ $extraArgs = @()
+ if ($OnCI) { $extraArgs += '--no-progress' }
+ & $dotnet test --solution $RepoRoot `
+ --no-build `
+ -c $Configuration `
+ -bl:"$testBinLog" `
+ --filter-not-trait 'TestCategory=FailsInCloudTest' `
+ --coverage `
+ --coverage-output-format cobertura `
+ --coverage-settings "$PSScriptRoot/test.runsettings" `
+ --hangdump `
+ --hangdump-timeout 60s `
+ --crashdump `
+ --diagnostic `
+ --diagnostic-output-directory $testLogs `
+ --diagnostic-verbosity Information `
+ --results-directory $testLogs `
+ --report-trx `
+ @extraArgs
+
+ $trxFiles = Get-ChildItem -Recurse -Path $testLogs\*.trx
+} else {
+ $testDiagLog = Join-Path $ArtifactStagingFolder (Join-Path test_logs diag.log)
+ & $dotnet test $RepoRoot `
+ --no-build `
+ -c $Configuration `
+ --filter "TestCategory!=FailsInCloudTest" `
+ --collect "Code Coverage;Format=cobertura" `
+ --settings "$PSScriptRoot/test.runsettings" `
+ --blame-hang-timeout 60s `
+ --blame-crash `
+ -bl:"$testBinLog" `
+ --diag "$testDiagLog;TraceLevel=info" `
+ --logger trx
+
+ $trxFiles = Get-ChildItem -Recurse -Path $RepoRoot\test\*.trx
+}
$unknownCounter = 0
-Get-ChildItem -Recurse -Path $RepoRoot\test\*.trx |% {
- Copy-Item $_ -Destination $ArtifactStagingFolder/test_logs/
+$trxFiles |% {
+ New-Item $testLogs -ItemType Directory -Force | Out-Null
+ if (!($_.FullName.StartsWith($testLogs))) {
+ Copy-Item $_ -Destination $testLogs
+ }
if ($PublishResults) {
$x = [xml](Get-Content -LiteralPath $_)
diff --git a/tools/variables/ProfilingInputsPropsName.ps1 b/tools/variables/ProfilingInputsPropsName.ps1
new file mode 100644
index 00000000..e66cce0c
--- /dev/null
+++ b/tools/variables/ProfilingInputsPropsName.ps1
@@ -0,0 +1,6 @@
+if ($env:SYSTEM_TEAMPROJECT) {
+ $repoName = $env:BUILD_REPOSITORY_NAME.Replace('/', '.')
+ "$env:SYSTEM_TEAMPROJECT.$repoName.props"
+} else {
+ Write-Warning "No Azure Pipelines build detected. No Azure Pipelines drop name will be computed."
+}