From 4c621bbb8ba68550859430427df620bea0e817d8 Mon Sep 17 00:00:00 2001 From: jiasli <4003950+jiasli@users.noreply.github.com> Date: Mon, 31 Jul 2023 16:31:43 +0800 Subject: [PATCH] test-msi --- azure-pipelines.yml | 52 ++----------- .../windows/scripts/test_msi_installation.ps1 | 76 +++++++++++++++++++ 2 files changed, 82 insertions(+), 46 deletions(-) create mode 100644 build_scripts/windows/scripts/test_msi_installation.ps1 diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b9347031389..7433df640cd 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -228,14 +228,14 @@ jobs: TargetPath: 'build_scripts/windows/out/' ArtifactName: msi-$(Platform) -- job: TestWindowsMSI - displayName: Test Windows MSI +- job: TestMsiInstallation + displayName: Test MSI Installation strategy: matrix: x86: Platform: x86 -# x64: -# Platform: x64 + x64: + Platform: x64 dependsOn: BuildWindowsMSI condition: and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI', 'Manual', 'Schedule')) @@ -257,47 +257,7 @@ jobs: - task: PowerShell@2 displayName: Install and Load CLI inputs: - targetType: inline - script: | - if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { - # Start another Powershell process as Admin and execute this script again - $arguments = "& '" +$myinvocation.mycommand.definition + "'" - Start-Process powershell -Verb runAs -ArgumentList $arguments - # Stop if the PowerShell is not run as Admin - Break - } - # The following are executed by elevated PowerShell - az --version - - $InstallArgs = @( - "/i" - "`"$env:SYSTEM_ARTIFACTSDIRECTORY\msi\Microsoft Azure CLI.msi`"" - "/q" - "/norestart" - "/l*v" - ".\install_logs.txt" - ) - $pre_installed_version=az version --query '\"azure-cli\"' -o tsv - $to_be_installed_version=Get-Content $(System.ArtifactsDirectory)/metadata/version - if ($pre_installed_version -eq $to_be_installed_version){ - # See https://docs.microsoft.com/windows/win32/msi/reinstallmode about options of REINSTALLMODE - $reinstall_option="REINSTALL=ALL REINSTALLMODE=emus" - $InstallArgs += $reinstall_option - } - Start-Process "msiexec.exe" -ArgumentList $InstallArgs -Wait -NoNewWindow - $install_time=Measure-Command {Start-Process "msiexec.exe" -ArgumentList $InstallArgs -Wait -NoNewWindow} | select -expand TotalSeconds - $installed_version=az version --query '\"azure-cli\"' -o tsv - if ($installed_version -ne $to_be_installed_version){ - echo "The MSI failed to install." - Exit 1 - } - echo 'Install time(seconds):' $install_time - az --version - # Test bundled pip with extension installation - az extension add -n rdbms-connect - az self-test - - Get-Content .\install_logs.txt + filePath: build_scripts\windows\scripts\test_msi_installation.ps1 - job: BuildDockerImage displayName: Build Docker Image @@ -1137,7 +1097,7 @@ jobs: - VerifyWindowsRequirements - VerifyVersions - BuildWindowsMSI - - TestWindowsMSI + - TestMsiInstallation - BuildDockerImage - TestDockerImage - BuildPythonWheel diff --git a/build_scripts/windows/scripts/test_msi_installation.ps1 b/build_scripts/windows/scripts/test_msi_installation.ps1 new file mode 100644 index 00000000000..c65bb99676c --- /dev/null +++ b/build_scripts/windows/scripts/test_msi_installation.ps1 @@ -0,0 +1,76 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- + +Set-PSDebug -Trace 1 + +if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { + # Start another Powershell process as Admin and execute this script again + $arguments = "& '" + $myinvocation.mycommand.definition + "'" + Start-Process powershell -Verb runAs -ArgumentList $arguments + # Stop if the PowerShell is not run as Admin + Break +} +# The following are executed by elevated PowerShell + +# Deal with the pre-installed Azure CLI on the ADO agent +az --version + +# Uninstall the pre-installed Azure CLI. We use wildcard, since product name can be: +# - Microsoft Azure CLI --deprecated +# - Microsoft Azure CLI (32-bit) +# - Microsoft Azure CLI (64-bit) +$cli_package = Get-Package -Provider Programs -IncludeWindowsInstaller -Name "Microsoft Azure CLI*" +$cli_package | Format-List +Uninstall-Package -Name $cli_package.Name + +# Make sure it is uninstalled +Get-Package -Provider Programs -IncludeWindowsInstaller + + +# Install artifact MSI +$InstallArgs = @( + "/i" + "`"$env:SYSTEM_ARTIFACTSDIRECTORY\msi\Microsoft Azure CLI.msi`"" + "/q" + "/norestart" + "/l*v" + ".\install_logs.txt" +) +Write-Output "Calling: msiexec.exe $InstallArgs" +$install_time = Measure-Command {Start-Process "msiexec.exe" -ArgumentList $InstallArgs -Wait -NoNewWindow} + +# Show installation log. Since the log is too big, we only print it when needed. +# Get-Content .\install_logs.txt + +# Show installation time +Write-Output "Installation time (seconds): $($install_time.TotalSeconds)" + +# Show package information +Get-Package -Provider Programs -IncludeWindowsInstaller -Name "Microsoft Azure CLI*" | Format-List + +# We can't restart the current shell in CI to refresh PATH, so use absolute path. +# If we can find a way to refresh PATH in the same shell session, we can directly call az. +if ($env:PLATFORM -eq 'x64') { + $az_full_path = "C:\Program Files\Microsoft SDKs\Azure\CLI2\wbin\az.cmd" +} else { + $az_full_path = "C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\az.cmd" +} + +& $az_full_path --version + +$installed_version=& $az_full_path version --query '\"azure-cli\"' -o tsv +Write-Output "Installed version: $installed_version" + +$artifact_version=Get-Content $env:SYSTEM_ARTIFACTSDIRECTORY\metadata\version +Write-Output "Artifact version: $artifact_version" + +if ($installed_version -ne $artifact_version){ + Write-Output "The installed version doesn't match the artifact version." + Exit 1 +} + +# Test bundled pip with extension installation +& $az_full_path extension add -n account +& $az_full_path self-test