Skip to content

Commit c0160f5

Browse files
committed
Struct out PGO scripts and jobs borrowed from MUX
1 parent 2559ed6 commit c0160f5

23 files changed

+569
-62
lines changed

.vscode/settings.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,9 @@
4141
"**/obj/**": true,
4242
"**/packages/**": true,
4343
"**/generated files/**": true
44-
}
44+
},
45+
"vscode-nmake-tools.workspaceBuildDirectories": [
46+
"d:\\src\\terminal"
47+
],
48+
"C_Cpp.default.configurationProvider": "microsoft.vscode-nmake-tools"
4549
}

build/Helix/RunTestsInHelix.proj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@
1414

1515
<!-- These .proj files are generated by the build machine prior to running tests via GenerateTestProjFile.ps1. -->
1616
<Import Project="$(ProjFilesPath)\RunTestsInHelix-TerminalAppLocalTests.proj" Condition=" '$(TestSuite)'=='DevTestSuite' " />
17+
<Import Project="$(ProjFilesPath)\RunTestsInHelix-SettingsModelLocalTests.proj" Condition=" '$(TestSuite)'=='DevTestSuite' " />
1718
<Import Project="$(ProjFilesPath)\RunTestsInHelix-HostTestsUIA.proj" Condition=" '$(TestSuite)'=='DevTestSuite' " />
1819
</Project>

build/Helix/runtests.cmd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ move te.wtl te_original.wtl
4646

4747
copy /y te_original.wtl %HELIX_WORKITEM_UPLOAD_ROOT%
4848
copy /y WexLogFileOutput\*.jpg %HELIX_WORKITEM_UPLOAD_ROOT%
49-
for /f "tokens=* delims=" %%a in ('dir /b *.pgc') do ren "%%a" "%testnameprefix%.%%~na.pgc"
49+
:: for /f "tokens=* delims=" %%a in ('dir /b *.pgc') do ren "%%a" "%testnameprefix%.%%~na.pgc"
5050
copy /y *.pgc %HELIX_WORKITEM_UPLOAD_ROOT%
5151

5252
set FailedTestQuery=

build/pipelines/pgo.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
trigger: none
2+
pr: none
3+
4+
variables:
5+
- name: runCodesignValidationInjectionBG
6+
value: false
7+
8+
# 0.0.yyMM.dd##
9+
# 0.0.1904.0900
10+
name: 0.0.$(Date:yyMM).$(Date:dd)$(Rev:rr)
11+
12+
stages:
13+
- stage: Build_x64
14+
displayName: Build x64
15+
dependsOn: []
16+
condition: succeeded()
17+
jobs:
18+
- template: ./templates/build-console-pgo.yml
19+
parameters:
20+
platform: x64
21+
- stage: Build_x86
22+
displayName: Build x86
23+
dependsOn: []
24+
jobs:
25+
- template: ./templates/build-console-pgo.yml
26+
parameters:
27+
platform: x86
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
parameters:
2+
configuration: 'Release'
3+
platform: ''
4+
additionalBuildArguments: ''
5+
minimumExpectedTestsExecutedCount: 10 # Sanity check for minimum expected tests to be reported
6+
rerunPassesRequiredToAvoidFailure: 5
7+
8+
jobs:
9+
- job: Build${{ parameters.platform }}${{ parameters.configuration }}
10+
displayName: Build ${{ parameters.platform }} ${{ parameters.configuration }}
11+
variables:
12+
BuildConfiguration: ${{ parameters.configuration }}
13+
BuildPlatform: ${{ parameters.platform }}
14+
PGOBuildMode: 'Instrument'
15+
pool: "windevbuildagents"
16+
# The public pool is also an option!
17+
# pool: { vmImage: windows-2019 }
18+
19+
steps:
20+
- template: build-console-steps.yml
21+
parameters:
22+
additionalBuildArguments: ${{ parameters.additionalBuildArguments }}
23+
24+
- template: helix-runtests-job.yml
25+
parameters:
26+
name: 'RunTestsInHelix'
27+
dependsOn: Build${{ parameters.platform }}${{ parameters.configuration }}
28+
condition: succeeded()
29+
testSuite: 'PgoInstrumentationSuite'
30+
rerunPassesRequiredToAvoidFailure: ${{ parameters.rerunPassesRequiredToAvoidFailure }}
31+
32+
- template: helix-processtestresults-job.yml
33+
parameters:
34+
name: 'ProcessTestResults'
35+
dependsOn:
36+
- RunTestsInHelix
37+
condition: succeededOrFailed()
38+
rerunPassesRequiredToAvoidFailure: ${{ parameters.rerunPassesRequiredToAvoidFailure }}
39+
minimumExpectedTestsExecutedCount: ${{ parameters.minimumExpectedTestsExecutedCount }}
40+
41+
- template: pgo-merge-pgd-job.yml
42+
parameters:
43+
name: 'MergePGD'
44+
dependsOn:
45+
- ProcessTestResults
46+
pgoArtifact: 'PGO'
47+
48+
- template: pgo-build-and-publish-nuget-job.yml
49+
parameters:
50+
dependsOn:
51+
- MergePGD
52+
pgoArtifact: 'PGO'

