diff --git a/images/windows/scripts/build/Install-AWSTools.ps1 b/images/windows/scripts/build/Install-AWSTools.ps1 index 5fdd8f949..ff9cdab3b 100644 --- a/images/windows/scripts/build/Install-AWSTools.ps1 +++ b/images/windows/scripts/build/Install-AWSTools.ps1 @@ -5,26 +5,21 @@ ################################################################################ # Install AWS CLI -Choco-Install -PackageName awscli +Install-ChocoPackage awscli # Install Session Manager Plugin for the AWS CLI -$sessionManagerName = "SessionManagerPluginSetup.exe" -$sessionManagerUrl = "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/$sessionManagerName" -$sessionManagerSignatureThumbprint = "FF457E5732E98A9F156E657F8CC7C4432507C3BB" -Install-Binary -Url $sessionManagerUrl -Name $sessionManagerName -ArgumentList ("/silent", "/install") -ExpectedSignature $sessionManagerSignatureThumbprint +Install-Binary ` + -Url "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe" ` + -InstallArgs ("/silent", "/install") ` + -ExpectedSignature "FF457E5732E98A9F156E657F8CC7C4432507C3BB" $env:Path = $env:Path + ";$env:ProgramFiles\Amazon\SessionManagerPlugin\bin" # Install AWS SAM CLI $packageName = "AWS_SAM_CLI_64_PY3.msi" $packageUrl = "https://github.com/awslabs/aws-sam-cli/releases/latest/download/$packageName" -$packagePath = Start-DownloadWithRetry -Url $packageUrl -Name $packageName - -#region Supply chain security - AWS SAM CLI -$fileHash = (Get-FileHash -Path $packagePath -Algorithm SHA256).Hash $externalHash = Get-HashFromGitHubReleaseBody -RepoOwner "awslabs" -RepoName "aws-sam-cli" -FileName $packageName -Use-ChecksumComparison $fileHash $externalHash -#endregion - -Install-Binary -FilePath $packagePath +Install-Binary ` + -Url $packageUrl ` + -ExpectedSHA256Sum $externalHash Invoke-PesterTests -TestFile "CLI.Tools" -TestName "AWS" diff --git a/images/windows/scripts/build/Install-Apache.ps1 b/images/windows/scripts/build/Install-Apache.ps1 index 0bcc7a5ee..e2d37dcc0 100644 --- a/images/windows/scripts/build/Install-Apache.ps1 +++ b/images/windows/scripts/build/Install-Apache.ps1 @@ -8,7 +8,7 @@ Stop-Service -Name w3svc | Out-Null # Install latest apache in chocolatey $installDir = "C:\tools" -Choco-Install -PackageName apache-httpd -ArgumentList "--force", "--params", "/installLocation:$installDir /port:80" +Install-ChocoPackage apache-httpd -ArgumentList "--force", "--params", "/installLocation:$installDir /port:80" # Stop and disable Apache service Stop-Service -Name Apache diff --git a/images/windows/scripts/build/Install-AzureCli.ps1 b/images/windows/scripts/build/Install-AzureCli.ps1 index a4ff45e08..1a1c2f196 100644 --- a/images/windows/scripts/build/Install-AzureCli.ps1 +++ b/images/windows/scripts/build/Install-AzureCli.ps1 @@ -11,9 +11,9 @@ $azureCliConfigPath = 'C:\azureCli' # make variable to be available in the current session ${env:AZURE_CONFIG_DIR} = $azureCliConfigPath -$azCliUrl = 'https://aka.ms/installazurecliwindowsx64' -$azCliSignatureThumbprint = "72105B6D5F370B62FD5C82F1512F7AD7DEE5F2C0" -Install-Binary -Url $azCliUrl -Name 'azure-cli.msi' -ExpectedSignature $azCliSignatureThumbprint +Install-Binary -Type MSI ` + -Url 'https://aka.ms/installazurecliwindowsx64' ` + -ExpectedSignature '72105B6D5F370B62FD5C82F1512F7AD7DEE5F2C0' $azureCliExtensionPath = Join-Path $Env:CommonProgramFiles 'AzureCliExtensionDirectory' $null = New-Item -ItemType 'Directory' -Path $azureCliExtensionPath diff --git a/images/windows/scripts/build/Install-AzureCosmosDbEmulator.ps1 b/images/windows/scripts/build/Install-AzureCosmosDbEmulator.ps1 index 697eaf853..32c1e9f27 100644 --- a/images/windows/scripts/build/Install-AzureCosmosDbEmulator.ps1 +++ b/images/windows/scripts/build/Install-AzureCosmosDbEmulator.ps1 @@ -3,10 +3,8 @@ ## Desc: Install Azure CosmosDb Emulator #################################################################################### -$InstallerName = "AzureCosmosDBEmulator.msi" -$InstallerUrl = "https://aka.ms/cosmosdb-emulator" -$SignatureThumbprint = "F372C27F6E052A6BE8BAB3112B465C692196CD6F" - -Install-Binary -Url $InstallerUrl -Name $InstallerName -ExpectedSignature $SignatureThumbprint +Install-Binary -Type MSI ` + -Url "https://aka.ms/cosmosdb-emulator" ` + -ExpectedSignature "F372C27F6E052A6BE8BAB3112B465C692196CD6F" Invoke-PesterTests -TestFile "Tools" -TestName "Azure Cosmos DB Emulator" diff --git a/images/windows/scripts/build/Install-Bazel.ps1 b/images/windows/scripts/build/Install-Bazel.ps1 index 61dd94ee6..bc3a4e011 100644 --- a/images/windows/scripts/build/Install-Bazel.ps1 +++ b/images/windows/scripts/build/Install-Bazel.ps1 @@ -3,8 +3,8 @@ ## Desc: Install Bazel and Bazelisk (A user-friendly launcher for Bazel) ################################################################################ -Choco-Install -PackageName bazel +Install-ChocoPackage bazel npm install -g @bazel/bazelisk -Invoke-PesterTests -TestFile "Tools" -TestName "Bazel" \ No newline at end of file +Invoke-PesterTests -TestFile "Tools" -TestName "Bazel" diff --git a/images/windows/scripts/build/Install-BizTalkBuildComponent.ps1 b/images/windows/scripts/build/Install-BizTalkBuildComponent.ps1 index 2dd4cbbf0..f1d7537ac 100644 --- a/images/windows/scripts/build/Install-BizTalkBuildComponent.ps1 +++ b/images/windows/scripts/build/Install-BizTalkBuildComponent.ps1 @@ -3,86 +3,29 @@ ## Desc: Install BizTalk Project Build Component ################################################################################ -function Install-Msi -{ - <# - .SYNOPSIS - A helper function to install executables. +$BuildComponentUri = "https://aka.ms/BuildComponentSetup.EN" +$BuildComponentSignatureThumbprint = "8740DF4ACB749640AD318E4BE842F72EC651AD80" - .DESCRIPTION - install .exe or .msi binaries from specified Path. +Write-Host "Downloading BizTalk Project Build Component archive..." +$setupZipFile = Start-DownloadWithRetry -Url $BuildComponentUri -Name "BuildComponentSetup.EN.zip" - .PARAMETER MsiPath - Msi or exe path. Required parameter. - - .PARAMETER LogPath - The log file path where installation will write log to. Required parameter. - - .EXAMPLE - Install-Msi -MsiPath "c:\temp\abc.msi" -LogPath "c:\abc.log" - #> - - Param - ( - [Parameter(Mandatory)] - [String] $MsiPath, - [Parameter(Mandatory)] - [String] $LogPath - ) - - try - { - $filePath = "msiexec.exe" - - Write-Host "Starting Install $MsiPath..." - $ArgumentList = ('/i', $MsiPath, '/QN', '/norestart', "/l*v",$LogPath) - $process = Start-Process -FilePath $filePath -ArgumentList $ArgumentList -Wait -PassThru -Verb runAs - - $exitCode = $process.ExitCode - if ($exitCode -eq 0 -or $exitCode -eq 3010) - { - Write-Host "Installation for $MsiPath is successful." - } - else - { - Write-Host "Non zero exit code returned by $MsiPath installation process: $exitCode" - Get-Content $LogPath | Write-Host - exit $exitCode - } - } - catch - { - Write-Host "Failed to install $MsiPath : $($_.Exception.Message)" - exit 1 - } -} - -$bizTalkBuildComponentUri = "https://aka.ms/BuildComponentSetup.EN" - -# Download -Write-Host "BizTalk Project Build Component download..." -$setupZipFile = Start-DownloadWithRetry -Url $bizTalkBuildComponentUri -Name "BuildComponentSetup.EN.zip" - -# Unzip -$setupPath = "C:\BizTalkBuildComponent" +$setupPath = Join-Path $env:TEMP "BizTalkBuildComponent" if (-not (Test-Path -Path $setupPath)) { $null = New-Item -Path $setupPath -ItemType Directory -Force } - -Write-Host "Unzip $setupZipFile to $setupPath..." Extract-7Zip -Path $setupZipFile -DestinationPath $setupPath + +Write-Host "Installing BizTalk Project Build Component..." +Install-Binary ` + -LocalPath "$setupPath\Bootstrap.msi" ` + -ExtraInstallArgs ("/l*v", "$setupPath\bootstrap.log") ` + -ExpectedSignature $BuildComponentSignatureThumbprint +Install-Binary ` + -LocalPath "$setupPath\BuildComponentSetup.msi" ` + -ExtraInstallArgs ("/l*v", "$setupPath\buildComponentSetup.log") ` + -ExpectedSignature $BuildComponentSignatureThumbprint + Remove-Item $setupZipFile - -# Verify signature -$BuildComponentSignatureThumbprint = "8740DF4ACB749640AD318E4BE842F72EC651AD80" -Test-FileSignature -FilePath "$setupPath\Bootstrap.msi" -ExpectedThumbprint $BuildComponentSignatureThumbprint -Test-FileSignature -FilePath "$setupPath\BuildComponentSetup.msi" -ExpectedThumbprint $BuildComponentSignatureThumbprint - -# Install -Install-Msi -MsiPath "$setupPath\Bootstrap.msi" -LogPath "$setupPath\bootstrap.log" -Install-Msi -MsiPath "$setupPath\BuildComponentSetup.msi" -LogPath "$setupPath\buildComponentSetup.log" - Remove-Item $setupPath -Recurse -Force -# Test Invoke-PesterTests -TestFile "BizTalk" -TestName "BizTalk Build Component Setup" diff --git a/images/windows/scripts/build/Install-ChocolateyPackages.ps1 b/images/windows/scripts/build/Install-ChocolateyPackages.ps1 index 3d2fbdc56..826e77ff9 100644 --- a/images/windows/scripts/build/Install-ChocolateyPackages.ps1 +++ b/images/windows/scripts/build/Install-ChocolateyPackages.ps1 @@ -6,7 +6,7 @@ $commonPackages = (Get-ToolsetContent).choco.common_packages foreach ($package in $commonPackages) { - Choco-Install -PackageName $package.name -ArgumentList $package.args + Install-ChocoPackage $package.name -ArgumentList $package.args } Invoke-PesterTests -TestFile "ChocoPackages" diff --git a/images/windows/scripts/build/Install-Chrome.ps1 b/images/windows/scripts/build/Install-Chrome.ps1 index 2a2341f3c..43b6a0f05 100644 --- a/images/windows/scripts/build/Install-Chrome.ps1 +++ b/images/windows/scripts/build/Install-Chrome.ps1 @@ -4,10 +4,9 @@ ################################################################################ # Download and install latest Chrome browser -$ChromeSignatureThumbprint = "2673EA6CC23BEFFDA49AC715B121544098A1284C" -$ChromeInstallerFile = "googlechromestandaloneenterprise64.msi" -$ChromeInstallerUrl = "https://dl.google.com/tag/s/dl/chrome/install/${ChromeInstallerFile}" -Install-Binary -Url $ChromeInstallerUrl -Name $ChromeInstallerFile -ArgumentList @() -ExpectedSignature $ChromeSignatureThumbprint +Install-Binary ` + -Url 'https://dl.google.com/tag/s/dl/chrome/install/googlechromestandaloneenterprise64.msi' ` + -ExpectedSignature '2673EA6CC23BEFFDA49AC715B121544098A1284C' # Prepare firewall rules Write-Host "Adding the firewall rule for Google update blocking..." diff --git a/images/windows/scripts/build/Install-DACFx.ps1 b/images/windows/scripts/build/Install-DACFx.ps1 index 087ae6336..bff35dde9 100644 --- a/images/windows/scripts/build/Install-DACFx.ps1 +++ b/images/windows/scripts/build/Install-DACFx.ps1 @@ -3,10 +3,8 @@ ## Desc: Install SQL ServerĀ® Data-Tier Application Framework (DacFx) for Windows #################################################################################### -$InstallerName = "DacFramework.msi" -$InstallerUrl = "https://aka.ms/dacfx-msi" -$SignatureThumbprint = "72105B6D5F370B62FD5C82F1512F7AD7DEE5F2C0" - -Install-Binary -Url $InstallerUrl -Name $InstallerName -ExpectedSignature $SignatureThumbprint +Install-Binary -Type MSI ` + -Url 'https://aka.ms/dacfx-msi' ` + -ExpectedSignature '72105B6D5F370B62FD5C82F1512F7AD7DEE5F2C0' Invoke-PesterTests -TestFile "Tools" -TestName "DACFx" diff --git a/images/windows/scripts/build/Install-DockerCompose.ps1 b/images/windows/scripts/build/Install-DockerCompose.ps1 index 3cbbd3a15..915aed715 100644 --- a/images/windows/scripts/build/Install-DockerCompose.ps1 +++ b/images/windows/scripts/build/Install-DockerCompose.ps1 @@ -5,8 +5,8 @@ ################################################################################ Write-Host "Install-Package Docker-Compose v1" -$versionToInstall = Get-LatestChocoPackageVersion -TargetVersion "1.29" -PackageName "docker-compose" -Choco-Install -PackageName docker-compose -ArgumentList "--version=$versionToInstall" +$versionToInstall = Resolve-ChocoPackageVersion -PackageName "docker-compose" -TargetVersion "1.29" +Install-ChocoPackage docker-compose -ArgumentList "--version=$versionToInstall" Write-Host "Install-Package Docker-Compose v2" $dockerComposev2Url = "https://github.com/docker/compose/releases/latest/download/docker-compose-windows-x86_64.exe" diff --git a/images/windows/scripts/build/Install-Firefox.ps1 b/images/windows/scripts/build/Install-Firefox.ps1 index 11a7d6f4f..0a66f0d7c 100644 --- a/images/windows/scripts/build/Install-Firefox.ps1 +++ b/images/windows/scripts/build/Install-Firefox.ps1 @@ -5,19 +5,18 @@ ################################################################################ # Install and configure Firefox browser -Write-Host "Install latest Firefox browser..." +Write-Host "Get the latest Firefox version..." $VersionsManifest = Invoke-RestMethod "https://product-details.mozilla.org/1.0/firefox_versions.json" -$InstallerUrl = "https://download.mozilla.org/?product=firefox-$($VersionsManifest.LATEST_FIREFOX_VERSION)&os=win64&lang=en-US" -$packagePath = Start-DownloadWithRetry -Url $InstallerUrl -Name "FirefoxSetup.exe" -#region Supply chain security - Stack -$fileHash = (Get-FileHash -Path $packagePath -Algorithm SHA256).Hash +Write-Host "Install Firefox browser..." +$installerUrl = "https://download.mozilla.org/?product=firefox-$($VersionsManifest.LATEST_FIREFOX_VERSION)&os=win64&lang=en-US" $hashUrl = "https://archive.mozilla.org/pub/firefox/releases/$($VersionsManifest.LATEST_FIREFOX_VERSION)/SHA256SUMS" $externalHash = (Invoke-RestMethod -Uri $hashURL).ToString().Split("`n").Where({ $_ -ilike "*win64/en-US/Firefox Setup*exe*" }).Split(' ')[0] -Use-ChecksumComparison $fileHash $externalHash -#endregion -Install-Binary -FilePath $packagePath -ArgumentList "/silent", "/install" +Install-Binary -Type EXE ` + -Url $installerUrl ` + -InstallArgs @("/silent", "/install") ` + -ExpectedSHA256Sum $externalHash Write-Host "Disable autoupdate..." $FirefoxDirectoryPath = Join-Path $env:ProgramFiles "Mozilla Firefox" @@ -32,8 +31,7 @@ pref("general.config.filename", "mozilla.cfg");' -ItemType file -force # Download and install Gecko WebDriver Write-Host "Install Gecko WebDriver..." $GeckoDriverPath = "$($env:SystemDrive)\SeleniumWebDrivers\GeckoDriver" -if (-not (Test-Path -Path $GeckoDriverPath)) -{ +if (-not (Test-Path -Path $GeckoDriverPath)) { New-Item -Path $GeckoDriverPath -ItemType Directory -Force } diff --git a/images/windows/scripts/build/Install-Git.ps1 b/images/windows/scripts/build/Install-Git.ps1 index 8219f6dec..f7aaa256c 100644 --- a/images/windows/scripts/build/Install-Git.ps1 +++ b/images/windows/scripts/build/Install-Git.ps1 @@ -8,28 +8,25 @@ Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1" # Install the latest version of Git for Windows $repoURL = "https://api.github.com/repos/git-for-windows/git/releases/latest" $gitReleases = Invoke-RestMethod $repoURL -[string]$downloadUrl = $gitReleases.assets.browser_download_url -match "Git-.+-64-bit.exe" +$downloadUrl = $gitReleases.assets.browser_download_url -match "Git-.+-64-bit.exe" | Select-Object -First 1 + $installerFile = Split-Path $downloadUrl -Leaf -$packagePath = Start-DownloadWithRetry -Url $downloadUrl -Name $installerFile - -#region Supply chain security - Git -$fileHash = (Get-FileHash -Path $packagePath -Algorithm SHA256).Hash $externalHash = Get-HashFromGitHubReleaseBody -Url $RepoURL -FileName $installerFile -Use-ChecksumComparison $fileHash $externalHash -#endregion -Install-Binary -FilePath $packagePath ` - -ArgumentList ( - "/VERYSILENT", ` - "/NORESTART", ` - "/NOCANCEL", ` - "/SP-", ` - "/CLOSEAPPLICATIONS", ` - "/RESTARTAPPLICATIONS", ` - "/o:PathOption=CmdTools", ` - "/o:BashTerminalOption=ConHost", ` - "/o:EnableSymlinks=Enabled", ` - "/COMPONENTS=gitlfs") +Install-Binary ` + -Url $downloadUrl ` + -InstallArgs @(` + "/VERYSILENT", ` + "/NORESTART", ` + "/NOCANCEL", ` + "/SP-", ` + "/CLOSEAPPLICATIONS", ` + "/RESTARTAPPLICATIONS", ` + "/o:PathOption=CmdTools", ` + "/o:BashTerminalOption=ConHost", ` + "/o:EnableSymlinks=Enabled", ` + "/COMPONENTS=gitlfs") ` + -ExpectedSHA256Sum $externalHash Update-SessionEnvironment @@ -42,7 +39,7 @@ git config --system --add safe.directory "*" Add-MachinePathItem "C:\Program Files\Git\bin" # Add well-known SSH host keys to ssh_known_hosts -ssh-keyscan -t rsa,ecdsa,ed25519 github.com >> "C:\Program Files\Git\etc\ssh\ssh_known_hosts" +ssh-keyscan -t rsa, ecdsa, ed25519 github.com >> "C:\Program Files\Git\etc\ssh\ssh_known_hosts" ssh-keyscan -t rsa ssh.dev.azure.com >> "C:\Program Files\Git\etc\ssh\ssh_known_hosts" Invoke-PesterTests -TestFile "Git" diff --git a/images/windows/scripts/build/Install-GitHub-CLI.ps1 b/images/windows/scripts/build/Install-GitHub-CLI.ps1 index cf8278ac8..d34412e35 100644 --- a/images/windows/scripts/build/Install-GitHub-CLI.ps1 +++ b/images/windows/scripts/build/Install-GitHub-CLI.ps1 @@ -7,19 +7,15 @@ Write-Host "Get the latest gh version..." $repoUrl = "https://api.github.com/repos/cli/cli/releases/latest" -$installerFile = "gh_windows_amd64.msi" $assets = (Invoke-RestMethod -Uri $repoUrl).assets $downloadUrl = ($assets.browser_download_url -match "windows_amd64.msi") | Select-Object -First 1 -$packagePath = Start-DownloadWithRetry -Url $downloadUrl -Name $installerFile -#region Supply chain security - GitHub CLI -$fileHash = (Get-FileHash -Path $packagePath -Algorithm SHA256).Hash $hashUrl = ($assets.browser_download_url -match "checksums.txt") | Select-Object -First 1 $externalHash = (Invoke-RestMethod -Uri $hashURL).ToString().Split("`n").Where({ $_ -ilike "*windows_amd64.msi*" }).Split(' ')[0] -Use-ChecksumComparison $fileHash $externalHash -#endregion -Install-Binary -FilePath $packagePath +Install-Binary ` + -Url $downloadUrl ` + -ExpectedSHA256Sum $externalHash Add-MachinePathItem "C:\Program Files (x86)\GitHub CLI" diff --git a/images/windows/scripts/build/Install-GoogleCloudCLI.ps1 b/images/windows/scripts/build/Install-GoogleCloudCLI.ps1 index 8b793b3b7..a26481db4 100644 --- a/images/windows/scripts/build/Install-GoogleCloudCLI.ps1 +++ b/images/windows/scripts/build/Install-GoogleCloudCLI.ps1 @@ -4,10 +4,9 @@ ################################################################################ # https://cloud.google.com/sdk/docs/downloads-interactive -$googleCloudCLIInstaller = "https://dl.google.com/dl/cloudsdk/channels/rapid/GoogleCloudSDKInstaller.exe" -$argumentList = @("/S", "/allusers", "/noreporting") -$googleCloudCLISignatureThumbprint = "2673EA6CC23BEFFDA49AC715B121544098A1284C" - -Install-Binary -Url $googleCloudCLIInstaller -Name "GoogleCloudSDKInstaller.exe" -ArgumentList $argumentList -ExpectedSignature $googleCloudCLISignatureThumbprint +Install-Binary ` + -Url 'https://dl.google.com/dl/cloudsdk/channels/rapid/GoogleCloudSDKInstaller.exe' ` + -InstallArgs @("/S", "/allusers", "/noreporting") ` + -ExpectedSignature '2673EA6CC23BEFFDA49AC715B121544098A1284C' Invoke-PesterTests -TestFile "Tools" -TestName "GoogleCloudCLI" diff --git a/images/windows/scripts/build/Install-JavaTools.ps1 b/images/windows/scripts/build/Install-JavaTools.ps1 index 9696fd9f5..084d23d97 100644 --- a/images/windows/scripts/build/Install-JavaTools.ps1 +++ b/images/windows/scripts/build/Install-JavaTools.ps1 @@ -114,13 +114,13 @@ foreach ($jdkVersionToInstall in $jdkVersionsToInstall) { # Install Java tools # Force chocolatey to ignore dependencies on Ant and Maven or else they will download the Oracle JDK -Choco-Install -PackageName ant -ArgumentList "-i" +Install-ChocoPackage ant -ArgumentList "--ignore-dependencies" # Maven 3.9.x has multiple compatibilities problems $toolsetMavenVersion = (Get-ToolsetContent).maven.version -$versionToInstall = Get-LatestChocoPackageVersion -TargetVersion $toolsetMavenVersion -PackageName "maven" +$versionToInstall = Resolve-ChocoPackageVersion -PackageName "maven" -TargetVersion $toolsetMavenVersion -Choco-Install -PackageName maven -ArgumentList "--version=$versionToInstall" -Choco-Install -PackageName gradle +Install-ChocoPackage maven -ArgumentList "--version=$versionToInstall" +Install-ChocoPackage gradle # Add maven env variables to Machine [string]$m2 = (Get-MachinePath).Split(";") -match "maven" diff --git a/images/windows/scripts/build/Install-KubernetesTools.ps1 b/images/windows/scripts/build/Install-KubernetesTools.ps1 index eb44761fd..5126ba52c 100644 --- a/images/windows/scripts/build/Install-KubernetesTools.ps1 +++ b/images/windows/scripts/build/Install-KubernetesTools.ps1 @@ -23,12 +23,12 @@ Use-ChecksumComparison $fileHash $externalHash Add-MachinePathItem $destFilePath Write-Host "Install Kubectl" -Choco-Install -PackageName kubernetes-cli +Install-ChocoPackage kubernetes-cli Write-Host "Install Helm" -Choco-Install -PackageName kubernetes-helm +Install-ChocoPackage kubernetes-helm Write-Host "Install Minikube" -Choco-Install -PackageName minikube +Install-ChocoPackage minikube Invoke-PesterTests -TestFile "Tools" -TestName "KubernetesTools" diff --git a/images/windows/scripts/build/Install-LLVM.ps1 b/images/windows/scripts/build/Install-LLVM.ps1 index f039a9421..41b8aef95 100644 --- a/images/windows/scripts/build/Install-LLVM.ps1 +++ b/images/windows/scripts/build/Install-LLVM.ps1 @@ -4,7 +4,7 @@ ################################################################################ $llvmVersion = (Get-ToolsetContent).llvm.version -$latestChocoVersion = Get-LatestChocoPackageVersion -TargetVersion $llvmVersion -PackageName "llvm" -Choco-Install -PackageName llvm -ArgumentList '--version', $latestChocoVersion +$latestChocoVersion = Resolve-ChocoPackageVersion -PackageName "llvm" -TargetVersion $llvmVersion +Install-ChocoPackage llvm -ArgumentList '--version', $latestChocoVersion Invoke-PesterTests -TestFile "LLVM" diff --git a/images/windows/scripts/build/Install-Mercurial.ps1 b/images/windows/scripts/build/Install-Mercurial.ps1 index bcbab65cd..96ba27ee6 100644 --- a/images/windows/scripts/build/Install-Mercurial.ps1 +++ b/images/windows/scripts/build/Install-Mercurial.ps1 @@ -3,10 +3,10 @@ ## Desc: Install Mercurial ################################################################################ -Choco-Install -PackageName hg -ArgumentList "--version", "5.0.0" +Install-ChocoPackage hg -ArgumentList "--version", "5.0.0" $hgPath = "${env:ProgramFiles}\Mercurial\" Add-MachinePathItem $hgPath $env:Path = Get-MachinePath -Invoke-PesterTests -TestFile "Tools" -TestName "Mercurial" \ No newline at end of file +Invoke-PesterTests -TestFile "Tools" -TestName "Mercurial" diff --git a/images/windows/scripts/build/Install-Miniconda.ps1 b/images/windows/scripts/build/Install-Miniconda.ps1 index e81eeeaab..c628675cc 100644 --- a/images/windows/scripts/build/Install-Miniconda.ps1 +++ b/images/windows/scripts/build/Install-Miniconda.ps1 @@ -5,28 +5,28 @@ ################################################################################ $CondaDestination = "C:\Miniconda" - -# Install the latest Miniconda $InstallerName = "Miniconda3-latest-Windows-x86_64.exe" -$InstallerUrl = "https://repo.anaconda.com/miniconda/${InstallerName}" -$ArgumentList = ("/S", "/AddToPath=0", "/RegisterPython=0", "/D=$CondaDestination") - -Install-Binary -Url $InstallerUrl -Name $InstallerName -ArgumentList $ArgumentList -[System.Environment]::SetEnvironmentVariable("CONDA", $CondaDestination, "Machine") #region Supply chain security -$localFileHash = (Get-FileHash -Path (Join-Path ${env:TEMP} $installerName) -Algorithm SHA256).Hash $distributorFileHash = $null - $checksums = (Invoke-RestMethod -Uri 'https://repo.anaconda.com/miniconda/' | ConvertFrom-HTML).SelectNodes('//html/body/table/tr') -ForEach($node in $checksums) { +foreach ($node in $checksums) { if ($node.ChildNodes[1].InnerText -eq $InstallerName) { $distributorFileHash = $node.ChildNodes[7].InnerText } } -Use-ChecksumComparison -LocalFileHash $localFileHash -DistributorFileHash $distributorFileHash +if ($null -eq $distributorFileHash) { + throw "Unable to find checksum for $InstallerName in https://repo.anaconda.com/miniconda/" +} #endregion +Install-Binary ` + -Url "https://repo.anaconda.com/miniconda/${InstallerName}" ` + -InstallArgs @("/S", "/AddToPath=0", "/RegisterPython=0", "/D=$CondaDestination") ` + -ExpectedSHA256Sum $distributorFileHash + +[System.Environment]::SetEnvironmentVariable("CONDA", $CondaDestination, "Machine") + Invoke-PesterTests -TestFile "Miniconda" diff --git a/images/windows/scripts/build/Install-MongoDB.ps1 b/images/windows/scripts/build/Install-MongoDB.ps1 index 82b1a36d4..35cfd76f9 100644 --- a/images/windows/scripts/build/Install-MongoDB.ps1 +++ b/images/windows/scripts/build/Install-MongoDB.ps1 @@ -20,12 +20,10 @@ foreach ($release in $TargetReleases) { $LatestVersion = $MinorVersions[0] -$installDir = "c:\PROGRA~1\MongoDB" -$binaryName = "mongodb-windows-x86_64-$LatestVersion-signed.msi" -$downloadURL = "https://fastdl.mongodb.org/windows/$BinaryName" -$installArg = "INSTALLLOCATION=$installDir ADDLOCAL=all" -Install-Binary -Url $downloadURL -Name $binaryName -ArgumentList ("/q","/i","${env:Temp}\$binaryName", $installArg) -ExpectedSignature (Get-ToolsetContent).mongodb.signature - +Install-Binary ` + -Url "https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-$LatestVersion-signed.msi" ` + -ExtraInstallArgs @('TARGETDIR=C:\PROGRA~1\MongoDB ADDLOCAL=ALL') ` + -ExpectedSignature (Get-ToolsetContent).mongodb.signature # Add mongodb to the PATH $mongodbService = "mongodb" diff --git a/images/windows/scripts/build/Install-MysqlCli.ps1 b/images/windows/scripts/build/Install-MysqlCli.ps1 index a05b56cd3..7ca934dca 100644 --- a/images/windows/scripts/build/Install-MysqlCli.ps1 +++ b/images/windows/scripts/build/Install-MysqlCli.ps1 @@ -4,26 +4,26 @@ ################################################################################ # Installing visual c++ redistibutable package. -$InstallerName = "vcredist_x64.exe" -$InstallerURI = "https://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/${InstallerName}" -$ArgumentList = ("/install", "/quiet", "/norestart") -$InstallerSignatureThumbrint = "3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC" - -Install-Binary -Url $InstallerURI -Name $InstallerName -ArgumentList $ArgumentList -ExpectedSignature $InstallerSignatureThumbrint +Install-Binary ` + -Url 'https://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x64.exe' ` + -InstallArgs @("/install", "/quiet", "/norestart") ` + -ExpectedSignature '3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC' # Downloading mysql [version]$MysqlVersion = (Get-ToolsetContent).mysql.version $MysqlVersionMajorMinor = $MysqlVersion.ToString(2) if ($MysqlVersion.Build -lt 0) { - $MysqlVersion = (Invoke-RestMethod -Uri "https://dev.mysql.com/downloads/mysql/${MysqlVersionMajorMinor}.html" -Headers @{ 'User-Agent'='curl/8.4.0' } | - Select-String -Pattern "${MysqlVersionMajorMinor}\.\d+").Matches.Value + $MysqlVersion = (Invoke-RestMethod -Uri "https://dev.mysql.com/downloads/mysql/${MysqlVersionMajorMinor}.html" -Headers @{ 'User-Agent' = 'curl/8.4.0' } | + Select-String -Pattern "${MysqlVersionMajorMinor}\.\d+").Matches.Value } $MysqlVersionFull = $MysqlVersion.ToString() $MysqlVersionUrl = "https://cdn.mysql.com/Downloads/MySQL-${MysqlVersionMajorMinor}/mysql-${MysqlVersionFull}-winx64.msi" -Install-Binary -Url $MysqlVersionUrl -Name "mysql-${MysqlVersionFull}-winx64.msi" -ExpectedSignature (Get-ToolsetContent).mysql.signature +Install-Binary ` + -Url $MysqlVersionUrl ` + -ExpectedSignature (Get-ToolsetContent).mysql.signature # Adding mysql in system environment path $MysqlPath = $(Get-ChildItem -Path "C:\PROGRA~1\MySQL" -Directory)[0].FullName diff --git a/images/windows/scripts/build/Install-NET48-devpack.ps1 b/images/windows/scripts/build/Install-NET48-devpack.ps1 index 348924908..d15931615 100644 --- a/images/windows/scripts/build/Install-NET48-devpack.ps1 +++ b/images/windows/scripts/build/Install-NET48-devpack.ps1 @@ -4,11 +4,9 @@ ################################################################################ # .NET 4.8 Dev pack -$InstallerName = "ndp48-devpack-enu.exe" -$InstallerUrl = "https://download.visualstudio.microsoft.com/download/pr/014120d7-d689-4305-befd-3cb711108212/0307177e14752e359fde5423ab583e43/${InstallerName}" -$InstallerSignatureThumbprint = "C82273A065EC470FB1EBDE846A91E6FFB29E9C12" -$ArgumentList = ("Setup", "/passive", "/norestart") - -Install-Binary -Url $InstallerUrl -Name $InstallerName -ArgumentList $ArgumentList -ExpectedSignature $InstallerSignatureThumbprint +Install-Binary ` + -Url 'https://download.visualstudio.microsoft.com/download/pr/014120d7-d689-4305-befd-3cb711108212/0307177e14752e359fde5423ab583e43/ndp48-devpack-enu.exe' ` + -InstallArgs @("Setup", "/passive", "/norestart") ` + -ExpectedSignature 'C82273A065EC470FB1EBDE846A91E6FFB29E9C12' Invoke-PesterTests -TestFile "Tools" -TestName "NET48" diff --git a/images/windows/scripts/build/Install-NET48.ps1 b/images/windows/scripts/build/Install-NET48.ps1 index 271b11cd5..c9776cd26 100644 --- a/images/windows/scripts/build/Install-NET48.ps1 +++ b/images/windows/scripts/build/Install-NET48.ps1 @@ -4,9 +4,7 @@ ################################################################################ # .NET 4.8 Dev pack -$InstallerName = "ndp48-x86-x64-allos-enu.exe" -$InstallerUrl = "https://download.visualstudio.microsoft.com/download/pr/2d6bb6b2-226a-4baa-bdec-798822606ff1/8494001c276a4b96804cde7829c04d7f/${InstallerName}" -$InstallerSignatureThumbprint = "ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" -$ArgumentList = ("Setup", "/passive", "/norestart") - -Install-Binary -Url $InstallerUrl -Name $InstallerName -ArgumentList $ArgumentList -ExpectedSignature $InstallerSignatureThumbprint +Install-Binary ` + -Url 'https://download.visualstudio.microsoft.com/download/pr/2d6bb6b2-226a-4baa-bdec-798822606ff1/8494001c276a4b96804cde7829c04d7f/ndp48-x86-x64-allos-enu.exe' ` + -InstallArgs @("Setup", "/passive", "/norestart") ` + -ExpectedSignature 'ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B' diff --git a/images/windows/scripts/build/Install-NSIS.ps1 b/images/windows/scripts/build/Install-NSIS.ps1 index 7995c39e1..423eae9da 100644 --- a/images/windows/scripts/build/Install-NSIS.ps1 +++ b/images/windows/scripts/build/Install-NSIS.ps1 @@ -6,7 +6,7 @@ $NsisVersion = (Get-ToolsetContent).nsis.version -Choco-Install -PackageName nsis -ArgumentList "--version", "$NsisVersion" +Install-ChocoPackage nsis -ArgumentList "--version", "$NsisVersion" $NsisPath = "${env:ProgramFiles(x86)}\NSIS\" Add-MachinePathItem $NsisPath diff --git a/images/windows/scripts/build/Install-Nginx.ps1 b/images/windows/scripts/build/Install-Nginx.ps1 index b0889305a..5d2dd0d28 100644 --- a/images/windows/scripts/build/Install-Nginx.ps1 +++ b/images/windows/scripts/build/Install-Nginx.ps1 @@ -8,7 +8,7 @@ Stop-Service -Name w3svc | Out-Null # Install latest nginx in chocolatey $installDir = "C:\tools" -Choco-Install -PackageName nginx -ArgumentList "--force", "--params", "/installLocation:$installDir /port:80" +Install-ChocoPackage nginx -ArgumentList "--force", "--params", "/installLocation:$installDir /port:80" # Stop and disable Nginx service Stop-Service -Name nginx diff --git a/images/windows/scripts/build/Install-NodeJS.ps1 b/images/windows/scripts/build/Install-NodeJS.ps1 index 5487ff9ce..0f0d00a54 100644 --- a/images/windows/scripts/build/Install-NodeJS.ps1 +++ b/images/windows/scripts/build/Install-NodeJS.ps1 @@ -11,9 +11,9 @@ New-Item -Path $PrefixPath -Force -ItemType Directory New-Item -Path $CachePath -Force -ItemType Directory $defaultVersion = (Get-ToolsetContent).node.default -$versionToInstall = Get-LatestChocoPackageVersion -TargetVersion $defaultVersion -PackageName "nodejs" +$versionToInstall = Resolve-ChocoPackageVersion -PackageName "nodejs" -TargetVersion $defaultVersion -Choco-Install -PackageName nodejs -ArgumentList "--version=$versionToInstall" +Install-ChocoPackage nodejs -ArgumentList "--version=$versionToInstall" Add-MachinePathItem $PrefixPath $env:Path = Get-MachinePath diff --git a/images/windows/scripts/build/Install-OpenSSL.ps1 b/images/windows/scripts/build/Install-OpenSSL.ps1 index 47441808a..06f5e1840 100644 --- a/images/windows/scripts/build/Install-OpenSSL.ps1 +++ b/images/windows/scripts/build/Install-OpenSSL.ps1 @@ -7,7 +7,7 @@ $arch = 'INTEL' $bits = '64' $light = $false -$installer = "exe" +$installerType = "exe" $version = (Get-ToolsetContent).openssl.version $installDir = "$Env:ProgramFiles\OpenSSL" @@ -15,35 +15,27 @@ $installDir = "$Env:ProgramFiles\OpenSSL" $jsonUrl = 'https://raw.githubusercontent.com/slproweb/opensslhashes/master/win32_openssl_hashes.json' $installersAvailable = (Invoke-RestMethod $jsonUrl).files +$installerNames = $installersAvailable | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty Name -$distributor_file_hash = $null $installerUrl = $null -$installerName = $null +$installerHash = $null -$installersAvailable | Get-Member -MemberType NoteProperty | ForEach-Object { - $key = $_.Name - if(($installersAvailable.$key.light -eq $light) -and ($installersAvailable.$key.arch -eq $arch) -and ($installersAvailable.$key.bits -eq $bits) -and ($installersAvailable.$key.installer -eq $installer) -and ($installersAvailable.$key.basever -eq $version)) { - $installerUrl = $installersAvailable.$key.url - $installerName = $key - $distributor_file_hash = $installersAvailable.$key.sha512 - } +foreach ($key in $installerNames) { + $installer = $installersAvailable.$key + if (($installer.light -eq $light) -and ($installer.arch -eq $arch) -and ($installer.bits -eq $bits) -and ($installer.installer -eq $installerType) -and ($installer.basever -eq $version)) { + $installerUrl = $installer.url + $installerHash = $installer.sha512 + } } -# Invoke installation - -$installerArgs = '/silent', '/sp-', '/suppressmsgboxes', "/DIR=`"$installDir`"" -Install-Binary -Url "$installerUrl" -Name "$installerName" -ArgumentList $installerArgs - -#region Supply chain security -Write-Verbose "Performing checksum verification" -$local_file_hash = (Get-FileHash -Path (Join-Path ${env:TEMP} $installerName) -Algorithm SHA512).Hash - -if ($local_file_hash -ne $distributor_file_hash) { - Write-Host "hash must be equal to: ${distributor_file_hash}" - Write-Host "actual hash is: ${local_file_hash}" - throw 'Checksum verification failed, please rerun install' +if ($null -eq $installerUrl) { + throw "Installer not found for version $version" } -#endregion + +Install-Binary ` + -Url $installerUrl ` + -InstallArgs @('/silent', '/sp-', '/suppressmsgboxes', "/DIR=`"$installDir`"") ` + -ExpectedSHA512Sum $installerHash # Update PATH Add-MachinePathItem "$installDir\bin" diff --git a/images/windows/scripts/build/Install-PHP.ps1 b/images/windows/scripts/build/Install-PHP.ps1 index c8b5ffea1..f4198aa24 100644 --- a/images/windows/scripts/build/Install-PHP.ps1 +++ b/images/windows/scripts/build/Install-PHP.ps1 @@ -6,11 +6,11 @@ # Install latest PHP in chocolatey $installDir = "c:\tools\php" $phpMajorMinor = (Get-ToolsetContent).php.version -$phpVersionToInstall = Get-LatestChocoPackageVersion -TargetVersion $phpMajorMinor -PackageName "php" -Choco-Install -PackageName php -ArgumentList "--params", "/InstallDir:$installDir", "--version=$phpVersionToInstall" +$phpVersionToInstall = Resolve-ChocoPackageVersion -PackageName "php" -TargetVersion $phpMajorMinor +Install-ChocoPackage php -ArgumentList "--params", "/InstallDir:$installDir", "--version=$phpVersionToInstall" # Install latest Composer in chocolatey -Choco-Install -PackageName composer -ArgumentList "--ia", "/DEV=$installDir /PHP=$installDir" +Install-ChocoPackage composer -ArgumentList "--install-args", "/DEV=$installDir /PHP=$installDir" # update path to extensions and enable curl and mbstring extensions, and enable php openssl extensions. ((Get-Content -path $installDir\php.ini -Raw) -replace ';extension=curl','extension=curl' -replace ';extension=mbstring','extension=mbstring' -replace ';extension_dir = "ext"','extension_dir = "ext"' -replace ';extension=openssl','extension=openssl') | Set-Content -Path $installDir\php.ini diff --git a/images/windows/scripts/build/Install-PostgreSQL.ps1 b/images/windows/scripts/build/Install-PostgreSQL.ps1 index f4d72d9c7..c68036623 100644 --- a/images/windows/scripts/build/Install-PostgreSQL.ps1 +++ b/images/windows/scripts/build/Install-PostgreSQL.ps1 @@ -44,11 +44,14 @@ do { $increment-- } } while (!$response) + # Return the previous value of ErrorAction and invoke Install-Binary function $ErrorActionPreference = $ErrorActionOldValue -$InstallerName = $InstallerUrl.Split('/')[-1] -$ArgumentList = ("--install_runtimes 0", "--superpassword root", "--enable_acledit 1", "--unattendedmodeui none", "--mode unattended") -Install-Binary -Url $InstallerUrl -Name $InstallerName -ArgumentList $ArgumentList -ExpectedSignature (Get-ToolsetContent).postgresql.signature +$InstallerArgs = @("--install_runtimes 0", "--superpassword root", "--enable_acledit 1", "--unattendedmodeui none", "--mode unattended") +Install-Binary ` + -Url $InstallerUrl ` + -InstallArgs $InstallerArgs ` + -ExpectedSignature (Get-ToolsetContent).postgresql.signature # Get Path to pg_ctl.exe $pgPath = (Get-CimInstance Win32_Service -Filter "Name LIKE 'postgresql-%'").PathName diff --git a/images/windows/scripts/build/Install-PowershellCore.ps1 b/images/windows/scripts/build/Install-PowershellCore.ps1 index 6f36959f9..e168a998f 100644 --- a/images/windows/scripts/build/Install-PowershellCore.ps1 +++ b/images/windows/scripts/build/Install-PowershellCore.ps1 @@ -6,20 +6,6 @@ $ErrorActionPreference = "Stop" -#region functions -Function Get-PowerShellCoreHash -{ - Param ( - [Parameter(Mandatory = $True)] - [string] $Release -) - - $hashURL = "https://github.com/PowerShell/PowerShell/releases/download/v${Release}/hashes.sha256" - (Invoke-RestMethod -Uri $hashURL).ToString().Split("`n").Where({ $_ -ilike "*PowerShell-${Release}-win-x64.msi*" }).Split(' ')[0] - -} -#endregion - $tempDir = Join-Path ([System.IO.Path]::GetTempPath()) ([System.IO.Path]::GetRandomFileName()) $null = New-Item -ItemType Directory -Path $tempDir -Force -ErrorAction SilentlyContinue try { @@ -28,33 +14,12 @@ try { $metadata = Invoke-RestMethod https://raw.githubusercontent.com/PowerShell/PowerShell/master/tools/metadata.json $release = $metadata.LTSReleaseTag[0] -replace '^v' - $packageName = "PowerShell-${release}-win-x64.msi" + $downloadUrl = "https://github.com/PowerShell/PowerShell/releases/download/v${release}/PowerShell-${release}-win-x64.msi" - $downloadURL = "https://github.com/PowerShell/PowerShell/releases/download/v${release}/${packageName}" - Write-Verbose "About to download package from '$downloadURL'" -Verbose + $hashUrl = "https://github.com/PowerShell/PowerShell/releases/download/v${release}/hashes.sha256" + $expectedSHA256Sum = (Invoke-RestMethod -Uri $hashURL).ToString().Split("`n").Where({ $_ -ilike "*PowerShell-${Release}-win-x64.msi*" }).Split(' ')[0] - $packagePath = Join-Path -Path $tempDir -ChildPath $packageName - Invoke-WebRequest -Uri $downloadURL -OutFile $packagePath - - #region Supply chain security - Write-Verbose "Performing checksum verification" - - $distributor_file_hash = Get-PowerShellCoreHash -Release $release - $local_file_hash = (Get-FileHash -Path $packagePath -Algorithm SHA256).Hash - - if ($local_file_hash -ne $distributor_file_hash) { - Write-Host "hash must be equal to: ${distributor_file_hash}" - Write-Host "actual hash is: ${local_file_hash}" - throw 'Checksum verification failed, please rerun install' - } - #endregion - - Write-Verbose "Performing quiet install" - $ArgumentList=@("/i", $packagePath, "/quiet") - $process = Start-Process msiexec -ArgumentList $ArgumentList -Wait -PassThru - if ($process.exitcode -ne 0) { - throw "Quiet install failed, please rerun install without -Quiet switch or ensure you have administrator rights" - } + Install-Binary -Url $downloadUrl -ExpectedSHA256Sum $expectedSHA256Sum } finally { # Restore original value [Net.ServicePointManager]::SecurityProtocol = $originalValue diff --git a/images/windows/scripts/build/Install-R.ps1 b/images/windows/scripts/build/Install-R.ps1 index a6f238e7f..96743d725 100644 --- a/images/windows/scripts/build/Install-R.ps1 +++ b/images/windows/scripts/build/Install-R.ps1 @@ -3,9 +3,9 @@ ## Desc: Install R for Windows ################################################################################ -Choco-Install R.Project -Choco-Install rtools +Install-ChocoPackage R.Project +Install-ChocoPackage rtools $rscriptPath = Resolve-Path "C:\Program Files\R\*\bin\x64" Add-MachinePathItem $rscriptPath -Invoke-PesterTests -TestFile "Tools" -TestName "R" \ No newline at end of file +Invoke-PesterTests -TestFile "Tools" -TestName "R" diff --git a/images/windows/scripts/build/Install-SQLOLEDBDriver.ps1 b/images/windows/scripts/build/Install-SQLOLEDBDriver.ps1 index 207c728c4..82fefc5e3 100644 --- a/images/windows/scripts/build/Install-SQLOLEDBDriver.ps1 +++ b/images/windows/scripts/build/Install-SQLOLEDBDriver.ps1 @@ -3,7 +3,7 @@ ## Desc: Install OLE DB Driver for SQL Server ################################################################################ -$binaryDownloadPath = Start-DownloadWithRetry "https://go.microsoft.com/fwlink/?linkid=2242656" "msoledbsql.msi" -$binarySignatureThumbprint = "6E78B3DCE2998F6C2457C3E54DA90A01034916AE" -$ArgumentList = ("/i", "$binaryDownloadPath", "ADDLOCAL=ALL", "IACCEPTMSOLEDBSQLLICENSETERMS=YES", "/qn") -Install-Binary -FilePath $binaryDownloadPath -ArgumentList $ArgumentList -ExpectedSignature $binarySignatureThumbprint +Install-Binary -Type MSI ` + -Url "https://go.microsoft.com/fwlink/?linkid=2242656" ` + -ExtraInstallArgs @("ADDLOCAL=ALL", "IACCEPTMSOLEDBSQLLICENSETERMS=YES") ` + -ExpectedSignature '6E78B3DCE2998F6C2457C3E54DA90A01034916AE' diff --git a/images/windows/scripts/build/Install-SQLPowerShellTools.ps1 b/images/windows/scripts/build/Install-SQLPowerShellTools.ps1 index 1be0946a7..a12c86ffe 100644 --- a/images/windows/scripts/build/Install-SQLPowerShellTools.ps1 +++ b/images/windows/scripts/build/Install-SQLPowerShellTools.ps1 @@ -3,18 +3,18 @@ ## Desc: Install SQL PowerShell tool ################################################################################ -$BaseUrl = "https://download.microsoft.com/download/B/1/7/B1783FE9-717B-4F78-A39A-A2E27E3D679D/ENU/x64" -$SignatureThumbrint = "9ACA9419E53D3C9E56396DD2335FF683A8B0B8F3" +$baseUrl = "https://download.microsoft.com/download/B/1/7/B1783FE9-717B-4F78-A39A-A2E27E3D679D/ENU/x64" +$signatureThumbrint = "9ACA9419E53D3C9E56396DD2335FF683A8B0B8F3" # install required MSIs -$SQLSysClrTypesName = "SQLSysClrTypes.msi" -$SQLSysClrTypesUrl = "${BaseUrl}/${SQLSysClrTypesName}" -Install-Binary -Url $SQLSysClrTypesUrl -Name $SQLSysClrTypesName -ExpectedSignature $SignatureThumbrint +Install-Binary ` + -Url "${baseUrl}/SQLSysClrTypes.msi" ` + -ExpectedSignature $signatureThumbrint -$SharedManagementObjectsName = "SharedManagementObjects.msi" -$SharedManagementObjectsUrl = "${BaseUrl}/${SharedManagementObjectsName}" -Install-Binary -Url $SharedManagementObjectsUrl -Name $SharedManagementObjectsName -ExpectedSignature $SignatureThumbrint +Install-Binary ` + -Url "${baseUrl}/SharedManagementObjects.msi" ` + -ExpectedSignature $signatureThumbrint -$PowerShellToolsName = "PowerShellTools.msi" -$PowerShellToolsUrl = "${BaseUrl}/${PowerShellToolsName}" -Install-Binary -Url $PowerShellToolsUrl -Name $PowerShellToolsName -ExpectedSignature $SignatureThumbrint +Install-Binary ` + -Url "${baseUrl}/PowerShellTools.msi" ` + -ExpectedSignature $signatureThumbrint diff --git a/images/windows/scripts/build/Install-Sbt.ps1 b/images/windows/scripts/build/Install-Sbt.ps1 index cfc37f5b8..184380527 100644 --- a/images/windows/scripts/build/Install-Sbt.ps1 +++ b/images/windows/scripts/build/Install-Sbt.ps1 @@ -5,7 +5,7 @@ # Install the latest version of sbt. # See https://chocolatey.org/packages/sbt -Choco-Install -PackageName sbt +Install-ChocoPackage sbt $env:SBT_HOME="${env:ProgramFiles(x86)}\sbt" diff --git a/images/windows/scripts/build/Install-ServiceFabricSDK.ps1 b/images/windows/scripts/build/Install-ServiceFabricSDK.ps1 index abd3a0e99..18cb6461d 100644 --- a/images/windows/scripts/build/Install-ServiceFabricSDK.ps1 +++ b/images/windows/scripts/build/Install-ServiceFabricSDK.ps1 @@ -8,18 +8,19 @@ New-Item -Path 'C:\Windows\Installer' -ItemType Directory -Force # Get Service Fabric components versions -$serviceFabricRuntimeVersion = (Get-ToolsetContent).serviceFabric.runtime.version -$serviceFabricSDKVersion = (Get-ToolsetContent).serviceFabric.sdk.version +$runtimeVersion = (Get-ToolsetContent).serviceFabric.runtime.version +$sdkVersion = (Get-ToolsetContent).serviceFabric.sdk.version +$urlBase = "https://download.microsoft.com/download/b/8/a/b8a2fb98-0ec1-41e5-be98-9d8b5abf7856" # Install Service Fabric Runtime for Windows -$InstallerName = "MicrosoftServiceFabric.${serviceFabricRuntimeVersion}.exe" -$InstallerUrl = "https://download.microsoft.com/download/b/8/a/b8a2fb98-0ec1-41e5-be98-9d8b5abf7856/${InstallerName}" -$ArgumentList = ("/accepteula ","/quiet","/force") -Install-Binary -Url $InstallerUrl -Name $InstallerName -ArgumentList $ArgumentList -ExpectedSignature (Get-ToolsetContent).serviceFabric.runtime.signature +Install-Binary ` + -Url "${urlBase}/MicrosoftServiceFabric.${runtimeVersion}.exe" ` + -InstallArgs @("/accepteula ", "/quiet", "/force") ` + -ExpectedSignature (Get-ToolsetContent).serviceFabric.runtime.signature # Install Service Fabric SDK -$InstallerName = "MicrosoftServiceFabricSDK.${serviceFabricSDKVersion}.msi" -$InstallerUrl = "https://download.microsoft.com/download/b/8/a/b8a2fb98-0ec1-41e5-be98-9d8b5abf7856/${InstallerName}" -Install-Binary -Url $InstallerUrl -Name $InstallerName -ExpectedSignature (Get-ToolsetContent).serviceFabric.sdk.signature +Install-Binary ` + -Url "${urlBase}/MicrosoftServiceFabricSDK.${sdkVersion}.msi" ` + -ExpectedSignature (Get-ToolsetContent).serviceFabric.sdk.signature Invoke-PesterTests -TestFile "Tools" -TestName "ServiceFabricSDK" diff --git a/images/windows/scripts/build/Install-VCRedist.ps1 b/images/windows/scripts/build/Install-VCRedist.ps1 index 46646fb09..fea415cf7 100644 --- a/images/windows/scripts/build/Install-VCRedist.ps1 +++ b/images/windows/scripts/build/Install-VCRedist.ps1 @@ -3,14 +3,18 @@ ## Desc: Install Visual C++ Redistributable ################################################################################ -$vc2010x86Name = "vcredist_x86.exe" -$vc2010x86URI = "https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/${vc2010x86Name}" -$vc2010x64Name = "vcredist_x64.exe" -$vc2010x64URI = "https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/${Vc2010x64Name}" +$baseUrl = "https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC" $argumentList = ("/install", "/quiet", "/norestart") -$vcSignatureThumbprint = "ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" +$signatureThumbrint = "ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" -Install-Binary -Url $vc2010x86URI -Name $vc2010x86Name -ArgumentList $argumentList -ExpectedSignature $vcSignatureThumbprint -Install-Binary -Url $vc2010x64URI -Name $vc2010x64Name -ArgumentList $argumentList -ExpectedSignature $vcSignatureThumbprint +Install-Binary ` + -Url "${baseUrl}/vcredist_x86.exe" ` + -InstallArgs $argumentList ` + -ExpectedSignature $signatureThumbrint + +Install-Binary ` + -Url "${baseUrl}/vcredist_x64.exe" ` + -InstallArgs $argumentList ` + -ExpectedSignature $signatureThumbrint Invoke-PesterTests -TestFile "Tools" -TestName "VCRedist" diff --git a/images/windows/scripts/build/Install-VSExtensions.ps1 b/images/windows/scripts/build/Install-VSExtensions.ps1 index 0b18a7da8..b4fad504e 100644 --- a/images/windows/scripts/build/Install-VSExtensions.ps1 +++ b/images/windows/scripts/build/Install-VSExtensions.ps1 @@ -16,8 +16,9 @@ $vsixPackagesList | ForEach-Object { if ($vsixPackage.FileName.EndsWith(".vsix")) { Install-VsixExtension -Url $vsixPackage.DownloadUri -Name $vsixPackage.FileName } else { - $argumentList = ('/install', '/quiet', '/norestart') - Install-Binary -Url $vsixPackage.DownloadUri -Name $vsixPackage.FileName -ArgumentList $argumentList + Install-Binary ` + -Url $vsixPackage.DownloadUri ` + -InstallArgs @('/install', '/quiet', '/norestart') } } diff --git a/images/windows/scripts/build/Install-VisualStudio.ps1 b/images/windows/scripts/build/Install-VisualStudio.ps1 index 8b0fbb791..148e6f84d 100644 --- a/images/windows/scripts/build/Install-VisualStudio.ps1 +++ b/images/windows/scripts/build/Install-VisualStudio.ps1 @@ -30,29 +30,25 @@ $newContent = '{"Extensions":[{"Key":"1e906ff5-9da8-4091-a299-5c253c55fdc9","Val Set-Content -Path "$vsInstallRoot\Common7\IDE\Extensions\MachineState.json" -Value $newContent if (Test-IsWin19) { - # Install Windows 10 SDK version 10.0.14393.795 - $sdkSignatureThumbprint = "C91545B333C52C4465DE8B90A3FAF4E1D9C58DFA" - $sdkUrl = "https://go.microsoft.com/fwlink/p/?LinkId=838916" - $sdkFileName = "sdksetup14393.exe" - $argumentList = ("/q", "/norestart", "/ceip off", "/features OptionId.WindowsSoftwareDevelopmentKit") - Install-Binary -Url $sdkUrl -Name $sdkFileName -ArgumentList $argumentList -ExpectedSignature $sdkSignatureThumbprint + Install-Binary -Type EXE ` + -Url 'https://go.microsoft.com/fwlink/p/?LinkId=838916' ` + -InstallArgs @("/q", "/norestart", "/ceip off", "/features OptionId.WindowsSoftwareDevelopmentKit") ` + -ExpectedSignature 'C91545B333C52C4465DE8B90A3FAF4E1D9C58DFA' # Install Windows 11 SDK version 10.0.22621.0 - $sdkSignatureThumbprint = "E4C5C5FCDB68B930EE4E19BC25D431EF6D864C51" - $sdkUrl = "https://go.microsoft.com/fwlink/p/?linkid=2196241" - $sdkFileName = "sdksetup22621.exe" - $argumentList = ("/q", "/norestart", "/ceip off", "/features OptionId.UWPManaged OptionId.UWPCPP OptionId.UWPLocalized OptionId.DesktopCPPx86 OptionId.DesktopCPPx64 OptionId.DesktopCPParm64") - Install-Binary -Url $sdkUrl -Name $sdkFileName -ArgumentList $argumentList -ExpectedSignature $sdkSignatureThumbprint + Install-Binary -Type EXE ` + -Url 'https://go.microsoft.com/fwlink/p/?linkid=2196241' ` + -InstallArgs @("/q", "/norestart", "/ceip off", "/features OptionId.UWPManaged OptionId.UWPCPP OptionId.UWPLocalized OptionId.DesktopCPPx86 OptionId.DesktopCPPx64 OptionId.DesktopCPParm64") ` + -ExpectedSignature 'E4C5C5FCDB68B930EE4E19BC25D431EF6D864C51' } if (Test-IsWin22) { # Install Windows 10 SDK version 10.0.17763 - $sdkSignatureThumbprint = "7535269B94C1FEA4A5EF6D808E371DA242F27936" - $sdkUrl = "https://go.microsoft.com/fwlink/p/?LinkID=2033908" - $sdkFileName = "sdksetup17763.exe" - $argumentList = ("/q", "/norestart", "/ceip off", "/features OptionId.UWPManaged OptionId.UWPCPP OptionId.UWPLocalized OptionId.DesktopCPPx86 OptionId.DesktopCPPx64 OptionId.DesktopCPParm64") - Install-Binary -Url $sdkUrl -Name $sdkFileName -ArgumentList $argumentList -ExpectedSignature $sdkSignatureThumbprint + Install-Binary -Type EXE ` + -Url 'https://go.microsoft.com/fwlink/p/?LinkID=2033908' ` + -InstallArgs @("/q", "/norestart", "/ceip off", "/features OptionId.UWPManaged OptionId.UWPCPP OptionId.UWPLocalized OptionId.DesktopCPPx86 OptionId.DesktopCPPx64 OptionId.DesktopCPParm64") ` + -ExpectedSignature '7535269B94C1FEA4A5EF6D808E371DA242F27936' } Invoke-PesterTests -TestFile "VisualStudio" diff --git a/images/windows/scripts/build/Install-WDK.ps1 b/images/windows/scripts/build/Install-WDK.ps1 index bd7114a63..1b40646a2 100644 --- a/images/windows/scripts/build/Install-WDK.ps1 +++ b/images/windows/scripts/build/Install-WDK.ps1 @@ -4,33 +4,33 @@ ################################################################################ # Requires Windows SDK with the same version number as the WDK -if (Test-IsWin22) { - # SDK available through Visual Studio - $wdkUrl = "https://go.microsoft.com/fwlink/?linkid=2249371" - $FilePath = "C:\Program Files (x86)\Windows Kits\10\Vsix\VS2022\*\WDK.vsix" - $wdkSignatureThumbprint = "7C94971221A799907BB45665663BBFD587BAC9F8" -} elseif (Test-IsWin19) { - $winSdkUrl = "https://go.microsoft.com/fwlink/?linkid=2173743" +if (Test-IsWin19) { + # Install all features without showing the GUI using winsdksetup.exe + Install-Binary -Type EXE ` + -Url 'https://go.microsoft.com/fwlink/?linkid=2173743' ` + -InstallArgs @("/features", "+", "/quiet") ` + -ExpectedSignature '44796EB5BD439B4BFB078E1DC2F8345AE313CBB1' + $wdkUrl = "https://go.microsoft.com/fwlink/?linkid=2166289" - $FilePath = "C:\Program Files (x86)\Windows Kits\10\Vsix\VS2019\WDK.vsix" $wdkSignatureThumbprint = "914A09C2E02C696AF394048BCB8D95449BCD5B9E" - $winSdkSignatureThumbprint = "44796EB5BD439B4BFB078E1DC2F8345AE313CBB1" + $wdkExtensionPath = "C:\Program Files (x86)\Windows Kits\10\Vsix\VS2019\WDK.vsix" +} elseif (Test-IsWin22) { + # SDK is available through Visual Studio + $wdkUrl = "https://go.microsoft.com/fwlink/?linkid=2249371" + $wdkSignatureThumbprint = "7C94971221A799907BB45665663BBFD587BAC9F8" + $wdkExtensionPath = "C:\Program Files (x86)\Windows Kits\10\Vsix\VS2022\*\WDK.vsix" } else { throw "Invalid version of Visual Studio is found. Either 2019 or 2022 are required" } -$argumentList = ("/features", "+", "/quiet") - -if (Test-IsWin19) { - # `winsdksetup.exe /features + /quiet` installs all features without showing the GUI - Install-Binary -Url $winSdkUrl -Name "winsdksetup.exe" -ArgumentList $argumentList -ExpectedSignature $winSdkSignatureThumbprint -} - -# `wdksetup.exe /features + /quiet` installs all features without showing the GUI -Install-Binary -Url $wdkUrl -Name "wdksetup.exe" -ArgumentList $argumentList -ExpectedSignature $wdkSignatureThumbprint +# Install all features without showing the GUI using wdksetup.exe +Install-Binary -Type EXE ` + -Url $wdkUrl ` + -InstallArgs @("/features", "+", "/quiet") ` + -ExpectedSignature $wdkSignatureThumbprint # Need to install the VSIX to get the build targets when running VSBuild -$FilePath = Resolve-Path -Path $FilePath -Install-VsixExtension -FilePath $FilePath -Name "WDK.vsix" -InstallOnly +$wdkExtensionPath = Resolve-Path -Path $wdkExtensionPath +Install-VsixExtension -FilePath $wdkExtensionPath -Name "WDK.vsix" -InstallOnly Invoke-PesterTests -TestFile "WDK" diff --git a/images/windows/scripts/build/Install-WebPlatformInstaller.ps1 b/images/windows/scripts/build/Install-WebPlatformInstaller.ps1 index c83dd458e..7fc802644 100644 --- a/images/windows/scripts/build/Install-WebPlatformInstaller.ps1 +++ b/images/windows/scripts/build/Install-WebPlatformInstaller.ps1 @@ -3,10 +3,8 @@ ## Desc: Install WebPlatformInstaller ################################################################################ -# Download and install WebPlatformInstaller -$webPlatformInstallerFile = "WebPlatformInstaller_x64_en-US.msi" -$webPlatformInstallerUrl = "http://go.microsoft.com/fwlink/?LinkId=287166" -$webPlatformInstallerSignatureThumbprint = "C3A3D43788E7ABCD287CB4F5B6583043774F99D2" -Install-Binary -Url $webPlatformInstallerUrl -Name $webPlatformInstallerFile -ExpectedSignature $webPlatformInstallerSignatureThumbprint +Install-Binary -Type MSI ` + -Url 'http://go.microsoft.com/fwlink/?LinkId=287166' ` + -ExpectedSignature 'C3A3D43788E7ABCD287CB4F5B6583043774F99D2' Invoke-PesterTests -TestFile "Tools" -TestName "WebPlatformInstaller" diff --git a/images/windows/scripts/build/Install-WinAppDriver.ps1 b/images/windows/scripts/build/Install-WinAppDriver.ps1 index cdd34079e..192b7004f 100644 --- a/images/windows/scripts/build/Install-WinAppDriver.ps1 +++ b/images/windows/scripts/build/Install-WinAppDriver.ps1 @@ -3,12 +3,13 @@ ## Desc: Install Windows Application Driver (WinAppDriver) #################################################################################### -$LatestReleaseUrl = 'https://api.github.com/repos/microsoft/WinAppDriver/releases/latest' -$InstallerUrl = (Invoke-RestMethod -Uri $LatestReleaseUrl).assets.browser_download_url -$InstallerName = "WindowsApplicationDriver.msi" -$InstallerSignatureThumbprint = "2485A7AFA98E178CB8F30C9838346B514AEA4769" - [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -Install-Binary -Url $InstallerUrl -Name $InstallerName -ExpectedSignature $InstallerSignatureThumbprint + +$latestReleaseUrl = 'https://api.github.com/repos/microsoft/WinAppDriver/releases/latest' +$installerUrl = (Invoke-RestMethod -Uri $latestReleaseUrl).assets.browser_download_url + +Install-Binary ` + -Url $installerUrl ` + -ExpectedSignature '2485A7AFA98E178CB8F30C9838346B514AEA4769' Invoke-PesterTests -TestFile "WinAppDriver" -TestName "WinAppDriver" diff --git a/images/windows/scripts/build/Install-Wix.ps1 b/images/windows/scripts/build/Install-Wix.ps1 index c5865af80..0fd90bf32 100644 --- a/images/windows/scripts/build/Install-Wix.ps1 +++ b/images/windows/scripts/build/Install-Wix.ps1 @@ -3,6 +3,6 @@ ## Desc: Install WIX. ################################################################################ -Choco-Install -PackageName wixtoolset -ArgumentList "--force" +Install-ChocoPackage wixtoolset -ArgumentList "--force" Invoke-PesterTests -TestFile "Wix" diff --git a/images/windows/scripts/helpers/ChocoHelpers.ps1 b/images/windows/scripts/helpers/ChocoHelpers.ps1 index 46247620c..a4fe9e421 100644 --- a/images/windows/scripts/helpers/ChocoHelpers.ps1 +++ b/images/windows/scripts/helpers/ChocoHelpers.ps1 @@ -1,4 +1,4 @@ -function Choco-Install { +function Install-ChocoPackage { [CmdletBinding()] param( [Parameter(Mandatory)] @@ -9,8 +9,7 @@ function Choco-Install { process { $count = 1 - while($true) - { + while ($true) { Write-Host "Running [#$count]: choco install $packageName -y $argumentList" choco install $packageName -y @argumentList --no-progress @@ -18,8 +17,7 @@ function Choco-Install { if ($pkg) { Write-Host "Package installed: $pkg" break - } - else { + } else { $count++ if ($count -ge $retryCount) { Write-Host "Could not install $packageName after $count attempts" @@ -31,20 +29,7 @@ function Choco-Install { } } -function Send-RequestToChocolateyPackages { - param( - [Parameter(Mandatory)] - [string] $FilterQuery, - [string] $Url = "https://community.chocolatey.org/api", - [int] $ApiVersion = 2 - ) - - $response = Invoke-RestMethod "$Url/v$ApiVersion/Packages()?$filterQuery" - - return $response -} - -function Get-LatestChocoPackageVersion { +function Resolve-ChocoPackageVersion { param( [Parameter(Mandatory)] [string] $PackageName, @@ -56,10 +41,10 @@ function Get-LatestChocoPackageVersion { [int]$versionNumbers[-1] += 1 $incrementedVersion = $versionNumbers -join "." $filterQuery = "`$filter=(Id eq '$PackageName') and (IsPrerelease eq false) and (Version ge '$TargetVersion') and (Version lt '$incrementedVersion')" - $latestVersion = (Send-RequestToChocolateyPackages -FilterQuery $filterQuery).properties.Version | - Where-Object {$_ -Like "$TargetVersion.*" -or $_ -eq $TargetVersion} | - Sort-Object {[version]$_} | + $latestVersion = (Invoke-RestMethod "https://community.chocolatey.org/api/v2/Packages()?$filterQuery").properties.Version | + Where-Object { $_ -Like "$TargetVersion.*" -or $_ -eq $TargetVersion } | + Sort-Object { [version]$_ } | Select-Object -Last 1 return $latestVersion -} \ No newline at end of file +} diff --git a/images/windows/scripts/helpers/ImageHelpers.psm1 b/images/windows/scripts/helpers/ImageHelpers.psm1 index e7136d319..4435792f9 100644 --- a/images/windows/scripts/helpers/ImageHelpers.psm1 +++ b/images/windows/scripts/helpers/ImageHelpers.psm1 @@ -34,9 +34,9 @@ Export-ModuleMember -Function @( 'Get-WinVersion' 'Test-IsWin22' 'Test-IsWin19' - 'Choco-Install' + 'Install-ChocoPackage' 'Send-RequestToCocolateyPackages' - 'Get-LatestChocoPackageVersion' + 'Resolve-ChocoPackageVersion' 'Get-GitHubPackageDownloadUrl' 'Extract-7Zip' 'Invoke-SBWithRetry' diff --git a/images/windows/scripts/helpers/InstallHelpers.ps1 b/images/windows/scripts/helpers/InstallHelpers.ps1 index ad466aaab..bf06e17e4 100644 --- a/images/windows/scripts/helpers/InstallHelpers.ps1 +++ b/images/windows/scripts/helpers/InstallHelpers.ps1 @@ -1,94 +1,132 @@ -function Install-Binary -{ +function Install-Binary { <# .SYNOPSIS - A helper function to install executables. + A function to install binaries from either a URL or a local path. .DESCRIPTION - Download and install .exe or .msi binaries from specified URL. + This function downloads and installs .exe or .msi binaries from a specified URL or a local path. It also supports checking the binary's signature and SHA256/SHA512 sum before installation. .PARAMETER Url - The URL from which the binary will be downloaded. Required parameter. + The URL from which the binary will be downloaded. This parameter is required if LocalPath is not specified. - .PARAMETER Name - The Name with which binary will be downloaded. Required parameter. + .PARAMETER LocalPath + The local path of the binary to be installed. This parameter is required if Url is not specified. - .PARAMETER ArgumentList - The list of arguments that will be passed to the installer. Required for .exe binaries. + .PARAMETER Type + The type of the binary to be installed. Valid values are "MSI" and "EXE". If not specified, the type is inferred from the file extension. + + .PARAMETER InstallArgs + The list of arguments that will be passed to the installer. Cannot be used together with ExtraInstallArgs. + + .PARAMETER ExtraInstallArgs + Additional arguments that will be passed to the installer. Cannot be used together with InstallArgs. + + .PARAMETER ExpectedSignature + The expected signature of the binary. If specified, the binary's signature is checked before installation. + + .PARAMETER ExpectedSHA256Sum + The expected SHA256 sum of the binary. If specified, the binary's SHA256 sum is checked before installation. + + .PARAMETER ExpectedSHA512Sum + The expected SHA512 sum of the binary. If specified, the binary's SHA512 sum is checked before installation. .EXAMPLE - Install-Binary -Url "https://go.microsoft.com/fwlink/p/?linkid=2083338" -Name "winsdksetup.exe" -ArgumentList ("/features", "+", "/quiet") -ExpectedSignature "XXXXXXXXXXXXXXXXXXXXXXXXXX" + Install-Binary -Url "https://go.microsoft.com/fwlink/p/?linkid=2083338" -Type EXE -InstallArgs ("/features", "+", "/quiet") -ExpectedSignature "A5C7D5B7C838D5F89DDBEDB85B2C566B4CDA881F" #> Param ( - [Parameter(Mandatory, ParameterSetName="Url")] + [Parameter(Mandatory, ParameterSetName = "Url")] [String] $Url, - [Parameter(Mandatory, ParameterSetName="Url")] - [String] $Name, - [Parameter(Mandatory, ParameterSetName="LocalPath")] - [String] $FilePath, - [String[]] $ArgumentList, - [String[]] $ExpectedSignature + [Parameter(Mandatory, ParameterSetName = "LocalPath")] + [String] $LocalPath, + [ValidateSet("MSI", "EXE")] + [String] $Type, + [String[]] $InstallArgs, + [String[]] $ExtraInstallArgs, + [String[]] $ExpectedSignature, + [String] $ExpectedSHA256Sum, + [String] $ExpectedSHA512Sum ) - if ($PSCmdlet.ParameterSetName -eq "LocalPath") - { - $name = Split-Path -Path $FilePath -Leaf - } - else - { - Write-Host "Downloading $Name..." - $filePath = Start-DownloadWithRetry -Url $Url -Name $Name + if ($PSCmdlet.ParameterSetName -eq "LocalPath") { + if (-not (Test-Path -Path $LocalPath)) { + throw "LocalPath parameter is specified, but the file does not exist." + } + if (-not $Type) { + $Type = ([System.IO.Path]::GetExtension($LocalPath)).Replace(".", "").ToUpper() + if ($Type -ne "MSI" -and $Type -ne "EXE") { + throw "LocalPath parameter is specified, but the file extension is not .msi or .exe. Please specify the Type parameter." + } + } + $filePath = $LocalPath + } else { + if (-not $Type) { + $Type = ([System.IO.Path]::GetExtension($Url)).Replace(".", "").ToUpper() + if ($Type -ne "MSI" -and $Type -ne "EXE") { + throw "Cannot determine the file type from the URL. Please specify the Type parameter." + } + } + $fileName = [System.IO.Path]::GetFileNameWithoutExtension([System.IO.Path]::GetRandomFileName()) + ".$Type".ToLower() + $filePath = Start-DownloadWithRetry -Url $Url -Name $fileName } - if ($PSBoundParameters.ContainsKey('ExpectedSignature')) - { - if ($ExpectedSignature) - { + if ($PSBoundParameters.ContainsKey('ExpectedSignature')) { + if ($ExpectedSignature) { Test-FileSignature -FilePath $filePath -ExpectedThumbprint $ExpectedSignature - } - else - { + } else { throw "ExpectedSignature parameter is specified, but no signature is provided." } } - - # MSI binaries should be installed via msiexec.exe - $fileExtension = ([System.IO.Path]::GetExtension($Name)).Replace(".", "") - if ($fileExtension -eq "msi") - { - if (-not $ArgumentList) - { - $ArgumentList = ('/i', $filePath, '/QN', '/norestart') - } - $filePath = "msiexec.exe" + + if ($ExpectedSHA256Sum) { + $fileHash = (Get-FileHash -Path $filePath -Algorithm SHA256).Hash + Use-ChecksumComparison $fileHash $ExpectedSHA256Sum } - try - { - $installStartTime = Get-Date - Write-Host "Starting Install $Name..." - $process = Start-Process -FilePath $filePath -ArgumentList $ArgumentList -Wait -PassThru - $exitCode = $process.ExitCode - $installCompleteTime = [math]::Round(($(Get-Date) - $installStartTime).TotalSeconds, 2) - if ($exitCode -eq 0 -or $exitCode -eq 3010) - { - Write-Host "Installation successful in $installCompleteTime seconds" + if ($ExpectedSHA512Sum) { + $fileHash = (Get-FileHash -Path $filePath -Algorithm SHA512).Hash + Use-ChecksumComparison $fileHash $ExpectedSHA512Sum + } + + if ($ExtraInstallArgs -and $InstallArgs) { + throw "InstallArgs and ExtraInstallArgs parameters cannot be used together." + } + + if ($Type -eq "MSI") { + # MSI binaries should be installed via msiexec.exe + if ($ExtraInstallArgs) { + $InstallArgs = @('/i', $filePath, '/qn', '/norestart') + $ExtraInstallArgs + } elseif (-not $InstallArgs) { + Write-Host "No arguments provided for MSI binary. Using default arguments: /i, /qn, /norestart" + $InstallArgs = @('/i', $filePath, '/qn', '/norestart') } - else - { - Write-Host "Non zero exit code returned by the installation process: $exitCode" - Write-Host "Total time elapsed: $installCompleteTime seconds" - exit $exitCode + $filePath = "msiexec.exe" + } else { + # EXE binaries should be started directly + if ($ExtraInstallArgs) { + $InstallArgs = $ExtraInstallArgs } } - catch - { + + $installStartTime = Get-Date + Write-Host "Starting Install $Name..." + try { + $process = Start-Process -FilePath $filePath -ArgumentList $InstallArgs -Wait -PassThru + $exitCode = $process.ExitCode $installCompleteTime = [math]::Round(($(Get-Date) - $installStartTime).TotalSeconds, 2) - Write-Host "Failed to install the $fileExtension ${Name}: $($_.Exception.Message)" - Write-Host "Installation failed after $installCompleteTime seconds" - exit 1 + if ($exitCode -eq 0) { + Write-Host "Installation successful in $installCompleteTime seconds" + } elseif ($exitCode -eq 3010) { + Write-Host "Installation successful in $installCompleteTime seconds. Reboot is required." + } else { + Write-Host "Installation process returned unexpected exit code: $exitCode" + Write-Host "Time elapsed: $installCompleteTime seconds" + exit $exitCode + } + } catch { + $installCompleteTime = [math]::Round(($(Get-Date) - $installStartTime).TotalSeconds, 2) + Write-Host "Installation failed in $installCompleteTime seconds" } } @@ -171,8 +209,7 @@ function Set-SvcWithErrHandling { } } -function Start-DownloadWithRetry -{ +function Start-DownloadWithRetry { Param ( [Parameter(Mandatory)] @@ -190,26 +227,20 @@ function Start-DownloadWithRetry $downloadStartTime = Get-Date # Default retry logic for the package. - while ($Retries -gt 0) - { - try - { + Write-Host "Downloading package from: $Url to path $filePath." + while ($Retries -gt 0) { + try { $downloadAttemptStartTime = Get-Date - Write-Host "Downloading package from: $Url to path $filePath ." (New-Object System.Net.WebClient).DownloadFile($Url, $filePath) break - } - catch - { + } catch { $failTime = [math]::Round(($(Get-Date) - $downloadStartTime).TotalSeconds, 2) $attemptTime = [math]::Round(($(Get-Date) - $downloadAttemptStartTime).TotalSeconds, 2) - Write-Host "There is an error encounterd after $attemptTime seconds during package downloading:`n $_" + Write-Host "There is an error encounterd after $attemptTime seconds during package downloading:`n$($_.Exception.ToString())" $Retries-- - if ($Retries -eq 0) - { - Write-Host "File can't be downloaded. Please try later or check that file exists by url: $Url" - Write-Host "Total time elapsed $failTime" + if ($Retries -eq 0) { + Write-Host "Package download failed after $failTime seconds" exit 1 } diff --git a/images/windows/scripts/helpers/VisualStudioHelpers.ps1 b/images/windows/scripts/helpers/VisualStudioHelpers.ps1 index e02c52fad..fe613ceaa 100644 --- a/images/windows/scripts/helpers/VisualStudioHelpers.ps1 +++ b/images/windows/scripts/helpers/VisualStudioHelpers.ps1 @@ -66,14 +66,19 @@ Function Install-VisualStudio { $responseDataPath = "$env:TEMP\vs_install_response.json" $responseData | ConvertTo-Json | Out-File -FilePath $responseDataPath + $installStartTime = Get-Date Write-Host "Starting Install ..." $bootstrapperArgumentList = ('/c', $bootstrapperFilePath, '--in', $responseDataPath, $ExtraArgs, '--quiet', '--norestart', '--wait', '--nocache' ) Write-Host "Bootstrapper arguments: $bootstrapperArgumentList" $process = Start-Process -FilePath cmd.exe -ArgumentList $bootstrapperArgumentList -Wait -PassThru $exitCode = $process.ExitCode - if ($exitCode -eq 0 -or $exitCode -eq 3010) { - Write-Host "Installation successful" + $installCompleteTime = [math]::Round(($(Get-Date) - $installStartTime).TotalSeconds, 2) + if ($exitCode -eq 0) { + Write-Host "Installation successful in $installCompleteTime seconds" + return $exitCode + } elseif ($exitCode -eq 3010) { + Write-Host "Installation successful in $installCompleteTime seconds. Reboot is required." return $exitCode } else { Write-Host "Non zero exit code returned by the installation process : $exitCode"