# This build should never run as CI or against a pull request. trigger: none pr: none pool: name: WinDevPool-L demands: ImageOverride -equals WinDevVS17-latest parameters: - name: buildConfigurations type: object default: - Release - name: buildPlatforms type: object default: - x64 - arm64 - name: versionNumber type: string default: '0.0.1' 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 name: $(BuildDefinitionName)_$(date:yyMM).$(date:dd)$(rev:rrr) resources: repositories: - repository: self type: git ref: main jobs: - job: Build strategy: matrix: ${{ each config in parameters.buildConfigurations }}: ${{ each platform in parameters.buildPlatforms }}: ${{ config }}_${{ platform }}: BuildConfiguration: ${{ config }} BuildPlatform: ${{ platform }} NUGET_RESTORE_MSBUILD_ARGS: /p:Platform=${{ platform }} # Required for nuget to work due to self contained NODE_OPTIONS: --max_old_space_size=16384 displayName: Build timeoutInMinutes: 120 # Some of the loc stuff adds quite a bit of time. cancelTimeoutInMinutes: 1 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 '' # Guardian tool needs 'Microsoft.NETCore.App', version '2.1.0' (x64) - task: UseDotNet@2 displayName: 'Use .NET Core 2.1 SDK' inputs: packageType: sdk version: '2.1.x' - task: UseDotNet@2 displayName: 'Use .NET 7 SDK' inputs: packageType: sdk version: '7.x' - task: NuGetAuthenticate@0 - 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: NuGetCommand@2 displayName: NuGet restore solutions dependencies inputs: command: restore restoreSolution: '**/*.sln' selectOrConfig: config nugetConfigPath: .pipelines/release-nuget.config - 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@1 displayName: 'Download Localization Files -- PowerToys 37400' inputs: teamId: 37400 authId: '$(TouchdownApplicationID)' authKey: '$(TouchdownApplicationKey)' 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: /p:CIBuild=true /bl:$(Build.SourcesDirectory)\msbuild.binlog platform: $(BuildPlatform) configuration: $(BuildConfiguration) clean: true maximumCpuCount: true - task: VSBuild@1 displayName: Build BugReportTool inputs: solution: '**/tools/BugReportTool/BugReportTool.sln' vsVersion: 17.0 msbuildArgs: /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: /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: /p:CIBuild=true /bl:$(Build.SourcesDirectory)\msbuild.binlog platform: $(BuildPlatform) configuration: $(BuildConfiguration) clean: true maximumCpuCount: true - task: VSBuild@1 displayName: Build PowerToysSetupCustomActions inputs: solution: '**/installer/PowerToysSetup.sln' vsVersion: 17.0 msbuildArgs: /target:PowerToysSetupCustomActions /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 /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 /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 /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 /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 /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 /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 Measure Tool UI for Packaging inputs: solution: 'src/modules/MeasureTool/MeasureToolUI/MeasureToolUI.csproj' vsVersion: 17.0 # The arguments should be the same as the ones for Settings; make sure they are. msbuildArgs: >- /target:Publish /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 /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: Build PowerToysSetupCustomActions DLL # This dll needs to be build and signed before building the MSI. inputs: solution: '**/installer/PowerToysSetup.sln' vsVersion: 17.0 msbuildArgs: /p:CIBuild=true /bl:$(Build.SourcesDirectory)\msbuild.binlog /t:PowerToysSetupCustomActions platform: $(BuildPlatform) configuration: $(BuildConfiguration) maximumCpuCount: 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@1 displayName: Sign PowerToysSetupCustomActions DLL inputs: ConnectedServiceName: 'Terminal/Console/WinAppDriver Team Code Signing Connection' FolderPath: 'installer/PowerToysSetupCustomActions/$(BuildPlatform)\$(BuildConfiguration)' signType: batchSigning batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_installer.json' ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml' - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1 displayName: Sign Core PT inputs: ConnectedServiceName: 'Terminal/Console/WinAppDriver Team Code Signing Connection' 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@1 displayName: Sign x86 directshow VCM inputs: ConnectedServiceName: 'Terminal/Console/WinAppDriver Team Code Signing Connection' 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 ## INSTALLER START #### MSI BUILDING AND SIGNING - task: VSBuild@1 displayName: Build MSI inputs: solution: '**/installer/PowerToysSetup.sln' vsVersion: 17.0 msbuildArgs: /p:CIBuild=true /target:PowerToysInstaller /bl:$(Build.SourcesDirectory)\msbuild.binlog 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)\PowerToysSetup-${{ parameters.versionNumber }}-$(BuildPlatform).msi dir $(build.sourcesdirectory)\extractedMsi # 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@1 displayName: Sign MSI inputs: ConnectedServiceName: 'Terminal/Console/WinAppDriver Team Code Signing Connection' FolderPath: 'installer/PowerToysSetup/$(BuildPlatform)\$(BuildConfiguration)' 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 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)\PowerToysSetup-${{ parameters.versionNumber }}-$(BuildPlatform).exe -o installer\engine.exe' - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1 displayName: 'ESRP CodeSigning (Engine)' inputs: ConnectedServiceName: 'Terminal/Console/WinAppDriver Team Code Signing Connection' 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)\PowerToysSetup-${{ parameters.versionNumber }}-$(BuildPlatform).exe -o installer\PowerToysSetup\$(BuildPlatform)\$(BuildConfiguration)\PowerToysSetup-${{ parameters.versionNumber }}-$(BuildPlatform).exe' - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1 displayName: Sign Bootstrapper inputs: ConnectedServiceName: 'Terminal/Console/WinAppDriver Team Code Signing Connection' FolderPath: 'installer/PowerToysSetup/$(BuildPlatform)\$(BuildConfiguration)' signType: batchSigning batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_installer.json' ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml' #### END BOOTSTRAP ## END INSTALLER - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact: binlog' condition: failed() continueOnError: True inputs: PathtoPublish: $(Build.SourcesDirectory)\msbuild.binlog ArtifactName: binlog-$(BuildPlatform) - 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 - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact: Symbols' inputs: PathtoPublish: $(System.ArtifactsDirectory)/Symbols-$(BuildPlatform)/ ArtifactName: Symbols-${{ parameters.versionNumber }}-$(BuildPlatform) - task: DeleteFiles@1 displayName: 'Remove symbols from ArtifactStagingDirectory' inputs: Contents: '*' SourceFolder: $(Build.ArtifactStagingDirectory)/Symbols-$(BuildPlatform)/ RemoveSourceFolder: True - task: CopyFiles@2 displayName: Copying setup file over inputs: contents: '**/PowerToysSetup-*.exe' flattenFolders: True targetFolder: $(Build.ArtifactStagingDirectory) - task: PowerShell@2 displayName: 'Calculating SHA256 hash' inputs: targetType: 'inline' script: | $p = "$(System.ArtifactsDirectory)\"; $staging = "$(Build.ArtifactStagingDirectory)\" $hash = ((get-item $p\*.exe | Get-FileHash).Hash); $plat = "hash_$(BuildPlatform).txt"; $combinedPath = $staging + $plat; echo $plat echo $hash echo $p echo $combinedPath $hash | out-file -filepath $combinedPath pwsh: true - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact: PowerToySetup' inputs: PathtoPublish: $(System.ArtifactsDirectory) ArtifactName: setup-$(BuildPlatform) - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact: GPO Files' inputs: PathtoPublish: doc\gpo\assets ArtifactName: GroupPolicyObjectsFiles ...