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 @@ +