From ad144eedb641df78a9774757d7babe9ee0ea52f0 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 7 Oct 2025 18:17:53 +0100 Subject: [PATCH 1/9] Allow skipping hanging test. Add timeouts --- ci/release.yml | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/ci/release.yml b/ci/release.yml index 54ec020..1cc75cb 100644 --- a/ci/release.yml +++ b/ci/release.yml @@ -27,6 +27,10 @@ parameters: displayName: "Post test" type: boolean default: true +- name: PostTestWithHangs + displayName: "Post tests that may hang" + type: boolean + default: true - name: OverrideRef displayName: "Force version (else uses tag)" type: string @@ -237,47 +241,49 @@ stages: TEST_MSIX: $(TEST_MSIX_DIR) - powershell: | - gcm pymanager - gcm pywmanager - # These are likely present due to the machine configuration, + # Some of these are likely present due to the machine configuration, # but we'll check for them anyway. - gcm py - gcm python - gcm pyw - gcm pythonw + gcm pymanager, pywmanager, py, python, pyw, pythonw | Format-Table -AutoSize displayName: 'Ensure global commands are present' - - powershell: | - pymanager help - displayName: 'Show help output' + - ${{ if eq(parameters.PostTestWithHangs, 'true') }}: + - powershell: | + pymanager help + displayName: 'Show help output' + timeoutInMinutes: 1 - powershell: | pymanager install -vv default displayName: 'Install default runtime' + timeoutInMinutes: 5 env: PYMANAGER_DEBUG: true - powershell: | pymanager list displayName: 'List installed runtimes' + timeoutInMinutes: 1 env: PYMANAGER_DEBUG: true - powershell: | pymanager --list-paths displayName: 'List installed runtimes (legacy)' + timeoutInMinutes: 1 env: PYMANAGER_DEBUG: true - powershell: | pymanager exec -m site displayName: 'Launch default runtime' + timeoutInMinutes: 1 env: PYMANAGER_DEBUG: true - powershell: | pymanager uninstall -y default displayName: 'Uninstall runtime' + timeoutInMinutes: 3 env: PYMANAGER_DEBUG: true @@ -291,6 +297,7 @@ stages: pymanager install --configure -y if ($?) { pymanager list } displayName: 'Emulate first launch' + timeoutInMinutes: 5 env: PYTHON_MANAGER_INCLUDE_UNMANAGED: false PYTHON_MANAGER_CONFIG: .\test-config.json @@ -302,6 +309,7 @@ stages: pymanager list --source .\bundle pymanager install --source .\bundle 3 3-32 3-64 3-arm64 displayName: 'Offline bundle download and install' + timeoutInMinutes: 5 env: PYMANAGER_DEBUG: true From 73840c64c1c363c4e291d210f4bd6efe52ee6e53 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 7 Oct 2025 18:38:54 +0100 Subject: [PATCH 2/9] Switch to service connection --- ci/release.yml | 85 +++++++++++++++++++++----------------------------- 1 file changed, 36 insertions(+), 49 deletions(-) diff --git a/ci/release.yml b/ci/release.yml index 1cc75cb..afd1f00 100644 --- a/ci/release.yml +++ b/ci/release.yml @@ -68,10 +68,10 @@ stages: vmImage: 'windows-latest' variables: - - ${{ if eq(parameters.Sign, 'true') }}: - - group: CPythonSign - ${{ if eq(parameters.TestSign, 'true') }}: - group: CPythonTestSign + - ${{ elseif eq(parameters.Sign, 'true') }}: + - group: CPythonSign - ${{ if eq(parameters.Publish, 'true') }}: - group: PythonOrgPublish @@ -145,20 +145,21 @@ stages: PYMANAGER_APPX_PUBLISHER: $(TrustedSigningCertificateSubject) - ${{ if or(eq(parameters.Sign, 'true'), eq(parameters.TestSign, 'true')) }}: - - powershell: > - dir -r *.exe, *.pyd | %{ - sign code trusted-signing "$_" - -fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 - -tse "$(TrustedSigningUri)" -tsa "$(TrustedSigningAccount)" -tscp "$(TrustedSigningCertificateName)" - -d "PyManager $(Build.BuildNumber)" - -fl $env:SIGNLIST1 - } + - task: AzureCLI@2 displayName: 'Sign binaries' - workingDirectory: $(LAYOUT_DIR) - env: - AZURE_CLIENT_ID: $(TrustedSigningClientId) - AZURE_CLIENT_SECRET: $(TrustedSigningSecret) - AZURE_TENANT_ID: $(TrustedSigningTenantId) + inputs: + azureSubscription: 'Python Signing' + scriptType: ps + scriptLocation: inlineScript + inlineScript: | + dir -r *.exe, *.pyd | %{ + sign code trusted-signing "$_" + -fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 + -tse "$(TrustedSigningUri)" -tsa "$(TrustedSigningAccount)" -tscp "$(TrustedSigningCertificateName)" + -d "PyManager $(Build.BuildNumber)" + -fl $env:SIGNLIST1 + } + workingDirectory: $(LAYOUT_DIR) - powershell: | python make-msix.py @@ -180,49 +181,35 @@ stages: PYMANAGER_APPX_PUBLISHER: $(TrustedSigningCertificateSubject) - ${{ if or(eq(parameters.Sign, 'true'), eq(parameters.TestSign, 'true')) }}: - - powershell: > - dir *.msix | %{ - sign code trusted-signing "$_" - -fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 - -tse "$(TrustedSigningUri)" -tsa "$(TrustedSigningAccount)" -tscp "$(TrustedSigningCertificateName)" - -d "PyManager $(Build.BuildNumber)" - -fl $env:SIGNLIST2 - } - displayName: 'Sign MSIX package' - workingDirectory: $(DIST_DIR) - env: - AZURE_CLIENT_ID: $(TrustedSigningClientId) - AZURE_CLIENT_SECRET: $(TrustedSigningSecret) - AZURE_TENANT_ID: $(TrustedSigningTenantId) - - - powershell: > - dir *.msi | %{ - sign code trusted-signing "$_" - -fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 - -tse "$(TrustedSigningUri)" -tsa "$(TrustedSigningAccount)" -tscp "$(TrustedSigningCertificateName)" - -d "PyManager $(Build.BuildNumber)" - -fl $env:SIGNLIST3 - } - displayName: 'Sign MSI package' - workingDirectory: $(DIST_DIR) - env: - AZURE_CLIENT_ID: $(TrustedSigningClientId) - AZURE_CLIENT_SECRET: $(TrustedSigningSecret) - AZURE_TENANT_ID: $(TrustedSigningTenantId) + - task: AzureCLI@2 + displayName: 'Sign packages' + inputs: + azureSubscription: 'Python Signing' + scriptType: ps + scriptLocation: inlineScript + inlineScript: | + dir *.msix, *.msi | %{ + sign code trusted-signing "$_" + -fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 + -tse "$(TrustedSigningUri)" -tsa "$(TrustedSigningAccount)" -tscp "$(TrustedSigningCertificateName)" + -d "PyManager $(Build.BuildNumber)" + -fl $env:SIGNLIST2 + } + workingDirectory: $(DIST_DIR) - - ${{ if eq(parameters.Sign, 'true') }}: - - powershell: Write-Host "##vso[build.addbuildtag]signed" - displayName: 'Add signed build tag' - - ${{ elseif eq(parameters.TestSign, 'true') }}: + - ${{ if eq(parameters.TestSign, 'true') }}: - powershell: Write-Host "##vso[build.addbuildtag]test-signed" displayName: 'Add test-signed build tag' + - ${{ elseif eq(parameters.Sign, 'true') }}: + - powershell: Write-Host "##vso[build.addbuildtag]signed" + displayName: 'Add signed build tag' - publish: $(DIST_DIR) artifact: dist displayName: Publish distribution artifacts - ${{ if eq(parameters.PostTest, 'true') }}: - - ${{ if eq(parameters.Sign, 'true') }}: + - ${{ if and(ne(parameters.TestSign, 'true'), eq(parameters.Sign, 'true')) }}: - powershell: | $msix = dir "$(DIST_DIR)\*.msix" | ?{ -not ($_.BaseName -match '.+-store') } | select -first 1 Add-AppxPackage $msix From 4da089c5a54145859d1471815ededbeee69899ee Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 7 Oct 2025 18:45:11 +0100 Subject: [PATCH 3/9] Wrap script properly --- ci/release.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ci/release.yml b/ci/release.yml index afd1f00..1205586 100644 --- a/ci/release.yml +++ b/ci/release.yml @@ -153,11 +153,11 @@ stages: scriptLocation: inlineScript inlineScript: | dir -r *.exe, *.pyd | %{ - sign code trusted-signing "$_" - -fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 - -tse "$(TrustedSigningUri)" -tsa "$(TrustedSigningAccount)" -tscp "$(TrustedSigningCertificateName)" - -d "PyManager $(Build.BuildNumber)" - -fl $env:SIGNLIST1 + sign code trusted-signing "$_" ` + -fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 ` + -tse "$(TrustedSigningUri)" -tsa "$(TrustedSigningAccount)" -tscp "$(TrustedSigningCertificateName)" ` + -d "PyManager $(Build.BuildNumber)" ` + -fl $env:SIGNLIST1 } workingDirectory: $(LAYOUT_DIR) @@ -189,11 +189,11 @@ stages: scriptLocation: inlineScript inlineScript: | dir *.msix, *.msi | %{ - sign code trusted-signing "$_" - -fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 - -tse "$(TrustedSigningUri)" -tsa "$(TrustedSigningAccount)" -tscp "$(TrustedSigningCertificateName)" - -d "PyManager $(Build.BuildNumber)" - -fl $env:SIGNLIST2 + sign code trusted-signing "$_" ` + -fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 ` + -tse "$(TrustedSigningUri)" -tsa "$(TrustedSigningAccount)" -tscp "$(TrustedSigningCertificateName)" ` + -d "PyManager $(Build.BuildNumber)" ` + -fl $env:SIGNLIST2 } workingDirectory: $(DIST_DIR) From 72a8e621a49c12f0ad130ab4dc19cea619aa8008 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 7 Oct 2025 19:19:37 +0100 Subject: [PATCH 4/9] Alternate service connection --- ci/release.yml | 83 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 29 deletions(-) diff --git a/ci/release.yml b/ci/release.yml index 1205586..81373ba 100644 --- a/ci/release.yml +++ b/ci/release.yml @@ -135,6 +135,18 @@ stages: displayName: 'Install signing tool and generate files' workingDirectory: $(Build.BinariesDirectory) + - task: AzureCLI@2 + displayName: 'Azure CLI' + inputs: + azureSubscription: 'Python Signing' + scriptType: 'ps' + scriptLocation: 'inlineScript' + inlineScript: | + "##vso[task.setvariable variable=AZURE_CLIENT_ID;issecret=true]$servicePrincipalId" + "##vso[task.setvariable variable=AZURE_ID_TOKEN;issecret=true]$idToken" + "##vso[task.setvariable variable=AZURE_TENANT_ID;issecret=true]$tenantId" + addSpnToEnvironment: true + - powershell: | python make.py displayName: 'Build package' @@ -145,21 +157,20 @@ stages: PYMANAGER_APPX_PUBLISHER: $(TrustedSigningCertificateSubject) - ${{ if or(eq(parameters.Sign, 'true'), eq(parameters.TestSign, 'true')) }}: - - task: AzureCLI@2 + - powershell: > + dir -r *.exe, *.pyd | %{ + sign code trusted-signing "$_" + -fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 + -tse "$(TrustedSigningUri)" -tsa "$(TrustedSigningAccount)" -tscp "$(TrustedSigningCertificateName)" + -d "PyManager $(Build.BuildNumber)" + -fl $env:SIGNLIST1 + } displayName: 'Sign binaries' - inputs: - azureSubscription: 'Python Signing' - scriptType: ps - scriptLocation: inlineScript - inlineScript: | - dir -r *.exe, *.pyd | %{ - sign code trusted-signing "$_" ` - -fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 ` - -tse "$(TrustedSigningUri)" -tsa "$(TrustedSigningAccount)" -tscp "$(TrustedSigningCertificateName)" ` - -d "PyManager $(Build.BuildNumber)" ` - -fl $env:SIGNLIST1 - } - workingDirectory: $(LAYOUT_DIR) + workingDirectory: $(LAYOUT_DIR) + env: + AZURE_CLIENT_ID: $(AZURE_CLIENT_ID) + AZURE_CLIENT_SECRET: $(AZURE_CLIENT_SECRET) + AZURE_TENANT_ID: $(AZURE_TENANT_ID) - powershell: | python make-msix.py @@ -181,21 +192,35 @@ stages: PYMANAGER_APPX_PUBLISHER: $(TrustedSigningCertificateSubject) - ${{ if or(eq(parameters.Sign, 'true'), eq(parameters.TestSign, 'true')) }}: - - task: AzureCLI@2 - displayName: 'Sign packages' - inputs: - azureSubscription: 'Python Signing' - scriptType: ps - scriptLocation: inlineScript - inlineScript: | - dir *.msix, *.msi | %{ - sign code trusted-signing "$_" ` - -fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 ` - -tse "$(TrustedSigningUri)" -tsa "$(TrustedSigningAccount)" -tscp "$(TrustedSigningCertificateName)" ` - -d "PyManager $(Build.BuildNumber)" ` - -fl $env:SIGNLIST2 - } - workingDirectory: $(DIST_DIR) + - powershell: > + dir *.msix | %{ + sign code trusted-signing "$_" + -fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 + -tse "$(TrustedSigningUri)" -tsa "$(TrustedSigningAccount)" -tscp "$(TrustedSigningCertificateName)" + -d "PyManager $(Build.BuildNumber)" + -fl $env:SIGNLIST2 + } + displayName: 'Sign MSIX package' + workingDirectory: $(DIST_DIR) + env: + AZURE_CLIENT_ID: $(AZURE_CLIENT_ID) + AZURE_CLIENT_SECRET: $(AZURE_CLIENT_SECRET) + AZURE_TENANT_ID: $(AZURE_TENANT_ID) + + - powershell: > + dir *.msi | %{ + sign code trusted-signing "$_" + -fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 + -tse "$(TrustedSigningUri)" -tsa "$(TrustedSigningAccount)" -tscp "$(TrustedSigningCertificateName)" + -d "PyManager $(Build.BuildNumber)" + -fl $env:SIGNLIST3 + } + displayName: 'Sign MSI package' + workingDirectory: $(DIST_DIR) + env: + AZURE_CLIENT_ID: $(AZURE_CLIENT_ID) + AZURE_CLIENT_SECRET: $(AZURE_CLIENT_SECRET) + AZURE_TENANT_ID: $(AZURE_TENANT_ID) - ${{ if eq(parameters.TestSign, 'true') }}: - powershell: Write-Host "##vso[build.addbuildtag]test-signed" From 1f0f75b5538897a48f2f5f21ed4bf8813272061a Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 7 Oct 2025 19:29:54 +0100 Subject: [PATCH 5/9] Also write token file --- ci/release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ci/release.yml b/ci/release.yml index 81373ba..1ffeea7 100644 --- a/ci/release.yml +++ b/ci/release.yml @@ -145,6 +145,9 @@ stages: "##vso[task.setvariable variable=AZURE_CLIENT_ID;issecret=true]$servicePrincipalId" "##vso[task.setvariable variable=AZURE_ID_TOKEN;issecret=true]$idToken" "##vso[task.setvariable variable=AZURE_TENANT_ID;issecret=true]$tenantId" + $tokenPath = "$env:AGENT_TEMPDIRECTORY\federated-token.jwt" + Set-Content -Path $tokenPath -Value $env:idToken + Write-Host "##vso[task.setvariable variable=AZURE_FEDERATED_TOKEN_FILE]$tokenPath" addSpnToEnvironment: true - powershell: | From 2c7ef6f252a1aef6e310836f89f87af3a056e37d Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 7 Oct 2025 19:47:14 +0100 Subject: [PATCH 6/9] Another try --- ci/release.yml | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/ci/release.yml b/ci/release.yml index 1ffeea7..d5617b9 100644 --- a/ci/release.yml +++ b/ci/release.yml @@ -136,7 +136,7 @@ stages: workingDirectory: $(Build.BinariesDirectory) - task: AzureCLI@2 - displayName: 'Azure CLI' + displayName: 'Azure Login (1/2)' inputs: azureSubscription: 'Python Signing' scriptType: 'ps' @@ -145,11 +145,16 @@ stages: "##vso[task.setvariable variable=AZURE_CLIENT_ID;issecret=true]$servicePrincipalId" "##vso[task.setvariable variable=AZURE_ID_TOKEN;issecret=true]$idToken" "##vso[task.setvariable variable=AZURE_TENANT_ID;issecret=true]$tenantId" - $tokenPath = "$env:AGENT_TEMPDIRECTORY\federated-token.jwt" - Set-Content -Path $tokenPath -Value $env:idToken - Write-Host "##vso[task.setvariable variable=AZURE_FEDERATED_TOKEN_FILE]$tokenPath" addSpnToEnvironment: true + - powershell: > + az login --service-principal + -u $(AZURE_CLIENT_ID) + --tenant $(AZURE_TENANT_ID) + --allow-no-subscriptions + --federated-token $(AZURE_ID_TOKEN) + displayName: 'Azure Login (2/2)' + - powershell: | python make.py displayName: 'Build package' @@ -170,10 +175,6 @@ stages: } displayName: 'Sign binaries' workingDirectory: $(LAYOUT_DIR) - env: - AZURE_CLIENT_ID: $(AZURE_CLIENT_ID) - AZURE_CLIENT_SECRET: $(AZURE_CLIENT_SECRET) - AZURE_TENANT_ID: $(AZURE_TENANT_ID) - powershell: | python make-msix.py @@ -205,10 +206,6 @@ stages: } displayName: 'Sign MSIX package' workingDirectory: $(DIST_DIR) - env: - AZURE_CLIENT_ID: $(AZURE_CLIENT_ID) - AZURE_CLIENT_SECRET: $(AZURE_CLIENT_SECRET) - AZURE_TENANT_ID: $(AZURE_TENANT_ID) - powershell: > dir *.msi | %{ @@ -220,10 +217,6 @@ stages: } displayName: 'Sign MSI package' workingDirectory: $(DIST_DIR) - env: - AZURE_CLIENT_ID: $(AZURE_CLIENT_ID) - AZURE_CLIENT_SECRET: $(AZURE_CLIENT_SECRET) - AZURE_TENANT_ID: $(AZURE_TENANT_ID) - ${{ if eq(parameters.TestSign, 'true') }}: - powershell: Write-Host "##vso[build.addbuildtag]test-signed" From 558b4330f6eeb0d46a5cbf0abcb541cf0df23759 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 7 Oct 2025 19:53:46 +0100 Subject: [PATCH 7/9] Env spec? --- ci/release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ci/release.yml b/ci/release.yml index d5617b9..8c3f2a0 100644 --- a/ci/release.yml +++ b/ci/release.yml @@ -142,9 +142,9 @@ stages: scriptType: 'ps' scriptLocation: 'inlineScript' inlineScript: | - "##vso[task.setvariable variable=AZURE_CLIENT_ID;issecret=true]$servicePrincipalId" - "##vso[task.setvariable variable=AZURE_ID_TOKEN;issecret=true]$idToken" - "##vso[task.setvariable variable=AZURE_TENANT_ID;issecret=true]$tenantId" + "##vso[task.setvariable variable=AZURE_CLIENT_ID;issecret=true]${env:servicePrincipalId}" + "##vso[task.setvariable variable=AZURE_ID_TOKEN;issecret=true]${env:idToken}" + "##vso[task.setvariable variable=AZURE_TENANT_ID;issecret=true]${env:tenantId}" addSpnToEnvironment: true - powershell: > From 921745e5be97bb886ed469007e8a09d1bf0f6c5f Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 7 Oct 2025 21:38:12 +0100 Subject: [PATCH 8/9] Pin build VM to old Windows for now --- ci/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/release.yml b/ci/release.yml index 8c3f2a0..5366859 100644 --- a/ci/release.yml +++ b/ci/release.yml @@ -65,7 +65,7 @@ stages: - job: Build pool: - vmImage: 'windows-latest' + vmImage: 'windows-2022' variables: - ${{ if eq(parameters.TestSign, 'true') }}: From d885e3cba242c44b29984733c2751bc4bd99b836 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Wed, 8 Oct 2025 00:04:30 +0100 Subject: [PATCH 9/9] Disable update popups for testing --- ci/release.yml | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/ci/release.yml b/ci/release.yml index 5366859..bcc6c7a 100644 --- a/ci/release.yml +++ b/ci/release.yml @@ -27,10 +27,6 @@ parameters: displayName: "Post test" type: boolean default: true -- name: PostTestWithHangs - displayName: "Post tests that may hang" - type: boolean - default: true - name: OverrideRef displayName: "Force version (else uses tag)" type: string @@ -65,7 +61,7 @@ stages: - job: Build pool: - vmImage: 'windows-2022' + vmImage: 'windows-latest' variables: - ${{ if eq(parameters.TestSign, 'true') }}: @@ -234,7 +230,6 @@ stages: - powershell: | $msix = dir "$(DIST_DIR)\*.msix" | ?{ -not ($_.BaseName -match '.+-store') } | select -first 1 Add-AppxPackage $msix - Get-AppxPackage PythonSoftwareFoundation.PythonManager displayName: 'Install signed MSIX' - ${{ else }}: @@ -243,22 +238,29 @@ stages: cp $msix "${msix}.zip" Expand-Archive "${msix}.zip" (mkdir -Force $env:TEST_MSIX) Add-AppxPackage -Register "${env:TEST_MSIX}\appxmanifest.xml" - Get-AppxPackage PythonSoftwareFoundation.PythonManager displayName: 'Register unsigned MSIX' env: TEST_MSIX: $(TEST_MSIX_DIR) + - powershell: | + $p = Get-AppxPackage PythonSoftwareFoundation.PythonManager + $p + Set-AppxPackageAutoUpdateSettings $p.PackageFamilyName -CheckOnLaunch $false + Set-AppxPackageAutoUpdateSettings $p.PackageFamilyName -ShowPrompt $false + Set-AppxPackageAutoUpdateSettings $p.PackageFamilyName -PauseUpdates -HoursToPause 1 + Get-AppxPackageAutoUpdateSettings $p.PackageFamilyName + displayName: 'Update MSIX settings' + - powershell: | # Some of these are likely present due to the machine configuration, # but we'll check for them anyway. gcm pymanager, pywmanager, py, python, pyw, pythonw | Format-Table -AutoSize displayName: 'Ensure global commands are present' - - ${{ if eq(parameters.PostTestWithHangs, 'true') }}: - - powershell: | - pymanager help - displayName: 'Show help output' - timeoutInMinutes: 1 + - powershell: | + pymanager help + displayName: 'Show help output' + timeoutInMinutes: 1 - powershell: | pymanager install -vv default