jobs: - job: Pack_MSIX displayName: Pack MSIX bundles pool: vmImage: windows-2019 workspace: clean: all strategy: matrix: amd64: Name: amd64 Artifact: appx Suffix: ShouldSign: true amd64_store: Name: amd64 Artifact: appxstore Suffix: -store Upload: true arm64: Name: arm64 Artifact: appx Suffix: ShouldSign: true arm64_store: Name: arm64 Artifact: appxstore Suffix: -store Upload: true steps: - template: ./checkout.yml - task: DownloadPipelineArtifact@1 displayName: 'Download artifact: layout_$(Artifact)_$(Name)' inputs: artifactName: layout_$(Artifact)_$(Name) targetPath: $(Build.BinariesDirectory)\layout - task: DownloadBuildArtifacts@0 displayName: 'Download artifact: symbols' inputs: artifactName: symbols downloadPath: $(Build.BinariesDirectory) - powershell: | $d = (.\PCbuild\build.bat -V) | %{ if($_ -match '\s+(\w+):\s*(.+)\s*$') { @{$Matches[1] = $Matches[2];} }}; Write-Host "##vso[task.setvariable variable=VersionText]$($d.PythonVersion)" Write-Host "##vso[task.setvariable variable=VersionNumber]$($d.PythonVersionNumber)" Write-Host "##vso[task.setvariable variable=VersionHex]$($d.PythonVersionHex)" Write-Host "##vso[task.setvariable variable=VersionUnique]$($d.PythonVersionUnique)" Write-Host "##vso[task.setvariable variable=Filename]python-$($d.PythonVersion)-$(Name)$(Suffix)" displayName: 'Extract version numbers' - powershell: | ./Tools/msi/make_appx.ps1 -layout "$(Build.BinariesDirectory)\layout" -msix "$(Build.ArtifactStagingDirectory)\msix\$(Filename).msix" displayName: 'Build msix' - powershell: | 7z a -tzip "$(Build.ArtifactStagingDirectory)\msix\$(Filename).appxsym" *.pdb displayName: 'Build appxsym' workingDirectory: $(Build.BinariesDirectory)\symbols\$(Name) - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact: MSIX' condition: and(succeeded(), or(ne(variables['ShouldSign'], 'true'), not(variables['SigningCertificate']))) inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)\msix' ArtifactName: msix - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact: MSIX' condition: and(succeeded(), and(eq(variables['ShouldSign'], 'true'), variables['SigningCertificate'])) inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)\msix' ArtifactName: unsigned_msix - powershell: | 7z a -tzip "$(Build.ArtifactStagingDirectory)\msixupload\$(Filename).msixupload" * displayName: 'Build msixupload' condition: and(succeeded(), eq(variables['Upload'], 'true')) workingDirectory: $(Build.ArtifactStagingDirectory)\msix - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact: MSIXUpload' condition: and(succeeded(), eq(variables['Upload'], 'true')) inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)\msixupload' ArtifactName: msixupload - job: Sign_MSIX displayName: Sign side-loadable MSIX bundles dependsOn: - Pack_MSIX condition: and(succeeded(), variables['SigningCertificate']) pool: name: 'Windows Release' workspace: clean: all steps: - template: ./checkout.yml - template: ./find-sdk.yml - powershell: | $d = (.\PCbuild\build.bat -V) | %{ if($_ -match '\s+(\w+):\s*(.+)\s*$') { @{$Matches[1] = $Matches[2];} }}; Write-Host "##vso[task.setvariable variable=SigningDescription]Python $($d.PythonVersion)" displayName: 'Update signing description' condition: and(succeeded(), not(variables['SigningDescription'])) - task: DownloadBuildArtifacts@0 displayName: 'Download Artifact: unsigned_msix' inputs: artifactName: unsigned_msix downloadPath: $(Build.BinariesDirectory) # MSIX must be signed and timestamped simultaneously - powershell: | $failed = $true foreach ($retry in 1..3) { signtool sign /a /n "$(SigningCertificate)" /fd sha256 /tr http://timestamp.digicert.com/ /td sha256 /d "$(SigningDescription)" (gi *.msix) if ($?) { $failed = $false break } sleep 1 } if ($failed) { throw "Failed to sign MSIX" } displayName: 'Sign MSIX' workingDirectory: $(Build.BinariesDirectory)\unsigned_msix - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact: MSIX' inputs: PathtoPublish: '$(Build.BinariesDirectory)\unsigned_msix' ArtifactName: msix