diff --git a/.github/actions/spell-check/expect.txt b/.github/actions/spell-check/expect.txt
index fef55083750..46e1bd6b470 100644
--- a/.github/actions/spell-check/expect.txt
+++ b/.github/actions/spell-check/expect.txt
@@ -30,6 +30,7 @@ AFX
AGGREGATABLE
AHybrid
AKV
+akv
ALarger
ALLAPPS
ALLINPUT
@@ -728,6 +729,7 @@ ISettings
IShell
isocpp
iss
+issecret
ISSEPARATOR
ITask
ith
@@ -946,6 +948,7 @@ mrw
msc
mscorlib
msdata
+MSDL
msedge
MSGFLT
msiexec
@@ -1138,6 +1141,7 @@ pch
pchast
PCIDLIST
PCWSTR
+pdbs
pdisp
pdo
pdto
@@ -1203,6 +1207,7 @@ ppv
prc
Prefixer
Preinstalled
+prependpath
prevhost
previewer
PREVIEWHANDLERFRAMEINFO
@@ -1565,6 +1570,7 @@ SWC
SWFO
SWP
SWRESTORE
+symbolrequestprod
SYMCACHE
SYMED
SYMOPT
@@ -1640,6 +1646,7 @@ TOUCHEVENTF
TOUCHINPUT
touchpad
tracelogging
+trafficmanager
traies
transicc
TRAYMOUSEMESSAGE
diff --git a/.pipelines/ci/caching.yml b/.pipelines/ci/caching.yml
deleted file mode 100644
index b802c9efae4..00000000000
--- a/.pipelines/ci/caching.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-# yaml-language-server: $schema=https://raw.githubusercontent.com/microsoft/azure-pipelines-vscode/main/service-schema.json
-trigger:
- batch: true
- branches:
- include:
- - main
- - stable
- paths:
- exclude:
- - doc/*
- - temp/*
- - tools/*
- - '**.md'
-
-pr:
- branches:
- include:
- - main
- - stable
- paths:
- exclude:
- - '**.md'
- - doc
-
-# 0.0.yyMM.dd##
-# 0.0.1904.0900
-name: 0.0.$(Date:yyMM).$(Date:dd)$(Rev:rr)
-
-variables:
- EnablePipelineCache: true
-
-jobs:
- - template: ./templates/build-powertoys-precheck.yml
- - template: ./templates/build-powertoys-ci.yml
- parameters:
- platform: x64
- enableCaching: true
- - template: ./templates/build-powertoys-ci.yml
- parameters:
- platform: arm64
- enableCaching: true
\ No newline at end of file
diff --git a/.pipelines/ci/ci.yml b/.pipelines/ci/ci.yml
deleted file mode 100644
index e746e2afd2d..00000000000
--- a/.pipelines/ci/ci.yml
+++ /dev/null
@@ -1,46 +0,0 @@
-# yaml-language-server: $schema=https://raw.githubusercontent.com/microsoft/azure-pipelines-vscode/main/service-schema.json
-trigger:
- batch: true
- branches:
- include:
- - main
- - stable
- paths:
- exclude:
- - doc/*
- - temp/*
- - tools/*
- - '**.md'
-
-pr:
- branches:
- include:
- - main
- - stable
- paths:
- exclude:
- - '**.md'
- - doc
-
-# 0.0.yyMM.dd##
-# 0.0.1904.0900
-name: 0.0.$(Date:yyMM).$(Date:dd)$(Rev:rr)
-
-variables:
- EnablePipelineCache: true
-
-jobs:
- - template: ./templates/build-powertoys-precheck.yml
- - template: ./templates/build-powertoys-ci.yml
- parameters:
- platform: x64
- ${{ if eq(variables['System.PullRequest.IsFork'], 'False') }}:
- enableCaching: true
- - template: ./templates/build-powertoys-ci.yml
- parameters:
- platform: arm64
- ${{ if eq(variables['System.PullRequest.IsFork'], 'False') }}:
- enableCaching: true
-# - template: ./templates/run-ui-tests-ci.yml
-# parameters:
-# platform: x64
diff --git a/.pipelines/ci/templates/build-powertoys-ci.yml b/.pipelines/ci/templates/build-powertoys-ci.yml
deleted file mode 100644
index 177313e1170..00000000000
--- a/.pipelines/ci/templates/build-powertoys-ci.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-parameters:
- - name: configuration
- type: string
- default: 'Release'
- - name: platform
- type: string
- default: 'x64'
- - name: additionalBuildArguments
- type: string
- default: '-p:RestorePackagesConfig=true -m'
- - name: enableCaching
- type: boolean
- default: false
-
-jobs:
-- job: Build${{ parameters.platform }}${{ parameters.configuration }}
- displayName: Build ${{ parameters.platform }} ${{ parameters.configuration }}
- dependsOn: Precheck
- condition: and(succeeded(),ne(dependencies.Precheck.outputs['verifyBuildRequest.skipBuild'], 'Yes'))
- variables:
- BuildConfiguration: ${{ parameters.configuration }}
- BuildPlatform: ${{ parameters.platform }}
- NUGET_RESTORE_MSBUILD_ARGS: /p:Platform=${{ parameters.platform }} # Required for nuget to work due to self contained
- NODE_OPTIONS: --max_old_space_size=16384
- pool:
- demands: ImageOverride -equals SHINE-VS17-Latest
- ${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}:
- name: SHINE-INT-L
- ${{ else }}:
- name: SHINE-OSS-L
- timeoutInMinutes: 120
- strategy:
- maxParallel: 10
- steps:
- - template: build-powertoys-steps.yml
- parameters:
- additionalBuildArguments: ${{ parameters.additionalBuildArguments }}
- enableCaching: ${{ parameters.enableCaching }}
-
- # It appears that the Component Governance build task that gets automatically injected stopped working
- # when we renamed our main branch.
- - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
- displayName: 'Component Detection'
- condition: and(succeededOrFailed(), not(eq(variables['Build.Reason'], 'PullRequest')))
\ No newline at end of file
diff --git a/.pipelines/ci/templates/build-powertoys-installer.yml b/.pipelines/ci/templates/build-powertoys-installer.yml
deleted file mode 100644
index 1756171cf21..00000000000
--- a/.pipelines/ci/templates/build-powertoys-installer.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-parameters:
- configuration: 'Release'
- platform: ''
- additionalBuildArguments: '/p:RestorePackagesConfig=true -m'
-
-jobs:
-- job: Build${{ parameters.platform }}${{ parameters.configuration }}
- displayName: Build ${{ parameters.platform }} ${{ parameters.configuration }}
- variables:
- BuildConfiguration: ${{ parameters.configuration }}
- BuildPlatform: ${{ parameters.platform }}
- pool:
- name: SHINE-INT-L
- timeoutInMinutes: 120
- strategy:
- maxParallel: 10
- steps:
- - template: build-powertoys-steps.yml
- parameters:
- additionalBuildArguments: ${{ parameters.additionalBuildArguments }}
diff --git a/.pipelines/ci/templates/build-powertoys-precheck.yml b/.pipelines/ci/templates/build-powertoys-precheck.yml
deleted file mode 100644
index 76012896522..00000000000
--- a/.pipelines/ci/templates/build-powertoys-precheck.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-# yaml-language-server: $schema=https://raw.githubusercontent.com/microsoft/azure-pipelines-vscode/master/service-schema.json
-jobs:
-- job: Precheck
- pool:
- demands: ImageOverride -equals SHINE-VS17-Latest
- ${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}:
- name: SHINE-INT-L
- ${{ else }}:
- name: SHINE-OSS-L
- steps:
- - checkout: none
-
- - task: PowerShell@2
- displayName: Verify Build Request
- inputs:
- targetType: 'inline'
- script: |
- try {
- # Try based on pull request first
- $pullRequestNumber = "$(system.pullRequest.pullRequestNumber)";
- $gitHubPullRequest = Invoke-RestMethod -Method Get "https://api.github.com/repos/microsoft/PowerToys/pulls/$pullRequestNumber/files"
- # If there are no files updated in the commit that are .md, set skipBuild variable
- if(([array]($gitHubPullRequest.filename) -notmatch ".md|.txt").Length -eq 0) {
- Write-Host '##vso[task.setvariable variable=skipBuild;isOutput=true]Yes'
- Write-Host 'Skipping Build'
- }
- }
- catch {
- # Fall back to the latest commit otherwise.
- $commit = "$(build.sourceVersion)";
- $gitHubCommit = Invoke-RestMethod -Method Get "https://api.github.com/repos/microsoft/PowerToys/commits/$commit"
- if(([array]($githubCommit.files.filename) -notmatch ".md|.txt").Length -eq 0) {
- Write-Host '##vso[task.setvariable variable=skipBuild;isOutput=true]Yes'
- Write-Host 'Skipping Build'
- }
- }
- pwsh: true
- name: verifyBuildRequest
diff --git a/.pipelines/ci/templates/build-powertoys-steps.yml b/.pipelines/ci/templates/build-powertoys-steps.yml
deleted file mode 100644
index 2aa1390c4d0..00000000000
--- a/.pipelines/ci/templates/build-powertoys-steps.yml
+++ /dev/null
@@ -1,297 +0,0 @@
-parameters:
- - name: additionalBuildArguments
- type: string
- default: ''
- - name: enableCaching
- type: boolean
- default: false
-
-steps:
-- checkout: self
- fetchDepth: 1
- submodules: true
- clean: true
-
-- task: UseDotNet@2
- displayName: 'Use .NET 6 SDK'
- inputs:
- packageType: sdk
- version: '6.x'
-
-- task: PowerShell@2
- displayName: Verify XAML formatting
- inputs:
- filePath: '$(build.sourcesdirectory)\.pipelines\applyXamlStyling.ps1'
- arguments: -Passive
- pwsh: true
-
-- task: PowerShell@2
- displayName: Verify Nuget package versions for PowerToys.sln
- inputs:
- filePath: '$(build.sourcesdirectory)\.pipelines\verifyNugetPackages.ps1'
- arguments: -solution '$(build.sourcesdirectory)\PowerToys.sln'
- pwsh: true
-
-- task: PowerShell@2
- displayName: Verify Arm64 configuration for PowerToys.sln
- inputs:
- filePath: '$(build.sourcesdirectory)\.pipelines\verifyArm64Configuration.ps1'
- arguments: -solution '$(build.sourcesdirectory)\PowerToys.sln'
- pwsh: true
-
-- task: PowerShell@2
- displayName: Verify Arm64 configuration for BugReportTool.sln
- inputs:
- filePath: '$(build.sourcesdirectory)\.pipelines\verifyArm64Configuration.ps1'
- arguments: -solution '$(build.sourcesdirectory)\tools\BugReportTool\BugReportTool.sln'
- pwsh: true
-
-- task: PowerShell@2
- displayName: Verify Arm64 configuration for WebcamReportTool.sln
- inputs:
- filePath: '$(build.sourcesdirectory)\.pipelines\verifyArm64Configuration.ps1'
- arguments: -solution '$(build.sourcesdirectory)\tools\WebcamReportTool\WebcamReportTool.sln'
- pwsh: true
-
-- task: PowerShell@2
- displayName: Verify Arm64 configuration for StylesReportTool.sln
- inputs:
- filePath: '$(build.sourcesdirectory)\.pipelines\verifyArm64Configuration.ps1'
- arguments: -solution '$(build.sourcesdirectory)\tools\StylesReportTool\StylesReportTool.sln'
- pwsh: true
-
-- task: PowerShell@2
- displayName: Verify Arm64 configuration for PowerToysSetup.sln
- inputs:
- filePath: '$(build.sourcesdirectory)\.pipelines\verifyArm64Configuration.ps1'
- arguments: -solution '$(build.sourcesdirectory)\installer\PowerToysSetup.sln'
- pwsh: true
-
-- task: PowerShell@2
- displayName: Verify and set latest VCToolsVersion usage
- inputs:
- filePath: '$(build.sourcesdirectory)\.pipelines\verifyAndSetLatestVCToolsVersion.ps1'
- pwsh: true
-
-- task: UseDotNet@2
- displayName: 'Use .NET 8 SDK'
- inputs:
- packageType: sdk
- version: '8.x'
- includePreviewVersions: true
-
-- task: VisualStudioTestPlatformInstaller@1
- displayName: Ensure VSTest Platform
-
-- task: Cache@2
- displayName: 'Cache nuget packages (PackageReference)'
- inputs:
- key: '"PackageReference" | "$(Agent.OS)" | Directory.Packages.props'
- restoreKeys: |
- "PackageReference" | "$(Agent.OS)"
- "PackageReference"
- path: $(NUGET_PACKAGES)
-
-- task: Cache@2
- displayName: 'Cache nuget packages (packages.config)'
- inputs:
- key: '"packages.config" | "$(Agent.OS)" | **/packages.config'
- restoreKeys: |
- "packages.config" | "$(Agent.OS)"
- "packages.config"
- path: packages
-
-- ${{ if eq(parameters.enableCaching, true) }}:
- - task: NuGetToolInstaller@1
- displayName: Install NuGet
-
- - script: nuget restore packages.config -SolutionDirectory .
- displayName: 'nuget restore packages.config'
-
-- task: VSBuild@1
- displayName: 'Build and Test PowerToys.sln'
- inputs:
- solution: '**\PowerToys.sln'
- vsVersion: 17.0
- platform: '$(BuildPlatform)'
- configuration: '$(BuildConfiguration)'
- ${{ if eq(parameters.enableCaching, true) }}:
- msbuildArgs: -restore ${{ parameters.additionalBuildArguments }} -t:Build;Test -graph -reportfileaccesses -p:MSBuildCacheEnabled=true -p:MSBuildCacheLogDirectory=$(Build.ArtifactStagingDirectory)\logs\MSBuildCache -bl:$(Build.ArtifactStagingDirectory)\logs\PowerToys.binlog -ds:false
- ${{ else }}:
- msbuildArgs: -restore ${{ parameters.additionalBuildArguments }} -t:Build;Test -graph -bl:$(Build.ArtifactStagingDirectory)\logs\PowerToys.binlog -ds:false
- msbuildArchitecture: x64
- maximumCpuCount: true
- ${{ if eq(parameters.enableCaching, true) }}:
- env:
- SYSTEM_ACCESSTOKEN: $(System.AccessToken)
-
-- task: VSBuild@1
- displayName: 'Build BugReportTool.sln'
- inputs:
- solution: '**\BugReportTool.sln'
- vsVersion: 17.0
- platform: '$(BuildPlatform)'
- configuration: '$(BuildConfiguration)'
- msbuildArgs: -restore ${{ parameters.additionalBuildArguments }} -graph -bl:$(Build.ArtifactStagingDirectory)\logs\BugReportTool.binlog -ds:false
- msbuildArchitecture: x64
- maximumCpuCount: true
-
-- task: VSBuild@1
- displayName: 'Build WebcamReportTool.sln'
- inputs:
- solution: '**\WebcamReportTool.sln'
- vsVersion: 17.0
- platform: '$(BuildPlatform)'
- configuration: '$(BuildConfiguration)'
- msbuildArgs: -restore ${{ parameters.additionalBuildArguments }} -graph -bl:$(Build.ArtifactStagingDirectory)\logs\WebcamReportTool.binlog -ds:false
- msbuildArchitecture: x64
- maximumCpuCount: true
-
-- task: VSBuild@1
- displayName: 'Build StylesReportTool.sln'
- inputs:
- solution: '**\StylesReportTool.sln'
- vsVersion: 17.0
- platform: '$(BuildPlatform)'
- configuration: '$(BuildConfiguration)'
- msbuildArgs: -restore ${{ parameters.additionalBuildArguments }} -graph -bl:$(Build.ArtifactStagingDirectory)\logs\StylesReportTool.binlog -ds:false
- msbuildArchitecture: x64
- maximumCpuCount: true
-
-- task: PowerShell@2
- displayName: Download and install WiX 3.14 development build
- inputs:
- targetType: filePath
- filePath: '$(build.sourcesdirectory)\.pipelines\installWiX.ps1'
-
-- task: VSBuild@1
- displayName: 'Build PowerToys per-machine MSI'
- inputs:
- solution: '**\installer\PowerToysSetup.sln'
- vsVersion: 17.0
- platform: '$(BuildPlatform)'
- configuration: '$(BuildConfiguration)'
- msbuildArgs: /t:PowerToysInstaller -restore ${{ parameters.additionalBuildArguments }} -bl:$(Build.ArtifactStagingDirectory)\logs\PowerToysSetup-PowerToysInstaller.binlog -ds:false
- msbuildArchitecture: x64
- maximumCpuCount: true
-
-- task: VSBuild@1
- displayName: 'Build PowerToys per-machine Bootstrapper'
- inputs:
- solution: '**\installer\PowerToysSetup.sln'
- vsVersion: 17.0
- platform: '$(BuildPlatform)'
- configuration: '$(BuildConfiguration)'
- msbuildArgs: /t:PowerToysBootstrapper ${{ parameters.additionalBuildArguments }} -bl:$(Build.ArtifactStagingDirectory)\logs\PowerToysSetup-PowerToysBootstrapper.binlog -ds:false
- clean: false
- msbuildArchitecture: x64
- maximumCpuCount: true
-
-- task: PowerShell@2
- displayName: Clean installer dir before building per-user installer
- inputs:
- targetType: inline
- script: git clean -xfd -e *exe -- .\installer\
- pwsh: true
-
-- task: VSBuild@1
- displayName: 'Build PowerToys per-user MSI'
- inputs:
- solution: '**\installer\PowerToysSetup.sln'
- vsVersion: 17.0
- platform: '$(BuildPlatform)'
- configuration: '$(BuildConfiguration)'
- msbuildArgs: /t:PowerToysInstaller -restore ${{ parameters.additionalBuildArguments }} /p:PerUser=true -bl:$(Build.ArtifactStagingDirectory)\logs\PowerToysSetup-PowerToysInstaller-PerUser.binlog -ds:false
- msbuildArchitecture: x64
- maximumCpuCount: true
-
-- task: VSBuild@1
- displayName: 'Build PowerToys per-user Bootstrapper'
- inputs:
- solution: '**\installer\PowerToysSetup.sln'
- vsVersion: 17.0
- platform: '$(BuildPlatform)'
- configuration: '$(BuildConfiguration)'
- msbuildArgs: /t:PowerToysBootstrapper ${{ parameters.additionalBuildArguments }} /p:PerUser=true -bl:$(Build.ArtifactStagingDirectory)\logs\PowerToysSetup-PowerToysBootstrapper-PerUser.binlog -ds:false
- clean: false
- msbuildArchitecture: x64
- maximumCpuCount: true
-
-# Check if deps.json files don't reference different dll versions.
-- task: PowerShell@2
- displayName: Audit deps.json files for all applications
- inputs:
- filePath: '$(build.sourcesdirectory)\.pipelines\verifyDepsJsonLibraryVersions.ps1'
- arguments: -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)'
- pwsh: true
-
-# Check if asset files on the main application paths are playing nice and avoiding basic conflicts.
-- task: PowerShell@2
- displayName: Audit base applications path asset conflicts
- inputs:
- filePath: '$(build.sourcesdirectory)\.pipelines\verifyPossibleAssetConflicts.ps1'
- arguments: -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)'
- pwsh: true
-
-- task: PowerShell@2
- displayName: Audit WinAppSDK applications path asset conflicts
- inputs:
- filePath: '$(build.sourcesdirectory)\.pipelines\verifyPossibleAssetConflicts.ps1'
- arguments: -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)\WinUI3Apps'
- pwsh: true
-
-# Publish test results which ran in MSBuild
-- task: PublishTestResults@2
- displayName: 'Publish Test Results'
- inputs:
- testResultsFormat: VSTest
- testResultsFiles: '**/*.trx'
- condition: ne(variables['BuildPlatform'],'arm64')
-
-# Native dlls
-- task: VSTest@2
- condition: ne(variables['BuildPlatform'],'arm64') # No arm64 agents to run the tests.
- displayName: 'Native Tests'
- inputs:
- platform: '$(BuildPlatform)'
- configuration: '$(BuildConfiguration)'
- testSelector: 'testAssemblies'
- testAssemblyVer2: |
- **\KeyboardManagerEngineTest.dll
- **\KeyboardManagerEditorTest.dll
- **\UnitTests-CommonLib.dll
- **\PowerRenameUnitTests.dll
- **\UnitTests-FancyZones.dll
- !**\obj\**
-
-- task: PowerShell@2
- displayName: Trigger dotnet welcome message so that it does not cause errors on other scripts
- inputs:
- targetType: 'inline'
- script: |
- dotnet list $(build.sourcesdirectory)\src\common\Common.UI\Common.UI.csproj package
-
-- task: PowerShell@2
- displayName: Verify Notice.md and Nuget packages match
- inputs:
- filePath: '$(build.sourcesdirectory)\.pipelines\verifyNoticeMdAgainstNugetPackages.ps1'
- arguments: -path '$(build.sourcesdirectory)\'
- pwsh: true
-
-- publish: $(Build.ArtifactStagingDirectory)\logs
- displayName: Publish Logs
- artifact: '$(System.JobDisplayName) logs'
- condition: always()
-
-- task: CopyFiles@2
- displayName: Copy Build Files
- condition: and(succeeded(), ne(variables['BuildPlatform'],'arm64'))
- inputs:
- sourceFolder: '$(Build.SourcesDirectory)'
- contents: '$(BuildPlatform)/$(BuildConfiguration)/**/*'
- targetFolder: '$(Build.ArtifactStagingDirectory)\$(BuildPlatform)\$(BuildConfiguration)'
-
-- publish: $(Build.ArtifactStagingDirectory)\$(BuildPlatform)\$(BuildConfiguration)
- displayName: Publish Build Artifacts
- artifact: build-$(BuildPlatform)-$(BuildConfiguration)
- condition: and(succeeded(), ne(variables['BuildPlatform'],'arm64'))
diff --git a/.pipelines/ci/templates/run-ui-tests-ci.yml b/.pipelines/ci/templates/run-ui-tests-ci.yml
deleted file mode 100644
index e08c08ff7a2..00000000000
--- a/.pipelines/ci/templates/run-ui-tests-ci.yml
+++ /dev/null
@@ -1,70 +0,0 @@
-parameters:
- configuration: 'Release'
- platform: ''
-
-jobs:
-- job: UITest
- displayName: UI Test ${{ parameters.platform }} ${{ parameters.configuration }}
- dependsOn: Build${{ parameters.platform }}${{ parameters.configuration }}
- variables:
- SrcPath: $(Build.Repository.LocalPath)
- pool:
- ${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}:
- name: SHINE-INT-Testing-x64
- ${{ else }}:
- name: SHINE-OSS-Testing-x64
- steps:
- - checkout: self
- fetchDepth: 1
- submodules: false
- clean: true
- fetchTags: false
-
- - download: current
- displayName: Download artifacts
- artifact: build-${{ parameters.platform }}-${{ parameters.configuration }}
-
- - task: UseDotNet@2
- displayName: 'Use .NET 6 SDK'
- inputs:
- packageType: sdk
- version: '6.x'
-
- - task: UseDotNet@2
- displayName: 'Use .NET 8 SDK'
- inputs:
- packageType: sdk
- version: '8.x'
- includePreviewVersions: true
-
- - task: VisualStudioTestPlatformInstaller@1
- displayName: Ensure VSTest Platform
-
- - task: PowerShell@2
- displayName: Download and install WinAppDriver
- inputs:
- targetType: filePath
- filePath: '$(build.sourcesdirectory)\.pipelines\InstallWinAppDriver.ps1'
-
- - task: ScreenResolutionUtility@1
- inputs:
- displaySettings: 'optimal'
-
- - task: VSTest@2
- displayName: 'UI Tests'
- condition: and(succeeded(), ne(variables['BuildPlatform'],'arm64')) # No arm64 agents to run the tests.
- inputs:
- platform: '$(BuildPlatform)'
- configuration: '$(BuildConfiguration)'
- testSelector: 'testAssemblies'
- searchFolder: '$(Pipeline.Workspace)\build-${{ parameters.platform }}-${{ parameters.configuration }}'
- vstestLocationMethod: 'location' # otherwise fails to find vstest.console.exe
- #vstestLocation: '$(Agent.ToolsDirectory)\VsTest\**\${{ parameters.platform }}\tools\net462\Common7\IDE\Extensions\TestPlatform'
- vstestLocation: '$(Agent.ToolsDirectory)\VsTest\17.10.0\x64\tools\net462\Common7\IDE\Extensions\TestPlatform'
- uiTests: true
- rerunFailedTests: true
- testAssemblyVer2: |
- **\UITests-FancyZones.dll
- **\UITests-FancyZonesEditor.dll
- !**\obj\**
- !**\ref\**
diff --git a/.pipelines/installer-steps.yml b/.pipelines/installer-steps.yml
deleted file mode 100644
index 3fe30dfc62e..00000000000
--- a/.pipelines/installer-steps.yml
+++ /dev/null
@@ -1,152 +0,0 @@
-parameters:
- - name: versionNumber
- type: string
- default: "0.0.1"
- - name: perUserArg
- type: string
- default: "false"
- - name: buildSubDir
- type: string
- default: "MachineSetup"
- - name: installerPrefix
- type: string
- default: "PowerToysSetup"
- - name: signingParameters
- type: object
- default: {}
-
-steps:
- - task: VSBuild@1
- displayName: Build PowerToysSetupCustomActions DLL # This dll needs to be build and signed before building the MSI.
- inputs:
- solution: "**/installer/PowerToysSetup.sln"
- vsVersion: 17.0
- msbuildArgs: -restore /p:RestorePackagesConfig=true /p:RestoreConfigFile="$(Build.SourcesDirectory)\.pipelines\release-nuget.config" /p:CIBuild=true /bl:$(Build.SourcesDirectory)\msbuild.binlog /t:PowerToysSetupCustomActions /p:RunBuildEvents=true /p:PerUser=${{parameters.perUserArg}}
- platform: $(BuildPlatform)
- configuration: $(BuildConfiguration)
- clean: true
- maximumCpuCount: true
-
- - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5
- displayName: Sign PowerToysSetupCustomActions DLL
- inputs:
- ${{ insert }}: ${{ parameters.signingParameters }}
- FolderPath: 'installer/PowerToysSetupCustomActions/$(BuildPlatform)\$(BuildConfiguration)\${{parameters.buildSubDir}}'
- signType: batchSigning
- batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_installer.json'
- ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
-
- ## INSTALLER START
- #### MSI BUILDING AND SIGNING
- - task: VSBuild@1
- displayName: Build MSI
- inputs:
- solution: "**/installer/PowerToysSetup.sln"
- vsVersion: 17.0
- msbuildArgs: /p:CIBuild=true /p:BuildProjectReferences=false /target:PowerToysInstaller /bl:$(Build.SourcesDirectory)\msbuild.binlog /p:RunBuildEvents=false /p:PerUser=${{parameters.perUserArg}}
- platform: $(BuildPlatform)
- configuration: $(BuildConfiguration)
- clean: false # don't undo our hard work above by deleting the CustomActions dll
- maximumCpuCount: true
-
- - task: CmdLine@2
- displayName: "Extracting MSI to verify contents"
- inputs:
- script: |
- "C:\Program Files (x86)\WiX Toolset v3.14\bin\dark.exe" -x $(build.sourcesdirectory)\extractedMsi installer\PowerToysSetup\$(BuildPlatform)\$(BuildConfiguration)\${{parameters.buildSubDir}}\${{parameters.installerPrefix}}-${{ parameters.versionNumber }}-$(BuildPlatform).msi
- dir $(build.sourcesdirectory)\extractedMsi
-
- # Check if deps.json files don't reference different dll versions.
- - task: PowerShell@2
- displayName: Audit deps.json in MSI extracted files
- inputs:
- filePath: '.pipelines/verifyDepsJsonLibraryVersions.ps1'
- arguments: -targetDir '$(build.sourcesdirectory)\extractedMsi\File'
- pwsh: true
-
- # Did we sign all files
- - task: PowerShell@1
- displayName: Verifying entire build is signed and version set
- inputs:
- scriptName: .pipelines/versionAndSignCheck.ps1
- arguments: -targetDir '$(build.sourcesdirectory)\extractedMsi\File'
-
- - task: PowerShell@1
- displayName: Verifying MSI Custom Actions DLL is signed
- inputs:
- scriptName: .pipelines/versionAndSignCheck.ps1
- arguments: -targetDir '$(build.sourcesdirectory)\extractedMsi\Binary'
-
- - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5
- displayName: Sign MSI
- inputs:
- ${{ insert }}: ${{ parameters.signingParameters }}
- FolderPath: 'installer/PowerToysSetup/$(BuildPlatform)\$(BuildConfiguration)\${{parameters.buildSubDir}}'
- signType: batchSigning
- batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_installer.json'
- ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
- #### END MSI
- #### BOOTSTRAP BUILDING AND SIGNING
-
- - task: VSBuild@1
- displayName: Build Bootstrapper
- inputs:
- solution: "**/installer/PowerToysSetup.sln"
- vsVersion: 17.0
- msbuildArgs: /p:CIBuild=true /bl:$(Build.SourcesDirectory)\msbuild.binlog /t:PowerToysBootstrapper /p:PerUser=${{parameters.perUserArg}}
- platform: $(BuildPlatform)
- configuration: $(BuildConfiguration)
- clean: false # don't undo our hard work above by deleting the MSI
- maximumCpuCount: true
-
- - task: CmdLine@2
- displayName: "Insignia: Extract Engine from Bundle"
- inputs:
- script: '"C:\Program Files (x86)\WiX Toolset v3.14\bin\insignia.exe" -ib installer\PowerToysSetup\$(BuildPlatform)\$(BuildConfiguration)\${{parameters.buildSubDir}}\${{parameters.installerPrefix}}-${{ parameters.versionNumber }}-$(BuildPlatform).exe -o installer\engine.exe'
-
- - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5
- displayName: "ESRP CodeSigning (Engine)"
- inputs:
- ${{ insert }}: ${{ parameters.signingParameters }}
- FolderPath: "installer"
- Pattern: engine.exe
- signConfigType: inlineSignParams
- inlineOperation: |
- [
- {
- "KeyCode": "CP-230012",
- "OperationCode": "SigntoolSign",
- "Parameters": {
- "OpusName": "Microsoft",
- "OpusInfo": "http://www.microsoft.com",
- "FileDigest": "/fd \"SHA256\"",
- "PageHash": "/NPH",
- "TimeStamp": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
- },
- "ToolName": "sign",
- "ToolVersion": "1.0"
- },
- {
- "KeyCode": "CP-230012",
- "OperationCode": "SigntoolVerify",
- "Parameters": {},
- "ToolName": "sign",
- "ToolVersion": "1.0"
- }
- ]
-
- - task: CmdLine@2
- displayName: "Insignia: Merge Engine into Bundle"
- inputs:
- script: '"C:\Program Files (x86)\WiX Toolset v3.14\bin\insignia.exe" -ab installer\engine.exe installer\PowerToysSetup\$(BuildPlatform)\$(BuildConfiguration)\${{parameters.buildSubDir}}\${{parameters.installerPrefix}}-${{ parameters.versionNumber }}-$(BuildPlatform).exe -o installer\PowerToysSetup\$(BuildPlatform)\$(BuildConfiguration)\${{parameters.buildSubDir}}\${{parameters.installerPrefix}}-${{ parameters.versionNumber }}-$(BuildPlatform).exe'
-
- - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5
- displayName: Sign Bootstrapper
- inputs:
- ${{ insert }}: ${{ parameters.signingParameters }}
- FolderPath: 'installer/PowerToysSetup/$(BuildPlatform)\$(BuildConfiguration)\${{parameters.buildSubDir}}'
- signType: batchSigning
- batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_installer.json'
- ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
- #### END BOOTSTRAP
- ## END INSTALLER
diff --git a/.pipelines/release.yml b/.pipelines/release.yml
deleted file mode 100644
index 22a3563c8dd..00000000000
--- a/.pipelines/release.yml
+++ /dev/null
@@ -1,551 +0,0 @@
-# This build should never run as CI or against a pull request.
-name: $(BuildDefinitionName)_$(date:yyMM).$(date:dd)$(rev:rrr)
-trigger: none
-pr: none
-
-resources:
- repositories:
- - repository: 1ESPipelineTemplates
- type: git
- name: 1ESPipelineTemplates/1ESPipelineTemplates
- ref: refs/tags/release
-
-parameters:
- - name: buildConfigurations
- type: object
- default:
- - Release
- - name: buildPlatforms
- type: object
- default:
- - x64
- - arm64
- - name: versionNumber
- type: string
- default: '0.0.1'
- - name: signingParameters
- type: object
- default:
- ConnectedServiceName: $(SigningServiceName)
- AppRegistrationClientId: $(SigningAppId)
- AppRegistrationTenantId: $(SigningTenantId)
- AuthAKVName: $(SigningAKVName)
- AuthCertName: $(SigningAuthCertName)
- AuthSignCertName: $(SigningSignCertName)
-
-extends:
- template: v1/1ES.Official.PipelineTemplate.yml@1ESPipelineTemplates
- parameters:
- customBuildTags:
- - 1ES.PT.ViaStartRight
- pool:
- name: SHINE-INT-S
- image: SHINE-VS17-Latest
- os: windows
- sdl:
- tsa:
- enabled: true
- configFile: '$(Build.SourcesDirectory)\.pipelines\tsa.json'
-
- stages:
- - stage: build
- displayName: Build (Complete)
- pool:
- name: SHINE-INT-L
- image: SHINE-VS17-Latest
- os: windows
- jobs:
- - job: Build
- strategy:
- matrix:
- ${{ each config in parameters.buildConfigurations }}:
- ${{ each platform in parameters.buildPlatforms }}:
- ${{ config }}_${{ platform }}:
- BuildConfiguration: ${{ config }}
- BuildPlatform: ${{ platform }}
- templateContext:
- outputs:
- - output: pipelineArtifact
- artifactName: setup-$(BuildPlatform)
- targetPath: $(Build.ArtifactStagingDirectory)
- displayName: Build
- timeoutInMinutes: 240 # Some of the 1ES Pipeline stuff and Loc take a very long time
- cancelTimeoutInMinutes: 1
- variables:
- NUGET_RESTORE_MSBUILD_ARGS: /p:Platform=$(BuildPlatform) # Required for nuget to work due to self contained
- NODE_OPTIONS: --max_old_space_size=16384
- IsPipeline: 1 # The installer uses this to detect whether it should pick up localizations
- SkipCppCodeAnalysis: 1 # Skip the code analysis to speed up release CI. It runs on PR CI, anyway
- # IsExperimentationLive: 1 # The build and installer use this to turn on experimentation
- steps:
- - checkout: self
- clean: true
- submodules: true
- persistCredentials: True
-
- # Sets versions for all PowerToy created DLLs
- - task: PowerShell@1
- displayName: Set Versions.Prop
- inputs:
- scriptName: .pipelines/versionSetting.ps1
- arguments: -versionNumber '${{ parameters.versionNumber }}' -DevEnvironment ''
-
- # ESRP needs 'Microsoft.NETCore.App', version '6.0.0' (x64)
- - task: UseDotNet@2
- displayName: 'Use .NET 6 SDK'
- inputs:
- packageType: sdk
- version: '6.x'
-
- - task: UseDotNet@2
- displayName: 'Use .NET 8 SDK'
- inputs:
- packageType: sdk
- version: '8.x'
-
- - task: PowerShell@2
- displayName: Verify and set latest VCToolsVersion usage
- inputs:
- filePath: '$(build.sourcesdirectory)\.pipelines\verifyAndSetLatestVCToolsVersion.ps1'
- pwsh: true
-
- - task: NuGetAuthenticate@1
-
- - task: NuGetToolInstaller@1
- displayName: Use NuGet Installer latest
-
- # this will restore the following nugets:
- # - main solution
- # - Bug report tool
- # - Webcam report tool
- # - Installer
- # - Bootstrapper Installer
- - task: PowerShell@2
- displayName: Download and install WiX 3.14 development build
- inputs:
- targetType: filePath
- filePath: '$(build.sourcesdirectory)\.pipelines\installWiX.ps1'
-
- - task: MicrosoftTDBuild.tdbuild-task.tdbuild-task.TouchdownBuildTask@3
- displayName: 'Download Localization Files -- PowerToys 37400'
- inputs:
- teamId: 37400
- TDBuildServiceConnection: $(TouchdownServiceConnection)
- authType: SubjectNameIssuer
- resourceFilePath: |
- **\Resources.resx
- **\Resource.resx
- **\Resources.resw
- appendRelativeDir: true
- localizationTarget: false
- # pseudoSetting: Included
-
- - task: PowerShell@2
- displayName: Move Loc files into correct locations
- inputs:
- targetType: inline
- script: >-
- $VerbosePreference = "Continue"
-
- ./tools/build/move-and-rename-resx.ps1
-
- ./tools/build/move-uwp-resw.ps1
- pwsh: true
-
- - task: CmdLine@2
- displayName: Moving telem files
- inputs:
- script: |
- call nuget.exe restore -configFile .pipelines/release-nuget.config -PackagesDirectory . .pipelines/packages.config || exit /b 1
- move /Y "Microsoft.PowerToys.Telemetry.2.0.0\build\include\TraceLoggingDefines.h" "src\common\Telemetry\TraceLoggingDefines.h" || exit /b 1
- move /Y "Microsoft.PowerToys.Telemetry.2.0.0\build\include\TelemetryBase.cs" "src\common\Telemetry\TelemetryBase.cs" || exit /b 1
-
- ## ALL BUT INSTALLER BUILDING
- - task: VSBuild@1
- displayName: Build PowerToys main project
- inputs:
- solution: '**\PowerToys.sln'
- vsVersion: 17.0
- msbuildArgs: -restore -graph /p:RestorePackagesConfig=true /p:RestoreConfigFile="$(Build.SourcesDirectory)\.pipelines\release-nuget.config" /p:CIBuild=true /bl:$(Build.SourcesDirectory)\msbuild.binlog
- platform: $(BuildPlatform)
- configuration: $(BuildConfiguration)
- clean: true
- maximumCpuCount: true
-
- ### BEGIN SECTION - build and sign nuget packages for abstracted UI utils
- - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5
- displayName: Sign Utilities libraries
- inputs:
- ${{ insert }}: ${{ parameters.signingParameters }}
- FolderPath: 'src/modules'
- signType: batchSigning
- batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_abstracted_utils_dll.json'
- ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
-
- - task: VSBuild@1
- displayName: Create Hosts File Editor package
- inputs:
- solution: '**\HostsUILib.csproj'
- vsVersion: 17.0
- msbuildArgs: /p:CIBuild=true -t:pack /bl:$(Build.SourcesDirectory)\msbuild.binlog
- configuration: $(BuildConfiguration)
- maximumCpuCount: true
-
- - task: VSBuild@1
- displayName: Create Environment Variables Editor package
- inputs:
- solution: '**\EnvironmentVariablesUILib.csproj'
- vsVersion: 17.0
- msbuildArgs: /p:CIBuild=true -t:pack /bl:$(Build.SourcesDirectory)\msbuild.binlog
- configuration: $(BuildConfiguration)
- maximumCpuCount: true
-
- - task: VSBuild@1
- displayName: Create Registry Preview package
- inputs:
- solution: '**\RegistryPreviewUILib.csproj'
- vsVersion: 17.0
- msbuildArgs: /p:CIBuild=true -t:pack /bl:$(Build.SourcesDirectory)\msbuild.binlog
- configuration: $(BuildConfiguration)
- maximumCpuCount: true
-
- - task: CopyFiles@2
- displayName: Copying nuget packages file over
- inputs:
- contents: "**/bin/Release/PowerToys*.nupkg"
- flattenFolders: True
- targetFolder: $(Build.ArtifactStagingDirectory)/nupkg
-
- - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5
- displayName: Submit *.nupkg to ESRP for code signing
- inputs:
- ${{ insert }}: ${{ parameters.signingParameters }}
- FolderPath: $(Build.ArtifactStagingDirectory)/nupkg
- Pattern: '*.nupkg'
- UseMinimatch: true
- signConfigType: inlineSignParams
- inlineOperation: >-
- [
- {
- "KeyCode": "CP-401405",
- "OperationCode": "NuGetSign",
- "Parameters": {},
- "ToolName": "sign",
- "ToolVersion": "1.0"
- },
- {
- "KeyCode": "CP-401405",
- "OperationCode": "NuGetVerify",
- "Parameters": {},
- "ToolName": "sign",
- "ToolVersion": "1.0"
- }
- ]
- ### END SECTION - build and sign nuget packages for abstracted UI utils
-
- - task: VSBuild@1
- displayName: Build BugReportTool
- inputs:
- solution: '**/tools/BugReportTool/BugReportTool.sln'
- vsVersion: 17.0
- msbuildArgs: -restore -graph /p:RestorePackagesConfig=true /p:RestoreConfigFile="$(Build.SourcesDirectory)\.pipelines\release-nuget.config" /p:CIBuild=true /bl:$(Build.SourcesDirectory)\msbuild.binlog
- platform: $(BuildPlatform)
- configuration: $(BuildConfiguration)
- clean: true
- maximumCpuCount: true
-
- - task: VSBuild@1
- displayName: Build WebcamReportTool
- inputs:
- solution: '**/tools/WebcamReportTool/WebcamReportTool.sln'
- vsVersion: 17.0
- msbuildArgs: -restore -graph /p:RestorePackagesConfig=true /p:RestoreConfigFile="$(Build.SourcesDirectory)\.pipelines\release-nuget.config" /p:CIBuild=true /bl:$(Build.SourcesDirectory)\msbuild.binlog
- platform: $(BuildPlatform)
- configuration: $(BuildConfiguration)
- clean: true
- maximumCpuCount: true
-
- - task: VSBuild@1
- displayName: Build StylesReportTool
- inputs:
- solution: '**/tools/StylesReportTool/StylesReportTool.sln'
- vsVersion: 17.0
- msbuildArgs: -restore -graph /p:RestorePackagesConfig=true /p:RestoreConfigFile="$(Build.SourcesDirectory)\.pipelines\release-nuget.config" /p:CIBuild=true /bl:$(Build.SourcesDirectory)\msbuild.binlog
- platform: $(BuildPlatform)
- configuration: $(BuildConfiguration)
- clean: true
- maximumCpuCount: true
-
- - task: VSBuild@1
- displayName: Publish Settings for Packaging
- inputs:
- solution: 'src/settings-ui/Settings.UI/PowerToys.Settings.csproj'
- vsVersion: 17.0
- msbuildArgs: >-
- /target:Publish
- /graph
- /p:Configuration=$(BuildConfiguration);Platform=$(BuildPlatform);AppxBundle=Never
- /p:VCRTForwarders-IncludeDebugCRT=false
- /p:PowerToysRoot=$(Build.SourcesDirectory)
- /p:PublishProfile=InstallationPublishProfile.pubxml
- platform: $(BuildPlatform)
- configuration: $(BuildConfiguration)
- maximumCpuCount: true
-
- - task: VSBuild@1
- displayName: Publish Launcher for Packaging
- inputs:
- solution: 'src/modules/launcher/PowerLauncher/PowerLauncher.csproj'
- vsVersion: 17.0
- # The arguments should be the same as the ones for Settings; make sure they are.
- msbuildArgs: >-
- /target:Publish
- /graph
- /p:Configuration=$(BuildConfiguration);Platform=$(BuildPlatform);AppxBundle=Never
- /p:VCRTForwarders-IncludeDebugCRT=false
- /p:PowerToysRoot=$(Build.SourcesDirectory)
- /p:PublishProfile=InstallationPublishProfile.pubxml
- platform: $(BuildPlatform)
- configuration: $(BuildConfiguration)
- maximumCpuCount: true
-
- - task: VSBuild@1
- displayName: Publish Monaco Preview Handler for Packaging
- inputs:
- solution: 'src/modules/previewpane/MonacoPreviewHandler/MonacoPreviewHandler.csproj'
- vsVersion: 17.0
- # The arguments should be the same as the ones for Settings; make sure they are.
- msbuildArgs: >-
- /target:Publish
- /graph
- /p:Configuration=$(BuildConfiguration);Platform=$(BuildPlatform);AppxBundle=Never
- /p:VCRTForwarders-IncludeDebugCRT=false
- /p:PowerToysRoot=$(Build.SourcesDirectory)
- /p:PublishProfile=InstallationPublishProfile.pubxml
- platform: $(BuildPlatform)
- configuration: $(BuildConfiguration)
- maximumCpuCount: true
-
- - task: VSBuild@1
- displayName: Publish Markdown Preview Handler for Packaging
- inputs:
- solution: 'src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandler.csproj'
- vsVersion: 17.0
- # The arguments should be the same as the ones for Settings; make sure they are.
- msbuildArgs: >-
- /target:Publish
- /graph
- /p:Configuration=$(BuildConfiguration);Platform=$(BuildPlatform);AppxBundle=Never
- /p:VCRTForwarders-IncludeDebugCRT=false
- /p:PowerToysRoot=$(Build.SourcesDirectory)
- /p:PublishProfile=InstallationPublishProfile.pubxml
- platform: $(BuildPlatform)
- configuration: $(BuildConfiguration)
- maximumCpuCount: true
-
- - task: VSBuild@1
- displayName: Publish Svg Preview Handler for Packaging
- inputs:
- solution: 'src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.csproj'
- vsVersion: 17.0
- # The arguments should be the same as the ones for Settings; make sure they are.
- msbuildArgs: >-
- /target:Publish
- /graph
- /p:Configuration=$(BuildConfiguration);Platform=$(BuildPlatform);AppxBundle=Never
- /p:VCRTForwarders-IncludeDebugCRT=false
- /p:PowerToysRoot=$(Build.SourcesDirectory)
- /p:PublishProfile=InstallationPublishProfile.pubxml
- platform: $(BuildPlatform)
- configuration: $(BuildConfiguration)
- maximumCpuCount: true
-
- - task: VSBuild@1
- displayName: Publish Svg Thumbnail Provider for Packaging
- inputs:
- solution: 'src/modules/previewpane/SvgThumbnailProvider/SvgThumbnailProvider.csproj'
- vsVersion: 17.0
- # The arguments should be the same as the ones for Settings; make sure they are.
- msbuildArgs: >-
- /target:Publish
- /graph
- /p:Configuration=$(BuildConfiguration);Platform=$(BuildPlatform);AppxBundle=Never
- /p:VCRTForwarders-IncludeDebugCRT=false
- /p:PowerToysRoot=$(Build.SourcesDirectory)
- /p:PublishProfile=InstallationPublishProfile.pubxml
- platform: $(BuildPlatform)
- configuration: $(BuildConfiguration)
- maximumCpuCount: true
-
- - task: VSBuild@1
- displayName: Publish File Locksmith UI for Packaging
- inputs:
- solution: 'src/modules/FileLocksmith/FileLocksmithUI/FileLocksmithUI.csproj'
- vsVersion: 17.0
- # The arguments should be the same as the ones for Settings; make sure they are.
- msbuildArgs: >-
- /target:Publish
- /graph
- /p:Configuration=$(BuildConfiguration);Platform=$(BuildPlatform);AppxBundle=Never
- /p:VCRTForwarders-IncludeDebugCRT=false
- /p:PowerToysRoot=$(Build.SourcesDirectory)
- /p:PublishProfile=InstallationPublishProfile.pubxml
- platform: $(BuildPlatform)
- configuration: $(BuildConfiguration)
- maximumCpuCount: true
-
- # Check if deps.json files don't reference different dll versions.
- - task: PowerShell@2
- displayName: Audit deps.json files for all applications
- inputs:
- filePath: '.pipelines/verifyDepsJsonLibraryVersions.ps1'
- arguments: -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)'
- pwsh: true
-
- # Check if asset files on the main application paths are playing nice and avoiding basic conflicts.
- - task: PowerShell@2
- displayName: Audit base applications path asset conflicts
- inputs:
- filePath: '.pipelines/verifyPossibleAssetConflicts.ps1'
- arguments: -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)'
- pwsh: true
-
- - task: PowerShell@2
- displayName: Audit WinAppSDK applications path asset conflicts
- inputs:
- filePath: '.pipelines/verifyPossibleAssetConflicts.ps1'
- arguments: -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)\WinUI3Apps'
- pwsh: true
-
- #### MAIN SIGNING AREA
- # reference https://dev.azure.com/microsoft/Dart/_git/AppDriver?path=/ESRPSigning.json&version=GBarm64-netcore&_a=contents for winappdriver
- # https://dev.azure.com/microsoft/Dart/_git/AppDriver?path=/CIPolicy.xml&version=GBarm64-netcore&_a=contents
-
- - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5
- displayName: Sign Core PT
- inputs:
- ${{ insert }}: ${{ parameters.signingParameters }}
- FolderPath: '$(BuildPlatform)/$(BuildConfiguration)' # Video conf uses x86 and x64.
- signType: batchSigning
- batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_core.json'
- ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
-
- - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5
- displayName: Sign DSC Powershell files
- inputs:
- ${{ insert }}: ${{ parameters.signingParameters }}
- FolderPath: 'src/dsc/Microsoft.PowerToys.Configure'
- signType: batchSigning
- batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_DSC.json'
- ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
-
- - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5
- displayName: Sign x86 directshow VCM
- inputs:
- ${{ insert }}: ${{ parameters.signingParameters }}
- FolderPath: 'x86/$(BuildConfiguration)' # Video conf uses x86 and x64.
- signType: batchSigning
- batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_vcm.json'
- ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
- #### END SIGNING
- ## END MAIN
-
- - pwsh: |-
- Move-Item msbuild.binlog "$(Build.ArtifactStagingDirectory)/"
- displayName: Stage binlog into artifact directory
- condition: always()
-
- - task: ComponentGovernanceComponentDetection@0
- displayName: Component Detection
-
- - task: CopyFiles@2
- displayName: Copying files for symbols
- inputs:
- contents: >-
- **/*.pdb
- flattenFolders: True
- targetFolder: $(Build.ArtifactStagingDirectory)/Symbols-$(BuildPlatform)/
-
- - task: PowerShell@2
- displayName: 'Remove unneeded files from ArtifactStagingDirectory'
- inputs:
- targetType: 'inline'
- script: |
- cd $(Build.ArtifactStagingDirectory)/Symbols-$(BuildPlatform)/
- Remove-Item vc143.pdb
- Remove-Item *test*
-
- - task: PublishSymbols@2
- displayName: Publish symbols path
- continueOnError: True
- inputs:
- SearchPattern: |
- $(Build.ArtifactStagingDirectory)/Symbols-$(BuildPlatform)/**/*.*
- IndexSources: false
- SymbolServerType: TeamServices
-
- - template: .pipelines/installer-steps.yml@self
- parameters:
- signingParameters: ${{ parameters.signingParameters }}
- versionNumber: ${{ parameters.versionNumber }}
- perUserArg: "false"
- buildSubDir: "MachineSetup"
- installerPrefix: "PowerToysSetup"
-
- - task: PowerShell@2
- displayName: Clean installer dir before building per-user installer
- inputs:
- targetType: inline
- script: git clean -xfd -e *exe -- .\installer\
- pwsh: true
-
- - template: .pipelines/installer-steps.yml@self
- parameters:
- signingParameters: ${{ parameters.signingParameters }}
- versionNumber: ${{ parameters.versionNumber }}
- perUserArg: "true"
- buildSubDir: "UserSetup"
- installerPrefix: "PowerToysUserSetup"
-
- - task: CopyFiles@2
- displayName: Copying setup file over
- inputs:
- contents: "**/PowerToys*Setup-*.exe"
- flattenFolders: True
- targetFolder: $(Build.ArtifactStagingDirectory)
-
- - task: PowerShell@2
- displayName: 'Calculating SHA256 hash'
- inputs:
- targetType: 'inline'
- script: |
- $p = "$(System.ArtifactsDirectory)\";
- $staging = "$(Build.ArtifactStagingDirectory)\"
- $userHash = ((get-item $p\PowerToysUserSetup*.exe | Get-FileHash).Hash);
- $machineHash = ((get-item $p\PowerToysSetup*.exe | Get-FileHash).Hash);
- $userPlat = "hash_user_$(BuildPlatform).txt";
- $machinePlat = "hash_machine_$(BuildPlatform).txt";
- $combinedUserPath = $staging + $userPlat;
- $combinedMachinePath = $staging + $machinePlat;
-
- echo $p
-
- echo $userPlat
- echo $userHash
- echo $combinedUserPath
-
- echo $machinePlat
- echo $machineHash
- echo $combinedMachinePath
-
- $userHash | out-file -filepath $combinedUserPath
- $machineHash | out-file -filepath $combinedMachinePath
- pwsh: true
-
- # Publishing the GPO files
- - pwsh: |-
- New-Item "$(Build.ArtifactStagingDirectory)/gpo" -Type Directory
- Copy-Item src\gpo\assets\* "$(Build.ArtifactStagingDirectory)/gpo" -Recurse
- displayName: Stage the GPO files
-
-...
diff --git a/.pipelines/v2/ci.yml b/.pipelines/v2/ci.yml
new file mode 100644
index 00000000000..268bea7d11b
--- /dev/null
+++ b/.pipelines/v2/ci.yml
@@ -0,0 +1,46 @@
+trigger:
+ batch: true
+ branches:
+ include:
+ - main
+ - stable
+ paths:
+ exclude:
+ - doc/*
+ - temp/*
+ - tools/*
+ - '**.md'
+
+pr:
+ branches:
+ include:
+ - main
+ - stable
+ paths:
+ exclude:
+ - '**.md'
+ - doc
+
+name: $(BuildDefinitionName)_$(date:yyMM).$(date:dd)$(rev:rrr)
+
+parameters:
+ - name: buildPlatforms
+ type: object
+ default:
+ - x64
+ - arm64
+ - name: enableMsBuildCaching
+ type: boolean
+ displayName: "Enable MSBuild Caching"
+ default: true
+ - name: runTests
+ type: boolean
+ displayName: "Run Tests"
+ default: true
+
+extends:
+ template: templates/pipeline-ci-build.yml
+ parameters:
+ buildPlatforms: ${{ parameters.buildPlatforms }}
+ enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }}
+ runTests: ${{ parameters.runTests }}
diff --git a/.pipelines/v2/release.yml b/.pipelines/v2/release.yml
new file mode 100644
index 00000000000..de474564a32
--- /dev/null
+++ b/.pipelines/v2/release.yml
@@ -0,0 +1,106 @@
+trigger: none
+pr: none
+
+resources:
+ repositories:
+ - repository: 1ESPipelineTemplates
+ type: git
+ name: 1ESPipelineTemplates/1ESPipelineTemplates
+ ref: refs/tags/release
+
+# Expose all of these parameters for user configuration.
+parameters:
+ - name: versionNumber
+ displayName: "Version Number"
+ type: string
+ default: '0.0.1'
+
+ - name: buildConfigurations
+ displayName: "Build Configurations"
+ type: object
+ default:
+ - Release
+
+ - name: buildPlatforms
+ displayName: "Build Platforms"
+ type: object
+ default:
+ - x64
+ - arm64
+
+ - name: publishSymbolsToPublic
+ displayName: "Publish Symbols to **PUBLIC** (use only for Final Builds)"
+ type: boolean
+ default: true
+
+name: $(BuildDefinitionName)_$(date:yyMM).$(date:dd)$(rev:rrr)
+
+extends:
+ template: v1/1ES.Official.PipelineTemplate.yml@1ESPipelineTemplates
+ parameters:
+ customBuildTags:
+ - 1ES.PT.ViaStartRight
+ pool:
+ name: SHINE-INT-S
+ image: SHINE-VS17-Latest
+ os: windows
+ sdl:
+ tsa:
+ enabled: true
+ configFile: '$(Build.SourcesDirectory)\.pipelines\tsa.json'
+
+ stages:
+ - stage: Build
+ displayName: Build
+ dependsOn: []
+ jobs:
+ - template: .pipelines/v2/templates/job-build-project.yml@self
+ parameters:
+ pool:
+ name: SHINE-INT-L
+ image: SHINE-VS17-Latest
+ os: windows
+ variables:
+ IsPipeline: 1 # The installer uses this to detect whether it should pick up localizations
+ SkipCppCodeAnalysis: 1 # Skip the code analysis to speed up release CI. It runs on PR CI, anyway
+ # IsExperimentationLive: 1 # The build and installer use this to turn on experimentation
+ buildPlatforms: ${{ parameters.buildPlatforms }}
+ buildConfigurations: ${{ parameters.buildConfigurations }}
+ versionNumber: ${{ parameters.versionNumber }}
+ publishArtifacts: false # 1ES PT handles publication for us.
+ codeSign: true
+ runTests: false
+ signingIdentity:
+ serviceName: $(SigningServiceName)
+ appId: $(SigningAppId)
+ tenantId: $(SigningTenantId)
+ akvName: $(SigningAKVName)
+ authCertName: $(SigningAuthCertName)
+ signCertName: $(SigningSignCertName)
+ # Have msbuild use the release nuget config profile
+ additionalBuildOptions: /p:RestoreConfigFile="$(Build.SourcesDirectory)\.pipelines\release-nuget.config"
+ beforeBuildSteps:
+ # Sets versions for all PowerToy created DLLs
+ - pwsh: |-
+ .pipelines/versionSetting.ps1 -versionNumber '${{ parameters.versionNumber }}' -DevEnvironment ''
+ displayName: Prepare versioning
+
+ # Prepare the localizations and telemetry config before the release build
+ - template: .pipelines/v2/templates/steps-fetch-and-prepare-localizations.yml@self
+
+ - script: |
+ call nuget.exe restore -configFile .pipelines/release-nuget.config -PackagesDirectory . .pipelines/packages.config || exit /b 1
+ move /Y "Microsoft.PowerToys.Telemetry.2.0.0\build\include\TraceLoggingDefines.h" "src\common\Telemetry\TraceLoggingDefines.h" || exit /b 1
+ move /Y "Microsoft.PowerToys.Telemetry.2.0.0\build\include\TelemetryBase.cs" "src\common\Telemetry\TelemetryBase.cs" || exit /b 1
+ displayName: Emplace telemetry files
+
+ - stage: Publish
+ displayName: Publish
+ dependsOn: [Build]
+ jobs:
+ - template: .pipelines/v2/templates/job-publish-symbols-using-symbolrequestprod-api.yml@self
+ parameters:
+ versionNumber: ${{ parameters.versionNumber }}
+ includePublicSymbolServer: ${{ parameters.publishSymbolsToPublic }}
+ subscription: $(SymbolPublishingServiceConnection)
+ symbolProject: $(SymbolPublishingProject)
diff --git a/.pipelines/v2/templates/job-build-project.yml b/.pipelines/v2/templates/job-build-project.yml
new file mode 100644
index 00000000000..88417ca983e
--- /dev/null
+++ b/.pipelines/v2/templates/job-build-project.yml
@@ -0,0 +1,538 @@
+parameters:
+ - name: additionalBuildOptions
+ type: string
+ default: ''
+ - name: buildConfigurations
+ type: object
+ default:
+ - Release
+ - name: buildPlatforms
+ type: object
+ default:
+ - x64
+ - arm64
+ - name: codeSign
+ type: boolean
+ default: false
+ - name: artifactStem
+ type: string
+ default: ''
+ - name: jobName
+ type: string
+ default: 'Build'
+ - name: condition
+ type: string
+ default: ''
+ - name: dependsOn
+ type: object
+ default: []
+ - name: pool
+ type: object
+ default: []
+ - name: beforeBuildSteps
+ type: stepList
+ default: []
+ - name: variables
+ type: object
+ default: {}
+ - name: publishArtifacts
+ type: boolean
+ default: true
+ - name: signingIdentity
+ type: object
+ default: {}
+ - name: enablePackageCaching
+ type: boolean
+ default: false
+ - name: enableMsBuildCaching
+ type: boolean
+ default: false
+ - name: runTests
+ type: boolean
+ default: true
+
+ - name: versionNumber
+ type: string
+ default: '0.0.1'
+ - name: csProjectsToPublish
+ type: object
+ default:
+ - 'src/settings-ui/Settings.UI/PowerToys.Settings.csproj'
+ - 'src/modules/launcher/PowerLauncher/PowerLauncher.csproj'
+ - 'src/modules/previewpane/MonacoPreviewHandler/MonacoPreviewHandler.csproj'
+ - 'src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandler.csproj'
+ - 'src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.csproj'
+ - 'src/modules/previewpane/SvgThumbnailProvider/SvgThumbnailProvider.csproj'
+ - 'src/modules/FileLocksmith/FileLocksmithUI/FileLocksmithUI.csproj'
+
+jobs:
+- job: ${{ parameters.jobName }}
+ ${{ if ne(length(parameters.pool), 0) }}:
+ pool: ${{ parameters.pool }}
+ dependsOn: ${{ parameters.dependsOn }}
+ condition: ${{ parameters.condition }}
+ strategy:
+ matrix:
+ ${{ each config in parameters.buildConfigurations }}:
+ ${{ each platform in parameters.buildPlatforms }}:
+ ${{ config }}_${{ platform }}:
+ BuildConfiguration: ${{ config }}
+ BuildPlatform: ${{ platform }}
+ ${{ if eq(platform, 'x86') }}:
+ OutputBuildPlatform: Win32
+ ${{ elseif eq(platform, 'Any CPU') }}:
+ OutputBuildPlatform: AnyCPU
+ ${{ else }}:
+ OutputBuildPlatform: ${{ platform }}
+ variables:
+ # Azure DevOps abhors a vacuum
+ # If these are blank, expansion will fail later on... which will result in direct substitution of the variable *names*
+ # later on. We'll just... set them to a single space and if we need to, check IsNullOrWhiteSpace.
+ # Yup.
+ MSBuildCacheParameters: ' '
+ JobOutputDirectory: $(Build.ArtifactStagingDirectory)
+ LogOutputDirectory: $(Build.ArtifactStagingDirectory)\logs
+ JobOutputArtifactName: build-$(BuildPlatform)-$(BuildConfiguration)${{ parameters.artifactStem }}
+ NUGET_RESTORE_MSBUILD_ARGS: /p:Platform=$(BuildPlatform) # Required for nuget to work due to self contained
+ NODE_OPTIONS: --max_old_space_size=16384
+ ${{ if eq(parameters.runTests, true) }}:
+ MSBuildMainBuildTargets: Build;Test
+ ${{ else }}:
+ MSBuildMainBuildTargets: Build
+ ${{ insert }}: ${{ parameters.variables }}
+ displayName: Build
+ timeoutInMinutes: 240
+ cancelTimeoutInMinutes: 1
+ templateContext: # Required when this template is hosted in 1ES PT
+ outputs:
+ - output: pipelineArtifact
+ artifactName: $(JobOutputArtifactName)
+ targetPath: $(Build.ArtifactStagingDirectory)
+ steps:
+ - checkout: self
+ clean: true
+ submodules: true
+ persistCredentials: True
+ fetchTags: false
+ fetchDepth: 1
+
+ - ${{ if eq(parameters.enableMsBuildCaching, true) }}:
+ - pwsh: |-
+ $MSBuildCacheParameters = ""
+ $MSBuildCacheParameters += " -graph"
+ $MSBuildCacheParameters += " -reportfileaccesses"
+ $MSBuildCacheParameters += " -p:MSBuildCacheEnabled=true"
+ $MSBuildCacheParameters += " -p:MSBuildCacheLogDirectory=$(LogOutputDirectory)\MSBuildCacheLogs"
+ Write-Host "MSBuildCacheParameters: $MSBuildCacheParameters"
+ Write-Host "##vso[task.setvariable variable=MSBuildCacheParameters]$MSBuildCacheParameters"
+ displayName: Prepare MSBuildCache variables
+
+ - ${{ if eq(parameters.codeSign, true) }}:
+ # Only required if we're using ESRP
+ - template: steps-ensure-dotnet-version.yml
+ parameters:
+ sdk: true
+ version: '6.0'
+
+ - template: steps-ensure-dotnet-version.yml
+ parameters:
+ sdk: true
+ version: '8.0'
+
+ - ${{ if eq(parameters.runTests, true) }}:
+ - task: VisualStudioTestPlatformInstaller@1
+ displayName: Ensure VSTest Platform
+
+ - pwsh: |-
+ & '.pipelines/applyXamlStyling.ps1' -Passive
+ & '.pipelines/verifyNugetPackages.ps1' -solution '$(build.sourcesdirectory)\PowerToys.sln'
+ & '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\PowerToys.sln'
+ & '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\tools\BugReportTool\BugReportTool.sln'
+ & '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\tools\WebcamReportTool\WebcamReportTool.sln'
+ & '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\tools\StylesReportTool\StylesReportTool.sln'
+ & '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\installer\PowerToysSetup.sln'
+ displayName: Verify formatting, nuget, and ARM64 configurations
+
+ - ${{ if eq(parameters.enablePackageCaching, true) }}:
+ - task: Cache@2
+ displayName: 'Cache nuget packages (PackageReference)'
+ inputs:
+ key: '"PackageReference" | "$(Agent.OS)" | Directory.Packages.props'
+ restoreKeys: |
+ "PackageReference" | "$(Agent.OS)"
+ "PackageReference"
+ path: $(NUGET_PACKAGES)
+
+ - task: Cache@2
+ displayName: 'Cache nuget packages (packages.config)'
+ inputs:
+ key: '"packages.config" | "$(Agent.OS)" | **/packages.config'
+ restoreKeys: |
+ "packages.config" | "$(Agent.OS)"
+ "packages.config"
+ path: packages
+
+ - template: .\steps-restore-nuget.yml
+
+ - pwsh: |-
+ & "$(build.sourcesdirectory)\.pipelines\verifyAndSetLatestVCToolsVersion.ps1"
+ displayName: Work around DD-1541167 (VCToolsVersion)
+
+ - pwsh: |-
+ & "$(build.sourcesdirectory)\.pipelines\installWiX.ps1"
+ displayName: Download and install WiX 3.14 development build
+
+ - ${{ parameters.beforeBuildSteps }}
+
+ - task: VSBuild@1
+ ${{ if eq(parameters.runTests, true) }}:
+ displayName: Build and Test PowerToys main project
+ ${{ else }}:
+ displayName: Build PowerToys main project
+ inputs:
+ solution: 'PowerToys.sln'
+ vsVersion: 17.0
+ msbuildArgs: >-
+ -restore -graph
+ /p:RestorePackagesConfig=true
+ /p:CIBuild=true
+ /bl:$(LogOutputDirectory)\build-0-main.binlog
+ ${{ parameters.additionalBuildOptions }}
+ $(MSBuildCacheParameters)
+ /t:$(MSBuildMainBuildTargets)
+ platform: $(BuildPlatform)
+ configuration: $(BuildConfiguration)
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+ ${{ if eq(parameters.enableMsBuildCaching, true) }}:
+ env:
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+
+ - ${{ if eq(parameters.codeSign, true) }}:
+ - template: steps-esrp-signing.yml
+ parameters:
+ displayName: Sign Utilities
+ signingIdentity: ${{ parameters.signingIdentity }}
+ inputs:
+ FolderPath: 'src/modules'
+ signType: batchSigning
+ batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_abstracted_utils_dll.json'
+ ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
+
+ - task: VSBuild@1
+ displayName: Create Hosts File Editor package
+ inputs:
+ solution: '**\HostsUILib.csproj'
+ vsVersion: 17.0
+ msbuildArgs: /p:CIBuild=true -t:pack /bl:$(LogOutputDirectory)\build-hosts.binlog
+ configuration: $(BuildConfiguration)
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+ ${{ if eq(parameters.enableMsBuildCaching, true) }}:
+ env:
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+
+ - task: VSBuild@1
+ displayName: Create Environment Variables Editor package
+ inputs:
+ solution: '**\EnvironmentVariablesUILib.csproj'
+ vsVersion: 17.0
+ msbuildArgs: /p:CIBuild=true -t:pack /bl:$(LogOutputDirectory)\build-env-var-editor.binlog
+ configuration: $(BuildConfiguration)
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+ ${{ if eq(parameters.enableMsBuildCaching, true) }}:
+ env:
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+
+ - task: VSBuild@1
+ displayName: Create Registry Preview package
+ inputs:
+ solution: '**\RegistryPreviewUILib.csproj'
+ vsVersion: 17.0
+ msbuildArgs: /p:CIBuild=true -t:pack /bl:$(LogOutputDirectory)\build-registry-preview.binlog
+ configuration: $(BuildConfiguration)
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+ ${{ if eq(parameters.enableMsBuildCaching, true) }}:
+ env:
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+
+ - task: CopyFiles@2
+ displayName: Stage NuGet packages
+ inputs:
+ contents: "**/bin/Release/PowerToys*.nupkg"
+ flattenFolders: True
+ targetFolder: $(JobOutputDirectory)/nupkg
+
+ - ${{ if eq(parameters.codeSign, true) }}:
+ - template: steps-esrp-signing.yml
+ parameters:
+ displayName: Sign NuGet packages
+ signingIdentity: ${{ parameters.signingIdentity }}
+ inputs:
+ FolderPath: $(JobOutputDirectory)/nupkg
+ Pattern: '*.nupkg'
+ UseMinimatch: true
+ signConfigType: inlineSignParams
+ inlineOperation: >-
+ [
+ {
+ "KeyCode": "CP-401405",
+ "OperationCode": "NuGetSign",
+ "Parameters": {},
+ "ToolName": "sign",
+ "ToolVersion": "1.0"
+ },
+ {
+ "KeyCode": "CP-401405",
+ "OperationCode": "NuGetVerify",
+ "Parameters": {},
+ "ToolName": "sign",
+ "ToolVersion": "1.0"
+ }
+ ]
+
+ - task: VSBuild@1
+ displayName: Build BugReportTool
+ inputs:
+ solution: '**/tools/BugReportTool/BugReportTool.sln'
+ vsVersion: 17.0
+ msbuildArgs: >-
+ -restore -graph
+ /p:RestorePackagesConfig=true
+ /p:CIBuild=true
+ /bl:$(LogOutputDirectory)\build-bug-report.binlog
+ ${{ parameters.additionalBuildOptions }}
+ $(MSBuildCacheParameters)
+ platform: $(BuildPlatform)
+ configuration: $(BuildConfiguration)
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+ ${{ if eq(parameters.enableMsBuildCaching, true) }}:
+ env:
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+
+ - task: VSBuild@1
+ displayName: Build WebcamReportTool
+ inputs:
+ solution: '**/tools/WebcamReportTool/WebcamReportTool.sln'
+ vsVersion: 17.0
+ msbuildArgs: >-
+ -restore -graph
+ /p:RestorePackagesConfig=true
+ /p:CIBuild=true
+ /bl:$(LogOutputDirectory)\build-webcam-report.binlog
+ ${{ parameters.additionalBuildOptions }}
+ $(MSBuildCacheParameters)
+ platform: $(BuildPlatform)
+ configuration: $(BuildConfiguration)
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+ ${{ if eq(parameters.enableMsBuildCaching, true) }}:
+ env:
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+
+ - task: VSBuild@1
+ displayName: Build StylesReportTool
+ inputs:
+ solution: '**/tools/StylesReportTool/StylesReportTool.sln'
+ vsVersion: 17.0
+ msbuildArgs: >-
+ -restore -graph
+ /p:RestorePackagesConfig=true
+ /p:CIBuild=true
+ /bl:$(LogOutputDirectory)\build-styles-report.binlog
+ ${{ parameters.additionalBuildOptions }}
+ $(MSBuildCacheParameters)
+ platform: $(BuildPlatform)
+ configuration: $(BuildConfiguration)
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+ ${{ if eq(parameters.enableMsBuildCaching, true) }}:
+ env:
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+
+ - ${{ each project in parameters.csProjectsToPublish }}:
+ - task: VSBuild@1
+ displayName: Publish ${{ project }} for Packaging
+ inputs:
+ solution: ${{ project }}
+ vsVersion: 17.0
+ msbuildArgs: >-
+ /target:Publish
+ /graph
+ /p:Configuration=$(BuildConfiguration);Platform=$(BuildPlatform);AppxBundle=Never
+ /p:VCRTForwarders-IncludeDebugCRT=false
+ /p:PowerToysRoot=$(Build.SourcesDirectory)
+ /p:PublishProfile=InstallationPublishProfile.pubxml
+ /bl:$(LogOutputDirectory)\publish-${{ join('_',split(project, '/')) }}.binlog
+ platform: $(BuildPlatform)
+ configuration: $(BuildConfiguration)
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+
+ # Check if deps.json files don't reference different dll versions.
+ - pwsh: |-
+ & '.pipelines/verifyDepsJsonLibraryVersions.ps1' -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)'
+ displayName: Audit deps.json files for all applications
+
+ # Check if asset files on the main application paths are playing nice and avoiding basic conflicts.
+ - pwsh: |-
+ & '.pipelines/verifyPossibleAssetConflicts.ps1' -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)'
+ displayName: Audit base applications path asset conflicts
+
+ - pwsh: |-
+ & '.pipelines/verifyPossibleAssetConflicts.ps1' -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)\WinUI3Apps'
+ displayName: Audit WinAppSDK applications path asset conflicts
+
+ - pwsh: |-
+ & '.pipelines/verifyNoticeMdAgainstNugetPackages.ps1' -path '$(build.sourcesdirectory)\'
+ displayName: Verify NOTICE.md and NuGet packages match
+
+ - ${{ if eq(parameters.runTests, true) }}:
+ # Publish test results which ran in MSBuild
+ - task: PublishTestResults@2
+ displayName: 'Publish Test Results'
+ inputs:
+ testResultsFormat: VSTest
+ testResultsFiles: '**/*.trx'
+ condition: ne(variables['BuildPlatform'],'arm64')
+
+ # Native dlls
+ - task: VSTest@2
+ condition: ne(variables['BuildPlatform'],'arm64') # No arm64 agents to run the tests.
+ displayName: 'Native Tests'
+ inputs:
+ platform: '$(BuildPlatform)'
+ configuration: '$(BuildConfiguration)'
+ testSelector: 'testAssemblies'
+ testAssemblyVer2: |
+ **\KeyboardManagerEngineTest.dll
+ **\KeyboardManagerEditorTest.dll
+ **\UnitTests-CommonLib.dll
+ **\PowerRenameUnitTests.dll
+ **\UnitTests-FancyZones.dll
+ !**\obj\**
+
+ - ${{ if eq(parameters.codeSign, true) }}:
+ - template: steps-esrp-signing.yml
+ parameters:
+ displayName: Sign Core PowerToys
+ signingIdentity: ${{ parameters.signingIdentity }}
+ inputs:
+ FolderPath: '$(BuildPlatform)/$(BuildConfiguration)' # Video conf uses x86 and x64.
+ signType: batchSigning
+ batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_core.json'
+ ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
+
+ - template: steps-esrp-signing.yml
+ parameters:
+ displayName: Sign DSC files
+ signingIdentity: ${{ parameters.signingIdentity }}
+ inputs:
+ FolderPath: 'src/dsc/Microsoft.PowerToys.Configure'
+ signType: batchSigning
+ batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_DSC.json'
+ ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
+
+ - template: steps-esrp-signing.yml
+ parameters:
+ displayName: Sign x86 DirectShow VCM
+ signingIdentity: ${{ parameters.signingIdentity }}
+ inputs:
+ FolderPath: 'x86/$(BuildConfiguration)' # Video conf uses x86 and x64.
+ signType: batchSigning
+ batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_vcm.json'
+ ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
+
+ - template: steps-build-installer.yml
+ parameters:
+ codeSign: ${{ parameters.codeSign }}
+ signingIdentity: ${{ parameters.signingIdentity }}
+ versionNumber: ${{ parameters.versionNumber }}
+ additionalBuildOptions: ${{ parameters.additionalBuildOptions }}
+
+ - template: steps-build-installer.yml
+ parameters:
+ codeSign: ${{ parameters.codeSign }}
+ signingIdentity: ${{ parameters.signingIdentity }}
+ versionNumber: ${{ parameters.versionNumber }}
+ additionalBuildOptions: ${{ parameters.additionalBuildOptions }}
+ buildUserInstaller: true # NOTE: This is the distinction between the above and below rules
+
+ # This saves ~1GiB per architecture. We won't need these later.
+ # Removes:
+ # - All .pdbs from any static libs .libs (which were only used during linking)
+ - pwsh: |-
+ $binDir = '$(Build.SourcesDirectory)'
+ $ImportLibs = Get-ChildItem $binDir -Recurse -File -Filter '*.exp' | ForEach-Object { $_.FullName -Replace "exp$","lib" }
+ $StaticLibs = Get-ChildItem $binDir -Recurse -File -Filter '*.lib' | Where-Object FullName -NotIn $ImportLibs
+
+ $Items = @()
+ $Items += Get-Item ($StaticLibs.FullName -Replace "lib$","pdb") -ErrorAction:Ignore
+
+ $Items | Remove-Item -Recurse -Force -Verbose -ErrorAction:Ignore
+ displayName: Clean up static libs PDBs
+ errorActionPreference: silentlyContinue # It's OK if this silently fails
+
+ - task: CopyFiles@2
+ displayName: Stage Installers
+ inputs:
+ contents: "**/PowerToys*Setup-*.exe"
+ flattenFolders: True
+ targetFolder: $(JobOutputDirectory)
+
+ - task: CopyFiles@2
+ displayName: Stage Symbols
+ inputs:
+ contents: |-
+ **\*.pdb
+ !**\vc143.pdb
+ !**\*test*.pdb
+ flattenFolders: True
+ targetFolder: $(JobOutputDirectory)/symbols-$(BuildPlatform)/
+
+ - pwsh: |-
+ $p = "$(JobOutputDirectory)\"
+ $userHash = ((Get-Item $p\PowerToysUserSetup*.exe | Get-FileHash).Hash);
+ $machineHash = ((Get-Item $p\PowerToysSetup*.exe | Get-FileHash).Hash);
+ $userPlat = "hash_user_$(BuildPlatform).txt";
+ $machinePlat = "hash_machine_$(BuildPlatform).txt";
+ $combinedUserPath = $p + $userPlat;
+ $combinedMachinePath = $p + $machinePlat;
+
+ echo $p
+
+ echo $userPlat
+ echo $userHash
+ echo $combinedUserPath
+
+ echo $machinePlat
+ echo $machineHash
+ echo $combinedMachinePath
+
+ $userHash | out-file -filepath $combinedUserPath
+ $machineHash | out-file -filepath $combinedMachinePath
+ displayName: Calculate file hashes
+
+ # Publishing the GPO files
+ - pwsh: |-
+ New-Item "$(JobOutputDirectory)/gpo" -Type Directory
+ Copy-Item src\gpo\assets\* "$(JobOutputDirectory)/gpo" -Recurse
+ displayName: Stage GPO files
+
+ # Running the tests may result in future jobs consuming artifacts out of this build
+ - ${{ if eq(parameters.runTests, true) }}:
+ - task: CopyFiles@2
+ displayName: Stage entire build output
+ inputs:
+ sourceFolder: '$(Build.SourcesDirectory)'
+ contents: '$(BuildPlatform)/$(BuildConfiguration)/**/*'
+ targetFolder: '$(JobOutputDirectory)\$(BuildPlatform)\$(BuildConfiguration)'
+
+ - ${{ if eq(parameters.publishArtifacts, true) }}:
+ - publish: $(JobOutputDirectory)
+ artifact: $(JobOutputArtifactName)
+ displayName: Publish all outputs
+ condition: always()
diff --git a/.pipelines/v2/templates/job-ci-precheck.yml b/.pipelines/v2/templates/job-ci-precheck.yml
new file mode 100644
index 00000000000..6d3616ff69e
--- /dev/null
+++ b/.pipelines/v2/templates/job-ci-precheck.yml
@@ -0,0 +1,30 @@
+# yaml-language-server: $schema=https://raw.githubusercontent.com/microsoft/azure-pipelines-vscode/master/service-schema.json
+jobs:
+- job: Precheck
+ pool:
+ vmImage: windows-2022
+ steps:
+ - checkout: none
+
+ - pwsh: |-
+ try {
+ # Try based on pull request first
+ $pullRequestNumber = "$(system.pullRequest.pullRequestNumber)";
+ $gitHubPullRequest = Invoke-RestMethod -Method Get "https://api.github.com/repos/microsoft/PowerToys/pulls/$pullRequestNumber/files"
+ # If there are no files updated in the commit that are .md, set skipBuild variable
+ if(([array]($gitHubPullRequest.filename) -notmatch ".md|.txt").Length -eq 0) {
+ Write-Host '##vso[task.setvariable variable=skipBuild;isOutput=true]Yes'
+ Write-Host 'Skipping Build'
+ }
+ }
+ catch {
+ # Fall back to the latest commit otherwise.
+ $commit = "$(build.sourceVersion)";
+ $gitHubCommit = Invoke-RestMethod -Method Get "https://api.github.com/repos/microsoft/PowerToys/commits/$commit"
+ if(([array]($githubCommit.files.filename) -notmatch ".md|.txt").Length -eq 0) {
+ Write-Host '##vso[task.setvariable variable=skipBuild;isOutput=true]Yes'
+ Write-Host 'Skipping Build'
+ }
+ }
+ displayName: Verify whether we need to build at all
+ name: verifyBuildRequest
diff --git a/.pipelines/v2/templates/job-publish-symbols-using-symbolrequestprod-api.yml b/.pipelines/v2/templates/job-publish-symbols-using-symbolrequestprod-api.yml
new file mode 100644
index 00000000000..967b7ba4ebd
--- /dev/null
+++ b/.pipelines/v2/templates/job-publish-symbols-using-symbolrequestprod-api.yml
@@ -0,0 +1,116 @@
+parameters:
+ - name: includePublicSymbolServer
+ type: boolean
+ default: false
+ - name: pool
+ type: object
+ default: []
+ - name: dependsOn
+ type: object
+ default: null
+ - name: versionNumber
+ type: string
+ default: '0.0.1'
+ - name: artifactStem
+ type: string
+ default: ''
+ - name: jobName
+ type: string
+ default: PublishSymbols
+ - name: symbolExpiryTime
+ type: string
+ default: 36530 # This is the default from PublishSymbols@2
+ - name: variables
+ type: object
+ default: {}
+ - name: subscription
+ type: string
+ - name: symbolProject
+ type: string
+
+jobs:
+- job: ${{ parameters.jobName }}
+ ${{ if ne(length(parameters.pool), 0) }}:
+ pool: ${{ parameters.pool }}
+ ${{ if eq(parameters.includePublicSymbolServer, true) }}:
+ displayName: Publish Symbols to Internal and MSDL
+ ${{ else }}:
+ displayName: Publish Symbols Internally
+ dependsOn: ${{ parameters.dependsOn }}
+ variables:
+ ${{ insert }}: ${{ parameters.variables }}
+ SymbolsArtifactName: "PowerToys_${{parameters.versionNumber}}_$(Build.BuildNumber)"
+ steps:
+ - checkout: self
+ clean: true
+ fetchDepth: 1
+ fetchTags: false # Tags still result in depth > 1 fetch; we don't need them here
+ submodules: true
+ persistCredentials: True
+
+ - task: DownloadPipelineArtifact@2
+ displayName: Download all PDBs from all prior build phases
+ inputs:
+ itemPattern: '**/*.pdb'
+ targetPath: '$(Build.SourcesDirectory)/symbolStaging'
+
+ - powershell: |-
+ Get-PackageProvider -Name NuGet -ForceBootstrap
+ Install-Module -Verbose -AllowClobber -Force Az.Accounts, Az.Storage, Az.Network, Az.Resources, Az.Compute
+ displayName: Install Azure Module Dependencies
+
+ # Transit the Azure token from the Service Connection into a secret variable for the rest of the pipeline to use.
+ - task: AzurePowerShell@5
+ displayName: Generate an Azure Token
+ inputs:
+ azureSubscription: ${{ parameters.subscription }}
+ azurePowerShellVersion: LatestVersion
+ pwsh: true
+ ScriptType: InlineScript
+ Inline: |-
+ $AzToken = (Get-AzAccessToken -ResourceUrl api://30471ccf-0966-45b9-a979-065dbedb24c1).Token
+ Write-Host "##vso[task.setvariable variable=SymbolAccessToken;issecret=true]$AzToken"
+
+
+ - task: PublishSymbols@2
+ displayName: Publish Symbols (to current Azure DevOps tenant)
+ continueOnError: True
+ inputs:
+ SymbolsFolder: '$(Build.SourcesDirectory)/symbolStaging'
+ SearchPattern: '**/*.pdb'
+ IndexSources: false
+ DetailedLog: true
+ SymbolsMaximumWaitTime: 30
+ SymbolServerType: 'TeamServices'
+ SymbolsProduct: 'PowerToys Converged Symbols'
+ SymbolsVersion: '${{ parameters.versionNumber }}'
+ SymbolsArtifactName: $(SymbolsArtifactName)
+ SymbolExpirationInDays: ${{ parameters.symbolExpiryTime }}
+ env:
+ LIB: $(Build.SourcesDirectory)
+
+ - pwsh: |-
+ # Prepare the defaults for IRM
+ $PSDefaultParameterValues['Invoke-RestMethod:Headers'] = @{ Authorization = "Bearer $(SymbolAccessToken)" }
+ $PSDefaultParameterValues['Invoke-RestMethod:ContentType'] = "application/json"
+ $PSDefaultParameterValues['Invoke-RestMethod:Method'] = "POST"
+
+ $BaseUri = "https://symbolrequestprod.trafficmanager.net/projects/${{ parameters.symbolProject }}/requests"
+
+ # Prepare the request
+ $expiration = (Get-Date).Add([TimeSpan]::FromDays(${{ parameters.symbolExpiryTime }}))
+ $createRequestBody = @{
+ requestName = "$(SymbolsArtifactName)";
+ expirationTime = $expiration.ToString();
+ }
+ Write-Host "##[debug]Starting request $($createRequestBody.requestName) with expiration date of $($createRequestBody.expirationTime)"
+ Invoke-RestMethod -Uri "$BaseUri" -Body ($createRequestBody | ConvertTo-Json -Compress) -Verbose
+
+ # Request symbol publication
+ $publishRequestBody = @{
+ publishToInternalServer = $true;
+ publishToPublicServer = $${{ parameters.includePublicSymbolServer }};
+ }
+ Write-Host "##[debug]Submitting request $($createRequestBody.requestName) ($($publishRequestBody | ConvertTo-Json -Compress))"
+ Invoke-RestMethod -Uri "$BaseUri/$($createRequestBody.requestName)" -Body ($publishRequestBody | ConvertTo-Json -Compress) -Verbose
+ displayName: Publish Symbols using internal REST API
diff --git a/.pipelines/v2/templates/job-test-project.yml b/.pipelines/v2/templates/job-test-project.yml
new file mode 100644
index 00000000000..f5167ededdb
--- /dev/null
+++ b/.pipelines/v2/templates/job-test-project.yml
@@ -0,0 +1,76 @@
+parameters:
+ - name: configuration
+ type: string
+ default: "Release"
+ - name: platform
+ type: string
+ default: ""
+ - name: inputArtifactStem
+ type: string
+ default: ""
+
+jobs:
+- job: Test${{ parameters.platform }}${{ parameters.configuration }}
+ displayName: Test ${{ parameters.platform }} ${{ parameters.configuration }}
+ variables:
+ BuildPlatform: ${{ parameters.platform }}
+ BuildConfiguration: ${{ parameters.configuration }}
+ SrcPath: $(Build.Repository.LocalPath)
+ pool:
+ ${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}:
+ ${{ if ne(parameters.platform, 'ARM64') }}:
+ name: SHINE-INT-Testing-x64
+ ${{ else }}:
+ name: SHINE-INT-Testing-arm64
+ ${{ else }}:
+ ${{ if ne(parameters.platform, 'ARM64') }}:
+ name: SHINE-OSS-Testing-x64
+ ${{ else }}:
+ name: SHINE-OSS-Testing-arm64
+ steps:
+ - checkout: self
+ submodules: false
+ clean: true
+ fetchDepth: 1
+ fetchTags: false
+
+ - download: current
+ displayName: Download artifacts
+ artifact: build-${{ parameters.platform }}-${{ parameters.configuration }}${{ parameters.inputArtifactStem }}
+ patterns: |-
+ **
+ !**\*.pdb
+ !**\*.lib
+
+ - template: steps-ensure-dotnet-version.yml
+ parameters:
+ sdk: true
+ version: '8.0'
+
+ - task: VisualStudioTestPlatformInstaller@1
+ displayName: Ensure VSTest Platform
+
+ - pwsh: |-
+ & '$(build.sourcesdirectory)\.pipelines\InstallWinAppDriver.ps1'
+ displayName: Download and install WinAppDriver
+
+ - ${{ if ne(parameters.platform, 'arm64') }}:
+ - task: ScreenResolutionUtility@1
+ inputs:
+ displaySettings: 'optimal'
+
+ - task: VSTest@3
+ displayName: Run UI Tests
+ inputs:
+ platform: '$(BuildPlatform)'
+ configuration: '$(BuildConfiguration)'
+ testSelector: 'testAssemblies'
+ searchFolder: '$(Pipeline.Workspace)\build-${{ parameters.platform }}-${{ parameters.configuration }}${{ parameters.inputArtifactStem }}'
+ vsTestVersion: 'toolsInstaller'
+ uiTests: true
+ rerunFailedTests: true
+ testAssemblyVer2: |
+ **\UITests-FancyZones.dll
+ **\UITests-FancyZonesEditor.dll
+ !**\obj\**
+ !**\ref\**
diff --git a/.pipelines/v2/templates/pipeline-ci-build.yml b/.pipelines/v2/templates/pipeline-ci-build.yml
new file mode 100644
index 00000000000..73a3ff766d1
--- /dev/null
+++ b/.pipelines/v2/templates/pipeline-ci-build.yml
@@ -0,0 +1,59 @@
+variables:
+ - name: runCodesignValidationInjectionBG
+ value: false
+ - name: EnablePipelineCache
+ value: true
+
+parameters:
+ - name: buildPlatforms
+ type: object
+ default:
+ - x64
+ - arm64
+ - name: enableMsBuildCaching
+ type: boolean
+ default: false
+ - name: runTests
+ type: boolean
+ default: true
+
+stages:
+ # Allow manual builds to skip pre-check
+ - ${{ if ne(variables['Build.Reason'], 'Manual') }}:
+ - stage: Precheck
+ jobs:
+ - template: job-ci-precheck.yml
+
+ - ${{ each platform in parameters.buildPlatforms }}:
+ - stage: Build_${{ platform }}
+ displayName: Build ${{ platform }}
+ ${{ if ne(variables['Build.Reason'], 'Manual') }}:
+ dependsOn: [Precheck]
+ ${{ else }}:
+ dependsOn: []
+ jobs:
+ - template: job-build-project.yml
+ parameters:
+ condition: and(succeeded(), or(eq(variables['Build.Reason'], 'Manual'), ne(stageDependencies.Precheck.Precheck.outputs['verifyBuildRequest.skipBuild'], 'Yes')))
+ pool:
+ ${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}:
+ name: SHINE-INT-L
+ ${{ else }}:
+ name: SHINE-OSS-L
+ buildPlatforms:
+ - ${{ platform }}
+ buildConfigurations: [Release]
+ enablePackageCaching: true
+ enableMsBuildCaching: ${{ parameters.enableMsBuildCaching }}
+ runTests: ${{ parameters.runTests }}
+
+ - ${{ if eq(parameters.runTests, true) }}:
+ - stage: Test_${{ platform }}
+ displayName: Test ${{ platform }}
+ dependsOn:
+ - Build_${{platform}}
+ jobs:
+ - template: job-test-project.yml
+ parameters:
+ platform: ${{ platform }}
+ configuration: Release
diff --git a/.pipelines/v2/templates/steps-build-installer.yml b/.pipelines/v2/templates/steps-build-installer.yml
new file mode 100644
index 00000000000..a4eb61481cf
--- /dev/null
+++ b/.pipelines/v2/templates/steps-build-installer.yml
@@ -0,0 +1,184 @@
+parameters:
+ - name: versionNumber
+ type: string
+ default: "0.0.1"
+ - name: buildUserInstaller
+ type: boolean
+ default: false
+ - name: codeSign
+ type: boolean
+ default: false
+ - name: signingIdentity
+ type: object
+ default: {}
+ - name: additionalBuildOptions
+ type: string
+ default: ''
+
+steps:
+ - pwsh: |-
+ & git clean -xfd -e *exe -- .\installer\
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Clean installer to reduce cross-contamination
+
+ - pwsh: |-
+ $IsPerUser = $${{ parameters.buildUserInstaller }}
+ $InstallerBuildSlug = "MachineSetup"
+ $InstallerBasename = "PowerToysSetup"
+ If($IsPerUser) {
+ $InstallerBuildSlug = "UserSetup"
+ $InstallerBasename = "PowerToysUserSetup"
+ }
+ $InstallerBasename += "-${{ parameters.versionNumber }}-$(BuildPlatform)"
+ Write-Host "##vso[task.setvariable variable=InstallerBuildSlug]$InstallerBuildSlug"
+ Write-Host "##vso[task.setvariable variable=InstallerRelativePath]$(BuildPlatform)\$(BuildConfiguration)\$InstallerBuildSlug"
+ Write-Host "##vso[task.setvariable variable=InstallerBasename]$InstallerBasename"
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Prepare Installer variables
+
+ # This dll needs to be built and signed before building the MSI.
+ - task: VSBuild@1
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Build PowerToysSetupCustomActions
+ inputs:
+ solution: "**/installer/PowerToysSetup.sln"
+ vsVersion: 17.0
+ msbuildArgs: >-
+ /t:PowerToysSetupCustomActions
+ /p:RunBuildEvents=true;PerUser=${{parameters.buildUserInstaller}};RestorePackagesConfig=true;CIBuild=true
+ -restore -graph
+ /bl:$(LogOutputDirectory)\installer-$(InstallerBuildSlug)-actions.binlog
+ ${{ parameters.additionalBuildOptions }}
+ platform: $(BuildPlatform)
+ configuration: $(BuildConfiguration)
+ clean: true
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+
+ - ${{ if eq(parameters.codeSign, true) }}:
+ - template: steps-esrp-signing.yml
+ parameters:
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Sign PowerToysSetupCustomActions
+ signingIdentity: ${{ parameters.signingIdentity }}
+ inputs:
+ FolderPath: 'installer/PowerToysSetupCustomActions/$(InstallerRelativePath)'
+ signType: batchSigning
+ batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_installer.json'
+ ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
+
+ ## INSTALLER START
+ #### MSI BUILDING AND SIGNING
+ - task: VSBuild@1
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Build MSI
+ inputs:
+ solution: "**/installer/PowerToysSetup.sln"
+ vsVersion: 17.0
+ msbuildArgs: >-
+ -restore
+ /t:PowerToysInstaller
+ /p:RunBuildEvents=false;PerUser=${{parameters.buildUserInstaller}};BuildProjectReferences=false;CIBuild=true
+ /bl:$(LogOutputDirectory)\installer-$(InstallerBuildSlug)-msi.binlog
+ ${{ parameters.additionalBuildOptions }}
+ platform: $(BuildPlatform)
+ configuration: $(BuildConfiguration)
+ clean: false # don't undo our hard work above by deleting the CustomActions dll
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+
+ - script: |-
+ "C:\Program Files (x86)\WiX Toolset v3.14\bin\dark.exe" -x $(build.sourcesdirectory)\extractedMsi installer\PowerToysSetup\$(InstallerRelativePath)\$(InstallerBasename).msi
+ dir $(build.sourcesdirectory)\extractedMsi
+ displayName: "${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Extract and verify MSI"
+
+ # Check if deps.json files don't reference different dll versions.
+ - pwsh: |-
+ & '.pipelines/verifyDepsJsonLibraryVersions.ps1' -targetDir '$(build.sourcesdirectory)\extractedMsi\File'
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Audit deps.json in MSI extracted files
+
+ - ${{ if eq(parameters.codeSign, true) }}:
+ - pwsh: |-
+ & .pipelines/versionAndSignCheck.ps1 -targetDir '$(build.sourcesdirectory)\extractedMsi\File'
+ & .pipelines/versionAndSignCheck.ps1 -targetDir '$(build.sourcesdirectory)\extractedMsi\Binary'
+ git clean -xfd ./extractedMsi
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Verify all binaries are signed and versioned
+
+ - template: steps-esrp-signing.yml
+ parameters:
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Sign MSI
+ signingIdentity: ${{ parameters.signingIdentity }}
+ inputs:
+ FolderPath: 'installer/PowerToysSetup/$(InstallerRelativePath)'
+ signType: batchSigning
+ batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_installer.json'
+ ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
+
+ #### END MSI
+ #### BOOTSTRAP BUILDING AND SIGNING
+
+ - task: VSBuild@1
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Build Bootstrapper
+ inputs:
+ solution: "**/installer/PowerToysSetup.sln"
+ vsVersion: 17.0
+ msbuildArgs: >-
+ /t:PowerToysBootstrapper
+ /p:PerUser=${{parameters.buildUserInstaller}};CIBuild=true
+ /bl:$(LogOutputDirectory)\installer-$(InstallerBuildSlug)-bootstrapper.binlog
+ -restore -graph
+ ${{ parameters.additionalBuildOptions }}
+ platform: $(BuildPlatform)
+ configuration: $(BuildConfiguration)
+ clean: false # don't undo our hard work above by deleting the MSI
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+
+ # The entirety of bundle unpacking/re-packing is unnecessary if we are not code signing it.
+ - ${{ if eq(parameters.codeSign, true) }}:
+ - script: |-
+ "C:\Program Files (x86)\WiX Toolset v3.14\bin\insignia.exe" -ib installer\PowerToysSetup\$(InstallerRelativePath)\$(InstallerBasename).exe -o installer\engine.exe
+ displayName: "${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Insignia: Extract Engine from Bundle"
+
+ - template: steps-esrp-signing.yml
+ parameters:
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Sign WiX Engine
+ signingIdentity: ${{ parameters.signingIdentity }}
+ inputs:
+ FolderPath: "installer"
+ Pattern: engine.exe
+ signConfigType: inlineSignParams
+ inlineOperation: |
+ [
+ {
+ "KeyCode": "CP-230012",
+ "OperationCode": "SigntoolSign",
+ "Parameters": {
+ "OpusName": "Microsoft",
+ "OpusInfo": "http://www.microsoft.com",
+ "FileDigest": "/fd \"SHA256\"",
+ "PageHash": "/NPH",
+ "TimeStamp": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
+ },
+ "ToolName": "sign",
+ "ToolVersion": "1.0"
+ },
+ {
+ "KeyCode": "CP-230012",
+ "OperationCode": "SigntoolVerify",
+ "Parameters": {},
+ "ToolName": "sign",
+ "ToolVersion": "1.0"
+ }
+ ]
+
+ - script: |-
+ "C:\Program Files (x86)\WiX Toolset v3.14\bin\insignia.exe" -ab installer\engine.exe installer\PowerToysSetup\$(InstallerRelativePath)\$(InstallerBasename).exe -o installer\PowerToysSetup\$(InstallerRelativePath)\$(InstallerBasename).exe
+ displayName: "${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Insignia: Merge Engine into Bundle"
+
+ - template: steps-esrp-signing.yml
+ parameters:
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Sign Final Bootstrapper
+ signingIdentity: ${{ parameters.signingIdentity }}
+ inputs:
+ FolderPath: 'installer/PowerToysSetup/$(InstallerRelativePath)'
+ signType: batchSigning
+ batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_installer.json'
+ ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
+ #### END BOOTSTRAP
+ ## END INSTALLER
diff --git a/.pipelines/v2/templates/steps-ensure-dotnet-version.yml b/.pipelines/v2/templates/steps-ensure-dotnet-version.yml
new file mode 100644
index 00000000000..ee688d18f61
--- /dev/null
+++ b/.pipelines/v2/templates/steps-ensure-dotnet-version.yml
@@ -0,0 +1,27 @@
+parameters:
+- name: version
+ type: string
+ default: "8.0"
+- name: sdk
+ type: boolean
+ default: false
+
+# You might be wondering, "Why didn't they use UseDotNet?"
+# Azure Pipelines is practically unmaintained, that's why.
+#
+# "[BUG]: UseDotNet task installs x86 build on Windows arm64"
+# https://github.com/microsoft/azure-pipelines-tasks/issues/20300
+#
+# Herein we replicate 90% of the meaningful logic in that task.
+steps:
+- pwsh: |-
+ curl.exe -J -L -O "https://dot.net/v1/dotnet-install.ps1"
+ $NEW_DOTNET_ROOT = "$(Agent.ToolsDirectory)\dotnet"
+ & ./dotnet-install.ps1 -Channel "${{parameters.version}}" -InstallDir $NEW_DOTNET_ROOT
+ Write-Host "##vso[task.setvariable variable=DOTNET_ROOT]${NEW_DOTNET_ROOT}"
+ Write-Host "##vso[task.prependpath]${NEW_DOTNET_ROOT}"
+ Remove-Item dotnet-install.ps1 -ErrorAction:Ignore
+ ${{ if eq(parameters.sdk, true) }}:
+ displayName: "Install .NET ${{parameters.version}} SDK"
+ ${{ else }}:
+ displayName: "Install .NET ${{parameters.version}}"
diff --git a/.pipelines/v2/templates/steps-ensure-nuget-version.yml b/.pipelines/v2/templates/steps-ensure-nuget-version.yml
new file mode 100644
index 00000000000..8d206bcaecc
--- /dev/null
+++ b/.pipelines/v2/templates/steps-ensure-nuget-version.yml
@@ -0,0 +1,5 @@
+steps:
+- task: NuGetToolInstaller@1
+ displayName: Use NuGet 6.6.1
+ inputs:
+ versionSpec: 6.6.1
diff --git a/.pipelines/v2/templates/steps-esrp-signing.yml b/.pipelines/v2/templates/steps-esrp-signing.yml
new file mode 100644
index 00000000000..2d47a4df58f
--- /dev/null
+++ b/.pipelines/v2/templates/steps-esrp-signing.yml
@@ -0,0 +1,22 @@
+parameters:
+ - name: displayName
+ type: string
+ default: ESRP Code Signing
+ - name: inputs
+ type: object
+ default: {}
+ - name: signingIdentity
+ type: object
+ default: {}
+
+steps:
+ - task: EsrpCodeSigning@5
+ displayName: 🔏 ${{ parameters.displayName }}
+ inputs:
+ ConnectedServiceName: ${{ parameters.signingIdentity.serviceName }}
+ AppRegistrationClientId: ${{ parameters.signingIdentity.appId }}
+ AppRegistrationTenantId: ${{ parameters.signingIdentity.tenantId }}
+ AuthAKVName: ${{ parameters.signingIdentity.akvName }}
+ AuthCertName: ${{ parameters.signingIdentity.authCertName }}
+ AuthSignCertName: ${{ parameters.signingIdentity.signCertName }}
+ ${{ insert }}: ${{ parameters.inputs }}
diff --git a/.pipelines/v2/templates/steps-fetch-and-prepare-localizations.yml b/.pipelines/v2/templates/steps-fetch-and-prepare-localizations.yml
new file mode 100644
index 00000000000..30cf2b6f675
--- /dev/null
+++ b/.pipelines/v2/templates/steps-fetch-and-prepare-localizations.yml
@@ -0,0 +1,26 @@
+parameters:
+ - name: includePseudoLoc
+ type: boolean
+ default: false
+
+steps:
+ - task: TouchdownBuildTask@3
+ displayName: 'Download Localization Files -- PowerToys 37400'
+ inputs:
+ teamId: 37400
+ TDBuildServiceConnection: $(TouchdownServiceConnection)
+ authType: SubjectNameIssuer
+ resourceFilePath: |
+ **\Resources.resx
+ **\Resource.resx
+ **\Resources.resw
+ appendRelativeDir: true
+ localizationTarget: false
+ ${{ if eq(parameters.includePseudoLoc, true) }}:
+ pseudoSetting: Included
+
+ - pwsh: |-
+ $VerbosePreference = "Continue"
+ ./tools/build/move-and-rename-resx.ps1
+ ./tools/build/move-uwp-resw.ps1
+ displayName: Move Loc files into final locations
diff --git a/.pipelines/v2/templates/steps-restore-nuget.yml b/.pipelines/v2/templates/steps-restore-nuget.yml
new file mode 100644
index 00000000000..f7928ccdcbb
--- /dev/null
+++ b/.pipelines/v2/templates/steps-restore-nuget.yml
@@ -0,0 +1,20 @@
+steps:
+- template: steps-ensure-nuget-version.yml
+
+- task: NuGetAuthenticate@1
+
+- script: |-
+ echo ##vso[task.setvariable variable=NUGET_RESTORE_MSBUILD_ARGS]/p:Platform=$(BuildPlatform)
+ displayName: Ensure NuGet restores for $(BuildPlatform)
+ condition: and(succeeded(), ne(variables['BuildPlatform'], 'Any CPU'))
+
+# In the Microsoft Azure DevOps tenant, NuGetCommand is ambiguous.
+# This should be `task: NuGetCommand@2`
+- task: 333b11bd-d341-40d9-afcf-b32d5ce6f23b@2
+ displayName: Restore NuGet packages
+ inputs:
+ command: restore
+ feedsToUse: config
+ configPath: NuGet.config
+ restoreSolution: packages.config
+ restoreDirectory: '$(Build.SourcesDirectory)\packages'
diff --git a/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj b/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj
index b58e19460d6..af6a0f184b0 100644
--- a/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj
+++ b/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj
@@ -36,6 +36,9 @@
$(Platform)\$(Configuration)\UserSetup\
$(SolutionDir)$(ProjectName)\$(Platform)\$(Configuration)\MachineSetup\obj\
$(SolutionDir)$(ProjectName)\$(Platform)\$(Configuration)\UserSetup\obj\
+
+ false
+ true
true
@@ -73,8 +76,8 @@
call cmd /C "copy ""$(ProjectDir)..\PowerToysSetup\VideoConference.wxs"" ""$(ProjectDir)..\PowerToysSetup\VideoConference.wxs.bk""""
call cmd /C "copy ""$(ProjectDir)..\PowerToysSetup\WinAppSDK.wxs"" ""$(ProjectDir)..\PowerToysSetup\WinAppSDK.wxs.bk""""
call cmd /C "copy ""$(ProjectDir)..\PowerToysSetup\WinUI3Applications.wxs"" ""$(ProjectDir)..\PowerToysSetup\WinUI3Applications.wxs.bk""""
- if not "$(PerUser)" == "true" call powershell.exe -NonInteractive -executionpolicy Unrestricted -File ..\PowerToysSetup\generateAllFileComponents.ps1 -platform $(Platform)
- if "$(PerUser)" == "true" call powershell.exe -NonInteractive -executionpolicy Unrestricted -File ..\PowerToysSetup\generateAllFileComponents.ps1 -platform $(Platform) -installscopeperuser $(PerUser)
+ if not "$(NormalizedPerUserValue)" == "true" call powershell.exe -NonInteractive -executionpolicy Unrestricted -File ..\PowerToysSetup\generateAllFileComponents.ps1 -platform $(Platform)
+ if "$(NormalizedPerUserValue)" == "true" call powershell.exe -NonInteractive -executionpolicy Unrestricted -File ..\PowerToysSetup\generateAllFileComponents.ps1 -platform $(Platform) -installscopeperuser $(NormalizedPerUserValue)
Backing up original files and populating .NET and WPF Runtime dependencies
diff --git a/src/modules/previewpane/UnitTests-SvgThumbnailProvider/UnitTests-SvgThumbnailProvider.csproj b/src/modules/previewpane/UnitTests-SvgThumbnailProvider/UnitTests-SvgThumbnailProvider.csproj
index a37734ffded..61e0e50c468 100644
--- a/src/modules/previewpane/UnitTests-SvgThumbnailProvider/UnitTests-SvgThumbnailProvider.csproj
+++ b/src/modules/previewpane/UnitTests-SvgThumbnailProvider/UnitTests-SvgThumbnailProvider.csproj
@@ -27,6 +27,7 @@
+