build/pipelines/templates/build-console-steps.yml

Lines changed: 35 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,29 @@ steps:
3232
restoreSolution: build/packages.config
3333
restoreDirectory: '$(Build.SourcesDirectory)\packages'
3434

35+
# The environment variable VCToolsInstallDir isn't defined on lab machines, so we need to retrieve it ourselves.
36+
- script: |
37+
"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -Latest -requires Microsoft.Component.MSBuild -property InstallationPath > %TEMP%\vsinstalldir.txt
38+
set /p _VSINSTALLDIR15=<%TEMP%\vsinstalldir.txt
39+
del %TEMP%\vsinstalldir.txt
40+
call "%_VSINSTALLDIR15%\Common7\Tools\VsDevCmd.bat"
41+
echo VCToolsInstallDir = %VCToolsInstallDir%
42+
echo ##vso[task.setvariable variable=VCToolsInstallDir]%VCToolsInstallDir%
43+
displayName: 'Retrieve VC tools directory'
44+
45+
- task: CmdLine@1
46+
displayName: 'Display build machine environment variables'
47+
inputs:
48+
filename: 'set'
49+
50+
- task: powershell@2
51+
displayName: 'Restore PGO database'
52+
condition: eq(variables['PGOBuildMode'], 'Optimize')
53+
inputs:
54+
targetType: filePath
55+
workingDirectory: $(Build.SourcesDirectory)\tools\PGODatabase
56+
filePath: $(Build.SourcesDirectory)\tools\PGODatabase\restore-pgodb.ps1
57+
3558
- task: VSBuild@1
3659
displayName: 'Build solution **\OpenConsole.sln'
3760
inputs:
@@ -51,60 +74,6 @@ steps:
5174
$Package = Get-ChildItem -Recurse -Filter "CascadiaPackage_*.msix"
5275
.\build\scripts\Test-WindowsTerminalPackage.ps1 -Verbose -Path $Package.FullName
5376
54-
- task: powershell@2
55-
displayName: 'Source Index PDBs'
56-
inputs:
57-
targetType: filePath
58-
filePath: build\scripts\Index-Pdbs.ps1
59-
arguments: -SearchDir '$(Build.SourcesDirectory)' -SourceRoot '$(Build.SourcesDirectory)' -recursive -Verbose -CommitId $(Build.SourceVersion)
60-
errorActionPreference: silentlyContinue
61-
62-
- task: PowerShell@2
63-
displayName: 'Rationalize build platform'
64-
inputs:
65-
targetType: inline
66-
script: |
67-
$Arch = "$(BuildPlatform)"
68-
If ($Arch -Eq "x86") { $Arch = "Win32" }
69-
Write-Host "##vso[task.setvariable variable=RationalizedBuildPlatform]${Arch}"
70-
71-
- task: PowerShell@2
72-
displayName: 'Run Unit Tests'
73-
inputs:
74-
targetType: filePath
75-
filePath: build\scripts\Run-Tests.ps1
76-
arguments: -MatchPattern '*unit.test*.dll' -Platform '$(RationalizedBuildPlatform)' -Configuration '$(BuildConfiguration)' -LogPath '${{ parameters.testLogPath }}'
77-
condition: and(succeeded(), or(eq(variables['BuildPlatform'], 'x64'), eq(variables['BuildPlatform'], 'x86')))
78-
79-
- task: PowerShell@2
80-
displayName: 'Run Feature Tests (x64 only)'
81-
inputs:
82-
targetType: filePath
83-
filePath: build\scripts\Run-Tests.ps1
84-
arguments: -MatchPattern '*feature.test*.dll' -Platform '$(RationalizedBuildPlatform)' -Configuration '$(BuildConfiguration)' -LogPath '${{ parameters.testLogPath }}'
85-
condition: and(succeeded(), eq(variables['BuildPlatform'], 'x64'))
86-
87-
- task: PowerShell@2
88-
displayName: 'Convert Test Logs from WTL to xUnit format'
89-
inputs:
90-
targetType: filePath
91-
filePath: build\Helix\ConvertWttLogToXUnit.ps1
92-
arguments: -WttInputPath '${{ parameters.testLogPath }}' -WttSingleRerunInputPath 'unused.wtl' -WttMultipleRerunInputPath 'unused2.wtl' -XUnitOutputPath 'onBuildMachineResults.xml' -TestNamePrefix '$(BuildConfiguration).$(BuildPlatform)'
93-
condition: or(eq(variables['BuildPlatform'], 'x64'), eq(variables['BuildPlatform'], 'x86'))
94-
95-
- task: PublishTestResults@2
96-
displayName: 'Upload converted test logs'
97-
inputs:
98-
testResultsFormat: 'xUnit' # Options: JUnit, NUnit, VSTest, xUnit, cTest
99-
testResultsFiles: '**/onBuildMachineResults.xml'
100-
#searchFolder: '$(System.DefaultWorkingDirectory)' # Optional
101-
#mergeTestResults: false # Optional
102-
#failTaskOnFailedTests: false # Optional
103-
testRunTitle: 'On Build Machine Tests' # Optional
104-
buildPlatform: $(BuildPlatform) # Optional
105-
buildConfiguration: $(BuildConfiguration) # Optional
106-
#publishRunAttachments: true # Optional
107-
10877
- task: CopyFiles@2
10978
displayName: 'Copy result logs to Artifacts'
11079
inputs:
@@ -127,7 +96,7 @@ steps:
12796
TargetFolder: '$(Build.ArtifactStagingDirectory)/appx'
12897
OverWrite: true
12998
flattenFolders: true
130-
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
99+
condition: succeeded()
131100
132101
- task: CopyFiles@2
133102
displayName: 'Copy outputs needed for test runs to Artifacts'
@@ -141,7 +110,17 @@ steps:
141110
TargetFolder: '$(Build.ArtifactStagingDirectory)/$(BuildConfiguration)/$(BuildPlatform)/test'
142111
OverWrite: true
143112
flattenFolders: true
144-
condition: and(and(succeeded(), eq(variables['BuildPlatform'], 'x64')), ne(variables['Build.Reason'], 'PullRequest'))
113+
condition: succeeded()
114+
115+
- task: CopyFiles@2
116+
displayName: 'Copy PGO databases needed for PGO instrumentation run'
117+
inputs:
118+
Contents: |
119+
$(Build.SourcesDirectory)/bin/$(BuildPlatform)/$(BuildConfiguration)/*.pgd
120+
TargetFolder: '$(Build.ArtifactStagingDirectory)/$(BuildConfiguration)/$(BuildPlatform)/PGO'
121+
OverWrite: true
122+
flattenFolders: true
123+
condition: and(succeeded(), eq(variables['PGOBuildMode'], 'Instrument'))
145124
146125
- task: PublishBuildArtifacts@1
147126
displayName: 'Publish All Build Artifacts'

build/pipelines/templates/helix-runtests-job.yml

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,15 @@ jobs:
9999

100100
- template: helix-createprojfile-steps.yml
101101
parameters:
102-
condition: and(succeeded(),ne('${{ parameters.testSuite }}','NugetTestSuite'))
102+
condition: and(succeeded(),eq('${{ parameters.testSuite }}','DevTestSuite'))
103103
testFilePath: '$(artifactsDir)\${{ parameters.artifactName }}\$(buildConfiguration)\$(buildPlatform)\Test\TerminalApp.LocalTests.dll'
104104
outputProjFileName: 'RunTestsInHelix-TerminalAppLocalTests.proj'
105105
testSuite: '${{ parameters.testSuite }}'
106106
taefQuery: ${{ parameters.taefQuery }}
107107

108108
- template: helix-createprojfile-steps.yml
109109
parameters:
110-
condition: and(succeeded(),ne('${{ parameters.testSuite }}','NugetTestSuite'))
110+
condition: and(succeeded(),eq('${{ parameters.testSuite }}','DevTestSuite'))
111111
testFilePath: '$(artifactsDir)\${{ parameters.artifactName }}\$(buildConfiguration)\$(buildPlatform)\Test\SettingsModel.LocalTests.dll'
112112
outputProjFileName: 'RunTestsInHelix-SettingsModelLocalTests.proj'
113113
testSuite: '${{ parameters.testSuite }}'
@@ -116,12 +116,20 @@ jobs:
116116

117117
- template: helix-createprojfile-steps.yml
118118
parameters:
119-
condition: and(succeeded(),ne('${{ parameters.testSuite }}','NugetTestSuite'))
119+
condition: and(succeeded(),eq('${{ parameters.testSuite }}','DevTestSuite'))
120120
testFilePath: '$(artifactsDir)\${{ parameters.artifactName }}\$(buildConfiguration)\$(buildPlatform)\Test\Conhost.UIA.Tests.dll'
121121
outputProjFileName: 'RunTestsInHelix-HostTestsUIA.proj'
122122
testSuite: '${{ parameters.testSuite }}'
123123
taefQuery: ${{ parameters.taefQuery }}
124124

125+
- template: helix-createprojfile-steps.yml
126+
parameters:
127+
condition: and(succeeded(),eq('${{ parameters.testSuite }}','PgoInstrumentationSuite'))
128+
testFilePath: '$(artifactsDir)\${{ parameters.artifactName }}\$(buildConfiguration)\$(buildPlatform)\Test\TerminalApp.PGO.Tests.dll'
129+
outputProjFileName: 'RunTestsInHelix-TerminalAppPGOTests.proj'
130+
testSuite: '${{ parameters.testSuite }}'
131+
taefQuery: ${{ parameters.taefQuery }}
132+
125133
- task: PublishBuildArtifacts@1
126134
displayName: 'Publish generated .proj files'
127135
inputs:
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# From our friends at MUX: https://github.com/microsoft/microsoft-ui-xaml/blob/main/build/AzurePipelinesTemplates/MUX-BuildAndPublishPGONuGet-Job.yml
2+
3+
parameters:
4+
dependsOn: ''
5+
pgoArtifact: PGO
6+
7+
jobs:
8+
- job: BuildAndPublishPGONuGet
9+
dependsOn: ${{ parameters.dependsOn }}
10+
pool:
11+
vmImage: 'windows-2019'
12+
variables:
13+
artifactsPath: $(Build.SourcesDirectory)\Artifacts
14+
pgoToolsPath: $(Build.SourcesDirectory)\tools\PGODatabase
15+
nuspecPath: $(pgoToolsPath)\NuSpecs
16+
nuspecFilename: PGO.nuspec
17+
18+
steps:
19+
- task: DownloadBuildArtifacts@0
20+
inputs:
21+
artifactName: ${{ parameters.pgoArtifact }}
22+
downloadPath: $(artifactsPath)
23+
24+
- task: CopyFiles@2
25+
displayName: 'Copy pgd files to NuGet build directory'
26+
inputs:
27+
sourceFolder: $(artifactsPath)\${{ parameters.pgoArtifact }}
28+
contents: '**\*.pgd'
29+
targetFolder: $(nuspecPath)\tools
30+
31+
- task: powershell@2
32+
displayName: 'Generate NuSpec file'
33+
inputs:
34+
targetType: filePath
35+
filePath: $(pgoToolsPath)\generate-nuspec.ps1
36+
workingDirectory: $(pgoToolsPath)
37+
arguments: $(nuspecPath)\$(nuspecFilename).template $(nuspecPath)\$(nuspecFilename)
38+
39+
- task: CmdLine@1
40+
displayName: 'Build NuGet package'
41+
inputs:
42+
filename: '$(Build.SourcesDirectory)\tools\NugetWrapper.cmd'
43+
arguments: pack "$(nuspecPath)\$(nuspecFilename)" -BasePath "$(nuspecPath)" -OutputDirectory "$(Build.ArtifactStagingDirectory)" -properties PROGRAMFILES="%ProgramFiles(x86)%"
44+
45+
- task: PublishBuildArtifacts@1
46+
inputs:
47+
pathToPublish: $(Build.ArtifactStagingDirectory)
48+
artifactName: ${{ parameters.pgoArtifact }}
49+
50+
- task: 333b11bd-d341-40d9-afcf-b32d5ce6f23b@2
51+
displayName: 'NuGet push'
52+
inputs:
53+
command: push
54+
publishVstsFeed: Terminal/TerminalDependencies
55+
packagesToPush: $(Build.ArtifactStagingDirectory)/*.nupkg
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
parameters:
2+
dependsOn: ''
3+
pgoArtifact: PGO
4+
5+
jobs:
6+
- job: MergePGD
7+
dependsOn: ${{ parameters.dependsOn }}
8+
pool:
9+
vmImage: 'windows-2019'
10+
variables:
11+
artifactsPath: $(Build.SourcesDirectory)\Artifacts
12+
pgoArtifactsPath: $(artifactsPath)\${{ parameters.pgoArtifact }}
13+
strategy:
14+
matrix: ${{ parameters.matrix }}
15+
16+
steps:
17+
# The environment variable VCToolsInstallDir isn't defined on lab machines, so we need to retrieve it ourselves.
18+
- script: |
19+
"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -Latest -requires Microsoft.Component.MSBuild -property InstallationPath > %TEMP%\vsinstalldir.txt
20+
set /p _VSINSTALLDIR15=<%TEMP%\vsinstalldir.txt
21+
del %TEMP%\vsinstalldir.txt
22+
call "%_VSINSTALLDIR15%\Common7\Tools\VsDevCmd.bat"
23+
echo VCToolsInstallDir = %VCToolsInstallDir%
24+
echo ##vso[task.setvariable variable=VCToolsInstallDir]%VCToolsInstallDir%
25+
displayName: 'Retrieve VC tools directory'
26+
27+
- task: DownloadBuildArtifacts@0
28+
inputs:
29+
artifactName: ${{ parameters.pgoArtifact }}
30+
downloadPath: $(artifactsPath)
31+
32+
- script: |
33+
cd $(buildPlatform)
34+
"%VCToolsInstallDir%\bin\hostx64\x64\pgomgr.exe" /merge WindowsTerminal*.pgc WindowsTerminal.pgd
35+
displayName: 'Merge Terminal pgc files into pgd'
36+
workingDirectory: $(pgoArtifactsPath)
37+
38+
- script: |
39+
cd $(buildPlatform)
40+
"%VCToolsInstallDir%\bin\hostx64\x64\pgomgr.exe" /merge OpenConsole*.pgc OpenConsole.pgd
41+
displayName: 'Merge OpenConsole pgc files into pgd'
42+
workingDirectory: $(pgoArtifactsPath)
43+
44+
- task: CopyFiles@2
45+
displayName: 'Copy merged pgd to artifact staging'
46+
inputs:
47+
sourceFolder: $(pgoArtifactsPath)
48+
contents: '**\$(buildPlatform)\*.pgd'
49+
targetFolder: $(Build.ArtifactStagingDirectory)
50+
51+
- task: PublishBuildArtifacts@1
52+
inputs:
53+
pathToPublish: $(Build.ArtifactStagingDirectory)
54+
artifactName: ${{ parameters.pgoArtifact }}

0 commit comments

Comments
 (0)