From 1e590b77aab883dbe2e4ebb6bd6797d3ffba180f Mon Sep 17 00:00:00 2001 From: Vasilii Polikarpov <126792224+vpolikarpov-akvelon@users.noreply.github.com> Date: Sat, 2 Sep 2023 12:25:52 +0200 Subject: [PATCH] [Windows] Add VC components for VS 17.7 (#8151) * [Windows] Add VC components for VS 17.7 * Try to debug VS installation * Add more components for VS * Use response file * Remove 14.36.17.6 build tools components * Fix issue where config is bad for VS2019 installer --- .../ImageHelpers/VisualStudioHelpers.ps1 | 92 ++++++++++++++----- images/win/scripts/Installers/Install-VS.ps1 | 19 ++-- images/win/toolsets/toolset-2022.json | 36 ++++---- 3 files changed, 91 insertions(+), 56 deletions(-) diff --git a/images/win/scripts/ImageHelpers/VisualStudioHelpers.ps1 b/images/win/scripts/ImageHelpers/VisualStudioHelpers.ps1 index a02311f78df7..e68f76479148 100644 --- a/images/win/scripts/ImageHelpers/VisualStudioHelpers.ps1 +++ b/images/win/scripts/ImageHelpers/VisualStudioHelpers.ps1 @@ -1,5 +1,4 @@ -Function Install-VisualStudio -{ +Function Install-VisualStudio { <# .SYNOPSIS A helper function to install Visual Studio. @@ -7,56 +6,99 @@ Function Install-VisualStudio .DESCRIPTION Prepare system environment, and install Visual Studio bootstrapper with selected workloads. - .PARAMETER BootstrapperUrl - The URL from which the bootstrapper will be downloaded. Required parameter. + .PARAMETER Version + The version of Visual Studio that will be installed. Required parameter. - .PARAMETER WorkLoads - The string that contain workloads that will be passed to the installer. + .PARAMETER Edition + The edition of Visual Studio that will be installed. Required parameter. + + .PARAMETER Channel + The channel of Visual Studio that will be installed. Required parameter. + + .PARAMETER RequiredComponents + The list of required components. Required parameter. + + .PARAMETER ExtraArgs + The extra arguments to pass to the bootstrapper. Optional parameter. #> Param ( - [Parameter(Mandatory)] - [String] $BootstrapperUrl, - [String] $WorkLoads + [Parameter(Mandatory)] [String] $Version, + [Parameter(Mandatory)] [String] $Edition, + [Parameter(Mandatory)] [String] $Channel, + [Parameter(Mandatory)] [String[]] $RequiredComponents, + [String] $ExtraArgs = "" ) + $bootstrapperUrl = "https://aka.ms/vs/${Version}/${Channel}/vs_${Edition}.exe" + $channelUri = "https://aka.ms/vs/${Version}/${Channel}/channel" + $channelId = "VisualStudio.${Version}.Release" + $productId = "Microsoft.VisualStudio.Product.${Edition}" + Write-Host "Downloading Bootstrapper ..." $BootstrapperName = [IO.Path]::GetFileName($BootstrapperUrl) $bootstrapperFilePath = Start-DownloadWithRetry -Url $BootstrapperUrl -Name $BootstrapperName - try - { + try { Write-Host "Enable short name support on Windows needed for Xamarin Android AOT, defaults appear to have been changed in Azure VMs" $shortNameEnableProcess = Start-Process -FilePath fsutil.exe -ArgumentList ('8dot3name', 'set', '0') -Wait -PassThru $shortNameEnableExitCode = $shortNameEnableProcess.ExitCode - if ($shortNameEnableExitCode -ne 0) - { + if ($shortNameEnableExitCode -ne 0) { Write-Host "Enabling short name support on Windows failed. This needs to be enabled prior to VS 2017 install for Xamarin Andriod AOT to work." exit $shortNameEnableExitCode } + $responseData = @{ + "channelUri" = $channelUri + "channelId" = $channelId + "productId" = $productId + "arch" = "x64" + "add" = $RequiredComponents | ForEach-Object { "$_;includeRecommended" } + } + + # Create json file with response data + $responseDataPath = "$env:TEMP\vs_install_response.json" + $responseData | ConvertTo-Json | Out-File -FilePath $responseDataPath + Write-Host "Starting Install ..." - $bootstrapperArgumentList = ('/c', $bootstrapperFilePath, $WorkLoads, '--quiet', '--norestart', '--wait', '--nocache' ) + $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) - { + if ($exitCode -eq 0 -or $exitCode -eq 3010) { Write-Host "Installation successful" return $exitCode - } - else - { - $setupErrorLogPath = "$env:TEMP\dd_setup_*_errors.log" - if (Test-Path -Path $setupErrorLogPath) - { - $logErrors = Get-Content -Path $setupErrorLogPath -Raw - Write-Host "$logErrors" + } else { + Write-Host "Non zero exit code returned by the installation process : $exitCode" + + # Try to download tool to collect logs + $collectExeUrl = "https://aka.ms/vscollect.exe" + $collectExeName = [IO.Path]::GetFileName($collectExeUrl) + $collectExePath = Start-DownloadWithRetry -Url $collectExeUrl -Name $collectExeName + + # Collect installation logs using the collect.exe tool and check if it is successful + & "$collectExePath" + if ($LastExitCode -ne 0) { + Write-Host "Failed to collect logs using collect.exe tool. Exit code : $LastExitCode" + exit $exitCode } - Write-Host "Non zero exit code returned by the installation process : $exitCode" + # Expand the zip file + Expand-Archive -Path "$env:TEMP\vslogs.zip" -DestinationPath "$env:TEMP\vslogs" + + # Print logs + $vsLogsPath = "$env:TEMP\vslogs" + $vsLogs = Get-ChildItem -Path $vsLogsPath -Recurse | Where-Object { -not $_.PSIsContainer } | Select-Object -ExpandProperty FullName + foreach ($log in $vsLogs) { + Write-Host "============================" + Write-Host "== Log file : $log " + Write-Host "============================" + Get-Content -Path $log -ErrorAction Continue + } + exit $exitCode } } diff --git a/images/win/scripts/Installers/Install-VS.ps1 b/images/win/scripts/Installers/Install-VS.ps1 index 1273975f61ff..707080f0e1d4 100644 --- a/images/win/scripts/Installers/Install-VS.ps1 +++ b/images/win/scripts/Installers/Install-VS.ps1 @@ -4,21 +4,14 @@ ################################################################################ $toolset = Get-ToolsetContent -$requiredComponents = $toolset.visualStudio.workloads | ForEach-Object { "--add $_" } -$workLoads = @( - "--allWorkloads --includeRecommended" - $requiredComponents - "--remove Component.CPython3.x64" -) -$workLoadsArgument = [String]::Join(" ", $workLoads) - -$releaseInPath = $toolset.visualStudio.edition -$subVersion = $toolset.visualStudio.subversion -$channel = $toolset.visualStudio.channel -$bootstrapperUrl = "https://aka.ms/vs/${subVersion}/${channel}/vs_${releaseInPath}.exe" # Install VS -Install-VisualStudio -BootstrapperUrl $bootstrapperUrl -WorkLoads $workLoadsArgument +Install-VisualStudio ` + -Version $toolset.visualStudio.subversion ` + -Edition $toolset.visualStudio.edition ` + -Channel $toolset.visualStudio.channel ` + -RequiredComponents $toolset.visualStudio.workloads ` + -ExtraArgs "--allWorkloads --includeRecommended --remove Component.CPython3.x64" # Find the version of VS installed for this instance # Only supports a single instance diff --git a/images/win/toolsets/toolset-2022.json b/images/win/toolsets/toolset-2022.json index 4d344e3e6727..138bc09e8283 100644 --- a/images/win/toolsets/toolset-2022.json +++ b/images/win/toolsets/toolset-2022.json @@ -265,24 +265,24 @@ "Microsoft.VisualStudio.Component.VC.14.35.17.5.MFC", "Microsoft.VisualStudio.Component.VC.14.35.17.5.x86.x64.Spectre", "Microsoft.VisualStudio.Component.VC.14.35.17.5.x86.x64", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.ARM.Spectre", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.ARM", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.ARM64.Spectre", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.ARM64", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.ATL.ARM.Spectre", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.ATL.ARM", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.ATL.ARM64.Spectre", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.ATL.ARM64", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.ATL.Spectre", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.ATL", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.MFC.ARM.Spectre", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.MFC.ARM", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.MFC.ARM64.Spectre", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.MFC.ARM64", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.MFC.Spectre", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.MFC", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.x86.x64.Spectre", - "Microsoft.VisualStudio.Component.VC.14.36.17.6.x86.x64", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.ARM.Spectre", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.ARM", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.ARM64.Spectre", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.ARM64", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.ATL.ARM.Spectre", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.ATL.ARM", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.ATL.ARM64.Spectre", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.ATL.ARM64", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.ATL.Spectre", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.ATL", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.MFC.ARM.Spectre", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.MFC.ARM", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.MFC.ARM64.Spectre", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.MFC.ARM64", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.MFC.Spectre", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.MFC", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.x86.x64.Spectre", + "Microsoft.VisualStudio.Component.VC.14.37.17.7.x86.x64", "Microsoft.VisualStudio.Component.VC.ATLMFC", "Microsoft.VisualStudio.Component.VC.ATLMFC.Spectre", "Microsoft.VisualStudio.Component.Windows10SDK.19041",